see CHANGELOG.txt
This commit is contained in:
parent
1393e5c38e
commit
9e2eb0c856
|
@ -4,6 +4,19 @@ KiCad ChangeLog 2012
|
||||||
Please add newer entries at the top, list the date and your name with
|
Please add newer entries at the top, list the date and your name with
|
||||||
email address.
|
email address.
|
||||||
|
|
||||||
|
2012-Feb-19 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||||
|
================================================================================
|
||||||
|
++pcbnew
|
||||||
|
* remove global g_Pad_Master global and put it into BOARD_DESIGN_SETTINGS
|
||||||
|
which is in turn already within BOARD.
|
||||||
|
* encapsulate class D_PAD with accessors, making data private.
|
||||||
|
* make D_PAD::GetBoundingRadius() do its longer calculation lazily, based on
|
||||||
|
m_boundingRadius == -1.
|
||||||
|
|
||||||
|
must test:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
2012-Feb-5 UPDATE Dick Hollenbeck <dick@softplc.com>
|
2012-Feb-5 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||||
================================================================================
|
================================================================================
|
||||||
++pcbnew
|
++pcbnew
|
||||||
|
|
|
@ -108,4 +108,3 @@ int g_PadCMPColor = RED;
|
||||||
*/
|
*/
|
||||||
DLIST<TRACK> g_CurrentTrackList;
|
DLIST<TRACK> g_CurrentTrackList;
|
||||||
|
|
||||||
D_PAD g_Pad_Master( (MODULE*) NULL );
|
|
||||||
|
|
|
@ -273,19 +273,6 @@ void RotatePoint( int* pX, int* pY, int cx, int cy, double angle )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void RotatePoint( wxPoint* point, double angle )
|
|
||||||
{
|
|
||||||
int ox, oy;
|
|
||||||
|
|
||||||
ox = point->x;
|
|
||||||
oy = point->y;
|
|
||||||
|
|
||||||
RotatePoint( &ox, &oy, angle );
|
|
||||||
point->x = ox;
|
|
||||||
point->y = oy;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void RotatePoint( wxPoint* point, const wxPoint& centre, double angle )
|
void RotatePoint( wxPoint* point, const wxPoint& centre, double angle )
|
||||||
{
|
{
|
||||||
int ox, oy;
|
int ox, oy;
|
||||||
|
|
|
@ -6,8 +6,14 @@
|
||||||
#define BOARD_DESIGN_SETTINGS_H_
|
#define BOARD_DESIGN_SETTINGS_H_
|
||||||
|
|
||||||
#include <pcbstruct.h> // NB_COLORS
|
#include <pcbstruct.h> // NB_COLORS
|
||||||
|
#include <class_pad.h>
|
||||||
|
#include <param_config.h>
|
||||||
|
|
||||||
// Class for handle current printed board design settings
|
|
||||||
|
/**
|
||||||
|
* Class BOARD_DESIGN_SETTINGS
|
||||||
|
* contains design settings for a BOARD object.
|
||||||
|
*/
|
||||||
class BOARD_DESIGN_SETTINGS
|
class BOARD_DESIGN_SETTINGS
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -38,6 +44,8 @@ public:
|
||||||
int m_ModuleTextWidth;
|
int m_ModuleTextWidth;
|
||||||
int m_ModuleSegmentWidth;
|
int m_ModuleSegmentWidth;
|
||||||
|
|
||||||
|
D_PAD m_Pad_Master;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BOARD_DESIGN_SETTINGS();
|
BOARD_DESIGN_SETTINGS();
|
||||||
|
|
||||||
|
@ -172,6 +180,13 @@ public:
|
||||||
*/
|
*/
|
||||||
void SetCopperLayerCount( int aNewLayerCount );
|
void SetCopperLayerCount( int aNewLayerCount );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function AppendConfigs
|
||||||
|
* appends to @a aResult the configuration setting accessors which will later
|
||||||
|
* allow reading or writing of configuration file information directly into
|
||||||
|
* this object.
|
||||||
|
*/
|
||||||
|
void AppendConfigs( PARAM_CFG_ARRAY* aResult );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int m_CopperLayerCount; ///< Number of copper layers for this design
|
int m_CopperLayerCount; ///< Number of copper layers for this design
|
||||||
|
|
|
@ -5,25 +5,36 @@
|
||||||
#ifndef PAD_SHAPES_H_
|
#ifndef PAD_SHAPES_H_
|
||||||
#define PAD_SHAPES_H_
|
#define PAD_SHAPES_H_
|
||||||
|
|
||||||
/* Pad shape id : ( .m_PadShape member) */
|
/**
|
||||||
#define PAD_NONE 0
|
* Enum PAD_SHAPE_T
|
||||||
#define PAD_CIRCLE 1
|
* is the set of pad shapes, used with D_PAD::{Set,Get}Shape()
|
||||||
#define PAD_ROUND PAD_CIRCLE
|
*/
|
||||||
#define PAD_RECT 2
|
enum PAD_SHAPE_T
|
||||||
#define PAD_OVAL 3
|
{
|
||||||
#define PAD_TRAPEZOID 4 // trapezoid
|
PAD_NONE,
|
||||||
#define PAD_RRECT 5
|
PAD_CIRCLE,
|
||||||
#define PAD_OCTAGON 6
|
PAD_ROUND = PAD_CIRCLE,
|
||||||
#define PAD_SQUARE 7
|
PAD_RECT,
|
||||||
|
PAD_OVAL,
|
||||||
|
PAD_TRAPEZOID,
|
||||||
|
PAD_RRECT,
|
||||||
|
PAD_OCTAGON,
|
||||||
|
PAD_SQUARE,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* PADS attributes */
|
/**
|
||||||
#define PAD_STANDARD 0 // Usual pad
|
* Enum PAD_ATTR_T
|
||||||
#define PAD_SMD 1 // Smd pad, appears on the solder paste layer (default)
|
* is the set of pad shapes, used with D_PAD::{Set,Get}Attribute()
|
||||||
#define PAD_CONN 2 // Like smd, does not appear on the solder paste layer (default)
|
*/
|
||||||
#define PAD_HOLE_NOT_PLATED 3 // like PAD_STANDARD, but not plated
|
enum PAD_ATTR_T
|
||||||
// mechanical used only
|
{
|
||||||
// no connection allowed
|
PAD_STANDARD, ///< Usual pad
|
||||||
|
PAD_SMD, ///< Smd pad, appears on the solder paste layer (default)
|
||||||
|
PAD_CONN, ///< Like smd, does not appear on the solder paste layer (default)
|
||||||
|
PAD_HOLE_NOT_PLATED, ///< like PAD_STANDARD, but not plated
|
||||||
|
///< mechanical use only, no connection allowed
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /* #ifndef PAD_SHAPES_H_ */
|
#endif // PAD_SHAPES_H_
|
||||||
|
|
|
@ -52,8 +52,5 @@ extern DLIST<TRACK> g_CurrentTrackList;
|
||||||
|
|
||||||
#define g_FirstTrackSegment g_CurrentTrackList.GetFirst() ///< first segment created
|
#define g_FirstTrackSegment g_CurrentTrackList.GetFirst() ///< first segment created
|
||||||
|
|
||||||
/// Pad editing
|
|
||||||
extern D_PAD g_Pad_Master;
|
|
||||||
|
|
||||||
|
|
||||||
#endif // PCBCOMMON_H_
|
#endif // PCBCOMMON_H_
|
||||||
|
|
|
@ -22,7 +22,10 @@ void RotatePoint( int *pX, int *pY, int cx, int cy, double angle );
|
||||||
* Calculates the new coord point point
|
* Calculates the new coord point point
|
||||||
* for a rotation angle in (1 / 10 degree)
|
* for a rotation angle in (1 / 10 degree)
|
||||||
*/
|
*/
|
||||||
void RotatePoint( wxPoint* point, double angle );
|
static inline void RotatePoint( wxPoint* point, double angle )
|
||||||
|
{
|
||||||
|
RotatePoint( &point->x, &point->y, angle );
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Calculates the new coord point point
|
* Calculates the new coord point point
|
||||||
|
|
|
@ -666,7 +666,7 @@ int PCB_EDIT_FRAME::GetOptimalModulePlacement( MODULE* aModule, wxDC* aDC )
|
||||||
|
|
||||||
for( Pad = aModule->m_Pads; Pad != NULL; Pad = Pad->Next() )
|
for( Pad = aModule->m_Pads; Pad != NULL; Pad = Pad->Next() )
|
||||||
{
|
{
|
||||||
if( ( Pad->m_layerMask & otherLayerMask ) == 0 )
|
if( ( Pad->GetLayerMask() & otherLayerMask ) == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
TstOtherSide = true;
|
TstOtherSide = true;
|
||||||
|
|
|
@ -443,7 +443,7 @@ void MoveMarkedItems( MODULE* module, wxPoint offset )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
pad->SetPosition( pad->GetPosition() + offset );
|
pad->SetPosition( pad->GetPosition() + offset );
|
||||||
pad->m_Pos0 += offset;
|
pad->SetPos0( pad->GetPos0() + offset );
|
||||||
}
|
}
|
||||||
|
|
||||||
item = module->m_Drawings;
|
item = module->m_Drawings;
|
||||||
|
@ -526,29 +526,38 @@ void MirrorMarkedItems( MODULE* module, wxPoint offset )
|
||||||
{
|
{
|
||||||
#define SETMIRROR( z ) (z) -= offset.x; (z) = -(z); (z) += offset.x;
|
#define SETMIRROR( z ) (z) -= offset.x; (z) = -(z); (z) += offset.x;
|
||||||
wxPoint tmp;
|
wxPoint tmp;
|
||||||
|
wxSize tmpz;
|
||||||
|
|
||||||
if( module == NULL )
|
if( module == NULL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for( D_PAD* pad = module->m_Pads; pad; pad = pad->Next() )
|
for( D_PAD* pad = module->m_Pads; pad; pad = pad->Next() )
|
||||||
{
|
{
|
||||||
if( pad->IsSelected() )
|
// @JP why allow some pads to stay behind? Do not understand
|
||||||
|
// why this test is here.
|
||||||
|
if( !pad->IsSelected() )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
tmp = pad->GetPosition();
|
tmp = pad->GetPosition();
|
||||||
SETMIRROR( tmp.x );
|
SETMIRROR( tmp.x );
|
||||||
pad->SetPosition( tmp );
|
pad->SetPosition( tmp );
|
||||||
|
|
||||||
pad->m_Pos0.x = pad->GetPosition().x;
|
pad->SetX0( pad->GetPosition().x );
|
||||||
NEGATE( pad->m_Offset.x );
|
|
||||||
NEGATE( pad->m_DeltaSize.x );
|
tmp = pad->GetOffset();
|
||||||
pad->m_Orient = 1800 - pad->m_Orient;
|
NEGATE( tmp.x );
|
||||||
NORMALIZE_ANGLE_POS( pad->m_Orient );
|
pad->SetOffset( tmp );
|
||||||
|
|
||||||
|
tmpz = pad->GetDelta();
|
||||||
|
NEGATE( tmpz.x );
|
||||||
|
pad->SetDelta( tmpz );
|
||||||
|
|
||||||
|
pad->SetOrientation( 1800 - pad->GetOrientation() );
|
||||||
}
|
}
|
||||||
|
|
||||||
for( EDA_ITEM* item = module->m_Drawings; item; item = item->Next() )
|
for( EDA_ITEM* item = module->m_Drawings; item; item = item->Next() )
|
||||||
{
|
{
|
||||||
if( !item->IsSelected() )
|
if( !item->IsSelected() ) // @JP why allow some graphics to stay behind?
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
switch( item->Type() )
|
switch( item->Type() )
|
||||||
|
@ -609,9 +618,8 @@ void RotateMarkedItems( MODULE* module, wxPoint offset )
|
||||||
ROTATE( pos );
|
ROTATE( pos );
|
||||||
pad->SetPosition( pos );
|
pad->SetPosition( pos );
|
||||||
|
|
||||||
pad->m_Pos0 = pad->GetPosition();
|
pad->SetPos0( pad->GetPosition() );
|
||||||
pad->m_Orient += 900;
|
pad->SetOrientation( pad->GetOrientation() + 900 );
|
||||||
NORMALIZE_ANGLE_POS( pad->m_Orient );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for( EDA_ITEM* item = module->m_Drawings; item; item = item->Next() )
|
for( EDA_ITEM* item = module->m_Drawings; item; item = item->Next() )
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#include <class_zone.h>
|
#include <class_zone.h>
|
||||||
|
|
||||||
|
|
||||||
/* Exported functions */
|
// Exported functions
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function TransformRoundedEndsSegmentToPolygon
|
* Function TransformRoundedEndsSegmentToPolygon
|
||||||
|
@ -640,8 +640,9 @@ void CreateThermalReliefPadPolygon( std::vector<CPolyPt>& aCornerBuffer,
|
||||||
wxPoint PadShapePos = aPad.ReturnShapePos(); /* Note: for pad having a shape offset,
|
wxPoint PadShapePos = aPad.ReturnShapePos(); /* Note: for pad having a shape offset,
|
||||||
* the pad position is NOT the shape position */
|
* the pad position is NOT the shape position */
|
||||||
wxSize copper_thickness;
|
wxSize copper_thickness;
|
||||||
int dx = aPad.m_Size.x / 2;
|
|
||||||
int dy = aPad.m_Size.y / 2;
|
int dx = aPad.GetSize().x / 2;
|
||||||
|
int dy = aPad.GetSize().y / 2;
|
||||||
|
|
||||||
int delta = 3600 / aCircleToSegmentsCount; // rot angle in 0.1 degree
|
int delta = 3600 / aCircleToSegmentsCount; // rot angle in 0.1 degree
|
||||||
|
|
||||||
|
@ -663,320 +664,327 @@ void CreateThermalReliefPadPolygon( std::vector<CPolyPt>& aCornerBuffer,
|
||||||
copper_thickness.x = min( dx, aCopperThickness );
|
copper_thickness.x = min( dx, aCopperThickness );
|
||||||
copper_thickness.y = min( dy, aCopperThickness );
|
copper_thickness.y = min( dy, aCopperThickness );
|
||||||
|
|
||||||
switch( aPad.m_PadShape )
|
switch( aPad.GetShape() )
|
||||||
{
|
{
|
||||||
case PAD_CIRCLE: // Add 4 similar holes
|
case PAD_CIRCLE: // Add 4 similar holes
|
||||||
{
|
|
||||||
/* we create 4 copper holes and put them in position 1, 2, 3 and 4
|
|
||||||
* here is the area of the rectangular pad + its thermal gap
|
|
||||||
* the 4 copper holes remove the copper in order to create the thermal gap
|
|
||||||
* 4 ------ 1
|
|
||||||
* | |
|
|
||||||
* | |
|
|
||||||
* | |
|
|
||||||
* | |
|
|
||||||
* 3 ------ 2
|
|
||||||
* holes 2, 3, 4 are the same as hole 1, rotated 90, 180, 270 deg
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Build the hole pattern, for the hole in the X >0, Y > 0 plane:
|
|
||||||
// The pattern roughtly is a 90 deg arc pie
|
|
||||||
std::vector <wxPoint> corners_buffer;
|
|
||||||
|
|
||||||
// Radius of outer arcs of the shape corrected for arc approximation by lines
|
|
||||||
int outer_radius = (int) ( (dx + aThermalGap) * aCorrectionFactor );
|
|
||||||
|
|
||||||
// Crosspoint of thermal spoke sides, the first point of polygon buffer
|
|
||||||
corners_buffer.push_back( wxPoint( copper_thickness.x / 2, copper_thickness.y / 2 ) );
|
|
||||||
|
|
||||||
// Add an intermediate point on spoke sides, to allow a > 90 deg angle between side
|
|
||||||
// and first seg of arc approx
|
|
||||||
corner.x = copper_thickness.x / 2;
|
|
||||||
int y = outer_radius - (aThermalGap / 4);
|
|
||||||
corner.y = (int) sqrt( ( ( (double) y * y ) - (double) corner.x * corner.x ) );
|
|
||||||
|
|
||||||
if( aThermalRot != 0 )
|
|
||||||
corners_buffer.push_back( corner );
|
|
||||||
|
|
||||||
// calculate the starting point of the outter arc
|
|
||||||
corner.x = copper_thickness.x / 2;
|
|
||||||
|
|
||||||
double dtmp = sqrt( ( (double) outer_radius * outer_radius ) -
|
|
||||||
( (double) corner.x * corner.x ) );
|
|
||||||
corner.y = (int) dtmp;
|
|
||||||
RotatePoint( &corner, 90 );
|
|
||||||
|
|
||||||
// calculate the ending point of the outter arc
|
|
||||||
corner_end.x = corner.y;
|
|
||||||
corner_end.y = corner.x;
|
|
||||||
|
|
||||||
// calculate intermediate points (y coordinate from corner.y to corner_end.y
|
|
||||||
while( (corner.y > corner_end.y) && (corner.x < corner_end.x) )
|
|
||||||
{
|
{
|
||||||
corners_buffer.push_back( corner );
|
/* we create 4 copper holes and put them in position 1, 2, 3 and 4
|
||||||
RotatePoint( &corner, delta );
|
* here is the area of the rectangular pad + its thermal gap
|
||||||
}
|
* the 4 copper holes remove the copper in order to create the thermal gap
|
||||||
|
* 4 ------ 1
|
||||||
|
* | |
|
||||||
|
* | |
|
||||||
|
* | |
|
||||||
|
* | |
|
||||||
|
* 3 ------ 2
|
||||||
|
* holes 2, 3, 4 are the same as hole 1, rotated 90, 180, 270 deg
|
||||||
|
*/
|
||||||
|
|
||||||
corners_buffer.push_back( corner_end );
|
// Build the hole pattern, for the hole in the X >0, Y > 0 plane:
|
||||||
|
// The pattern roughtly is a 90 deg arc pie
|
||||||
|
std::vector <wxPoint> corners_buffer;
|
||||||
|
|
||||||
/* add an intermediate point, to avoid angles < 90 deg between last arc approx line
|
// Radius of outer arcs of the shape corrected for arc approximation by lines
|
||||||
* and radius line
|
int outer_radius = (int) ( (dx + aThermalGap) * aCorrectionFactor );
|
||||||
*/
|
|
||||||
corner.x = corners_buffer[1].y;
|
|
||||||
corner.y = corners_buffer[1].x;
|
|
||||||
corners_buffer.push_back( corner );
|
|
||||||
|
|
||||||
// Now, add the 4 holes ( each is the pattern, rotated by 0, 90, 180 and 270 deg
|
// Crosspoint of thermal spoke sides, the first point of polygon buffer
|
||||||
// aThermalRot = 450 (45.0 degrees orientation) work fine.
|
corners_buffer.push_back( wxPoint( copper_thickness.x / 2, copper_thickness.y / 2 ) );
|
||||||
int angle_pad = aPad.GetOrientation(); // Pad orientation
|
|
||||||
int th_angle = aThermalRot;
|
|
||||||
|
|
||||||
for( unsigned ihole = 0; ihole < 4; ihole++ )
|
// Add an intermediate point on spoke sides, to allow a > 90 deg angle between side
|
||||||
{
|
// and first seg of arc approx
|
||||||
for( unsigned ii = 0; ii < corners_buffer.size(); ii++ )
|
corner.x = copper_thickness.x / 2;
|
||||||
|
int y = outer_radius - (aThermalGap / 4);
|
||||||
|
corner.y = (int) sqrt( ( ( (double) y * y ) - (double) corner.x * corner.x ) );
|
||||||
|
|
||||||
|
if( aThermalRot != 0 )
|
||||||
|
corners_buffer.push_back( corner );
|
||||||
|
|
||||||
|
// calculate the starting point of the outter arc
|
||||||
|
corner.x = copper_thickness.x / 2;
|
||||||
|
|
||||||
|
double dtmp = sqrt( ( (double) outer_radius * outer_radius ) -
|
||||||
|
( (double) corner.x * corner.x ) );
|
||||||
|
corner.y = (int) dtmp;
|
||||||
|
RotatePoint( &corner, 90 );
|
||||||
|
|
||||||
|
// calculate the ending point of the outter arc
|
||||||
|
corner_end.x = corner.y;
|
||||||
|
corner_end.y = corner.x;
|
||||||
|
|
||||||
|
// calculate intermediate points (y coordinate from corner.y to corner_end.y
|
||||||
|
while( (corner.y > corner_end.y) && (corner.x < corner_end.x) )
|
||||||
{
|
{
|
||||||
corner = corners_buffer[ii];
|
corners_buffer.push_back( corner );
|
||||||
RotatePoint( &corner, th_angle + angle_pad ); // Rotate by segment angle and pad orientation
|
RotatePoint( &corner, delta );
|
||||||
corner += PadShapePos;
|
|
||||||
aCornerBuffer.push_back( CPolyPt( corner.x, corner.y ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
aCornerBuffer.back().end_contour = true;
|
corners_buffer.push_back( corner_end );
|
||||||
th_angle += 900; // Note: th_angle in in 0.1 deg.
|
|
||||||
|
/* add an intermediate point, to avoid angles < 90 deg between last arc approx line
|
||||||
|
* and radius line
|
||||||
|
*/
|
||||||
|
corner.x = corners_buffer[1].y;
|
||||||
|
corner.y = corners_buffer[1].x;
|
||||||
|
corners_buffer.push_back( corner );
|
||||||
|
|
||||||
|
// Now, add the 4 holes ( each is the pattern, rotated by 0, 90, 180 and 270 deg
|
||||||
|
// aThermalRot = 450 (45.0 degrees orientation) work fine.
|
||||||
|
int angle_pad = aPad.GetOrientation(); // Pad orientation
|
||||||
|
int th_angle = aThermalRot;
|
||||||
|
|
||||||
|
for( unsigned ihole = 0; ihole < 4; ihole++ )
|
||||||
|
{
|
||||||
|
for( unsigned ii = 0; ii < corners_buffer.size(); ii++ )
|
||||||
|
{
|
||||||
|
corner = corners_buffer[ii];
|
||||||
|
RotatePoint( &corner, th_angle + angle_pad ); // Rotate by segment angle and pad orientation
|
||||||
|
corner += PadShapePos;
|
||||||
|
aCornerBuffer.push_back( CPolyPt( corner.x, corner.y ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
aCornerBuffer.back().end_contour = true;
|
||||||
|
th_angle += 900; // Note: th_angle in in 0.1 deg.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
case PAD_OVAL:
|
case PAD_OVAL:
|
||||||
{
|
|
||||||
// Oval pad support along the lines of round and rectangular pads
|
|
||||||
std::vector <wxPoint> corners_buffer; // Polygon buffer as vector
|
|
||||||
|
|
||||||
int dx = (aPad.m_Size.x / 2) + aThermalGap; // Cutout radius x
|
|
||||||
int dy = (aPad.m_Size.y / 2) + aThermalGap; // Cutout radius y
|
|
||||||
|
|
||||||
wxPoint shape_offset;
|
|
||||||
|
|
||||||
// We want to calculate an oval shape with dx > dy.
|
|
||||||
// if this is not the case, exchange dx and dy, and rotate the shape 90 deg.
|
|
||||||
int supp_angle = 0;
|
|
||||||
|
|
||||||
if( dx < dy )
|
|
||||||
{
|
{
|
||||||
EXCHG( dx, dy );
|
// Oval pad support along the lines of round and rectangular pads
|
||||||
supp_angle = 900;
|
std::vector <wxPoint> corners_buffer; // Polygon buffer as vector
|
||||||
EXCHG( copper_thickness.x, copper_thickness.y );
|
|
||||||
}
|
|
||||||
|
|
||||||
int deltasize = dx - dy; // = distance between shape position and the 2 demi-circle ends centre
|
int dx = (aPad.GetSize().x / 2) + aThermalGap; // Cutout radius x
|
||||||
// here we have dx > dy
|
int dy = (aPad.GetSize().y / 2) + aThermalGap; // Cutout radius y
|
||||||
// Radius of outer arcs of the shape:
|
|
||||||
int outer_radius = dy; // The radius of the outer arc is radius end + aThermalGap
|
|
||||||
|
|
||||||
// Some coordinate fiddling, depending on the shape offset direction
|
wxPoint shape_offset;
|
||||||
shape_offset = wxPoint( deltasize, 0 );
|
|
||||||
|
|
||||||
// Crosspoint of thermal spoke sides, the first point of polygon buffer
|
// We want to calculate an oval shape with dx > dy.
|
||||||
corners_buffer.push_back( wxPoint( copper_thickness.x / 2, copper_thickness.y / 2 ) );
|
// if this is not the case, exchange dx and dy, and rotate the shape 90 deg.
|
||||||
|
int supp_angle = 0;
|
||||||
|
|
||||||
// Arc start point calculation, the intersecting point of cutout arc and thermal spoke edge
|
if( dx < dy )
|
||||||
if( copper_thickness.x > deltasize ) // If copper thickness is more than shape offset, we need to calculate arc intercept point.
|
{
|
||||||
{
|
EXCHG( dx, dy );
|
||||||
corner.x = copper_thickness.x / 2;
|
supp_angle = 900;
|
||||||
corner.y = (int) sqrt( ( (double) outer_radius * outer_radius ) -
|
EXCHG( copper_thickness.x, copper_thickness.y );
|
||||||
( (double) ( corner.x - delta ) * ( corner.x - deltasize ) ) );
|
}
|
||||||
corner.x -= deltasize;
|
|
||||||
|
|
||||||
/* creates an intermediate point, to have a > 90 deg angle
|
int deltasize = dx - dy; // = distance between shape position and the 2 demi-circle ends centre
|
||||||
* between the side and the first segment of arc approximation
|
// here we have dx > dy
|
||||||
|
// Radius of outer arcs of the shape:
|
||||||
|
int outer_radius = dy; // The radius of the outer arc is radius end + aThermalGap
|
||||||
|
|
||||||
|
// Some coordinate fiddling, depending on the shape offset direction
|
||||||
|
shape_offset = wxPoint( deltasize, 0 );
|
||||||
|
|
||||||
|
// Crosspoint of thermal spoke sides, the first point of polygon buffer
|
||||||
|
corners_buffer.push_back( wxPoint( copper_thickness.x / 2, copper_thickness.y / 2 ) );
|
||||||
|
|
||||||
|
// Arc start point calculation, the intersecting point of cutout arc and thermal spoke edge
|
||||||
|
if( copper_thickness.x > deltasize ) // If copper thickness is more than shape offset, we need to calculate arc intercept point.
|
||||||
|
{
|
||||||
|
corner.x = copper_thickness.x / 2;
|
||||||
|
corner.y = (int) sqrt( ( (double) outer_radius * outer_radius ) -
|
||||||
|
( (double) ( corner.x - delta ) * ( corner.x - deltasize ) ) );
|
||||||
|
corner.x -= deltasize;
|
||||||
|
|
||||||
|
/* creates an intermediate point, to have a > 90 deg angle
|
||||||
|
* between the side and the first segment of arc approximation
|
||||||
|
*/
|
||||||
|
wxPoint intpoint = corner;
|
||||||
|
intpoint.y -= aThermalGap / 4;
|
||||||
|
corners_buffer.push_back( intpoint + shape_offset );
|
||||||
|
RotatePoint( &corner, 90 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
corner.x = copper_thickness.x / 2;
|
||||||
|
corner.y = outer_radius;
|
||||||
|
corners_buffer.push_back( corner );
|
||||||
|
corner.x = ( deltasize - copper_thickness.x ) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add an intermediate point on spoke sides, to allow a > 90 deg angle between side
|
||||||
|
// and first seg of arc approx
|
||||||
|
wxPoint last_corner;
|
||||||
|
last_corner.y = copper_thickness.y / 2;
|
||||||
|
int px = outer_radius - (aThermalGap / 4);
|
||||||
|
last_corner.x =
|
||||||
|
(int) sqrt( ( ( (double) px * px ) - (double) last_corner.y * last_corner.y ) );
|
||||||
|
|
||||||
|
// Arc stop point calculation, the intersecting point of cutout arc and thermal spoke edge
|
||||||
|
corner_end.y = copper_thickness.y / 2;
|
||||||
|
corner_end.x =
|
||||||
|
(int) sqrt( ( (double) outer_radius *
|
||||||
|
outer_radius ) - ( (double) corner_end.y * corner_end.y ) );
|
||||||
|
RotatePoint( &corner_end, -90 );
|
||||||
|
|
||||||
|
// calculate intermediate arc points till limit is reached
|
||||||
|
while( (corner.y > corner_end.y) && (corner.x < corner_end.x) )
|
||||||
|
{
|
||||||
|
corners_buffer.push_back( corner + shape_offset );
|
||||||
|
RotatePoint( &corner, delta );
|
||||||
|
}
|
||||||
|
|
||||||
|
//corners_buffer.push_back(corner + shape_offset); // TODO: about one mil geometry error forms somewhere.
|
||||||
|
corners_buffer.push_back( corner_end + shape_offset );
|
||||||
|
corners_buffer.push_back( last_corner + shape_offset ); // Enabling the line above shows intersection point.
|
||||||
|
|
||||||
|
/* Create 2 holes, rotated by pad rotation.
|
||||||
*/
|
*/
|
||||||
wxPoint intpoint = corner;
|
int angle = aPad.GetOrientation() + supp_angle;
|
||||||
intpoint.y -= aThermalGap / 4;
|
|
||||||
corners_buffer.push_back( intpoint + shape_offset );
|
|
||||||
RotatePoint( &corner, 90 );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
corner.x = copper_thickness.x / 2;
|
|
||||||
corner.y = outer_radius;
|
|
||||||
corners_buffer.push_back( corner );
|
|
||||||
corner.x = ( deltasize - copper_thickness.x ) / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add an intermediate point on spoke sides, to allow a > 90 deg angle between side
|
for( int irect = 0; irect < 2; irect++ )
|
||||||
// and first seg of arc approx
|
|
||||||
wxPoint last_corner;
|
|
||||||
last_corner.y = copper_thickness.y / 2;
|
|
||||||
int px = outer_radius - (aThermalGap / 4);
|
|
||||||
last_corner.x =
|
|
||||||
(int) sqrt( ( ( (double) px * px ) - (double) last_corner.y * last_corner.y ) );
|
|
||||||
|
|
||||||
// Arc stop point calculation, the intersecting point of cutout arc and thermal spoke edge
|
|
||||||
corner_end.y = copper_thickness.y / 2;
|
|
||||||
corner_end.x =
|
|
||||||
(int) sqrt( ( (double) outer_radius *
|
|
||||||
outer_radius ) - ( (double) corner_end.y * corner_end.y ) );
|
|
||||||
RotatePoint( &corner_end, -90 );
|
|
||||||
|
|
||||||
// calculate intermediate arc points till limit is reached
|
|
||||||
while( (corner.y > corner_end.y) && (corner.x < corner_end.x) )
|
|
||||||
{
|
|
||||||
corners_buffer.push_back( corner + shape_offset );
|
|
||||||
RotatePoint( &corner, delta );
|
|
||||||
}
|
|
||||||
|
|
||||||
//corners_buffer.push_back(corner + shape_offset); // TODO: about one mil geometry error forms somewhere.
|
|
||||||
corners_buffer.push_back( corner_end + shape_offset );
|
|
||||||
corners_buffer.push_back( last_corner + shape_offset ); // Enabling the line above shows intersection point.
|
|
||||||
|
|
||||||
/* Create 2 holes, rotated by pad rotation.
|
|
||||||
*/
|
|
||||||
int angle = aPad.GetOrientation() + supp_angle;
|
|
||||||
|
|
||||||
for( int irect = 0; irect < 2; irect++ )
|
|
||||||
{
|
|
||||||
for( unsigned ic = 0; ic < corners_buffer.size(); ic++ )
|
|
||||||
{
|
{
|
||||||
wxPoint cpos = corners_buffer[ic];
|
for( unsigned ic = 0; ic < corners_buffer.size(); ic++ )
|
||||||
RotatePoint( &cpos, angle );
|
{
|
||||||
cpos += PadShapePos;
|
wxPoint cpos = corners_buffer[ic];
|
||||||
aCornerBuffer.push_back( CPolyPt( cpos.x, cpos.y ) );
|
RotatePoint( &cpos, angle );
|
||||||
|
cpos += PadShapePos;
|
||||||
|
aCornerBuffer.push_back( CPolyPt( cpos.x, cpos.y ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
aCornerBuffer.back().end_contour = true;
|
||||||
|
angle += 1800; // this is calculate hole 3
|
||||||
|
|
||||||
|
if( angle >= 3600 )
|
||||||
|
angle -= 3600;
|
||||||
}
|
}
|
||||||
|
|
||||||
aCornerBuffer.back().end_contour = true;
|
// Create holes, that are the mirrored from the previous holes
|
||||||
angle += 1800; // this is calculate hole 3
|
|
||||||
|
|
||||||
if( angle >= 3600 )
|
|
||||||
angle -= 3600;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create holes, that are the mirrored from the previous holes
|
|
||||||
for( unsigned ic = 0; ic < corners_buffer.size(); ic++ )
|
|
||||||
{
|
|
||||||
wxPoint swap = corners_buffer[ic];
|
|
||||||
swap.x = -swap.x;
|
|
||||||
corners_buffer[ic] = swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now add corner 4 and 2 (2 is the corner 4 rotated by 180 deg
|
|
||||||
angle = aPad.GetOrientation() + supp_angle;
|
|
||||||
|
|
||||||
for( int irect = 0; irect < 2; irect++ )
|
|
||||||
{
|
|
||||||
for( unsigned ic = 0; ic < corners_buffer.size(); ic++ )
|
for( unsigned ic = 0; ic < corners_buffer.size(); ic++ )
|
||||||
{
|
{
|
||||||
wxPoint cpos = corners_buffer[ic];
|
wxPoint swap = corners_buffer[ic];
|
||||||
RotatePoint( &cpos, angle );
|
swap.x = -swap.x;
|
||||||
cpos += PadShapePos;
|
corners_buffer[ic] = swap;
|
||||||
aCornerBuffer.push_back( CPolyPt( cpos.x, cpos.y ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
aCornerBuffer.back().end_contour = true;
|
// Now add corner 4 and 2 (2 is the corner 4 rotated by 180 deg
|
||||||
angle += 1800;
|
angle = aPad.GetOrientation() + supp_angle;
|
||||||
|
|
||||||
if( angle >= 3600 )
|
for( int irect = 0; irect < 2; irect++ )
|
||||||
angle -= 3600;
|
{
|
||||||
|
for( unsigned ic = 0; ic < corners_buffer.size(); ic++ )
|
||||||
|
{
|
||||||
|
wxPoint cpos = corners_buffer[ic];
|
||||||
|
RotatePoint( &cpos, angle );
|
||||||
|
cpos += PadShapePos;
|
||||||
|
aCornerBuffer.push_back( CPolyPt( cpos.x, cpos.y ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
aCornerBuffer.back().end_contour = true;
|
||||||
|
angle += 1800;
|
||||||
|
|
||||||
|
if( angle >= 3600 )
|
||||||
|
angle -= 3600;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
case PAD_RECT: // draw 4 Holes
|
case PAD_RECT: // draw 4 Holes
|
||||||
{
|
|
||||||
/* we create 4 copper holes and put them in position 1, 2, 3 and 4
|
|
||||||
* here is the area of the rectangular pad + its thermal gap
|
|
||||||
* the 4 copper holes remove the copper in order to create the thermal gap
|
|
||||||
* 4 ------ 1
|
|
||||||
* | |
|
|
||||||
* | |
|
|
||||||
* | |
|
|
||||||
* | |
|
|
||||||
* 3 ------ 2
|
|
||||||
* hole 3 is the same as hole 1, rotated 180 deg
|
|
||||||
* hole 4 is the same as hole 2, rotated 180 deg and is the same as hole 1, mirrored
|
|
||||||
*/
|
|
||||||
|
|
||||||
// First, create a rectangular hole for position 1 :
|
|
||||||
// 2 ------- 3
|
|
||||||
// | |
|
|
||||||
// | |
|
|
||||||
// | |
|
|
||||||
// 1 -------4
|
|
||||||
|
|
||||||
// Modified rectangles with one corner rounded. TODO: merging with oval thermals
|
|
||||||
// and possibly round too.
|
|
||||||
|
|
||||||
std::vector <wxPoint> corners_buffer; // Polygon buffer as vector
|
|
||||||
|
|
||||||
int dx = (aPad.m_Size.x / 2) + aThermalGap; // Cutout radius x
|
|
||||||
int dy = (aPad.m_Size.y / 2) + aThermalGap; // Cutout radius y
|
|
||||||
|
|
||||||
// The first point of polygon buffer is left lower corner, second the crosspoint of
|
|
||||||
// thermal spoke sides, the third is upper right corner and the rest are rounding
|
|
||||||
// vertices going anticlockwise. Note the inveted Y-axis in CG.
|
|
||||||
corners_buffer.push_back( wxPoint( -dx, -(aThermalGap / 4 + copper_thickness.y / 2) ) ); // Adds small miters to zone
|
|
||||||
corners_buffer.push_back( wxPoint( -(dx - aThermalGap / 4), -copper_thickness.y / 2 ) ); // fill and spoke corner
|
|
||||||
corners_buffer.push_back( wxPoint( -copper_thickness.x / 2, -copper_thickness.y / 2 ) );
|
|
||||||
corners_buffer.push_back( wxPoint( -copper_thickness.x / 2, -(dy - aThermalGap / 4) ) );
|
|
||||||
corners_buffer.push_back( wxPoint( -(aThermalGap / 4 + copper_thickness.x / 2), -dy ) );
|
|
||||||
|
|
||||||
int angle = aPad.GetOrientation();
|
|
||||||
int rounding_radius = (int) ( aThermalGap * aCorrectionFactor ); // Corner rounding radius
|
|
||||||
int angle_pg; // Polygon increment angle
|
|
||||||
|
|
||||||
for( int i = 0; i < aCircleToSegmentsCount / 4 + 1; i++ )
|
|
||||||
{
|
{
|
||||||
wxPoint corner_position = wxPoint( 0, -rounding_radius );
|
/* we create 4 copper holes and put them in position 1, 2, 3 and 4
|
||||||
RotatePoint( &corner_position, 1800 / aCircleToSegmentsCount ); // Start at half increment offset
|
* here is the area of the rectangular pad + its thermal gap
|
||||||
angle_pg = i * delta;
|
* the 4 copper holes remove the copper in order to create the thermal gap
|
||||||
RotatePoint( &corner_position, angle_pg ); // Rounding vector rotation
|
* 4 ------ 1
|
||||||
corner_position -= aPad.m_Size / 2; // Rounding vector + Pad corner offset
|
* | |
|
||||||
corners_buffer.push_back( wxPoint( corner_position.x, corner_position.y ) );
|
* | |
|
||||||
}
|
* | |
|
||||||
|
* | |
|
||||||
|
* 3 ------ 2
|
||||||
|
* hole 3 is the same as hole 1, rotated 180 deg
|
||||||
|
* hole 4 is the same as hole 2, rotated 180 deg and is the same as hole 1, mirrored
|
||||||
|
*/
|
||||||
|
|
||||||
for( int irect = 0; irect < 2; irect++ )
|
// First, create a rectangular hole for position 1 :
|
||||||
{
|
// 2 ------- 3
|
||||||
for( unsigned ic = 0; ic < corners_buffer.size(); ic++ )
|
// | |
|
||||||
|
// | |
|
||||||
|
// | |
|
||||||
|
// 1 -------4
|
||||||
|
|
||||||
|
// Modified rectangles with one corner rounded. TODO: merging with oval thermals
|
||||||
|
// and possibly round too.
|
||||||
|
|
||||||
|
std::vector <wxPoint> corners_buffer; // Polygon buffer as vector
|
||||||
|
|
||||||
|
int dx = (aPad.GetSize().x / 2) + aThermalGap; // Cutout radius x
|
||||||
|
int dy = (aPad.GetSize().y / 2) + aThermalGap; // Cutout radius y
|
||||||
|
|
||||||
|
// The first point of polygon buffer is left lower corner, second the crosspoint of
|
||||||
|
// thermal spoke sides, the third is upper right corner and the rest are rounding
|
||||||
|
// vertices going anticlockwise. Note the inveted Y-axis in CG.
|
||||||
|
corners_buffer.push_back( wxPoint( -dx, -(aThermalGap / 4 + copper_thickness.y / 2) ) ); // Adds small miters to zone
|
||||||
|
corners_buffer.push_back( wxPoint( -(dx - aThermalGap / 4), -copper_thickness.y / 2 ) ); // fill and spoke corner
|
||||||
|
corners_buffer.push_back( wxPoint( -copper_thickness.x / 2, -copper_thickness.y / 2 ) );
|
||||||
|
corners_buffer.push_back( wxPoint( -copper_thickness.x / 2, -(dy - aThermalGap / 4) ) );
|
||||||
|
corners_buffer.push_back( wxPoint( -(aThermalGap / 4 + copper_thickness.x / 2), -dy ) );
|
||||||
|
|
||||||
|
int angle = aPad.GetOrientation();
|
||||||
|
int rounding_radius = (int) ( aThermalGap * aCorrectionFactor ); // Corner rounding radius
|
||||||
|
int angle_pg; // Polygon increment angle
|
||||||
|
|
||||||
|
for( int i = 0; i < aCircleToSegmentsCount / 4 + 1; i++ )
|
||||||
{
|
{
|
||||||
wxPoint cpos = corners_buffer[ic];
|
wxPoint corner_position = wxPoint( 0, -rounding_radius );
|
||||||
RotatePoint( &cpos, angle ); // Rotate according to module orientation
|
|
||||||
cpos += PadShapePos; // Shift origin to position
|
// Start at half increment offset
|
||||||
aCornerBuffer.push_back( CPolyPt( cpos.x, cpos.y ) );
|
RotatePoint( &corner_position, 1800 / aCircleToSegmentsCount );
|
||||||
|
angle_pg = i * delta;
|
||||||
|
|
||||||
|
RotatePoint( &corner_position, angle_pg ); // Rounding vector rotation
|
||||||
|
corner_position -= aPad.GetSize() / 2; // Rounding vector + Pad corner offset
|
||||||
|
|
||||||
|
corners_buffer.push_back( wxPoint( corner_position.x, corner_position.y ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
aCornerBuffer.back().end_contour = true;
|
for( int irect = 0; irect < 2; irect++ )
|
||||||
angle += 1800; // this is calculate hole 3
|
|
||||||
|
|
||||||
if( angle >= 3600 )
|
|
||||||
angle -= 3600;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create holes, that are the mirrored from the previous holes
|
|
||||||
for( unsigned ic = 0; ic < corners_buffer.size(); ic++ )
|
|
||||||
{
|
|
||||||
wxPoint swap = corners_buffer[ic];
|
|
||||||
swap.x = -swap.x;
|
|
||||||
corners_buffer[ic] = swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now add corner 4 and 2 (2 is the corner 4 rotated by 180 deg
|
|
||||||
for( int irect = 0; irect < 2; irect++ )
|
|
||||||
{
|
|
||||||
for( unsigned ic = 0; ic < corners_buffer.size(); ic++ )
|
|
||||||
{
|
{
|
||||||
wxPoint cpos = corners_buffer[ic];
|
for( unsigned ic = 0; ic < corners_buffer.size(); ic++ )
|
||||||
RotatePoint( &cpos, angle );
|
{
|
||||||
cpos += PadShapePos;
|
wxPoint cpos = corners_buffer[ic];
|
||||||
aCornerBuffer.push_back( CPolyPt( cpos.x, cpos.y ) );
|
RotatePoint( &cpos, angle ); // Rotate according to module orientation
|
||||||
|
cpos += PadShapePos; // Shift origin to position
|
||||||
|
aCornerBuffer.push_back( CPolyPt( cpos.x, cpos.y ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
aCornerBuffer.back().end_contour = true;
|
||||||
|
angle += 1800; // this is calculate hole 3
|
||||||
|
|
||||||
|
if( angle >= 3600 )
|
||||||
|
angle -= 3600;
|
||||||
}
|
}
|
||||||
|
|
||||||
aCornerBuffer.back().end_contour = true;
|
// Create holes, that are the mirrored from the previous holes
|
||||||
angle += 1800;
|
for( unsigned ic = 0; ic < corners_buffer.size(); ic++ )
|
||||||
|
{
|
||||||
|
wxPoint swap = corners_buffer[ic];
|
||||||
|
swap.x = -swap.x;
|
||||||
|
corners_buffer[ic] = swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now add corner 4 and 2 (2 is the corner 4 rotated by 180 deg
|
||||||
|
for( int irect = 0; irect < 2; irect++ )
|
||||||
|
{
|
||||||
|
for( unsigned ic = 0; ic < corners_buffer.size(); ic++ )
|
||||||
|
{
|
||||||
|
wxPoint cpos = corners_buffer[ic];
|
||||||
|
RotatePoint( &cpos, angle );
|
||||||
|
cpos += PadShapePos;
|
||||||
|
aCornerBuffer.push_back( CPolyPt( cpos.x, cpos.y ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
aCornerBuffer.back().end_contour = true;
|
||||||
|
angle += 1800;
|
||||||
|
|
||||||
|
if( angle >= 3600 )
|
||||||
|
angle -= 3600;
|
||||||
|
}
|
||||||
|
|
||||||
if( angle >= 3600 )
|
|
||||||
angle -= 3600;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
default:
|
||||||
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1181,7 +1181,7 @@ SEARCH_RESULT BOARD::Visit( INSPECTOR* inspector, const void* testData,
|
||||||
* D_PAD* pad = (D_PAD*) item;
|
* D_PAD* pad = (D_PAD*) item;
|
||||||
* if( pad->HitTest( refPos ) )
|
* if( pad->HitTest( refPos ) )
|
||||||
* {
|
* {
|
||||||
* if( layer_mask & pad->m_layerMask )
|
* if( layer_mask & pad->GetLayerMask() )
|
||||||
* {
|
* {
|
||||||
* found = item;
|
* found = item;
|
||||||
* return SEARCH_QUIT;
|
* return SEARCH_QUIT;
|
||||||
|
@ -1572,11 +1572,11 @@ D_PAD* BOARD::GetPadFast( const wxPoint& aPosition, int aLayerMask )
|
||||||
{
|
{
|
||||||
D_PAD* pad = m_NetInfo.GetPad(i);
|
D_PAD* pad = m_NetInfo.GetPad(i);
|
||||||
|
|
||||||
if( pad->m_Pos != aPosition )
|
if( pad->GetPosition() != aPosition )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Pad found, it must be on the correct layer */
|
/* Pad found, it must be on the correct layer */
|
||||||
if( pad->m_layerMask & aLayerMask )
|
if( pad->GetLayerMask() & aLayerMask )
|
||||||
return pad;
|
return pad;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1603,10 +1603,10 @@ D_PAD* BOARD::GetPad( std::vector<D_PAD*>& aPadList, const wxPoint& aPosition, i
|
||||||
|
|
||||||
D_PAD* pad = aPadList[idx];
|
D_PAD* pad = aPadList[idx];
|
||||||
|
|
||||||
if( pad->m_Pos == aPosition ) // candidate found
|
if( pad->GetPosition() == aPosition ) // candidate found
|
||||||
{
|
{
|
||||||
// The pad must match the layer mask:
|
// The pad must match the layer mask:
|
||||||
if( (aLayerMask & pad->m_layerMask) != 0 )
|
if( (aLayerMask & pad->GetLayerMask()) != 0 )
|
||||||
return pad;
|
return pad;
|
||||||
|
|
||||||
// More than one pad can be at aPosition
|
// More than one pad can be at aPosition
|
||||||
|
@ -1616,18 +1616,18 @@ D_PAD* BOARD::GetPad( std::vector<D_PAD*>& aPadList, const wxPoint& aPosition, i
|
||||||
for( int ii = idx+1; ii <= idxmax; ii++ )
|
for( int ii = idx+1; ii <= idxmax; ii++ )
|
||||||
{
|
{
|
||||||
pad = aPadList[ii];
|
pad = aPadList[ii];
|
||||||
if( pad->m_Pos != aPosition )
|
if( pad->GetPosition() != aPosition )
|
||||||
break;
|
break;
|
||||||
if( (aLayerMask & pad->m_layerMask) != 0 )
|
if( (aLayerMask & pad->GetLayerMask()) != 0 )
|
||||||
return pad;
|
return pad;
|
||||||
}
|
}
|
||||||
// search previous
|
// search previous
|
||||||
for( int ii = idx-1 ;ii >=0; ii-- )
|
for( int ii = idx-1 ;ii >=0; ii-- )
|
||||||
{
|
{
|
||||||
pad = aPadList[ii];
|
pad = aPadList[ii];
|
||||||
if( pad->m_Pos != aPosition )
|
if( pad->GetPosition() != aPosition )
|
||||||
break;
|
break;
|
||||||
if( (aLayerMask & pad->m_layerMask) != 0 )
|
if( (aLayerMask & pad->GetLayerMask()) != 0 )
|
||||||
return pad;
|
return pad;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1635,9 +1635,9 @@ D_PAD* BOARD::GetPad( std::vector<D_PAD*>& aPadList, const wxPoint& aPosition, i
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( pad->m_Pos.x == aPosition.x ) // Must search considering Y coordinate
|
if( pad->GetPosition().x == aPosition.x ) // Must search considering Y coordinate
|
||||||
{
|
{
|
||||||
if(pad->m_Pos.y < aPosition.y) // Must search after this item
|
if(pad->GetPosition().y < aPosition.y) // Must search after this item
|
||||||
{
|
{
|
||||||
idx += delta;
|
idx += delta;
|
||||||
if( idx > idxmax )
|
if( idx > idxmax )
|
||||||
|
@ -1650,7 +1650,7 @@ D_PAD* BOARD::GetPad( std::vector<D_PAD*>& aPadList, const wxPoint& aPosition, i
|
||||||
idx = 0;
|
idx = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( pad->m_Pos.x < aPosition.x ) // Must search after this item
|
else if( pad->GetPosition().x < aPosition.x ) // Must search after this item
|
||||||
{
|
{
|
||||||
idx += delta;
|
idx += delta;
|
||||||
if( idx > idxmax )
|
if( idx > idxmax )
|
||||||
|
@ -1674,9 +1674,9 @@ D_PAD* BOARD::GetPad( std::vector<D_PAD*>& aPadList, const wxPoint& aPosition, i
|
||||||
*/
|
*/
|
||||||
static bool sortPadsByXthenYCoord( D_PAD* const & ref, D_PAD* const & comp )
|
static bool sortPadsByXthenYCoord( D_PAD* const & ref, D_PAD* const & comp )
|
||||||
{
|
{
|
||||||
if( ref->m_Pos.x == comp->m_Pos.x )
|
if( ref->GetPosition().x == comp->GetPosition().x )
|
||||||
return ref->m_Pos.y < comp->m_Pos.y;
|
return ref->GetPosition().y < comp->GetPosition().y;
|
||||||
return ref->m_Pos.x < comp->m_Pos.x;
|
return ref->GetPosition().x < comp->GetPosition().x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1919,13 +1919,13 @@ TRACK* BOARD::MarkTrace( TRACK* aTrace,
|
||||||
if( track->GetState( BEGIN_ONPAD ) )
|
if( track->GetState( BEGIN_ONPAD ) )
|
||||||
{
|
{
|
||||||
D_PAD * pad = (D_PAD *) track->start;
|
D_PAD * pad = (D_PAD *) track->start;
|
||||||
lenDie += (double) pad->m_LengthDie;
|
lenDie += (double) pad->GetDieLength();
|
||||||
}
|
}
|
||||||
|
|
||||||
if( track->GetState( END_ONPAD ) )
|
if( track->GetState( END_ONPAD ) )
|
||||||
{
|
{
|
||||||
D_PAD * pad = (D_PAD *) track->end;
|
D_PAD * pad = (D_PAD *) track->end;
|
||||||
lenDie += (double) pad->m_LengthDie;
|
lenDie += (double) pad->GetDieLength();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1949,13 +1949,13 @@ TRACK* BOARD::MarkTrace( TRACK* aTrace,
|
||||||
if( track->GetState( BEGIN_ONPAD ) )
|
if( track->GetState( BEGIN_ONPAD ) )
|
||||||
{
|
{
|
||||||
D_PAD * pad = (D_PAD *) track->start;
|
D_PAD * pad = (D_PAD *) track->start;
|
||||||
lenDie += (double) pad->m_LengthDie;
|
lenDie += (double) pad->GetDieLength();
|
||||||
}
|
}
|
||||||
|
|
||||||
if( track->GetState( END_ONPAD ) )
|
if( track->GetState( END_ONPAD ) )
|
||||||
{
|
{
|
||||||
D_PAD * pad = (D_PAD *) track->end;
|
D_PAD * pad = (D_PAD *) track->end;
|
||||||
lenDie += (double) pad->m_LengthDie;
|
lenDie += (double) pad->GetDieLength();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,8 @@
|
||||||
#include <class_track.h>
|
#include <class_track.h>
|
||||||
|
|
||||||
|
|
||||||
BOARD_DESIGN_SETTINGS::BOARD_DESIGN_SETTINGS()
|
BOARD_DESIGN_SETTINGS::BOARD_DESIGN_SETTINGS() :
|
||||||
|
m_Pad_Master( 0 )
|
||||||
{
|
{
|
||||||
m_EnabledLayers = ALL_LAYERS; // All layers enabled at first.
|
m_EnabledLayers = ALL_LAYERS; // All layers enabled at first.
|
||||||
// SetCopperLayerCount() will adjust this.
|
// SetCopperLayerCount() will adjust this.
|
||||||
|
@ -59,6 +60,48 @@ BOARD_DESIGN_SETTINGS::BOARD_DESIGN_SETTINGS()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BOARD_DESIGN_SETTINGS::AppendConfigs( PARAM_CFG_ARRAY* aResult )
|
||||||
|
{
|
||||||
|
m_Pad_Master.AppendConfigs( aResult );
|
||||||
|
|
||||||
|
aResult->push_back( new PARAM_CFG_INT( wxT( "BoardThickness" ),
|
||||||
|
&m_BoardThickness,
|
||||||
|
630, 0, 0xFFFF ) );
|
||||||
|
|
||||||
|
aResult->push_back( new PARAM_CFG_INT( wxT( "TxtPcbV" ),
|
||||||
|
&m_PcbTextSize.y,
|
||||||
|
600, TEXTS_MIN_SIZE, TEXTS_MAX_SIZE ) );
|
||||||
|
|
||||||
|
aResult->push_back( new PARAM_CFG_INT( wxT( "TxtPcbH" ),
|
||||||
|
&m_PcbTextSize.x,
|
||||||
|
600, TEXTS_MIN_SIZE, TEXTS_MAX_SIZE ) );
|
||||||
|
|
||||||
|
aResult->push_back( new PARAM_CFG_INT( wxT( "TxtModV" ), &m_ModuleTextSize.y,
|
||||||
|
500, TEXTS_MIN_SIZE, TEXTS_MAX_SIZE ) );
|
||||||
|
aResult->push_back( new PARAM_CFG_INT( wxT( "TxtModH" ), &m_ModuleTextSize.x,
|
||||||
|
500, TEXTS_MIN_SIZE, TEXTS_MAX_SIZE ) );
|
||||||
|
aResult->push_back( new PARAM_CFG_INT( wxT( "TxtModW" ), &m_ModuleTextWidth,
|
||||||
|
100, 1, TEXTS_MAX_WIDTH ) );
|
||||||
|
|
||||||
|
aResult->push_back( new PARAM_CFG_INT( wxT( "VEgarde" ),
|
||||||
|
&m_SolderMaskMargin,
|
||||||
|
100, 0, 10000 ) );
|
||||||
|
|
||||||
|
aResult->push_back( new PARAM_CFG_INT( wxT( "DrawLar" ),
|
||||||
|
&m_DrawSegmentWidth,
|
||||||
|
120, 0, 0xFFFF ) );
|
||||||
|
|
||||||
|
aResult->push_back( new PARAM_CFG_INT( wxT( "EdgeLar" ),
|
||||||
|
&m_EdgeSegmentWidth,
|
||||||
|
120, 0, 0xFFFF ) );
|
||||||
|
aResult->push_back( new PARAM_CFG_INT( wxT( "TxtLar" ),
|
||||||
|
&m_PcbTextWidth,
|
||||||
|
120, 0, 0xFFFF ) );
|
||||||
|
aResult->push_back( new PARAM_CFG_INT( wxT( "MSegLar" ), &m_ModuleSegmentWidth,
|
||||||
|
120, 0, 0xFFFF ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// see pcbstruct.h
|
// see pcbstruct.h
|
||||||
int BOARD_DESIGN_SETTINGS::GetVisibleLayers() const
|
int BOARD_DESIGN_SETTINGS::GetVisibleLayers() const
|
||||||
{
|
{
|
||||||
|
@ -123,11 +166,6 @@ void BOARD_DESIGN_SETTINGS::SetCopperLayerCount( int aNewLayerCount )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function SetEnabledLayers
|
|
||||||
* changes the bit-mask of enabled layers
|
|
||||||
* @param aMask = The new bit-mask of enabled layers
|
|
||||||
*/
|
|
||||||
void BOARD_DESIGN_SETTINGS::SetEnabledLayers( int aMask )
|
void BOARD_DESIGN_SETTINGS::SetEnabledLayers( int aMask )
|
||||||
{
|
{
|
||||||
// Back and front layers are always enabled.
|
// Back and front layers are always enabled.
|
||||||
|
|
|
@ -102,13 +102,13 @@ MODULE::MODULE( const MODULE& aModule ) :
|
||||||
m_LocalSolderPasteMargin = aModule.m_LocalSolderPasteMargin;
|
m_LocalSolderPasteMargin = aModule.m_LocalSolderPasteMargin;
|
||||||
m_LocalSolderPasteMarginRatio = aModule.m_LocalSolderPasteMarginRatio;
|
m_LocalSolderPasteMarginRatio = aModule.m_LocalSolderPasteMarginRatio;
|
||||||
|
|
||||||
/* Copy reference and value. */
|
// Copy reference and value.
|
||||||
m_Reference = new TEXTE_MODULE( *aModule.m_Reference );
|
m_Reference = new TEXTE_MODULE( *aModule.m_Reference );
|
||||||
m_Reference->SetParent( this );
|
m_Reference->SetParent( this );
|
||||||
m_Value = new TEXTE_MODULE( *aModule.m_Value );
|
m_Value = new TEXTE_MODULE( *aModule.m_Value );
|
||||||
m_Value->SetParent( this );
|
m_Value->SetParent( this );
|
||||||
|
|
||||||
/* Copy auxiliary data: Pads */
|
// Copy auxiliary data: Pads
|
||||||
m_Pads.DeleteAll();
|
m_Pads.DeleteAll();
|
||||||
|
|
||||||
for( D_PAD* pad = aModule.m_Pads; pad; pad = pad->Next() )
|
for( D_PAD* pad = aModule.m_Pads; pad; pad = pad->Next() )
|
||||||
|
@ -118,7 +118,7 @@ MODULE::MODULE( const MODULE& aModule ) :
|
||||||
m_Pads.PushBack( newpad );
|
m_Pads.PushBack( newpad );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy auxiliary data: Drawings */
|
// Copy auxiliary data: Drawings
|
||||||
m_Drawings.DeleteAll();
|
m_Drawings.DeleteAll();
|
||||||
|
|
||||||
for( BOARD_ITEM* item = aModule.m_Drawings; item; item = item->Next() )
|
for( BOARD_ITEM* item = aModule.m_Drawings; item; item = item->Next() )
|
||||||
|
@ -138,7 +138,7 @@ MODULE::MODULE( const MODULE& aModule ) :
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy auxiliary data: 3D_Drawings info */
|
// Copy auxiliary data: 3D_Drawings info
|
||||||
m_3D_Drawings.DeleteAll();
|
m_3D_Drawings.DeleteAll();
|
||||||
|
|
||||||
for( S3D_MASTER* item = aModule.m_3D_Drawings; item; item = item->Next() )
|
for( S3D_MASTER* item = aModule.m_3D_Drawings; item; item = item->Next() )
|
||||||
|
@ -217,11 +217,11 @@ void MODULE::Copy( MODULE* aModule )
|
||||||
m_LocalSolderPasteMargin = aModule->m_LocalSolderPasteMargin;
|
m_LocalSolderPasteMargin = aModule->m_LocalSolderPasteMargin;
|
||||||
m_LocalSolderPasteMarginRatio = aModule->m_LocalSolderPasteMarginRatio;
|
m_LocalSolderPasteMarginRatio = aModule->m_LocalSolderPasteMarginRatio;
|
||||||
|
|
||||||
/* Copy reference and value. */
|
// Copy reference and value.
|
||||||
m_Reference->Copy( aModule->m_Reference );
|
m_Reference->Copy( aModule->m_Reference );
|
||||||
m_Value->Copy( aModule->m_Value );
|
m_Value->Copy( aModule->m_Value );
|
||||||
|
|
||||||
/* Copy auxiliary data: Pads */
|
// Copy auxiliary data: Pads
|
||||||
m_Pads.DeleteAll();
|
m_Pads.DeleteAll();
|
||||||
|
|
||||||
for( D_PAD* pad = aModule->m_Pads; pad; pad = pad->Next() )
|
for( D_PAD* pad = aModule->m_Pads; pad; pad = pad->Next() )
|
||||||
|
@ -231,7 +231,7 @@ void MODULE::Copy( MODULE* aModule )
|
||||||
m_Pads.PushBack( newpad );
|
m_Pads.PushBack( newpad );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy auxiliary data: Drawings */
|
// Copy auxiliary data: Drawings
|
||||||
m_Drawings.DeleteAll();
|
m_Drawings.DeleteAll();
|
||||||
|
|
||||||
for( BOARD_ITEM* item = aModule->m_Drawings; item; item = item->Next() )
|
for( BOARD_ITEM* item = aModule->m_Drawings; item; item = item->Next() )
|
||||||
|
@ -258,7 +258,7 @@ void MODULE::Copy( MODULE* aModule )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy auxiliary data: 3D_Drawings info */
|
// Copy auxiliary data: 3D_Drawings info
|
||||||
m_3D_Drawings.DeleteAll();
|
m_3D_Drawings.DeleteAll();
|
||||||
|
|
||||||
// Ensure there is one (or more) item in m_3D_Drawings
|
// Ensure there is one (or more) item in m_3D_Drawings
|
||||||
|
@ -314,7 +314,7 @@ void MODULE::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, int aDrawMode, const wxPoi
|
||||||
// Draws footprint anchor
|
// Draws footprint anchor
|
||||||
DrawAncre( aPanel, aDC, aOffset, DIM_ANCRE_MODULE, aDrawMode );
|
DrawAncre( aPanel, aDC, aOffset, DIM_ANCRE_MODULE, aDrawMode );
|
||||||
|
|
||||||
/* Draw graphic items */
|
// Draw graphic items
|
||||||
if( brd->IsElementVisible( MOD_REFERENCES_VISIBLE ) )
|
if( brd->IsElementVisible( MOD_REFERENCES_VISIBLE ) )
|
||||||
{
|
{
|
||||||
if( !(m_Reference->IsMoving()) )
|
if( !(m_Reference->IsMoving()) )
|
||||||
|
@ -549,8 +549,8 @@ D_PAD* MODULE::GetPad( const wxPoint& aPosition, int aLayerMask )
|
||||||
{
|
{
|
||||||
for( D_PAD* pad = m_Pads; pad; pad = pad->Next() )
|
for( D_PAD* pad = m_Pads; pad; pad = pad->Next() )
|
||||||
{
|
{
|
||||||
/* ... and on the correct layer. */
|
// ... and on the correct layer.
|
||||||
if( ( pad->m_layerMask & aLayerMask ) == 0 )
|
if( ( pad->GetLayerMask() & aLayerMask ) == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( pad->HitTest( aPosition ) )
|
if( pad->HitTest( aPosition ) )
|
||||||
|
|
|
@ -29,8 +29,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef _MODULE_H_
|
#ifndef MODULE_H_
|
||||||
#define _MODULE_H_
|
#define MODULE_H_
|
||||||
|
|
||||||
|
|
||||||
#include <dlist.h>
|
#include <dlist.h>
|
||||||
|
@ -410,4 +410,4 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif // _MODULE_H_
|
#endif // MODULE_H_
|
||||||
|
|
|
@ -161,22 +161,9 @@ void MODULE::Flip( const wxPoint& aCentre )
|
||||||
NEGATE( m_Orient );
|
NEGATE( m_Orient );
|
||||||
NORMALIZE_ANGLE_POS( m_Orient );
|
NORMALIZE_ANGLE_POS( m_Orient );
|
||||||
|
|
||||||
// Mirror inversion layers pads.
|
// Mirror pads to other side of board about the x axis, i.e. vertically.
|
||||||
for( D_PAD* pad = m_Pads; pad; pad = pad->Next() )
|
for( D_PAD* pad = m_Pads; pad; pad = pad->Next() )
|
||||||
{
|
pad->Flip( m_Pos.y );
|
||||||
pad->m_Pos.y -= m_Pos.y;
|
|
||||||
pad->m_Pos.y = -pad->m_Pos.y;
|
|
||||||
pad->m_Pos.y += m_Pos.y;
|
|
||||||
|
|
||||||
NEGATE( pad->m_Pos0.y );
|
|
||||||
NEGATE( pad->m_Offset.y );
|
|
||||||
NEGATE( pad->m_DeltaSize.y );
|
|
||||||
|
|
||||||
NEGATE_AND_NORMALIZE_ANGLE_POS( pad->m_Orient );
|
|
||||||
|
|
||||||
// flip pads layers
|
|
||||||
pad->m_layerMask = ChangeSideMaskLayer( pad->m_layerMask );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mirror reference.
|
// Mirror reference.
|
||||||
pt_texte = m_Reference;
|
pt_texte = m_Reference;
|
||||||
|
@ -301,7 +288,7 @@ void MODULE::SetPosition( const wxPoint& newpos )
|
||||||
|
|
||||||
for( D_PAD* pad = m_Pads; pad; pad = pad->Next() )
|
for( D_PAD* pad = m_Pads; pad; pad = pad->Next() )
|
||||||
{
|
{
|
||||||
pad->m_Pos += delta;
|
pad->SetPosition( pad->GetPosition() + delta );
|
||||||
}
|
}
|
||||||
|
|
||||||
for( EDA_ITEM* item = m_Drawings; item; item = item->Next() )
|
for( EDA_ITEM* item = m_Drawings; item; item = item->Next() )
|
||||||
|
@ -334,25 +321,22 @@ void MODULE::SetPosition( const wxPoint& newpos )
|
||||||
|
|
||||||
void MODULE::SetOrientation( double newangle )
|
void MODULE::SetOrientation( double newangle )
|
||||||
{
|
{
|
||||||
int px, py;
|
double angleChange = newangle - m_Orient; // change in rotation
|
||||||
|
wxPoint pt;
|
||||||
|
|
||||||
newangle -= m_Orient; // = Change in rotation
|
NORMALIZE_ANGLE_POS( newangle );
|
||||||
|
|
||||||
m_Orient += newangle;
|
m_Orient = newangle;
|
||||||
|
|
||||||
NORMALIZE_ANGLE_POS( m_Orient );
|
|
||||||
|
|
||||||
for( D_PAD* pad = m_Pads; pad; pad = pad->Next() )
|
for( D_PAD* pad = m_Pads; pad; pad = pad->Next() )
|
||||||
{
|
{
|
||||||
px = pad->m_Pos0.x;
|
pt = pad->GetPos0();
|
||||||
py = pad->m_Pos0.y;
|
|
||||||
|
|
||||||
pad->m_Orient += newangle; // change m_Orientation
|
pad->SetOrientation( pad->GetOrientation() + angleChange );
|
||||||
NORMALIZE_ANGLE_POS( pad->m_Orient );
|
|
||||||
|
|
||||||
RotatePoint( &px, &py, m_Orient );
|
RotatePoint( &pt, m_Orient );
|
||||||
pad->m_Pos.x = m_Pos.x + px;
|
|
||||||
pad->m_Pos.y = m_Pos.y + py;
|
pad->SetPosition( GetPosition() + pt );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update of the reference and value.
|
// Update of the reference and value.
|
||||||
|
|
|
@ -100,7 +100,7 @@ void NETINFO_ITEM::DisplayInfo( EDA_DRAW_FRAME* frame )
|
||||||
if( pad->GetNet() == GetNet() )
|
if( pad->GetNet() == GetNet() )
|
||||||
{
|
{
|
||||||
count++;
|
count++;
|
||||||
lengthdie += pad->m_LengthDie;
|
lengthdie += pad->GetDieLength();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -172,6 +172,7 @@ void RATSNEST_ITEM::Draw( EDA_DRAW_PANEL* panel,
|
||||||
|
|
||||||
int color = g_ColorsSettings.GetItemColor(RATSNEST_VISIBLE);
|
int color = g_ColorsSettings.GetItemColor(RATSNEST_VISIBLE);
|
||||||
|
|
||||||
GRLine( panel->GetClipBox(), DC, m_PadStart->m_Pos - aOffset,
|
GRLine( panel->GetClipBox(), DC,
|
||||||
m_PadEnd->m_Pos - aOffset, 0, color );
|
m_PadStart->GetPosition() - aOffset,
|
||||||
|
m_PadEnd->GetPosition() - aOffset, 0, color );
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include <confirm.h>
|
#include <confirm.h>
|
||||||
#include <kicad_string.h>
|
#include <kicad_string.h>
|
||||||
#include <trigo.h>
|
#include <trigo.h>
|
||||||
|
#include <protos.h>
|
||||||
#include <richio.h>
|
#include <richio.h>
|
||||||
#include <wxstruct.h>
|
#include <wxstruct.h>
|
||||||
#include <macros.h>
|
#include <macros.h>
|
||||||
|
@ -47,7 +48,8 @@
|
||||||
int D_PAD::m_PadSketchModePenSize = 0; // Pen size used to draw pads in sketch mode
|
int D_PAD::m_PadSketchModePenSize = 0; // Pen size used to draw pads in sketch mode
|
||||||
|
|
||||||
|
|
||||||
D_PAD::D_PAD( MODULE* parent ) : BOARD_CONNECTED_ITEM( parent, PCB_PAD_T )
|
D_PAD::D_PAD( MODULE* parent ) :
|
||||||
|
BOARD_CONNECTED_ITEM( parent, PCB_PAD_T )
|
||||||
{
|
{
|
||||||
m_NumPadName = 0;
|
m_NumPadName = 0;
|
||||||
|
|
||||||
|
@ -55,40 +57,35 @@ D_PAD::D_PAD( MODULE* parent ) : BOARD_CONNECTED_ITEM( parent, PCB_PAD_T )
|
||||||
m_Orient = 0; // Pad rotation in 1/10 degrees
|
m_Orient = 0; // Pad rotation in 1/10 degrees
|
||||||
m_LengthDie = 0;
|
m_LengthDie = 0;
|
||||||
|
|
||||||
if( m_Parent && (m_Parent->Type() == PCB_MODULE_T) )
|
if( m_Parent && m_Parent->Type() == PCB_MODULE_T )
|
||||||
{
|
{
|
||||||
m_Pos = ( (MODULE*) m_Parent )->GetPosition();
|
m_Pos = GetParent()->GetPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_PadShape = PAD_CIRCLE; // Shape: PAD_CIRCLE, PAD_RECT PAD_OVAL
|
m_PadShape = PAD_CIRCLE; // Shape: PAD_CIRCLE, PAD_RECT PAD_OVAL
|
||||||
// PAD_TRAPEZOID
|
// PAD_TRAPEZOID
|
||||||
m_Attribut = PAD_STANDARD; // Type: NORMAL, PAD_SMD, PAD_CONN
|
m_Attribute = PAD_STANDARD; // Type: NORMAL, PAD_SMD, PAD_CONN
|
||||||
m_DrillShape = PAD_CIRCLE; // Drill shape = circle
|
m_DrillShape = PAD_CIRCLE; // Drill shape = circle
|
||||||
m_LocalClearance = 0;
|
m_LocalClearance = 0;
|
||||||
m_LocalSolderMaskMargin = 0;
|
m_LocalSolderMaskMargin = 0;
|
||||||
m_LocalSolderPasteMargin = 0;
|
m_LocalSolderPasteMargin = 0;
|
||||||
m_LocalSolderPasteMarginRatio = 0.0;
|
m_LocalSolderPasteMarginRatio = 0.0;
|
||||||
m_layerMask = PAD_STANDARD_DEFAULT_LAYERS; // set layers mask to
|
|
||||||
// default for a standard pad
|
|
||||||
|
|
||||||
SetSubRatsnest( 0 ); // used in ratsnest calculations
|
// set layers mask to default for a standard pad
|
||||||
ComputeShapeMaxRadius();
|
m_layerMask = PAD_STANDARD_DEFAULT_LAYERS;
|
||||||
|
|
||||||
|
SetSubRatsnest( 0 ); // used in ratsnest calculations
|
||||||
|
|
||||||
|
m_boundingRadius = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
D_PAD::~D_PAD()
|
int D_PAD::boundingRadius() const
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Calculate the radius of the circle containing the pad.
|
|
||||||
*/
|
|
||||||
int D_PAD::GetMaxRadius() const
|
|
||||||
{
|
{
|
||||||
int x, y;
|
int x, y;
|
||||||
int radius;
|
int radius;
|
||||||
|
|
||||||
switch( m_PadShape & 0x7F )
|
switch( GetShape() )
|
||||||
{
|
{
|
||||||
case PAD_CIRCLE:
|
case PAD_CIRCLE:
|
||||||
radius = m_Size.x / 2;
|
radius = m_Size.x / 2;
|
||||||
|
@ -110,30 +107,19 @@ int D_PAD::GetMaxRadius() const
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
radius = 0; // quiet compiler
|
radius = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return radius;
|
return radius;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Calculate the radius of the circle containing the pad.
|
|
||||||
*/
|
|
||||||
void D_PAD::ComputeShapeMaxRadius()
|
|
||||||
{
|
|
||||||
m_ShapeMaxRadius = GetMaxRadius();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function GetBoundingBox
|
|
||||||
* returns the bounding box of this pad
|
|
||||||
* Mainly used to redraw the screen area occupied by the pad
|
|
||||||
*/
|
|
||||||
EDA_RECT D_PAD::GetBoundingBox() const
|
EDA_RECT D_PAD::GetBoundingBox() const
|
||||||
{
|
{
|
||||||
EDA_RECT area;
|
EDA_RECT area;
|
||||||
int radius = GetMaxRadius(); // Calculate the radius of the area, considered as a circle
|
|
||||||
|
// radius of pad area, enclosed in minimum sized circle
|
||||||
|
int radius = boundingRadius();
|
||||||
|
|
||||||
area.SetOrigin( m_Pos );
|
area.SetOrigin( m_Pos );
|
||||||
area.Inflate( radius );
|
area.Inflate( radius );
|
||||||
|
@ -142,6 +128,49 @@ EDA_RECT D_PAD::GetBoundingBox() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void D_PAD::SetOrientation( double aAngle )
|
||||||
|
{
|
||||||
|
NORMALIZE_ANGLE_POS( aAngle );
|
||||||
|
m_Orient = aAngle;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void D_PAD::Flip( int aTranslationY )
|
||||||
|
{
|
||||||
|
int y = GetPosition().y - aTranslationY;
|
||||||
|
|
||||||
|
y = -y; // invert about x axis.
|
||||||
|
|
||||||
|
y += aTranslationY;
|
||||||
|
|
||||||
|
SetY( y );
|
||||||
|
|
||||||
|
NEGATE( m_Pos0.y );
|
||||||
|
NEGATE( m_Offset.y );
|
||||||
|
NEGATE( m_DeltaSize.y );
|
||||||
|
|
||||||
|
SetOrientation( -GetOrientation() );
|
||||||
|
|
||||||
|
// flip pads layers
|
||||||
|
SetLayerMask( ChangeSideMaskLayer( m_layerMask ) );
|
||||||
|
|
||||||
|
// m_boundingRadius = -1; the shape has not been changed
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void D_PAD::AppendConfigs( PARAM_CFG_ARRAY* aResult )
|
||||||
|
{
|
||||||
|
aResult->push_back( new PARAM_CFG_INT( wxT( "PadDrlX" ), &m_Drill.x,
|
||||||
|
320, 0, 0x7FFF ) );
|
||||||
|
|
||||||
|
aResult->push_back( new PARAM_CFG_INT( wxT( "PadDimH" ), &m_Size.x,
|
||||||
|
550, 0, 0x7FFF ) );
|
||||||
|
|
||||||
|
aResult->push_back( new PARAM_CFG_INT( wxT( "PadDimV" ), &m_Size.y,
|
||||||
|
550, 0, 0x7FFF ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Returns the position of the pad.
|
// Returns the position of the pad.
|
||||||
const wxPoint D_PAD::ReturnShapePos()
|
const wxPoint D_PAD::ReturnShapePos()
|
||||||
{
|
{
|
||||||
|
@ -265,9 +294,9 @@ void D_PAD::Copy( D_PAD* source )
|
||||||
m_Size = source->m_Size;
|
m_Size = source->m_Size;
|
||||||
m_DeltaSize = source->m_DeltaSize;
|
m_DeltaSize = source->m_DeltaSize;
|
||||||
m_Pos0 = source->m_Pos0;
|
m_Pos0 = source->m_Pos0;
|
||||||
m_ShapeMaxRadius = source->m_ShapeMaxRadius;
|
m_boundingRadius = source->m_boundingRadius;
|
||||||
m_PadShape = source->m_PadShape;
|
m_PadShape = source->m_PadShape;
|
||||||
m_Attribut = source->m_Attribut;
|
m_Attribute = source->m_Attribute;
|
||||||
m_Orient = source->m_Orient;
|
m_Orient = source->m_Orient;
|
||||||
m_LengthDie = source->m_LengthDie;
|
m_LengthDie = source->m_LengthDie;
|
||||||
m_LocalClearance = source->m_LocalClearance;
|
m_LocalClearance = source->m_LocalClearance;
|
||||||
|
@ -581,9 +610,9 @@ void D_PAD::DisplayInfo( EDA_DRAW_FRAME* frame )
|
||||||
valeur_param( m_Pos.y, Line );
|
valeur_param( m_Pos.y, Line );
|
||||||
frame->AppendMsgPanel( _( "Y pos" ), Line, LIGHTBLUE );
|
frame->AppendMsgPanel( _( "Y pos" ), Line, LIGHTBLUE );
|
||||||
|
|
||||||
if( m_LengthDie )
|
if( GetDieLength() )
|
||||||
{
|
{
|
||||||
valeur_param( m_LengthDie, Line );
|
valeur_param( GetDieLength(), Line );
|
||||||
frame->AppendMsgPanel( _( "Length on die" ), Line, CYAN );
|
frame->AppendMsgPanel( _( "Length on die" ), Line, CYAN );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -596,12 +625,6 @@ bool D_PAD::IsOnLayer( int aLayer ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function HitTest
|
|
||||||
* tests if the given wxPoint is within the bounds of this object.
|
|
||||||
* @param refPos A wxPoint to test
|
|
||||||
* @return bool - true if a hit, else false
|
|
||||||
*/
|
|
||||||
bool D_PAD::HitTest( const wxPoint& refPos )
|
bool D_PAD::HitTest( const wxPoint& refPos )
|
||||||
{
|
{
|
||||||
int dx, dy;
|
int dx, dy;
|
||||||
|
@ -611,8 +634,10 @@ bool D_PAD::HitTest( const wxPoint& refPos )
|
||||||
|
|
||||||
wxPoint delta = refPos - shape_pos;
|
wxPoint delta = refPos - shape_pos;
|
||||||
|
|
||||||
/* Quick test: a test point must be inside the circle. */
|
// first test: a test point must be inside a minimum sized bounding circle.
|
||||||
if( ( abs( delta.x ) > m_ShapeMaxRadius ) || ( abs( delta.y ) > m_ShapeMaxRadius ) )
|
int radius = GetBoundingRadius();
|
||||||
|
|
||||||
|
if( ( abs( delta.x ) > radius ) || ( abs( delta.y ) > radius ) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
dx = m_Size.x >> 1; // dx also is the radius for rounded pads
|
dx = m_Size.x >> 1; // dx also is the radius for rounded pads
|
||||||
|
@ -716,7 +741,7 @@ wxString D_PAD::ShowPadShape() const
|
||||||
|
|
||||||
wxString D_PAD::ShowPadAttr() const
|
wxString D_PAD::ShowPadAttr() const
|
||||||
{
|
{
|
||||||
switch( m_Attribut & 0x0F )
|
switch( GetAttribute() )
|
||||||
{
|
{
|
||||||
case PAD_STANDARD:
|
case PAD_STANDARD:
|
||||||
return _( "Std" );
|
return _( "Std" );
|
||||||
|
|
|
@ -27,14 +27,15 @@
|
||||||
* @brief Pad object description
|
* @brief Pad object description
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _PAD_H_
|
#ifndef PAD_H_
|
||||||
#define _PAD_H_
|
#define PAD_H_
|
||||||
|
|
||||||
|
|
||||||
#include <class_board_item.h>
|
#include <class_board_item.h>
|
||||||
#include <class_board_connected_item.h>
|
#include <class_board_connected_item.h>
|
||||||
#include <pad_shapes.h>
|
#include <pad_shapes.h>
|
||||||
#include <PolyLine.h>
|
#include <PolyLine.h>
|
||||||
|
#include <param_config.h> // PARAM_CFG_ARRAY
|
||||||
|
|
||||||
|
|
||||||
class LINE_READER;
|
class LINE_READER;
|
||||||
|
@ -91,86 +92,20 @@ public:
|
||||||
|
|
||||||
class D_PAD : public BOARD_CONNECTED_ITEM
|
class D_PAD : public BOARD_CONNECTED_ITEM
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
wxString m_Netname; // Full net name like /mysheet/mysubsheet/vout used by Eeschema
|
|
||||||
wxString m_ShortNetname; // short net name, like vout from /mysheet/mysubsheet/vout
|
|
||||||
|
|
||||||
/// Pad name (4 char) or a long identifier (used in pad name
|
|
||||||
/// comparisons because this is faster than string comparison)
|
|
||||||
union
|
|
||||||
{
|
|
||||||
#define PADNAMEZ 4
|
|
||||||
char m_Padname[PADNAMEZ]; // zero padded at end to full size
|
|
||||||
wxUint32 m_NumPadName; // same number of bytes as m_Padname[]
|
|
||||||
};
|
|
||||||
|
|
||||||
int m_SubRatsnest; // variable used in rats nest computations
|
|
||||||
// handle subnet (block) number in ratsnest connection
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
wxPoint m_Pos; // pad Position on board
|
static int m_PadSketchModePenSize; ///< Pen size used to draw pads in sketch mode
|
||||||
|
///< (mode used to print pads on silkscreen layer)
|
||||||
int m_layerMask; // Bitwise layer :1= copper layer, 15= cmp,
|
|
||||||
// 2..14 = internal layers
|
|
||||||
// 16 .. 31 = technical layers
|
|
||||||
|
|
||||||
int m_PadShape; // Shape: PAD_CIRCLE, PAD_RECT, PAD_OVAL, PAD_TRAPEZOID
|
|
||||||
int m_DrillShape; // Shape PAD_CIRCLE, PAD_OVAL
|
|
||||||
|
|
||||||
wxSize m_Drill; // Drill diam (drill shape = PAD_CIRCLE) or drill size
|
|
||||||
// (shape = OVAL) for drill shape = PAD_CIRCLE, drill
|
|
||||||
// diam = m_Drill.x
|
|
||||||
|
|
||||||
wxSize m_Offset; /* This parameter is useful only for oblong pads (it can be used for other
|
|
||||||
* shapes, but without any interest).
|
|
||||||
* this is the offset between the pad hole and the pad shape (you must
|
|
||||||
* understand here pad shape = copper area around the hole)
|
|
||||||
* Most of cases, the hole is the center of the shape (m_Offset = 0).
|
|
||||||
* But some board designers use oblong pads with a hole moved to one of the
|
|
||||||
* oblong pad shape ends.
|
|
||||||
* In all cases the pad position is the pad hole.
|
|
||||||
* The physical shape position (used to draw it for instance) is pad
|
|
||||||
* position (m_Pos) + m_Offset.
|
|
||||||
* D_PAD::ReturnShapePos() returns the physical shape position according to
|
|
||||||
* the offset and the pad rotation.*/
|
|
||||||
|
|
||||||
wxSize m_Size; // X and Y size ( relative to orient 0)
|
|
||||||
|
|
||||||
wxSize m_DeltaSize; // delta on rectangular shapes
|
|
||||||
|
|
||||||
wxPoint m_Pos0; // Initial Pad position (i.e. pad position relative to the
|
|
||||||
// module anchor, orientation 0
|
|
||||||
|
|
||||||
int m_ShapeMaxRadius; // radius of the circle containing the pad shape
|
|
||||||
int m_Attribut; // NORMAL, PAD_SMD, PAD_CONN, PAD_HOLE_NOT_PLATED
|
|
||||||
double m_Orient; // in 1/10 degrees
|
|
||||||
|
|
||||||
static int m_PadSketchModePenSize; // Pen size used to draw pads in sketch mode
|
|
||||||
// (mode used to print pads on silkscreen layer)
|
|
||||||
|
|
||||||
int m_LengthDie; // Length net from pad to die on chip
|
|
||||||
|
|
||||||
// Local clearance. When null, the module default value is used.
|
|
||||||
// when the module default value is null, the netclass value is used
|
|
||||||
// Usually the local clearance is null
|
|
||||||
int m_LocalClearance;
|
|
||||||
|
|
||||||
// Local mask margins: when NULL, the parent footprint design values are used
|
|
||||||
int m_LocalSolderMaskMargin; // Local solder mask margin
|
|
||||||
int m_LocalSolderPasteMargin; // Local solder paste margin absolute value
|
|
||||||
double m_LocalSolderPasteMarginRatio; // Local solder mask margin ratio value of pad size
|
|
||||||
// The final margin is the sum of these 2 values
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
D_PAD( MODULE* parent );
|
D_PAD( MODULE* parent );
|
||||||
|
|
||||||
// Do not create a copy constructor. The one generated by the compiler is adequate.
|
// Do not create a copy constructor. The one generated by the compiler is adequate.
|
||||||
|
|
||||||
~D_PAD();
|
|
||||||
|
|
||||||
void Copy( D_PAD* source );
|
void Copy( D_PAD* source );
|
||||||
|
|
||||||
D_PAD* Next() { return (D_PAD*) Pnext; }
|
D_PAD* Next() const { return (D_PAD*) Pnext; }
|
||||||
|
|
||||||
|
MODULE* GetParent() const { return (MODULE*) m_Parent; }
|
||||||
|
|
||||||
void SetPadName( const wxString& name ); // Change pad name
|
void SetPadName( const wxString& name ); // Change pad name
|
||||||
const wxString GetPadName() const;
|
const wxString GetPadName() const;
|
||||||
|
@ -202,36 +137,50 @@ public:
|
||||||
* Function GetShape
|
* Function GetShape
|
||||||
* @return the shape of this pad.
|
* @return the shape of this pad.
|
||||||
*/
|
*/
|
||||||
int GetShape() const { return m_PadShape & 0xFF; }
|
PAD_SHAPE_T GetShape() const { return m_PadShape; }
|
||||||
void SetShape( int aShape ) { m_PadShape = aShape; }
|
void SetShape( PAD_SHAPE_T aShape ) { m_PadShape = aShape; m_boundingRadius = -1; }
|
||||||
|
|
||||||
void SetPosition( const wxPoint& aPos ) { m_Pos = aPos; } // overload
|
void SetPosition( const wxPoint& aPos ) { m_Pos = aPos; } // overload
|
||||||
const wxPoint GetPosition() const // overload
|
const wxPoint GetPosition() const { return m_Pos; } // overload
|
||||||
{
|
|
||||||
return m_Pos;
|
void SetY( int y ) { m_Pos.y = y; }
|
||||||
}
|
void SetX( int x ) { m_Pos.x = x; }
|
||||||
|
|
||||||
void SetPos0( const wxPoint& aPos ) { m_Pos0 = aPos; }
|
void SetPos0( const wxPoint& aPos ) { m_Pos0 = aPos; }
|
||||||
const wxPoint& GetPos0() const { return m_Pos0; }
|
const wxPoint& GetPos0() const { return m_Pos0; }
|
||||||
|
|
||||||
void SetSize( const wxSize& aSize ) { m_Size = aSize; }
|
void SetY0( int y ) { m_Pos0.y = y; }
|
||||||
|
void SetX0( int x ) { m_Pos0.x = x; }
|
||||||
|
|
||||||
|
void SetSize( const wxSize& aSize ) { m_Size = aSize; m_boundingRadius = -1; }
|
||||||
const wxSize& GetSize() const { return m_Size; }
|
const wxSize& GetSize() const { return m_Size; }
|
||||||
|
|
||||||
void SetDelta( const wxSize& aSize ) { m_DeltaSize = aSize; }
|
void SetDelta( const wxSize& aSize ) { m_DeltaSize = aSize; m_boundingRadius = -1; }
|
||||||
const wxSize& GetDelta() const { return m_DeltaSize; }
|
const wxSize& GetDelta() const { return m_DeltaSize; }
|
||||||
|
|
||||||
void SetDrillSize( const wxSize& aSize ) { m_Drill = aSize; }
|
void SetDrillSize( const wxSize& aSize ) { m_Drill = aSize; }
|
||||||
const wxSize& GetDrillSize() const { return m_Drill; }
|
const wxSize& GetDrillSize() const { return m_Drill; }
|
||||||
|
|
||||||
void SetOffset( const wxSize& aOffset ) { m_Offset = aOffset; }
|
void SetOffset( const wxPoint& aOffset ) { m_Offset = aOffset; }
|
||||||
const wxSize& GetOffset() const { return m_Offset; }
|
const wxPoint& GetOffset() const { return m_Offset; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Flip
|
||||||
|
* flips this pad to the other outter most copper layer, back to front or
|
||||||
|
* vice versa, and does this vertically, so the x coordinate is not affected.
|
||||||
|
*
|
||||||
|
* @param aTranslationY is the contribution of my 'y' position provided by
|
||||||
|
* my parent module.
|
||||||
|
*/
|
||||||
|
void Flip( int aTranslationY );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function SetOrientation
|
* Function SetOrientation
|
||||||
* sets the rotation angle of the pad.
|
* sets the rotation angle of the pad.
|
||||||
* @param aAngle is tenths of degrees, but will soon be degrees.
|
* @param aAngle is tenths of degrees, but will soon be degrees. If it is
|
||||||
|
* outside of 0 - 3600, then it will be normalized before being saved.
|
||||||
*/
|
*/
|
||||||
void SetOrientation( double aAngle ) { m_Orient = aAngle; } // manage migration to degrees
|
void SetOrientation( double aAngle );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetOrientation
|
* Function GetOrientation
|
||||||
|
@ -239,25 +188,25 @@ public:
|
||||||
*/
|
*/
|
||||||
double GetOrientation() const { return m_Orient; }
|
double GetOrientation() const { return m_Orient; }
|
||||||
|
|
||||||
void SetDrillShape( int aDrillShape ) { m_DrillShape = aDrillShape; }
|
void SetDrillShape( PAD_SHAPE_T aDrillShape ) { m_DrillShape = aDrillShape; }
|
||||||
int GetDrillShape() const { return m_DrillShape; }
|
PAD_SHAPE_T GetDrillShape() const { return m_DrillShape; }
|
||||||
|
|
||||||
void SetLayerMask( int aLayerMask ) { m_layerMask = aLayerMask; }
|
void SetLayerMask( int aLayerMask ) { m_layerMask = aLayerMask; }
|
||||||
int GetLayerMask() const { return m_layerMask; }
|
int GetLayerMask() const { return m_layerMask; }
|
||||||
|
|
||||||
void SetAttribute( int aAttribute ) { m_Attribut = aAttribute; }
|
void SetAttribute( PAD_ATTR_T aAttribute ) { m_Attribute = aAttribute; }
|
||||||
int GetAttribute() const { return m_Attribut; }
|
PAD_ATTR_T GetAttribute() const { return m_Attribute; }
|
||||||
|
|
||||||
void SetDieLength( int aLength ) { m_LengthDie = aLength; }
|
void SetDieLength( int aLength ) { m_LengthDie = aLength; }
|
||||||
int GetDieLength() const { return m_LengthDie; }
|
int GetDieLength() const { return m_LengthDie; }
|
||||||
|
|
||||||
int GetLocalSolderMaskMargin() const { return m_LocalSolderMaskMargin; }
|
int GetLocalSolderMaskMargin() const { return m_LocalSolderMaskMargin; }
|
||||||
void SetLocalSolderMaskMargin( int aMargin ) { m_LocalSolderMaskMargin = aMargin; }
|
void SetLocalSolderMaskMargin( int aMargin ) { m_LocalSolderMaskMargin = aMargin; }
|
||||||
|
|
||||||
int GetLocalClearance() const { return m_LocalClearance; }
|
int GetLocalClearance() const { return m_LocalClearance; }
|
||||||
void SetLocalClearance( int aClearance ) { m_LocalClearance = aClearance; }
|
void SetLocalClearance( int aClearance ) { m_LocalClearance = aClearance; }
|
||||||
|
|
||||||
int GetLocalSolderPasteMargin() const { return m_LocalSolderPasteMargin; }
|
int GetLocalSolderPasteMargin() const { return m_LocalSolderPasteMargin; }
|
||||||
void SetLocalSolderPasteMargin( int aMargin ) { m_LocalSolderPasteMargin = aMargin; }
|
void SetLocalSolderPasteMargin( int aMargin ) { m_LocalSolderPasteMargin = aMargin; }
|
||||||
|
|
||||||
double GetLocalSolderPasteMarginRatio() const { return m_LocalSolderPasteMarginRatio; }
|
double GetLocalSolderPasteMarginRatio() const { return m_LocalSolderPasteMarginRatio; }
|
||||||
|
@ -382,18 +331,29 @@ public:
|
||||||
|
|
||||||
void ReturnStringPadName( wxString& text ) const; // Return pad name as string in a buffer
|
void ReturnStringPadName( wxString& text ) const; // Return pad name as string in a buffer
|
||||||
|
|
||||||
void ComputeShapeMaxRadius(); // compute radius
|
/**
|
||||||
|
* Function GetBoundingRadius
|
||||||
int GetMaxRadius() const;
|
* returns the radius of a minimum sized circle which fully encloses this pad.
|
||||||
|
*/
|
||||||
|
int GetBoundingRadius()
|
||||||
|
{
|
||||||
|
// Any member function which would affect this calculation should set
|
||||||
|
// m_boundingRadius to -1 to re-trigger the calculation from here.
|
||||||
|
// Currently that is only m_Size, m_DeltaSize, and m_PadShape accessors.
|
||||||
|
if( m_boundingRadius == -1 )
|
||||||
|
{
|
||||||
|
m_boundingRadius = boundingRadius();
|
||||||
|
}
|
||||||
|
return m_boundingRadius;
|
||||||
|
}
|
||||||
|
|
||||||
const wxPoint ReturnShapePos();
|
const wxPoint ReturnShapePos();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetNet
|
* Function GetSubRatsnest
|
||||||
* @return int - the netcode
|
* @return int - the netcode
|
||||||
*/
|
*/
|
||||||
int GetSubRatsnest() const { return m_SubRatsnest; }
|
int GetSubRatsnest() const { return m_SubRatsnest; }
|
||||||
|
|
||||||
void SetSubRatsnest( int aSubRatsnest ) { m_SubRatsnest = aSubRatsnest; }
|
void SetSubRatsnest( int aSubRatsnest ) { m_SubRatsnest = aSubRatsnest; }
|
||||||
|
|
||||||
|
|
||||||
|
@ -475,13 +435,101 @@ public:
|
||||||
*/
|
*/
|
||||||
wxString ShowPadAttr() const;
|
wxString ShowPadAttr() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function AppendConfigs
|
||||||
|
* appends to @a aResult the configuration setting accessors which will later
|
||||||
|
* allow reading or writing of configuration file information directly into
|
||||||
|
* this object.
|
||||||
|
*/
|
||||||
|
void AppendConfigs( PARAM_CFG_ARRAY* aResult );
|
||||||
|
|
||||||
#if defined(DEBUG)
|
#if defined(DEBUG)
|
||||||
void Show( int nestLevel, std::ostream& os ) const; // overload
|
void Show( int nestLevel, std::ostream& os ) const; // overload
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual EDA_ITEM* doClone() const;
|
virtual EDA_ITEM* doClone() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function boundingRadius
|
||||||
|
* returns a calculated radius of a bounding circle for this pad.
|
||||||
|
*/
|
||||||
|
int boundingRadius() const;
|
||||||
|
|
||||||
|
int m_boundingRadius; ///< radius of the circle containing the pad shape
|
||||||
|
|
||||||
|
|
||||||
|
wxString m_Netname; ///< Full net name like /mysheet/mysubsheet/vout used by Eeschema
|
||||||
|
wxString m_ShortNetname; ///< short net name, like vout from /mysheet/mysubsheet/vout
|
||||||
|
|
||||||
|
/// Pad name (4 char) or a long identifier (used in pad name
|
||||||
|
/// comparisons because this is faster than string comparison)
|
||||||
|
union
|
||||||
|
{
|
||||||
|
#define PADNAMEZ 4
|
||||||
|
char m_Padname[PADNAMEZ]; // zero padded at end to full size
|
||||||
|
wxUint32 m_NumPadName; // same number of bytes as m_Padname[]
|
||||||
|
};
|
||||||
|
|
||||||
|
wxPoint m_Pos; ///< pad Position on board
|
||||||
|
|
||||||
|
PAD_SHAPE_T m_PadShape; ///< Shape: PAD_CIRCLE, PAD_RECT, PAD_OVAL, PAD_TRAPEZOID
|
||||||
|
|
||||||
|
|
||||||
|
int m_SubRatsnest; ///< variable used in rats nest computations
|
||||||
|
///< handle subnet (block) number in ratsnest connection
|
||||||
|
|
||||||
|
wxSize m_Drill; ///< Drill diam (drill shape = PAD_CIRCLE) or drill size
|
||||||
|
///< (shape = OVAL) for drill shape = PAD_CIRCLE, drill
|
||||||
|
///< diam = m_Drill.x
|
||||||
|
|
||||||
|
wxSize m_Size; ///< X and Y size ( relative to orient 0)
|
||||||
|
|
||||||
|
PAD_SHAPE_T m_DrillShape; ///< Shape PAD_CIRCLE, PAD_OVAL
|
||||||
|
|
||||||
|
/**
|
||||||
|
* m_Offset is useful only for oblong pads (it can be used for other
|
||||||
|
* shapes, but without any interest).
|
||||||
|
* this is the offset between the pad hole and the pad shape (you must
|
||||||
|
* understand here pad shape = copper area around the hole)
|
||||||
|
* Most of cases, the hole is the center of the shape (m_Offset = 0).
|
||||||
|
* But some board designers use oblong pads with a hole moved to one of the
|
||||||
|
* oblong pad shape ends.
|
||||||
|
* In all cases the pad position is the pad hole.
|
||||||
|
* The physical shape position (used to draw it for instance) is pad
|
||||||
|
* position (m_Pos) + m_Offset.
|
||||||
|
* D_PAD::ReturnShapePos() returns the physical shape position according to
|
||||||
|
* the offset and the pad rotation.
|
||||||
|
*/
|
||||||
|
wxPoint m_Offset;
|
||||||
|
|
||||||
|
int m_layerMask; ///< Bitwise layer :1= copper layer, 15= cmp,
|
||||||
|
///< 2..14 = internal layers
|
||||||
|
///< 16 .. 31 = technical layers
|
||||||
|
|
||||||
|
wxSize m_DeltaSize; ///< delta on rectangular shapes
|
||||||
|
|
||||||
|
wxPoint m_Pos0; ///< Initial Pad position (i.e. pad position relative to the
|
||||||
|
///< module anchor, orientation 0)
|
||||||
|
|
||||||
|
PAD_ATTR_T m_Attribute; ///< NORMAL, PAD_SMD, PAD_CONN, PAD_HOLE_NOT_PLATED
|
||||||
|
double m_Orient; ///< in 1/10 degrees
|
||||||
|
|
||||||
|
int m_LengthDie; ///< Length net from pad to die on chip
|
||||||
|
|
||||||
|
/// Local clearance. When null, the module default value is used.
|
||||||
|
/// when the module default value is null, the netclass value is used
|
||||||
|
/// Usually the local clearance is null
|
||||||
|
int m_LocalClearance;
|
||||||
|
|
||||||
|
// Local mask margins: when 0, the parent footprint design values are used
|
||||||
|
|
||||||
|
int m_LocalSolderMaskMargin; ///< Local solder mask margin
|
||||||
|
int m_LocalSolderPasteMargin; ///< Local solder paste margin absolute value
|
||||||
|
|
||||||
|
double m_LocalSolderPasteMarginRatio; ///< Local solder mask margin ratio value of pad size
|
||||||
|
///< The final margin is the sum of these 2 values
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif // PAD_H_
|
||||||
#endif // _PAD_H_
|
|
||||||
|
|
|
@ -234,7 +234,7 @@ void D_PAD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, int aDraw_mode, const wxPoi
|
||||||
}
|
}
|
||||||
|
|
||||||
// if PAD_SMD pad and high contrast mode
|
// if PAD_SMD pad and high contrast mode
|
||||||
if( ( m_Attribut == PAD_SMD || m_Attribut == PAD_CONN ) && DisplayOpt.ContrastModeDisplay )
|
if( ( GetAttribute() == PAD_SMD || GetAttribute() == PAD_CONN ) && DisplayOpt.ContrastModeDisplay )
|
||||||
{
|
{
|
||||||
// when routing tracks
|
// when routing tracks
|
||||||
if( frame && frame->GetToolId() == ID_TRACK_BUTT )
|
if( frame && frame->GetToolId() == ID_TRACK_BUTT )
|
||||||
|
@ -346,7 +346,7 @@ void D_PAD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, int aDraw_mode, const wxPoi
|
||||||
if( ( m_layerMask & ALL_CU_LAYERS ) == 0 )
|
if( ( m_layerMask & ALL_CU_LAYERS ) == 0 )
|
||||||
DisplayIsol = false;
|
DisplayIsol = false;
|
||||||
|
|
||||||
if( m_Attribut == PAD_HOLE_NOT_PLATED )
|
if( GetAttribute() == PAD_HOLE_NOT_PLATED )
|
||||||
drawInfo.m_ShowNotPlatedHole = true;
|
drawInfo.m_ShowNotPlatedHole = true;
|
||||||
|
|
||||||
drawInfo.m_DrawMode = aDraw_mode;
|
drawInfo.m_DrawMode = aDraw_mode;
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
#include <class_board.h>
|
#include <class_board.h>
|
||||||
#include <class_track.h>
|
#include <class_track.h>
|
||||||
|
|
||||||
/* local functions : */
|
// local functions :
|
||||||
static void clean_segments( PCB_EDIT_FRAME* aFrame );
|
static void clean_segments( PCB_EDIT_FRAME* aFrame );
|
||||||
static void clean_vias( BOARD* aPcb );
|
static void clean_vias( BOARD* aPcb );
|
||||||
static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* aFrame );
|
static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* aFrame );
|
||||||
|
@ -93,7 +93,7 @@ void CleanupTracks( PCB_EDIT_FRAME* aFrame,
|
||||||
aFrame->GetScreen()->ClearUndoRedoList();
|
aFrame->GetScreen()->ClearUndoRedoList();
|
||||||
aFrame->SetCurItem( NULL );
|
aFrame->SetCurItem( NULL );
|
||||||
|
|
||||||
/* Rebuild the pad infos (pad list and netcodes) to ensure an up to date info */
|
// Rebuild the pad infos (pad list and netcodes) to ensure an up to date info
|
||||||
aFrame->GetBoard()->m_Status_Pcb = 0;
|
aFrame->GetBoard()->m_Status_Pcb = 0;
|
||||||
aFrame->GetBoard()->BuildListOfNets();
|
aFrame->GetBoard()->BuildListOfNets();
|
||||||
|
|
||||||
|
@ -110,22 +110,22 @@ void CleanupTracks( PCB_EDIT_FRAME* aFrame,
|
||||||
{
|
{
|
||||||
aFrame->SetStatusText( _( "Reconnect pads" ) );
|
aFrame->SetStatusText( _( "Reconnect pads" ) );
|
||||||
|
|
||||||
/* Create missing segments when a track end covers a pad, but is not on the pad center */
|
// Create missing segments when a track end covers a pad, but is not on the pad center
|
||||||
ConnectDanglingEndToPad( aFrame );
|
ConnectDanglingEndToPad( aFrame );
|
||||||
|
|
||||||
/* Create missing segments when a track end covers a via, but is not on the via center */
|
// Create missing segments when a track end covers a via, but is not on the via center
|
||||||
ConnectDanglingEndToVia( aFrame->GetBoard() );
|
ConnectDanglingEndToVia( aFrame->GetBoard() );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Remove null segments and intermediate points on aligned segments */
|
// Remove null segments and intermediate points on aligned segments
|
||||||
if( aMergeSegments )
|
if( aMergeSegments )
|
||||||
{
|
{
|
||||||
aFrame->SetStatusText( _( "Merge track segments" ) );
|
aFrame->SetStatusText( _( "Merge track segments" ) );
|
||||||
clean_segments( aFrame );
|
clean_segments( aFrame );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Delete dangling tracks */
|
// Delete dangling tracks
|
||||||
if( aDeleteUnconnectedSegm )
|
if( aDeleteUnconnectedSegm )
|
||||||
{
|
{
|
||||||
aFrame->SetStatusText( _( "Delete unconnected tracks" ) );
|
aFrame->SetStatusText( _( "Delete unconnected tracks" ) );
|
||||||
|
@ -163,13 +163,13 @@ void clean_vias( BOARD * aPcb )
|
||||||
if( alt_track->m_Start != track->m_Start )
|
if( alt_track->m_Start != track->m_Start )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* delete via */
|
// delete via
|
||||||
alt_track->UnLink();
|
alt_track->UnLink();
|
||||||
delete alt_track;
|
delete alt_track;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Delete Via on pads at same location */
|
// Delete Via on pads at same location
|
||||||
for( track = aPcb->m_Track; track != NULL; track = next_track )
|
for( track = aPcb->m_Track; track != NULL; track = next_track )
|
||||||
{
|
{
|
||||||
next_track = track->Next();
|
next_track = track->Next();
|
||||||
|
@ -179,9 +179,9 @@ void clean_vias( BOARD * aPcb )
|
||||||
|
|
||||||
D_PAD* pad = aPcb->GetPadFast( track->m_Start, ALL_CU_LAYERS );
|
D_PAD* pad = aPcb->GetPadFast( track->m_Start, ALL_CU_LAYERS );
|
||||||
|
|
||||||
if( pad && (pad->m_layerMask & EXTERNAL_LAYERS) == EXTERNAL_LAYERS ) // redundant Via
|
if( pad && (pad->GetLayerMask() & EXTERNAL_LAYERS) == EXTERNAL_LAYERS ) // redundant Via
|
||||||
{
|
{
|
||||||
/* delete via */
|
// delete via
|
||||||
track->UnLink();
|
track->UnLink();
|
||||||
delete track;
|
delete track;
|
||||||
}
|
}
|
||||||
|
@ -243,7 +243,7 @@ static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* aFrame )
|
||||||
flag_erase = 0; //Not connected indicator
|
flag_erase = 0; //Not connected indicator
|
||||||
type_end = 0;
|
type_end = 0;
|
||||||
|
|
||||||
/* Is a pad found on a track end ? */
|
// Is a pad found on a track end ?
|
||||||
|
|
||||||
masklayer = segment->ReturnMaskLayer();
|
masklayer = segment->ReturnMaskLayer();
|
||||||
|
|
||||||
|
@ -403,7 +403,7 @@ static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* aFrame )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Delete null length segments, and intermediate points .. */
|
// Delete null length segments, and intermediate points ..
|
||||||
static void clean_segments( PCB_EDIT_FRAME* aFrame )
|
static void clean_segments( PCB_EDIT_FRAME* aFrame )
|
||||||
{
|
{
|
||||||
TRACK* segment, * nextsegment;
|
TRACK* segment, * nextsegment;
|
||||||
|
@ -422,11 +422,11 @@ static void clean_segments( PCB_EDIT_FRAME* aFrame )
|
||||||
if( !segment->IsNull() )
|
if( !segment->IsNull() )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Length segment = 0; delete it */
|
// Length segment = 0; delete it
|
||||||
segment->DeleteStructure();
|
segment->DeleteStructure();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Delete redundant segments */
|
// Delete redundant segments
|
||||||
for( segment = aFrame->GetBoard()->m_Track, ii = 0; segment; segment = segment->Next(), ii++ )
|
for( segment = aFrame->GetBoard()->m_Track, ii = 0; segment; segment = segment->Next(), ii++ )
|
||||||
{
|
{
|
||||||
for( other = segment->Next(); other; other = nextsegment )
|
for( other = segment->Next(); other; other = nextsegment )
|
||||||
|
@ -455,7 +455,7 @@ static void clean_segments( PCB_EDIT_FRAME* aFrame )
|
||||||
erase = 1;
|
erase = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Delete redundant point */
|
// Delete redundant point
|
||||||
if( erase )
|
if( erase )
|
||||||
{
|
{
|
||||||
ii--;
|
ii--;
|
||||||
|
@ -464,7 +464,7 @@ static void clean_segments( PCB_EDIT_FRAME* aFrame )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* delete intermediate points */
|
// delete intermediate points
|
||||||
ii = 0;
|
ii = 0;
|
||||||
|
|
||||||
for( segment = aFrame->GetBoard()->m_Track; segment; segment = nextsegment )
|
for( segment = aFrame->GetBoard()->m_Track; segment; segment = nextsegment )
|
||||||
|
@ -498,13 +498,13 @@ static void clean_segments( PCB_EDIT_FRAME* aFrame )
|
||||||
if( segStart->Type() != PCB_TRACE_T )
|
if( segStart->Type() != PCB_TRACE_T )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* We must have only one segment connected */
|
// We must have only one segment connected
|
||||||
segStart->SetState( BUSY, ON );
|
segStart->SetState( BUSY, ON );
|
||||||
other = segment->GetTrace( aFrame->GetBoard()->m_Track, NULL, START );
|
other = segment->GetTrace( aFrame->GetBoard()->m_Track, NULL, START );
|
||||||
segStart->SetState( BUSY, OFF );
|
segStart->SetState( BUSY, OFF );
|
||||||
|
|
||||||
if( other == NULL )
|
if( other == NULL )
|
||||||
flag = 1; /* OK */
|
flag = 1; // OK
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -523,7 +523,7 @@ static void clean_segments( PCB_EDIT_FRAME* aFrame )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* search for a possible point that connects on the END point of the segment: */
|
// search for a possible point that connects on the END point of the segment:
|
||||||
for( segEnd = segment->Next(); ; )
|
for( segEnd = segment->Next(); ; )
|
||||||
{
|
{
|
||||||
segEnd = segment->GetTrace( segEnd, NULL, END );
|
segEnd = segment->GetTrace( segEnd, NULL, END );
|
||||||
|
@ -536,13 +536,13 @@ static void clean_segments( PCB_EDIT_FRAME* aFrame )
|
||||||
if( segEnd->Type() != PCB_TRACE_T )
|
if( segEnd->Type() != PCB_TRACE_T )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* We must have only one segment connected */
|
// We must have only one segment connected
|
||||||
segEnd->SetState( BUSY, ON );
|
segEnd->SetState( BUSY, ON );
|
||||||
other = segment->GetTrace( aFrame->GetBoard()->m_Track, NULL, END );
|
other = segment->GetTrace( aFrame->GetBoard()->m_Track, NULL, END );
|
||||||
segEnd->SetState( BUSY, OFF );
|
segEnd->SetState( BUSY, OFF );
|
||||||
|
|
||||||
if( other == NULL )
|
if( other == NULL )
|
||||||
flag |= 2; /* Ok */
|
flag |= 2; // Ok
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -563,7 +563,7 @@ static void clean_segments( PCB_EDIT_FRAME* aFrame )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( no_inc ) /* The current segment was modified, retry to merge it */
|
if( no_inc ) // The current segment was modified, retry to merge it
|
||||||
nextsegment = segment->Next();
|
nextsegment = segment->Next();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,7 +571,7 @@ static void clean_segments( PCB_EDIT_FRAME* aFrame )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Function used by clean_segments.
|
/** Function used by clean_segments.
|
||||||
* Test alignment of aTrackRef and aCandidate (which must have a common end).
|
* Test alignment of aTrackRef and aCandidate (which must have a common end).
|
||||||
* and see if the common point is not on a pad (i.e. if this common point can be removed).
|
* and see if the common point is not on a pad (i.e. if this common point can be removed).
|
||||||
* the ending point of pt_ref is the start point (aEndType == START)
|
* the ending point of pt_ref is the start point (aEndType == START)
|
||||||
|
@ -876,15 +876,15 @@ void ConnectDanglingEndToPad( PCB_EDIT_FRAME* aFrame )
|
||||||
if( pad )
|
if( pad )
|
||||||
{
|
{
|
||||||
// test if the track start point is not exactly starting on the pad
|
// test if the track start point is not exactly starting on the pad
|
||||||
if( segment->m_Start != pad->m_Pos )
|
if( segment->m_Start != pad->GetPosition() )
|
||||||
{
|
{
|
||||||
if( segment->GetTrace( aFrame->GetBoard()->m_Track, NULL, START ) == NULL )
|
if( segment->GetTrace( aFrame->GetBoard()->m_Track, NULL, START ) == NULL )
|
||||||
{
|
{
|
||||||
TRACK* newTrack = (TRACK*)segment->Clone();
|
TRACK* newTrack = (TRACK*) segment->Clone();
|
||||||
|
|
||||||
aFrame->GetBoard()->m_Track.Insert( newTrack, segment->Next() );
|
aFrame->GetBoard()->m_Track.Insert( newTrack, segment->Next() );
|
||||||
|
|
||||||
newTrack->m_End = pad->m_Pos;
|
newTrack->m_End = pad->GetPosition();
|
||||||
newTrack->start = segment;
|
newTrack->start = segment;
|
||||||
newTrack->end = pad;
|
newTrack->end = pad;
|
||||||
|
|
||||||
|
@ -898,7 +898,7 @@ void ConnectDanglingEndToPad( PCB_EDIT_FRAME* aFrame )
|
||||||
if( pad )
|
if( pad )
|
||||||
{
|
{
|
||||||
// test if the track end point is not exactly on the pad
|
// test if the track end point is not exactly on the pad
|
||||||
if( segment->m_End != pad->m_Pos )
|
if( segment->m_End != pad->GetPosition() )
|
||||||
{
|
{
|
||||||
if( segment->GetTrace( aFrame->GetBoard()->m_Track, NULL, END ) == NULL )
|
if( segment->GetTrace( aFrame->GetBoard()->m_Track, NULL, END ) == NULL )
|
||||||
{
|
{
|
||||||
|
@ -906,7 +906,7 @@ void ConnectDanglingEndToPad( PCB_EDIT_FRAME* aFrame )
|
||||||
|
|
||||||
aFrame->GetBoard()->m_Track.Insert( newTrack, segment->Next() );
|
aFrame->GetBoard()->m_Track.Insert( newTrack, segment->Next() );
|
||||||
|
|
||||||
newTrack->m_Start = pad->m_Pos;
|
newTrack->m_Start = pad->GetPosition();
|
||||||
|
|
||||||
newTrack->start = pad;
|
newTrack->start = pad;
|
||||||
newTrack->end = segment;
|
newTrack->end = segment;
|
||||||
|
|
|
@ -235,8 +235,8 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, const void* testDa
|
||||||
// for through pads: pads on Front or Back board sides must be seen
|
// for through pads: pads on Front or Back board sides must be seen
|
||||||
pad = (D_PAD*) item;
|
pad = (D_PAD*) item;
|
||||||
|
|
||||||
if( (pad->m_Attribut != PAD_SMD) &&
|
if( (pad->GetAttribute() != PAD_SMD) &&
|
||||||
(pad->m_Attribut != PAD_CONN) ) // a hole is present, so multiple layers
|
(pad->GetAttribute() != PAD_CONN) ) // a hole is present, so multiple layers
|
||||||
{
|
{
|
||||||
// proceed to the common tests below, but without the parent module test,
|
// proceed to the common tests below, but without the parent module test,
|
||||||
// by leaving module==NULL, but having pad != null
|
// by leaving module==NULL, but having pad != null
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
extern void Merge_SubNets_Connected_By_CopperAreas( BOARD* aPcb );
|
extern void Merge_SubNets_Connected_By_CopperAreas( BOARD* aPcb );
|
||||||
extern void Merge_SubNets_Connected_By_CopperAreas( BOARD* aPcb, int aNetcode );
|
extern void Merge_SubNets_Connected_By_CopperAreas( BOARD* aPcb, int aNetcode );
|
||||||
|
|
||||||
/* Local functions */
|
// Local functions
|
||||||
static void RebuildTrackChain( BOARD* pcb );
|
static void RebuildTrackChain( BOARD* pcb );
|
||||||
|
|
||||||
|
|
||||||
|
@ -276,7 +276,9 @@ void CONNECTIONS::SearchConnectionsPadsToIntersectingPads()
|
||||||
D_PAD * pad = m_sortedPads[ii];
|
D_PAD * pad = m_sortedPads[ii];
|
||||||
pad->m_PadsConnected.clear();
|
pad->m_PadsConnected.clear();
|
||||||
candidates.clear();
|
candidates.clear();
|
||||||
CollectItemsNearTo( candidates, pad->ReturnShapePos(), pad->m_ShapeMaxRadius );
|
|
||||||
|
CollectItemsNearTo( candidates, pad->ReturnShapePos(), pad->GetBoundingRadius() );
|
||||||
|
|
||||||
// add pads to pad.m_PadsConnected, if they are connected
|
// add pads to pad.m_PadsConnected, if they are connected
|
||||||
for( unsigned jj = 0; jj < candidates.size(); jj++ )
|
for( unsigned jj = 0; jj < candidates.size(); jj++ )
|
||||||
{
|
{
|
||||||
|
@ -285,7 +287,7 @@ void CONNECTIONS::SearchConnectionsPadsToIntersectingPads()
|
||||||
if( pad == candidate_pad )
|
if( pad == candidate_pad )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( (pad->m_layerMask & candidate_pad->m_layerMask) == 0 )
|
if( (pad->GetLayerMask() & candidate_pad->GetLayerMask()) == 0 )
|
||||||
continue;
|
continue;
|
||||||
if( pad->HitTest( item->GetPoint() ) )
|
if( pad->HitTest( item->GetPoint() ) )
|
||||||
{
|
{
|
||||||
|
@ -311,14 +313,16 @@ void CONNECTIONS::SearchTracksConnectedToPads()
|
||||||
pad->m_TracksConnected.clear();
|
pad->m_TracksConnected.clear();
|
||||||
candidates.clear();
|
candidates.clear();
|
||||||
|
|
||||||
CollectItemsNearTo( candidates, pad->GetPosition(), pad->m_ShapeMaxRadius );
|
CollectItemsNearTo( candidates, pad->GetPosition(), pad->GetBoundingRadius() );
|
||||||
|
|
||||||
// add this pad to track.m_PadsConnected, if it is connected
|
// add this pad to track.m_PadsConnected, if it is connected
|
||||||
for( unsigned jj = 0; jj < candidates.size(); jj++ )
|
for( unsigned jj = 0; jj < candidates.size(); jj++ )
|
||||||
{
|
{
|
||||||
CONNECTED_POINT * cp_item = candidates[jj];
|
CONNECTED_POINT* cp_item = candidates[jj];
|
||||||
if( (pad->m_layerMask & cp_item->GetTrack()->ReturnMaskLayer()) == 0 )
|
|
||||||
|
if( (pad->GetLayerMask() & cp_item->GetTrack()->ReturnMaskLayer()) == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( pad->HitTest( cp_item->GetPoint() ) )
|
if( pad->HitTest( cp_item->GetPoint() ) )
|
||||||
{
|
{
|
||||||
cp_item->GetTrack()->m_PadsConnected.push_back( pad );
|
cp_item->GetTrack()->m_PadsConnected.push_back( pad );
|
||||||
|
@ -731,7 +735,7 @@ void CONNECTIONS::Propagate_SubNets()
|
||||||
pad->SetSubNet( curr_pad->GetSubNet() );
|
pad->SetSubNet( curr_pad->GetSubNet() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else /* the track segment is not attached to a cluster */
|
else // the track segment is not attached to a cluster
|
||||||
{
|
{
|
||||||
if( pad->GetSubNet() > 0 )
|
if( pad->GetSubNet() > 0 )
|
||||||
{
|
{
|
||||||
|
@ -758,16 +762,16 @@ void CONNECTIONS::Propagate_SubNets()
|
||||||
// Examine connections between trcaks and pads
|
// Examine connections between trcaks and pads
|
||||||
for( ; curr_track != NULL; curr_track = curr_track->Next() )
|
for( ; curr_track != NULL; curr_track = curr_track->Next() )
|
||||||
{
|
{
|
||||||
/* First: handling connections to pads */
|
// First: handling connections to pads
|
||||||
for( unsigned ii = 0; ii < curr_track->m_PadsConnected.size(); ii++ )
|
for( unsigned ii = 0; ii < curr_track->m_PadsConnected.size(); ii++ )
|
||||||
{
|
{
|
||||||
D_PAD * pad = curr_track->m_PadsConnected[ii];
|
D_PAD * pad = curr_track->m_PadsConnected[ii];
|
||||||
|
|
||||||
if( curr_track->GetSubNet() ) /* the track segment is already a cluster member */
|
if( curr_track->GetSubNet() ) // the track segment is already a cluster member
|
||||||
{
|
{
|
||||||
if( pad->GetSubNet() > 0 )
|
if( pad->GetSubNet() > 0 )
|
||||||
{
|
{
|
||||||
/* The pad is already a cluster member, so we can merge the 2 clusters */
|
// The pad is already a cluster member, so we can merge the 2 clusters
|
||||||
Merge_SubNets( pad->GetSubNet(), curr_track->GetSubNet() );
|
Merge_SubNets( pad->GetSubNet(), curr_track->GetSubNet() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -777,11 +781,11 @@ void CONNECTIONS::Propagate_SubNets()
|
||||||
pad->SetSubNet( curr_track->GetSubNet() );
|
pad->SetSubNet( curr_track->GetSubNet() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else /* the track segment is not attached to a cluster */
|
else // the track segment is not attached to a cluster
|
||||||
{
|
{
|
||||||
if( pad->GetSubNet() > 0 )
|
if( pad->GetSubNet() > 0 )
|
||||||
{
|
{
|
||||||
/* it is connected to a pad in a cluster, merge this track */
|
// it is connected to a pad in a cluster, merge this track
|
||||||
curr_track->SetSubNet( pad->GetSubNet() );
|
curr_track->SetSubNet( pad->GetSubNet() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -795,13 +799,13 @@ void CONNECTIONS::Propagate_SubNets()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Test connections between segments */
|
// Test connections between segments
|
||||||
for( unsigned ii = 0; ii < curr_track->m_TracksConnected.size(); ii++ )
|
for( unsigned ii = 0; ii < curr_track->m_TracksConnected.size(); ii++ )
|
||||||
{
|
{
|
||||||
BOARD_CONNECTED_ITEM* track = curr_track->m_TracksConnected[ii];
|
BOARD_CONNECTED_ITEM* track = curr_track->m_TracksConnected[ii];
|
||||||
if( curr_track->GetSubNet() ) // The current track is already a cluster member
|
if( curr_track->GetSubNet() ) // The current track is already a cluster member
|
||||||
{
|
{
|
||||||
/* The other track is already a cluster member, so we can merge the 2 clusters */
|
// The other track is already a cluster member, so we can merge the 2 clusters
|
||||||
if( track->GetSubNet() )
|
if( track->GetSubNet() )
|
||||||
{
|
{
|
||||||
Merge_SubNets( track->GetSubNet(), curr_track->GetSubNet() );
|
Merge_SubNets( track->GetSubNet(), curr_track->GetSubNet() );
|
||||||
|
@ -920,7 +924,7 @@ void PCB_BASE_FRAME::TestNetConnection( wxDC* aDC, int aNetCode )
|
||||||
|
|
||||||
m_Pcb->Test_Connections_To_Copper_Areas( aNetCode );
|
m_Pcb->Test_Connections_To_Copper_Areas( aNetCode );
|
||||||
|
|
||||||
/* Search for the first and the last segment relative to the given net code */
|
// Search for the first and the last segment relative to the given net code
|
||||||
if( m_Pcb->m_Track )
|
if( m_Pcb->m_Track )
|
||||||
{
|
{
|
||||||
CONNECTIONS connections( m_Pcb );
|
CONNECTIONS connections( m_Pcb );
|
||||||
|
@ -939,12 +943,12 @@ void PCB_BASE_FRAME::TestNetConnection( wxDC* aDC, int aNetCode )
|
||||||
|
|
||||||
Merge_SubNets_Connected_By_CopperAreas( m_Pcb, aNetCode );
|
Merge_SubNets_Connected_By_CopperAreas( m_Pcb, aNetCode );
|
||||||
|
|
||||||
/* rebuild the active ratsnest for this net */
|
// rebuild the active ratsnest for this net
|
||||||
DrawGeneralRatsnest( aDC, aNetCode );
|
DrawGeneralRatsnest( aDC, aNetCode );
|
||||||
TestForActiveLinksInRatsnest( aNetCode );
|
TestForActiveLinksInRatsnest( aNetCode );
|
||||||
DrawGeneralRatsnest( aDC, aNetCode );
|
DrawGeneralRatsnest( aDC, aNetCode );
|
||||||
|
|
||||||
/* Display results */
|
// Display results
|
||||||
int net_notconnected_count = 0;
|
int net_notconnected_count = 0;
|
||||||
NETINFO_ITEM* net = m_Pcb->FindNet( aNetCode );
|
NETINFO_ITEM* net = m_Pcb->FindNet( aNetCode );
|
||||||
if( net ) // Should not occur, but ...
|
if( net ) // Should not occur, but ...
|
||||||
|
@ -1058,7 +1062,7 @@ void PCB_BASE_FRAME::RecalculateAllTracksNetcode()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sort the track list by net codes: */
|
// Sort the track list by net codes:
|
||||||
RebuildTrackChain( m_Pcb );
|
RebuildTrackChain( m_Pcb );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -120,14 +120,14 @@ void DIALOG_MODULE_BOARD_EDITOR::InitBoardProperties()
|
||||||
// These 2 parameters are usually < 0, so prepare entering a negative
|
// These 2 parameters are usually < 0, so prepare entering a negative
|
||||||
// value, if current is 0
|
// value, if current is 0
|
||||||
PutValueInLocalUnits( *m_SolderPasteMarginCtrl,
|
PutValueInLocalUnits( *m_SolderPasteMarginCtrl,
|
||||||
m_CurrentModule->m_LocalSolderPasteMargin,
|
m_CurrentModule->GetLocalSolderPasteMargin(),
|
||||||
internalUnit );
|
internalUnit );
|
||||||
if( m_CurrentModule->m_LocalSolderPasteMargin == 0 )
|
if( m_CurrentModule->GetLocalSolderPasteMargin() == 0 )
|
||||||
m_SolderPasteMarginCtrl->SetValue( wxT( "-" ) +
|
m_SolderPasteMarginCtrl->SetValue( wxT( "-" ) +
|
||||||
m_SolderPasteMarginCtrl->GetValue() );
|
m_SolderPasteMarginCtrl->GetValue() );
|
||||||
msg.Printf( wxT( "%.1f" ),
|
msg.Printf( wxT( "%.1f" ),
|
||||||
m_CurrentModule->m_LocalSolderPasteMarginRatio * 100.0 );
|
m_CurrentModule->GetLocalSolderPasteMarginRatio() * 100.0 );
|
||||||
if( m_CurrentModule->m_LocalSolderPasteMarginRatio == 0.0 &&
|
if( m_CurrentModule->GetLocalSolderPasteMarginRatio() == 0.0 &&
|
||||||
msg[0] == '0') // Sometimes Printf add a sign if the value is small
|
msg[0] == '0') // Sometimes Printf add a sign if the value is small
|
||||||
m_SolderPasteMarginRatioCtrl->SetValue( wxT("-") + msg );
|
m_SolderPasteMarginRatioCtrl->SetValue( wxT("-") + msg );
|
||||||
else
|
else
|
||||||
|
@ -462,12 +462,13 @@ void DIALOG_MODULE_BOARD_EDITOR::OnOkClick( wxCommandEvent& event )
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize masks clearances
|
// Initialize masks clearances
|
||||||
m_CurrentModule->m_LocalClearance =
|
m_CurrentModule->SetLocalClearance(
|
||||||
ReturnValueFromTextCtrl( *m_NetClearanceValueCtrl, m_Parent->GetInternalUnits() );
|
ReturnValueFromTextCtrl( *m_NetClearanceValueCtrl, m_Parent->GetInternalUnits() ) );
|
||||||
m_CurrentModule->m_LocalSolderMaskMargin =
|
m_CurrentModule->SetLocalSolderMaskMargin(
|
||||||
ReturnValueFromTextCtrl( *m_SolderMaskMarginCtrl, m_Parent->GetInternalUnits() );
|
ReturnValueFromTextCtrl( *m_SolderMaskMarginCtrl, m_Parent->GetInternalUnits() ) );
|
||||||
m_CurrentModule->m_LocalSolderPasteMargin =
|
m_CurrentModule->SetLocalSolderPasteMargin(
|
||||||
ReturnValueFromTextCtrl( *m_SolderPasteMarginCtrl, m_Parent->GetInternalUnits() );
|
ReturnValueFromTextCtrl( *m_SolderPasteMarginCtrl, m_Parent->GetInternalUnits() ) );
|
||||||
|
|
||||||
double dtmp = 0.0;
|
double dtmp = 0.0;
|
||||||
msg = m_SolderPasteMarginRatioCtrl->GetValue();
|
msg = m_SolderPasteMarginRatioCtrl->GetValue();
|
||||||
msg.ToDouble( &dtmp );
|
msg.ToDouble( &dtmp );
|
||||||
|
@ -479,7 +480,7 @@ void DIALOG_MODULE_BOARD_EDITOR::OnOkClick( wxCommandEvent& event )
|
||||||
if( dtmp > +100 )
|
if( dtmp > +100 )
|
||||||
dtmp = +100;
|
dtmp = +100;
|
||||||
|
|
||||||
m_CurrentModule->m_LocalSolderPasteMarginRatio = dtmp / 100;
|
m_CurrentModule->SetLocalSolderPasteMarginRatio( dtmp / 100 );
|
||||||
|
|
||||||
// Set Module Position
|
// Set Module Position
|
||||||
modpos.x = ReturnValueFromTextCtrl( *m_ModPositionX, PCB_INTERNAL_UNIT );
|
modpos.x = ReturnValueFromTextCtrl( *m_ModPositionX, PCB_INTERNAL_UNIT );
|
||||||
|
|
|
@ -61,7 +61,7 @@ void DIALOG_MODULE_MODULE_EDITOR::InitModeditProperties()
|
||||||
|
|
||||||
m_LastSelected3DShapeIndex = -1;
|
m_LastSelected3DShapeIndex = -1;
|
||||||
|
|
||||||
/* Init 3D shape list */
|
// Init 3D shape list
|
||||||
S3D_MASTER* draw3D = m_CurrentModule->m_3D_Drawings;
|
S3D_MASTER* draw3D = m_CurrentModule->m_3D_Drawings;
|
||||||
|
|
||||||
while( draw3D )
|
while( draw3D )
|
||||||
|
@ -97,7 +97,7 @@ void DIALOG_MODULE_MODULE_EDITOR::InitModeditProperties()
|
||||||
"Use this attribute for \"virtual\" components drawn on board (like a old ISA PC bus connector)" ) );
|
"Use this attribute for \"virtual\" components drawn on board (like a old ISA PC bus connector)" ) );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Controls on right side of the dialog */
|
// Controls on right side of the dialog
|
||||||
switch( m_CurrentModule->m_Attributs & 255 )
|
switch( m_CurrentModule->m_Attributs & 255 )
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -154,13 +154,13 @@ void DIALOG_MODULE_MODULE_EDITOR::InitModeditProperties()
|
||||||
m_CurrentModule->m_LocalSolderMaskMargin, internalUnit );
|
m_CurrentModule->m_LocalSolderMaskMargin, internalUnit );
|
||||||
// These 2 parameters are usually < 0, so prepare entering a negative value, if current is 0
|
// These 2 parameters are usually < 0, so prepare entering a negative value, if current is 0
|
||||||
PutValueInLocalUnits( *m_SolderPasteMarginCtrl,
|
PutValueInLocalUnits( *m_SolderPasteMarginCtrl,
|
||||||
m_CurrentModule->m_LocalSolderPasteMargin, internalUnit );
|
m_CurrentModule->GetLocalSolderPasteMargin(), internalUnit );
|
||||||
if( m_CurrentModule->m_LocalSolderPasteMargin == 0 )
|
if( m_CurrentModule->GetLocalSolderPasteMargin() == 0 )
|
||||||
m_SolderPasteMarginCtrl->SetValue( wxT("-") + m_SolderPasteMarginCtrl->GetValue() );
|
m_SolderPasteMarginCtrl->SetValue( wxT("-") + m_SolderPasteMarginCtrl->GetValue() );
|
||||||
if( m_CurrentModule->m_LocalSolderPasteMarginRatio == 0.0 )
|
if( m_CurrentModule->GetLocalSolderPasteMarginRatio() == 0.0 )
|
||||||
msg.Printf( wxT( "-%.1f" ), m_CurrentModule->m_LocalSolderPasteMarginRatio * 100.0 );
|
msg.Printf( wxT( "-%.1f" ), m_CurrentModule->GetLocalSolderPasteMarginRatio() * 100.0 );
|
||||||
else
|
else
|
||||||
msg.Printf( wxT( "%.1f" ), m_CurrentModule->m_LocalSolderPasteMarginRatio * 100.0 );
|
msg.Printf( wxT( "%.1f" ), m_CurrentModule->GetLocalSolderPasteMarginRatio() * 100.0 );
|
||||||
m_SolderPasteMarginRatioCtrl->SetValue( msg );
|
m_SolderPasteMarginRatioCtrl->SetValue( msg );
|
||||||
|
|
||||||
// if m_3D_ShapeNameListBox is not empty, preselect first 3D shape
|
// if m_3D_ShapeNameListBox is not empty, preselect first 3D shape
|
||||||
|
@ -369,21 +369,26 @@ void DIALOG_MODULE_MODULE_EDITOR::OnOkClick( wxCommandEvent& event )
|
||||||
|
|
||||||
// Initialize masks clearances
|
// Initialize masks clearances
|
||||||
int internalUnit = m_Parent->GetInternalUnits();
|
int internalUnit = m_Parent->GetInternalUnits();
|
||||||
m_CurrentModule->m_LocalClearance =
|
|
||||||
ReturnValueFromTextCtrl( *m_NetClearanceValueCtrl, internalUnit );
|
m_CurrentModule->SetLocalClearance(
|
||||||
m_CurrentModule->m_LocalSolderMaskMargin =
|
ReturnValueFromTextCtrl( *m_NetClearanceValueCtrl, internalUnit ) );
|
||||||
ReturnValueFromTextCtrl( *m_SolderMaskMarginCtrl, internalUnit );
|
|
||||||
m_CurrentModule->m_LocalSolderPasteMargin =
|
m_CurrentModule->SetLocalSolderMaskMargin(
|
||||||
ReturnValueFromTextCtrl( *m_SolderPasteMarginCtrl, internalUnit );
|
ReturnValueFromTextCtrl( *m_SolderMaskMarginCtrl, internalUnit ) );
|
||||||
|
|
||||||
|
m_CurrentModule->SetLocalSolderPasteMargin(
|
||||||
|
ReturnValueFromTextCtrl( *m_SolderPasteMarginCtrl, internalUnit ) );
|
||||||
double dtmp;
|
double dtmp;
|
||||||
wxString msg = m_SolderPasteMarginRatioCtrl->GetValue();
|
wxString msg = m_SolderPasteMarginRatioCtrl->GetValue();
|
||||||
msg.ToDouble( &dtmp );
|
msg.ToDouble( &dtmp );
|
||||||
|
|
||||||
// A margin ratio de -50% means no paste on a pad, the ratio must be >= 50 %
|
// A margin ratio de -50% means no paste on a pad, the ratio must be >= 50 %
|
||||||
if( dtmp < -50 )
|
if( dtmp < -50 )
|
||||||
dtmp = -50;
|
dtmp = -50;
|
||||||
m_CurrentModule->m_LocalSolderPasteMarginRatio = dtmp / 100;
|
|
||||||
|
|
||||||
/* Update 3D shape list */
|
m_CurrentModule->SetLocalSolderPasteMarginRatio( dtmp / 100 );
|
||||||
|
|
||||||
|
// Update 3D shape list
|
||||||
int ii = m_3D_ShapeNameListBox->GetSelection();
|
int ii = m_3D_ShapeNameListBox->GetSelection();
|
||||||
if ( ii >= 0 )
|
if ( ii >= 0 )
|
||||||
TransfertDisplayTo3DValues( ii );
|
TransfertDisplayTo3DValues( ii );
|
||||||
|
|
|
@ -174,8 +174,7 @@ void DIALOG_GENDRILL::InitDisplayParams( void )
|
||||||
|
|
||||||
m_MicroViaDrillValue->Enable( m_microViasCount );
|
m_MicroViaDrillValue->Enable( m_microViasCount );
|
||||||
|
|
||||||
/* Count plated pad holes and not plated pad holes:
|
// Count plated pad holes and not plated pad holes:
|
||||||
*/
|
|
||||||
m_platedPadsHoleCount = 0;
|
m_platedPadsHoleCount = 0;
|
||||||
m_notplatedPadsHoleCount = 0;
|
m_notplatedPadsHoleCount = 0;
|
||||||
|
|
||||||
|
@ -183,11 +182,11 @@ void DIALOG_GENDRILL::InitDisplayParams( void )
|
||||||
{
|
{
|
||||||
for( D_PAD* pad = module->m_Pads; pad != NULL; pad = pad->Next() )
|
for( D_PAD* pad = module->m_Pads; pad != NULL; pad = pad->Next() )
|
||||||
{
|
{
|
||||||
if( pad->m_DrillShape == PAD_CIRCLE )
|
if( pad->GetDrillShape() == PAD_CIRCLE )
|
||||||
{
|
{
|
||||||
if( pad->m_Drill.x != 0 )
|
if( pad->GetDrillSize().x != 0 )
|
||||||
{
|
{
|
||||||
if( pad->m_Attribut == PAD_HOLE_NOT_PLATED )
|
if( pad->GetAttribute() == PAD_HOLE_NOT_PLATED )
|
||||||
m_notplatedPadsHoleCount++;
|
m_notplatedPadsHoleCount++;
|
||||||
else
|
else
|
||||||
m_platedPadsHoleCount++;
|
m_platedPadsHoleCount++;
|
||||||
|
@ -195,9 +194,9 @@ void DIALOG_GENDRILL::InitDisplayParams( void )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if( min( pad->m_Drill.x, pad->m_Drill.y ) != 0 )
|
if( min( pad->GetDrillSize().x, pad->GetDrillSize().y ) != 0 )
|
||||||
{
|
{
|
||||||
if( pad->m_Attribut == PAD_HOLE_NOT_PLATED )
|
if( pad->GetAttribute() == PAD_HOLE_NOT_PLATED )
|
||||||
m_notplatedPadsHoleCount++;
|
m_notplatedPadsHoleCount++;
|
||||||
else
|
else
|
||||||
m_platedPadsHoleCount++;
|
m_platedPadsHoleCount++;
|
||||||
|
@ -229,7 +228,7 @@ void DIALOG_GENDRILL::InitDisplayParams( void )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Save drill options: */
|
// Save drill options:
|
||||||
void DIALOG_GENDRILL::UpdateConfig()
|
void DIALOG_GENDRILL::UpdateConfig()
|
||||||
{
|
{
|
||||||
SetParams();
|
SetParams();
|
||||||
|
@ -275,7 +274,7 @@ void DIALOG_GENDRILL::OnOkClick( wxCommandEvent& event )
|
||||||
|
|
||||||
void DIALOG_GENDRILL::OnCancelClick( wxCommandEvent& event )
|
void DIALOG_GENDRILL::OnCancelClick( wxCommandEvent& event )
|
||||||
{
|
{
|
||||||
UpdateConfig(); /* Save drill options: */
|
UpdateConfig(); // Save drill options:
|
||||||
EndModal( wxID_CANCEL ); // Process the default cancel event (close dialog)
|
EndModal( wxID_CANCEL ); // Process the default cancel event (close dialog)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -294,13 +293,13 @@ void DIALOG_GENDRILL::UpdatePrecisionOptions()
|
||||||
{
|
{
|
||||||
if( m_Choice_Unit->GetSelection()== 1 ) // Units = inches
|
if( m_Choice_Unit->GetSelection()== 1 ) // Units = inches
|
||||||
{
|
{
|
||||||
/* inch options */
|
// inch options
|
||||||
m_Choice_Precision->SetString( 0, precisionListForInches[0].GetPrecisionString() );
|
m_Choice_Precision->SetString( 0, precisionListForInches[0].GetPrecisionString() );
|
||||||
m_Choice_Precision->SetString( 1, precisionListForInches[1].GetPrecisionString() );
|
m_Choice_Precision->SetString( 1, precisionListForInches[1].GetPrecisionString() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* metric options */
|
// metric options
|
||||||
m_Choice_Precision->SetString( 0, precisionListForMetric[0].GetPrecisionString() );
|
m_Choice_Precision->SetString( 0, precisionListForMetric[0].GetPrecisionString() );
|
||||||
m_Choice_Precision->SetString( 1, precisionListForMetric[1].GetPrecisionString() );
|
m_Choice_Precision->SetString( 1, precisionListForMetric[1].GetPrecisionString() );
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include <pcbcommon.h>
|
#include <pcbcommon.h>
|
||||||
|
|
||||||
#include <wx/dcbuffer.h>
|
#include <wx/dcbuffer.h>
|
||||||
|
#include <protos.h>
|
||||||
|
|
||||||
#include <class_board.h>
|
#include <class_board.h>
|
||||||
#include <class_module.h>
|
#include <class_module.h>
|
||||||
|
@ -22,16 +23,14 @@
|
||||||
#include <dialog_pad_properties_base.h>
|
#include <dialog_pad_properties_base.h>
|
||||||
|
|
||||||
|
|
||||||
#define NBSHAPES 4
|
// list of pad shapes.
|
||||||
int CodeShape[NBSHAPES] = // list of pad shapes.
|
static PAD_SHAPE_T CodeShape[] = {
|
||||||
{
|
|
||||||
PAD_CIRCLE, PAD_OVAL, PAD_RECT, PAD_TRAPEZOID
|
PAD_CIRCLE, PAD_OVAL, PAD_RECT, PAD_TRAPEZOID
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define NBTYPES 4
|
#define NBTYPES 4
|
||||||
int CodeType[NBTYPES] =
|
static PAD_ATTR_T CodeType[NBTYPES] = {
|
||||||
{
|
|
||||||
PAD_STANDARD, PAD_SMD, PAD_CONN, PAD_HOLE_NOT_PLATED
|
PAD_STANDARD, PAD_SMD, PAD_CONN, PAD_HOLE_NOT_PLATED
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -52,34 +51,35 @@ static long Std_Pad_Layers[NBTYPES] =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
extern int ChangeSideMaskLayer( int masque );
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* class DIALOG_PAD_PROPERTIES, derived from DIALOG_PAD_PROPERTIES_BASE,
|
* class DIALOG_PAD_PROPERTIES, derived from DIALOG_PAD_PROPERTIES_BASE,
|
||||||
* created by wxFormBuilder
|
* created by wxFormBuilder
|
||||||
*/
|
*/
|
||||||
class DIALOG_PAD_PROPERTIES : public DIALOG_PAD_PROPERTIES_BASE
|
class DIALOG_PAD_PROPERTIES : public DIALOG_PAD_PROPERTIES_BASE
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
PCB_BASE_FRAME* m_Parent;
|
|
||||||
D_PAD* m_CurrentPad; // Pad currently edited
|
|
||||||
D_PAD* m_dummyPad; // a working copy used to show changes
|
|
||||||
BOARD* m_Board;
|
|
||||||
bool m_isFlipped; /* true if the parent footprint (therefore pads) is flipped (mirrored)
|
|
||||||
* in this case, some Y coordinates values must be negated
|
|
||||||
*/
|
|
||||||
bool m_canUpdate;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DIALOG_PAD_PROPERTIES( PCB_BASE_FRAME* parent, D_PAD* Pad );
|
DIALOG_PAD_PROPERTIES( PCB_BASE_FRAME* aParent, D_PAD* aPad );
|
||||||
~DIALOG_PAD_PROPERTIES()
|
~DIALOG_PAD_PROPERTIES()
|
||||||
{
|
{
|
||||||
delete m_dummyPad;
|
delete m_dummyPad;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
PCB_BASE_FRAME* m_Parent;
|
||||||
|
|
||||||
|
D_PAD* m_CurrentPad; // pad currently being edited
|
||||||
|
|
||||||
|
D_PAD* m_dummyPad; // a working copy used to show changes
|
||||||
|
|
||||||
|
BOARD* m_Board;
|
||||||
|
|
||||||
|
D_PAD& m_Pad_Master;
|
||||||
|
|
||||||
|
bool m_isFlipped; // true if the parent footprint (therefore pads) is flipped (mirrored)
|
||||||
|
// in this case, some Y coordinates values must be negated
|
||||||
|
|
||||||
|
bool m_canUpdate;
|
||||||
|
|
||||||
void initValues();
|
void initValues();
|
||||||
void OnPadShapeSelection( wxCommandEvent& event );
|
void OnPadShapeSelection( wxCommandEvent& event );
|
||||||
void OnDrillShapeSelected( wxCommandEvent& event );
|
void OnDrillShapeSelected( wxCommandEvent& event );
|
||||||
|
@ -95,6 +95,30 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
DIALOG_PAD_PROPERTIES::DIALOG_PAD_PROPERTIES( PCB_BASE_FRAME* aParent, D_PAD* aPad ) :
|
||||||
|
DIALOG_PAD_PROPERTIES_BASE( aParent ),
|
||||||
|
m_Pad_Master( aParent->GetBoard()->GetDesignSettings().m_Pad_Master )
|
||||||
|
{
|
||||||
|
m_canUpdate = false;
|
||||||
|
m_Parent = aParent;
|
||||||
|
m_CurrentPad = aPad;
|
||||||
|
m_Board = m_Parent->GetBoard();
|
||||||
|
m_dummyPad = new D_PAD( (MODULE*) NULL );
|
||||||
|
|
||||||
|
if( aPad )
|
||||||
|
m_dummyPad->Copy( aPad );
|
||||||
|
else
|
||||||
|
m_dummyPad->Copy( &m_Pad_Master );
|
||||||
|
|
||||||
|
initValues();
|
||||||
|
|
||||||
|
m_sdbSizer1OK->SetDefault();
|
||||||
|
GetSizer()->SetSizeHints( this );
|
||||||
|
Center();
|
||||||
|
m_canUpdate = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void DIALOG_PAD_PROPERTIES::OnPaintShowPanel( wxPaintEvent& event )
|
void DIALOG_PAD_PROPERTIES::OnPaintShowPanel( wxPaintEvent& event )
|
||||||
{
|
{
|
||||||
wxPaintDC dc( m_panelShowPad );
|
wxPaintDC dc( m_panelShowPad );
|
||||||
|
@ -102,12 +126,12 @@ void DIALOG_PAD_PROPERTIES::OnPaintShowPanel( wxPaintEvent& event )
|
||||||
|
|
||||||
int color = 0;
|
int color = 0;
|
||||||
|
|
||||||
if( m_dummyPad->m_layerMask & LAYER_FRONT )
|
if( m_dummyPad->GetLayerMask() & LAYER_FRONT )
|
||||||
{
|
{
|
||||||
color = m_Board->GetVisibleElementColor( PAD_FR_VISIBLE );
|
color = m_Board->GetVisibleElementColor( PAD_FR_VISIBLE );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_dummyPad->m_layerMask & LAYER_BACK )
|
if( m_dummyPad->GetLayerMask() & LAYER_BACK )
|
||||||
{
|
{
|
||||||
color |= m_Board->GetVisibleElementColor( PAD_BK_VISIBLE );
|
color |= m_Board->GetVisibleElementColor( PAD_BK_VISIBLE );
|
||||||
}
|
}
|
||||||
|
@ -117,26 +141,30 @@ void DIALOG_PAD_PROPERTIES::OnPaintShowPanel( wxPaintEvent& event )
|
||||||
|
|
||||||
drawInfo.m_Color = color;
|
drawInfo.m_Color = color;
|
||||||
drawInfo.m_HoleColor = DARKGRAY;
|
drawInfo.m_HoleColor = DARKGRAY;
|
||||||
drawInfo.m_Offset = m_dummyPad->m_Pos;
|
drawInfo.m_Offset = m_dummyPad->GetPosition();
|
||||||
drawInfo.m_Display_padnum = true;
|
drawInfo.m_Display_padnum = true;
|
||||||
drawInfo.m_Display_netname = true;
|
drawInfo.m_Display_netname = true;
|
||||||
if( m_dummyPad->m_Attribut == PAD_HOLE_NOT_PLATED )
|
if( m_dummyPad->GetAttribute() == PAD_HOLE_NOT_PLATED )
|
||||||
drawInfo.m_ShowNotPlatedHole = true;
|
drawInfo.m_ShowNotPlatedHole = true;
|
||||||
|
|
||||||
// Shows the local pad clearance
|
// Shows the local pad clearance
|
||||||
drawInfo.m_PadClearance = m_dummyPad->m_LocalClearance;
|
drawInfo.m_PadClearance = m_dummyPad->GetLocalClearance();
|
||||||
|
|
||||||
wxSize dc_size = dc.GetSize();
|
wxSize dc_size = dc.GetSize();
|
||||||
dc.SetDeviceOrigin( dc_size.x / 2, dc_size.y / 2 );
|
dc.SetDeviceOrigin( dc_size.x / 2, dc_size.y / 2 );
|
||||||
|
|
||||||
// Calculate a suitable scale to fit the available draw area
|
// Calculate a suitable scale to fit the available draw area
|
||||||
int dim = m_dummyPad->m_Size.x + ABS( m_dummyPad->m_DeltaSize.y);
|
int dim = m_dummyPad->GetSize().x + ABS( m_dummyPad->GetDelta().y);
|
||||||
if( m_dummyPad->m_LocalClearance > 0 )
|
|
||||||
dim += m_dummyPad->m_LocalClearance * 2;
|
if( m_dummyPad->GetLocalClearance() > 0 )
|
||||||
double scale = (double) dc_size.x / dim;
|
dim += m_dummyPad->GetLocalClearance() * 2;
|
||||||
dim = m_dummyPad->m_Size.y + ABS( m_dummyPad->m_DeltaSize.x);
|
|
||||||
if( m_dummyPad->m_LocalClearance > 0 )
|
double scale = (double) dc_size.x / dim;
|
||||||
dim += m_dummyPad->m_LocalClearance * 2;
|
|
||||||
|
dim = m_dummyPad->GetSize().y + ABS( m_dummyPad->GetDelta().x);
|
||||||
|
if( m_dummyPad->GetLocalClearance() > 0 )
|
||||||
|
dim += m_dummyPad->GetLocalClearance() * 2;
|
||||||
|
|
||||||
double altscale = (double) dc_size.y / dim;
|
double altscale = (double) dc_size.y / dim;
|
||||||
scale = MIN( scale, altscale );
|
scale = MIN( scale, altscale );
|
||||||
|
|
||||||
|
@ -151,31 +179,6 @@ void DIALOG_PAD_PROPERTIES::OnPaintShowPanel( wxPaintEvent& event )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************************/
|
|
||||||
DIALOG_PAD_PROPERTIES::DIALOG_PAD_PROPERTIES( PCB_BASE_FRAME* parent, D_PAD* Pad ) :
|
|
||||||
DIALOG_PAD_PROPERTIES_BASE( parent )
|
|
||||||
/*******************************************************************************************/
|
|
||||||
{
|
|
||||||
m_canUpdate = false;
|
|
||||||
m_Parent = parent;
|
|
||||||
m_CurrentPad = Pad;
|
|
||||||
m_Board = m_Parent->GetBoard();
|
|
||||||
m_dummyPad = new D_PAD( (MODULE*) NULL );
|
|
||||||
|
|
||||||
if( m_CurrentPad )
|
|
||||||
m_dummyPad->Copy( m_CurrentPad );
|
|
||||||
else
|
|
||||||
m_dummyPad->Copy( &g_Pad_Master );
|
|
||||||
|
|
||||||
initValues();
|
|
||||||
|
|
||||||
m_sdbSizer1OK->SetDefault();
|
|
||||||
GetSizer()->SetSizeHints( this );
|
|
||||||
Center();
|
|
||||||
m_canUpdate = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_BASE_FRAME::InstallPadOptionsFrame( D_PAD* Pad )
|
void PCB_BASE_FRAME::InstallPadOptionsFrame( D_PAD* Pad )
|
||||||
{
|
{
|
||||||
DIALOG_PAD_PROPERTIES dlg( this, Pad );
|
DIALOG_PAD_PROPERTIES dlg( this, Pad );
|
||||||
|
@ -188,30 +191,42 @@ void PCB_BASE_FRAME::InstallPadOptionsFrame( D_PAD* Pad )
|
||||||
void DIALOG_PAD_PROPERTIES::initValues()
|
void DIALOG_PAD_PROPERTIES::initValues()
|
||||||
/***************************************/
|
/***************************************/
|
||||||
{
|
{
|
||||||
SetFocus(); // Required under wxGTK if we want to demiss the dialog with the ESC key
|
SetFocus(); // Required under wxGTK if we want to dismiss the dialog with the ESC key
|
||||||
|
|
||||||
|
int internalUnits = m_Parent->GetInternalUnits();
|
||||||
|
wxString msg;
|
||||||
|
double angle;
|
||||||
|
|
||||||
int internalUnits = m_Parent->GetInternalUnits();
|
|
||||||
wxString msg;
|
|
||||||
m_isFlipped = false;
|
m_isFlipped = false;
|
||||||
|
|
||||||
if( m_CurrentPad )
|
if( m_CurrentPad )
|
||||||
{
|
{
|
||||||
MODULE* Module = (MODULE*) m_CurrentPad->GetParent();
|
MODULE* module = m_CurrentPad->GetParent();
|
||||||
if( Module->GetLayer() == LAYER_N_BACK )
|
|
||||||
|
if( module->GetLayer() == LAYER_N_BACK )
|
||||||
{
|
{
|
||||||
m_isFlipped = true;
|
m_isFlipped = true;
|
||||||
m_staticModuleSideValue->SetLabel( _( "Back side (footprint is mirrored)" ) );
|
m_staticModuleSideValue->SetLabel( _( "Back side (footprint is mirrored)" ) );
|
||||||
}
|
}
|
||||||
msg.Printf( wxT( "%.1f" ), (double) Module->m_Orient / 10 );
|
|
||||||
|
msg.Printf( wxT( "%.1f" ), (double) module->GetOrientation() / 10 );
|
||||||
m_staticModuleRotValue->SetLabel( msg );
|
m_staticModuleRotValue->SetLabel( msg );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_isFlipped )
|
if( m_isFlipped )
|
||||||
{
|
{
|
||||||
NEGATE( m_dummyPad->m_Offset.y );
|
wxPoint pt = m_dummyPad->GetOffset();
|
||||||
NEGATE( m_dummyPad->m_DeltaSize.y );
|
NEGATE( pt.y );
|
||||||
/* flip pads layers*/
|
m_dummyPad->SetOffset( pt );
|
||||||
m_dummyPad->m_layerMask = ChangeSideMaskLayer( m_dummyPad->m_layerMask );
|
|
||||||
|
wxSize sz = m_dummyPad->GetDelta();
|
||||||
|
NEGATE( sz.y );
|
||||||
|
m_dummyPad->SetDelta( sz );
|
||||||
|
|
||||||
|
// flip pad's layers
|
||||||
|
m_dummyPad->SetLayerMask( ChangeSideMaskLayer( m_dummyPad->GetLayerMask() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
m_staticTextWarningPadFlipped->Show(m_isFlipped);
|
m_staticTextWarningPadFlipped->Show(m_isFlipped);
|
||||||
|
|
||||||
m_PadNumCtrl->SetValue( m_dummyPad->GetPadName() );
|
m_PadNumCtrl->SetValue( m_dummyPad->GetPadName() );
|
||||||
|
@ -236,70 +251,73 @@ void DIALOG_PAD_PROPERTIES::initValues()
|
||||||
m_SolderPasteMarginUnits->SetLabel( GetUnitsLabel( g_UserUnit ) );
|
m_SolderPasteMarginUnits->SetLabel( GetUnitsLabel( g_UserUnit ) );
|
||||||
|
|
||||||
// Display current pad parameters units:
|
// Display current pad parameters units:
|
||||||
PutValueInLocalUnits( *m_PadPosition_X_Ctrl, m_dummyPad->m_Pos.x, internalUnits );
|
PutValueInLocalUnits( *m_PadPosition_X_Ctrl, m_dummyPad->GetPosition().x, internalUnits );
|
||||||
PutValueInLocalUnits( *m_PadPosition_Y_Ctrl, m_dummyPad->m_Pos.y, internalUnits );
|
PutValueInLocalUnits( *m_PadPosition_Y_Ctrl, m_dummyPad->GetPosition().y, internalUnits );
|
||||||
|
|
||||||
PutValueInLocalUnits( *m_PadDrill_X_Ctrl, m_dummyPad->m_Drill.x, internalUnits );
|
PutValueInLocalUnits( *m_PadDrill_X_Ctrl, m_dummyPad->GetDrillSize().x, internalUnits );
|
||||||
PutValueInLocalUnits( *m_PadDrill_Y_Ctrl, m_dummyPad->m_Drill.y, internalUnits );
|
PutValueInLocalUnits( *m_PadDrill_Y_Ctrl, m_dummyPad->GetDrillSize().y, internalUnits );
|
||||||
|
|
||||||
PutValueInLocalUnits( *m_ShapeSize_X_Ctrl, m_dummyPad->m_Size.x, internalUnits );
|
PutValueInLocalUnits( *m_ShapeSize_X_Ctrl, m_dummyPad->GetSize().x, internalUnits );
|
||||||
PutValueInLocalUnits( *m_ShapeSize_Y_Ctrl, m_dummyPad->m_Size.y, internalUnits );
|
PutValueInLocalUnits( *m_ShapeSize_Y_Ctrl, m_dummyPad->GetSize().y, internalUnits );
|
||||||
|
|
||||||
PutValueInLocalUnits( *m_ShapeOffset_X_Ctrl, m_dummyPad->m_Offset.x, internalUnits );
|
PutValueInLocalUnits( *m_ShapeOffset_X_Ctrl, m_dummyPad->GetOffset().x, internalUnits );
|
||||||
PutValueInLocalUnits( *m_ShapeOffset_Y_Ctrl, m_dummyPad->m_Offset.y, internalUnits );
|
PutValueInLocalUnits( *m_ShapeOffset_Y_Ctrl, m_dummyPad->GetOffset().y, internalUnits );
|
||||||
|
|
||||||
if( m_dummyPad->m_DeltaSize.x )
|
if( m_dummyPad->GetDelta().x )
|
||||||
{
|
{
|
||||||
PutValueInLocalUnits( *m_ShapeDelta_Ctrl, m_dummyPad->m_DeltaSize.x, internalUnits );
|
PutValueInLocalUnits( *m_ShapeDelta_Ctrl, m_dummyPad->GetDelta().x, internalUnits );
|
||||||
m_radioBtnDeltaXdir->SetValue(true);
|
m_radioBtnDeltaXdir->SetValue(true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PutValueInLocalUnits( *m_ShapeDelta_Ctrl, m_dummyPad->m_DeltaSize.y, internalUnits );
|
PutValueInLocalUnits( *m_ShapeDelta_Ctrl, m_dummyPad->GetDelta().y, internalUnits );
|
||||||
m_radioBtnDeltaYdir->SetValue(true);
|
m_radioBtnDeltaYdir->SetValue(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
PutValueInLocalUnits( *m_LengthDieCtrl, m_dummyPad->m_LengthDie, internalUnits );
|
PutValueInLocalUnits( *m_LengthDieCtrl, m_dummyPad->GetDieLength(), internalUnits );
|
||||||
|
|
||||||
PutValueInLocalUnits( *m_NetClearanceValueCtrl, m_dummyPad->m_LocalClearance, internalUnits );
|
PutValueInLocalUnits( *m_NetClearanceValueCtrl, m_dummyPad->GetLocalClearance(), internalUnits );
|
||||||
PutValueInLocalUnits( *m_SolderMaskMarginCtrl,
|
PutValueInLocalUnits( *m_SolderMaskMarginCtrl,
|
||||||
m_dummyPad->m_LocalSolderMaskMargin,
|
m_dummyPad->GetLocalSolderMaskMargin(),
|
||||||
internalUnits );
|
internalUnits );
|
||||||
|
|
||||||
// These 2 parameters are usually < 0, so prepare entering a negative value, if current is 0
|
// These 2 parameters are usually < 0, so prepare entering a negative value, if current is 0
|
||||||
PutValueInLocalUnits( *m_SolderPasteMarginCtrl,
|
PutValueInLocalUnits( *m_SolderPasteMarginCtrl,
|
||||||
m_dummyPad->m_LocalSolderPasteMargin,
|
m_dummyPad->GetLocalSolderPasteMargin(),
|
||||||
internalUnits );
|
internalUnits );
|
||||||
if( m_dummyPad->m_LocalSolderPasteMargin == 0 )
|
|
||||||
m_SolderPasteMarginCtrl->SetValue( wxT( "-" ) + m_SolderPasteMarginCtrl->GetValue() );
|
|
||||||
msg.Printf( wxT( "%.1f" ), m_dummyPad->m_LocalSolderPasteMarginRatio * 100.0 );
|
|
||||||
|
|
||||||
if( m_dummyPad->m_LocalSolderPasteMarginRatio == 0.0
|
if( m_dummyPad->GetLocalSolderPasteMargin() == 0 )
|
||||||
&& msg[0] == '0' ) // Sometimes Printf add a sign if the value is small
|
m_SolderPasteMarginCtrl->SetValue( wxT( "-" ) + m_SolderPasteMarginCtrl->GetValue() );
|
||||||
|
|
||||||
|
msg.Printf( wxT( "%.1f" ), m_dummyPad->GetLocalSolderPasteMarginRatio() * 100.0 );
|
||||||
|
|
||||||
|
if( m_dummyPad->GetLocalSolderPasteMarginRatio() == 0.0 && msg[0] == '0' )
|
||||||
|
// Sometimes Printf adds a sign if the value is small
|
||||||
m_SolderPasteMarginRatioCtrl->SetValue( wxT( "-" ) + msg );
|
m_SolderPasteMarginRatioCtrl->SetValue( wxT( "-" ) + msg );
|
||||||
else
|
else
|
||||||
m_SolderPasteMarginRatioCtrl->SetValue( msg );
|
m_SolderPasteMarginRatioCtrl->SetValue( msg );
|
||||||
|
|
||||||
if( m_CurrentPad )
|
if( m_CurrentPad )
|
||||||
{
|
{
|
||||||
MODULE* Module = (MODULE*) m_CurrentPad->GetParent();
|
MODULE* module = m_CurrentPad->GetParent();
|
||||||
m_dummyPad->m_Orient = m_CurrentPad->m_Orient - Module->m_Orient;
|
|
||||||
|
angle = m_CurrentPad->GetOrientation() - module->GetOrientation();
|
||||||
|
|
||||||
if( m_isFlipped )
|
if( m_isFlipped )
|
||||||
NEGATE( m_dummyPad->m_Orient );
|
NEGATE( angle );
|
||||||
|
|
||||||
|
m_dummyPad->SetOrientation( angle );
|
||||||
}
|
}
|
||||||
|
|
||||||
// adjust rotation agngle to -1800 to 1800 in internal units (0.1 deg)
|
angle = m_dummyPad->GetOrientation();
|
||||||
NORMALIZE_ANGLE_180( m_dummyPad->m_Orient );
|
|
||||||
|
NORMALIZE_ANGLE_180( angle ); // ? normalizing is in D_PAD::SetOrientation()
|
||||||
|
|
||||||
// Set layers used by this pad: :
|
// Set layers used by this pad: :
|
||||||
SetPadLayersList( m_dummyPad->m_layerMask );
|
SetPadLayersList( m_dummyPad->GetLayerMask() );
|
||||||
|
|
||||||
msg.Clear();
|
|
||||||
msg << m_dummyPad->m_Orient;
|
|
||||||
m_PadOrientCtrl->SetValue( msg );
|
|
||||||
|
|
||||||
// Pad Orient
|
// Pad Orient
|
||||||
switch( int( m_dummyPad->GetOrientation() ) )
|
switch( int( angle ) )
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
m_PadOrient->SetSelection( 0 );
|
m_PadOrient->SetSelection( 0 );
|
||||||
|
@ -323,7 +341,7 @@ void DIALOG_PAD_PROPERTIES::initValues()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch( m_dummyPad->m_PadShape )
|
switch( m_dummyPad->GetShape() )
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
case PAD_CIRCLE:
|
case PAD_CIRCLE:
|
||||||
|
@ -343,14 +361,15 @@ void DIALOG_PAD_PROPERTIES::initValues()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
msg.Printf( wxT( "%g" ), m_dummyPad->GetOrientation() );
|
msg.Printf( wxT( "%g" ), angle );
|
||||||
m_PadOrientCtrl->SetValue( msg );
|
m_PadOrientCtrl->SetValue( msg );
|
||||||
|
|
||||||
// Type of pad selection
|
// Type of pad selection
|
||||||
m_PadType->SetSelection( 0 );
|
m_PadType->SetSelection( 0 );
|
||||||
|
|
||||||
for( int ii = 0; ii < NBTYPES; ii++ )
|
for( int ii = 0; ii < NBTYPES; ii++ )
|
||||||
{
|
{
|
||||||
if( CodeType[ii] == m_dummyPad->m_Attribut )
|
if( CodeType[ii] == m_dummyPad->GetAttribute() )
|
||||||
{
|
{
|
||||||
m_PadType->SetSelection( ii );
|
m_PadType->SetSelection( ii );
|
||||||
break;
|
break;
|
||||||
|
@ -359,12 +378,13 @@ void DIALOG_PAD_PROPERTIES::initValues()
|
||||||
|
|
||||||
// Enable/disable Pad name,and pad length die
|
// Enable/disable Pad name,and pad length die
|
||||||
// (disable for NPTH pads (mechanical pads)
|
// (disable for NPTH pads (mechanical pads)
|
||||||
bool enable = m_dummyPad->m_Attribut != PAD_HOLE_NOT_PLATED;
|
bool enable = m_dummyPad->GetAttribute() != PAD_HOLE_NOT_PLATED;
|
||||||
|
|
||||||
m_PadNumCtrl->Enable( enable );
|
m_PadNumCtrl->Enable( enable );
|
||||||
m_PadNetNameCtrl->Enable( enable );
|
m_PadNetNameCtrl->Enable( enable );
|
||||||
m_LengthDieCtrl->Enable( enable );
|
m_LengthDieCtrl->Enable( enable );
|
||||||
|
|
||||||
if( m_dummyPad->m_DrillShape != PAD_OVAL )
|
if( m_dummyPad->GetDrillShape() != PAD_OVAL )
|
||||||
m_DrillShapeCtrl->SetSelection( 0 );
|
m_DrillShapeCtrl->SetSelection( 0 );
|
||||||
else
|
else
|
||||||
m_DrillShapeCtrl->SetSelection( 1 );
|
m_DrillShapeCtrl->SetSelection( 1 );
|
||||||
|
@ -386,9 +406,7 @@ void DIALOG_PAD_PROPERTIES::initValues()
|
||||||
m_PadLayerECO2->SetLabel( m_Board->GetLayerName( ECO2_N ) );
|
m_PadLayerECO2->SetLabel( m_Board->GetLayerName( ECO2_N ) );
|
||||||
m_PadLayerDraft->SetLabel( m_Board->GetLayerName( DRAW_N ) );
|
m_PadLayerDraft->SetLabel( m_Board->GetLayerName( DRAW_N ) );
|
||||||
|
|
||||||
/* All init are done,
|
// Update some dialog widgets state (Enable/disable options):
|
||||||
* Update some dialog widgets state (Enable/disable options):
|
|
||||||
*/
|
|
||||||
wxCommandEvent cmd_event;
|
wxCommandEvent cmd_event;
|
||||||
OnPadShapeSelection( cmd_event );
|
OnPadShapeSelection( cmd_event );
|
||||||
OnDrillShapeSelected( cmd_event );
|
OnDrillShapeSelected( cmd_event );
|
||||||
|
@ -439,7 +457,7 @@ void DIALOG_PAD_PROPERTIES::OnPadShapeSelection( wxCommandEvent& event )
|
||||||
void DIALOG_PAD_PROPERTIES::OnDrillShapeSelected( wxCommandEvent& event )
|
void DIALOG_PAD_PROPERTIES::OnDrillShapeSelected( wxCommandEvent& event )
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
{
|
{
|
||||||
if( (m_PadType->GetSelection() == 1) || (m_PadType->GetSelection() == 2) )
|
if( m_PadType->GetSelection() == 1 || m_PadType->GetSelection() == 2 )
|
||||||
{
|
{
|
||||||
// pad type = SMD or CONN: no hole allowed
|
// pad type = SMD or CONN: no hole allowed
|
||||||
m_PadDrill_X_Ctrl->Enable( false );
|
m_PadDrill_X_Ctrl->Enable( false );
|
||||||
|
@ -473,19 +491,19 @@ void DIALOG_PAD_PROPERTIES::PadOrientEvent( wxCommandEvent& event )
|
||||||
switch( m_PadOrient->GetSelection() )
|
switch( m_PadOrient->GetSelection() )
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
m_dummyPad->m_Orient = 0;
|
m_dummyPad->SetOrientation( 0 );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
m_dummyPad->m_Orient = 900;
|
m_dummyPad->SetOrientation( 900 );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
m_dummyPad->m_Orient = -900;
|
m_dummyPad->SetOrientation( -900 );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
m_dummyPad->m_Orient = 1800;
|
m_dummyPad->SetOrientation( 1800 );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -590,13 +608,15 @@ void DIALOG_PAD_PROPERTIES::PadPropertiesAccept( wxCommandEvent& event )
|
||||||
if( !success ) // An error on parameters has occured
|
if( !success ) // An error on parameters has occured
|
||||||
return;
|
return;
|
||||||
|
|
||||||
TransfertDataToPad( &g_Pad_Master, false );
|
TransfertDataToPad( &m_Pad_Master, false );
|
||||||
|
|
||||||
if( m_CurrentPad ) // Set current Pad parameters
|
if( m_CurrentPad ) // Set current Pad parameters
|
||||||
{
|
{
|
||||||
MODULE* Module = (MODULE*) m_CurrentPad->GetParent();
|
wxSize size;
|
||||||
m_Parent->SaveCopyInUndoList( Module, UR_CHANGED );
|
MODULE* module = m_CurrentPad->GetParent();
|
||||||
Module->m_LastEdit_Time = time( NULL );
|
|
||||||
|
m_Parent->SaveCopyInUndoList( module, UR_CHANGED );
|
||||||
|
module->m_LastEdit_Time = time( NULL );
|
||||||
|
|
||||||
// redraw the area where the pad was, without pad (delete pad on screen)
|
// redraw the area where the pad was, without pad (delete pad on screen)
|
||||||
m_CurrentPad->SetFlags( DO_NOT_DRAW );
|
m_CurrentPad->SetFlags( DO_NOT_DRAW );
|
||||||
|
@ -604,45 +624,54 @@ void DIALOG_PAD_PROPERTIES::PadPropertiesAccept( wxCommandEvent& event )
|
||||||
m_CurrentPad->ClearFlags( DO_NOT_DRAW );
|
m_CurrentPad->ClearFlags( DO_NOT_DRAW );
|
||||||
|
|
||||||
// Update values
|
// Update values
|
||||||
m_CurrentPad->m_PadShape = g_Pad_Master.m_PadShape;
|
m_CurrentPad->SetShape( m_Pad_Master.GetShape() );
|
||||||
m_CurrentPad->m_Attribut = g_Pad_Master.m_Attribut;
|
m_CurrentPad->SetAttribute( m_Pad_Master.GetAttribute() );
|
||||||
|
|
||||||
if( m_CurrentPad->m_Pos != g_Pad_Master.m_Pos )
|
if( m_CurrentPad->GetPosition() != m_Pad_Master.GetPosition() )
|
||||||
{
|
{
|
||||||
m_CurrentPad->m_Pos = g_Pad_Master.m_Pos;
|
m_CurrentPad->SetPosition( m_Pad_Master.GetPosition() );
|
||||||
rastnestIsChanged = true;
|
rastnestIsChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* compute the pos 0 value, i.e. pad position for module orient = 0 i.e.
|
// compute the pos 0 value, i.e. pad position for module with orientation = 0
|
||||||
* refer to module origin (module position) */
|
// i.e. relative to module origin (module position)
|
||||||
m_CurrentPad->m_Pos0 = m_CurrentPad->m_Pos;
|
wxPoint pt = m_CurrentPad->GetPosition() - module->GetPosition();
|
||||||
m_CurrentPad->m_Pos0 -= Module->m_Pos;
|
|
||||||
m_CurrentPad->m_Orient = (g_Pad_Master.m_Orient * isign) + Module->m_Orient;
|
|
||||||
RotatePoint( &m_CurrentPad->m_Pos0.x, &m_CurrentPad->m_Pos0.y, -Module->m_Orient );
|
|
||||||
|
|
||||||
m_CurrentPad->m_Size = g_Pad_Master.m_Size;
|
RotatePoint( &pt, -module->GetOrientation() );
|
||||||
m_CurrentPad->m_DeltaSize = g_Pad_Master.m_DeltaSize;
|
|
||||||
m_CurrentPad->m_DeltaSize.y *= isign;
|
|
||||||
m_CurrentPad->m_Drill = g_Pad_Master.m_Drill;
|
|
||||||
m_CurrentPad->m_DrillShape = g_Pad_Master.m_DrillShape;
|
|
||||||
m_CurrentPad->m_Offset = g_Pad_Master.m_Offset;
|
|
||||||
m_CurrentPad->m_Offset.y *= isign;
|
|
||||||
|
|
||||||
m_CurrentPad->m_LengthDie = g_Pad_Master.m_LengthDie;
|
m_CurrentPad->SetPos0( pt );
|
||||||
|
|
||||||
if( m_CurrentPad->m_layerMask != g_Pad_Master.m_layerMask )
|
m_CurrentPad->SetOrientation( m_Pad_Master.GetOrientation() * isign + module->GetOrientation() );
|
||||||
|
|
||||||
|
m_CurrentPad->SetSize( m_Pad_Master.GetSize() );
|
||||||
|
|
||||||
|
size = m_Pad_Master.GetDelta();
|
||||||
|
size.y *= isign;
|
||||||
|
m_CurrentPad->SetDelta( size );
|
||||||
|
|
||||||
|
m_CurrentPad->SetDrillSize( m_Pad_Master.GetDrillSize() );
|
||||||
|
m_CurrentPad->SetDrillShape( m_Pad_Master.GetDrillShape() );
|
||||||
|
|
||||||
|
wxPoint offset = m_Pad_Master.GetOffset();
|
||||||
|
offset.y *= isign;
|
||||||
|
m_CurrentPad->SetOffset( offset );
|
||||||
|
|
||||||
|
m_CurrentPad->SetDieLength( m_Pad_Master.GetDieLength() );
|
||||||
|
|
||||||
|
if( m_CurrentPad->GetLayerMask() != m_Pad_Master.GetLayerMask() )
|
||||||
{
|
{
|
||||||
rastnestIsChanged = true;
|
rastnestIsChanged = true;
|
||||||
m_CurrentPad->m_layerMask = g_Pad_Master.m_layerMask;
|
m_CurrentPad->SetLayerMask( m_Pad_Master.GetLayerMask() );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_isFlipped )
|
if( m_isFlipped )
|
||||||
m_CurrentPad->m_layerMask = ChangeSideMaskLayer( m_CurrentPad->m_layerMask );
|
m_CurrentPad->SetLayerMask( ChangeSideMaskLayer( m_CurrentPad->GetLayerMask() ) );
|
||||||
|
|
||||||
m_CurrentPad->SetPadName( g_Pad_Master.GetPadName() );
|
m_CurrentPad->SetPadName( m_Pad_Master.GetPadName() );
|
||||||
|
|
||||||
if( m_CurrentPad->GetNetname() != g_Pad_Master.GetNetname() )
|
if( m_CurrentPad->GetNetname() != m_Pad_Master.GetNetname() )
|
||||||
{
|
{
|
||||||
if( g_Pad_Master.GetNetname().IsEmpty() )
|
if( m_Pad_Master.GetNetname().IsEmpty() )
|
||||||
{
|
{
|
||||||
rastnestIsChanged = true;
|
rastnestIsChanged = true;
|
||||||
m_CurrentPad->SetNet( 0 );
|
m_CurrentPad->SetNet( 0 );
|
||||||
|
@ -650,11 +679,11 @@ void DIALOG_PAD_PROPERTIES::PadPropertiesAccept( wxCommandEvent& event )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const NETINFO_ITEM* net = m_Parent->GetBoard()->FindNet( g_Pad_Master.GetNetname() );
|
const NETINFO_ITEM* net = m_Parent->GetBoard()->FindNet( m_Pad_Master.GetNetname() );
|
||||||
if( net )
|
if( net )
|
||||||
{
|
{
|
||||||
rastnestIsChanged = true;
|
rastnestIsChanged = true;
|
||||||
m_CurrentPad->SetNetname( g_Pad_Master.GetNetname() );
|
m_CurrentPad->SetNetname( m_Pad_Master.GetNetname() );
|
||||||
m_CurrentPad->SetNet( net->GetNet() );
|
m_CurrentPad->SetNet( net->GetNet() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -662,14 +691,12 @@ void DIALOG_PAD_PROPERTIES::PadPropertiesAccept( wxCommandEvent& event )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_CurrentPad->m_LocalClearance = g_Pad_Master.m_LocalClearance;
|
m_CurrentPad->SetLocalClearance( m_Pad_Master.GetLocalClearance() );
|
||||||
m_CurrentPad->m_LocalSolderMaskMargin = g_Pad_Master.m_LocalSolderMaskMargin;
|
m_CurrentPad->SetLocalSolderMaskMargin( m_Pad_Master.GetLocalSolderMaskMargin() );
|
||||||
m_CurrentPad->m_LocalSolderPasteMargin = g_Pad_Master.m_LocalSolderPasteMargin;
|
m_CurrentPad->SetLocalSolderPasteMargin( m_Pad_Master.GetLocalSolderPasteMargin() );
|
||||||
m_CurrentPad->m_LocalSolderPasteMarginRatio = g_Pad_Master.m_LocalSolderPasteMarginRatio;
|
m_CurrentPad->SetLocalSolderPasteMarginRatio( m_Pad_Master.GetLocalSolderPasteMarginRatio() );
|
||||||
|
|
||||||
m_CurrentPad->ComputeShapeMaxRadius();
|
module->CalculateBoundingBox();
|
||||||
|
|
||||||
Module->CalculateBoundingBox();
|
|
||||||
m_CurrentPad->DisplayInfo( m_Parent );
|
m_CurrentPad->DisplayInfo( m_Parent );
|
||||||
|
|
||||||
// redraw the area where the pad was
|
// redraw the area where the pad was
|
||||||
|
@ -688,92 +715,108 @@ void DIALOG_PAD_PROPERTIES::PadPropertiesAccept( wxCommandEvent& event )
|
||||||
// user will be prompted for an error
|
// user will be prompted for an error
|
||||||
bool DIALOG_PAD_PROPERTIES::TransfertDataToPad( D_PAD* aPad, bool aPromptOnError )
|
bool DIALOG_PAD_PROPERTIES::TransfertDataToPad( D_PAD* aPad, bool aPromptOnError )
|
||||||
{
|
{
|
||||||
long PadLayerMask;
|
long padLayerMask;
|
||||||
int internalUnits = m_Parent->GetInternalUnits();
|
int internalUnits = m_Parent->GetInternalUnits();
|
||||||
wxString msg;
|
wxString msg;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
aPad->m_Attribut = CodeType[m_PadType->GetSelection()];
|
aPad->SetAttribute( CodeType[m_PadType->GetSelection()] );
|
||||||
aPad->m_PadShape = CodeShape[m_PadShape->GetSelection()];
|
aPad->SetShape( CodeShape[m_PadShape->GetSelection()] );
|
||||||
|
|
||||||
// Read pad clearances values:
|
// Read pad clearances values:
|
||||||
aPad->m_LocalClearance = ReturnValueFromTextCtrl( *m_NetClearanceValueCtrl,
|
aPad->SetLocalClearance( ReturnValueFromTextCtrl( *m_NetClearanceValueCtrl,
|
||||||
internalUnits );
|
internalUnits ) );
|
||||||
aPad->m_LocalSolderMaskMargin = ReturnValueFromTextCtrl( *m_SolderMaskMarginCtrl,
|
aPad->SetLocalSolderMaskMargin( ReturnValueFromTextCtrl( *m_SolderMaskMarginCtrl,
|
||||||
internalUnits );
|
internalUnits ) );
|
||||||
aPad->m_LocalSolderPasteMargin = ReturnValueFromTextCtrl( *m_SolderPasteMarginCtrl,
|
aPad->SetLocalSolderPasteMargin( ReturnValueFromTextCtrl( *m_SolderPasteMarginCtrl,
|
||||||
internalUnits );
|
internalUnits ) );
|
||||||
double dtmp = 0.0;
|
double dtmp = 0.0;
|
||||||
msg = m_SolderPasteMarginRatioCtrl->GetValue();
|
msg = m_SolderPasteMarginRatioCtrl->GetValue();
|
||||||
msg.ToDouble( &dtmp );
|
msg.ToDouble( &dtmp );
|
||||||
|
|
||||||
// A margin ratio de -50% means no paste on a pad, the ratio must be >= 50 %
|
// A margin ratio of -50% means no paste on a pad, the ratio must be >= 50 %
|
||||||
if( dtmp < -50 )
|
if( dtmp < -50 )
|
||||||
dtmp = -50;
|
dtmp = -50;
|
||||||
if( dtmp > +100 )
|
if( dtmp > +100 )
|
||||||
dtmp = +100;
|
dtmp = +100;
|
||||||
aPad->m_LocalSolderPasteMarginRatio = dtmp / 100;
|
|
||||||
|
aPad->SetLocalSolderPasteMarginRatio( dtmp / 100 );
|
||||||
|
|
||||||
// Read pad position:
|
// Read pad position:
|
||||||
aPad->m_Pos.x = ReturnValueFromTextCtrl( *m_PadPosition_X_Ctrl, internalUnits );
|
x = ReturnValueFromTextCtrl( *m_PadPosition_X_Ctrl, internalUnits );
|
||||||
aPad->m_Pos.y = ReturnValueFromTextCtrl( *m_PadPosition_Y_Ctrl, internalUnits );
|
y = ReturnValueFromTextCtrl( *m_PadPosition_Y_Ctrl, internalUnits );
|
||||||
aPad->m_Pos0 = aPad->m_Pos;
|
|
||||||
|
aPad->SetPosition( wxPoint( x, y ) );
|
||||||
|
aPad->SetPos0( wxPoint( x, y ) );
|
||||||
|
|
||||||
// Read pad drill:
|
// Read pad drill:
|
||||||
aPad->m_Drill.x = ReturnValueFromTextCtrl( *m_PadDrill_X_Ctrl, internalUnits );
|
x = ReturnValueFromTextCtrl( *m_PadDrill_X_Ctrl, internalUnits );
|
||||||
aPad->m_Drill.y = ReturnValueFromTextCtrl( *m_PadDrill_Y_Ctrl, internalUnits );
|
y = ReturnValueFromTextCtrl( *m_PadDrill_Y_Ctrl, internalUnits );
|
||||||
|
|
||||||
if( m_DrillShapeCtrl->GetSelection() == 0 )
|
if( m_DrillShapeCtrl->GetSelection() == 0 )
|
||||||
{
|
{
|
||||||
aPad->m_DrillShape = PAD_CIRCLE;
|
aPad->SetDrillShape( PAD_CIRCLE );
|
||||||
aPad->m_Drill.y = aPad->m_Drill.x;
|
y = x;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
aPad->m_DrillShape = PAD_OVAL;
|
aPad->SetDrillShape( PAD_OVAL );
|
||||||
|
|
||||||
|
aPad->SetDrillSize( wxSize( x, y ) );
|
||||||
|
|
||||||
// Read pad shape size:
|
// Read pad shape size:
|
||||||
aPad->m_Size.x = ReturnValueFromTextCtrl( *m_ShapeSize_X_Ctrl, internalUnits );
|
x = ReturnValueFromTextCtrl( *m_ShapeSize_X_Ctrl, internalUnits );
|
||||||
aPad->m_Size.y = ReturnValueFromTextCtrl( *m_ShapeSize_Y_Ctrl, internalUnits );
|
y = ReturnValueFromTextCtrl( *m_ShapeSize_Y_Ctrl, internalUnits );
|
||||||
if( aPad->m_PadShape == PAD_CIRCLE )
|
if( aPad->GetShape() == PAD_CIRCLE )
|
||||||
aPad->m_Size.y = aPad->m_Size.x;
|
y = x;
|
||||||
|
|
||||||
|
aPad->SetSize( wxSize( x, y ) );
|
||||||
|
|
||||||
|
// Read pad length die
|
||||||
|
aPad->SetDieLength( ReturnValueFromTextCtrl( *m_LengthDieCtrl, internalUnits ) );
|
||||||
|
|
||||||
// Read pad shape delta size:
|
// Read pad shape delta size:
|
||||||
// m_DeltaSize.x or m_DeltaSize.y must be NULL. for a trapezoid.
|
// m_DeltaSize.x or m_DeltaSize.y must be NULL. for a trapezoid.
|
||||||
wxSize delta;
|
wxSize delta;
|
||||||
|
|
||||||
if( m_radioBtnDeltaXdir->GetValue() )
|
if( m_radioBtnDeltaXdir->GetValue() )
|
||||||
delta.x = ReturnValueFromTextCtrl( *m_ShapeDelta_Ctrl, internalUnits );
|
delta.x = ReturnValueFromTextCtrl( *m_ShapeDelta_Ctrl, internalUnits );
|
||||||
else
|
else
|
||||||
delta.y = ReturnValueFromTextCtrl( *m_ShapeDelta_Ctrl, internalUnits );
|
delta.y = ReturnValueFromTextCtrl( *m_ShapeDelta_Ctrl, internalUnits );
|
||||||
aPad->m_DeltaSize = delta;
|
|
||||||
|
|
||||||
// Read pad lenght die
|
// Test bad values (be sure delta values are not too large)
|
||||||
aPad->m_LengthDie = ReturnValueFromTextCtrl( *m_LengthDieCtrl, internalUnits );
|
|
||||||
|
|
||||||
// Test bad values (be sure delta values are not to large)
|
|
||||||
// remember DeltaSize.x is the Y size variation
|
// remember DeltaSize.x is the Y size variation
|
||||||
bool error = false;
|
bool error = false;
|
||||||
if( (aPad->m_DeltaSize.x < 0) && (aPad->m_DeltaSize.x <= -aPad->m_Size.y) )
|
|
||||||
|
if( delta.x < 0 && delta.x <= -aPad->GetSize().y )
|
||||||
{
|
{
|
||||||
aPad->m_DeltaSize.x = -aPad->m_Size.y + 2;
|
delta.x = -aPad->GetSize().y + 2;
|
||||||
error = true;
|
|
||||||
}
|
|
||||||
if( (aPad->m_DeltaSize.x > 0) && (aPad->m_DeltaSize.x >= aPad->m_Size.y) )
|
|
||||||
{
|
|
||||||
aPad->m_DeltaSize.x = aPad->m_Size.y - 2;
|
|
||||||
error = true;
|
|
||||||
}
|
|
||||||
if( (aPad->m_DeltaSize.y < 0) && (aPad->m_DeltaSize.y <= -aPad->m_Size.x) )
|
|
||||||
{
|
|
||||||
aPad->m_DeltaSize.y = -aPad->m_Size.x + 2;
|
|
||||||
error = true;
|
|
||||||
}
|
|
||||||
if( (aPad->m_DeltaSize.y > 0) && (aPad->m_DeltaSize.y >= aPad->m_Size.x) )
|
|
||||||
{
|
|
||||||
aPad->m_DeltaSize.y = aPad->m_Size.x - 2;
|
|
||||||
error = true;
|
error = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( delta.x > 0 && delta.x >= aPad->GetSize().y )
|
||||||
|
{
|
||||||
|
delta.x = aPad->GetSize().y - 2;
|
||||||
|
error = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( delta.y < 0 && delta.y <= -aPad->GetSize().x )
|
||||||
|
{
|
||||||
|
delta.y = -aPad->GetSize().x + 2;
|
||||||
|
error = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( delta.y > 0 && delta.y >= aPad->GetSize().x )
|
||||||
|
{
|
||||||
|
delta.y = aPad->GetSize().x - 2;
|
||||||
|
error = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
aPad->SetDelta( delta );
|
||||||
|
|
||||||
// Read pad shape offset:
|
// Read pad shape offset:
|
||||||
aPad->m_Offset.x = ReturnValueFromTextCtrl( *m_ShapeOffset_X_Ctrl, internalUnits );
|
x = ReturnValueFromTextCtrl( *m_ShapeOffset_X_Ctrl, internalUnits );
|
||||||
aPad->m_Offset.y = ReturnValueFromTextCtrl( *m_ShapeOffset_Y_Ctrl, internalUnits );
|
y = ReturnValueFromTextCtrl( *m_ShapeOffset_Y_Ctrl, internalUnits );
|
||||||
|
aPad->SetOffset( wxPoint( x, y ) );
|
||||||
|
|
||||||
double orient_value = 0;
|
double orient_value = 0;
|
||||||
msg = m_PadOrientCtrl->GetValue();
|
msg = m_PadOrientCtrl->GetValue();
|
||||||
|
@ -786,41 +829,45 @@ bool DIALOG_PAD_PROPERTIES::TransfertDataToPad( D_PAD* aPad, bool aPromptOnError
|
||||||
aPad->SetNetname( m_PadNetNameCtrl->GetValue() );
|
aPad->SetNetname( m_PadNetNameCtrl->GetValue() );
|
||||||
|
|
||||||
// Clear some values, according to the pad type and shape
|
// Clear some values, according to the pad type and shape
|
||||||
switch( aPad->m_PadShape )
|
switch( aPad->GetShape() )
|
||||||
{
|
{
|
||||||
case PAD_CIRCLE:
|
case PAD_CIRCLE:
|
||||||
aPad->m_Offset = wxSize( 0, 0 );
|
aPad->SetOffset( wxPoint( 0, 0 ) );
|
||||||
aPad->m_DeltaSize = wxSize( 0, 0 );
|
aPad->SetDelta( wxSize( 0, 0 ) );
|
||||||
aPad->m_Size.y = aPad->m_Size.x;
|
x = aPad->GetSize().x;
|
||||||
|
aPad->SetSize( wxSize( x, x ) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAD_RECT:
|
case PAD_RECT:
|
||||||
aPad->m_DeltaSize = wxSize( 0, 0 );
|
aPad->SetDelta( wxSize( 0, 0 ) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAD_OVAL:
|
case PAD_OVAL:
|
||||||
aPad->m_DeltaSize = wxSize( 0, 0 );
|
aPad->SetDelta( wxSize( 0, 0 ) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAD_TRAPEZOID:
|
case PAD_TRAPEZOID:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch( aPad->m_Attribut )
|
switch( aPad->GetAttribute() )
|
||||||
{
|
{
|
||||||
case PAD_STANDARD:
|
case PAD_STANDARD:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAD_CONN:
|
case PAD_CONN:
|
||||||
case PAD_SMD:
|
case PAD_SMD:
|
||||||
aPad->m_Offset = wxSize( 0, 0 );
|
aPad->SetOffset( wxPoint( 0, 0 ) );
|
||||||
aPad->m_Drill = wxSize( 0, 0 );
|
aPad->SetDrillSize( wxSize( 0, 0 ) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAD_HOLE_NOT_PLATED:
|
case PAD_HOLE_NOT_PLATED:
|
||||||
// Mechanical purpose only:
|
// Mechanical purpose only:
|
||||||
// no offset, no net name, no pad name allowed
|
// no offset, no net name, no pad name allowed
|
||||||
aPad->m_Offset = wxSize( 0, 0 );
|
aPad->SetOffset( wxPoint( 0, 0 ) );
|
||||||
aPad->SetPadName( wxEmptyString );
|
aPad->SetPadName( wxEmptyString );
|
||||||
aPad->SetNetname( wxEmptyString );
|
aPad->SetNetname( wxEmptyString );
|
||||||
break;
|
break;
|
||||||
|
@ -830,67 +877,67 @@ bool DIALOG_PAD_PROPERTIES::TransfertDataToPad( D_PAD* aPad, bool aPromptOnError
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PadLayerMask = 0;
|
padLayerMask = 0;
|
||||||
|
|
||||||
switch( m_rbCopperLayersSel->GetSelection() )
|
switch( m_rbCopperLayersSel->GetSelection() )
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
PadLayerMask |= LAYER_FRONT;
|
padLayerMask |= LAYER_FRONT;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
PadLayerMask |= LAYER_BACK;
|
padLayerMask |= LAYER_BACK;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
PadLayerMask |= ALL_CU_LAYERS;
|
padLayerMask |= ALL_CU_LAYERS;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3: // No copper layers
|
case 3: // No copper layers
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_PadLayerAdhCmp->GetValue() )
|
if( m_PadLayerAdhCmp->GetValue() )
|
||||||
PadLayerMask |= ADHESIVE_LAYER_FRONT;
|
padLayerMask |= ADHESIVE_LAYER_FRONT;
|
||||||
if( m_PadLayerAdhCu->GetValue() )
|
if( m_PadLayerAdhCu->GetValue() )
|
||||||
PadLayerMask |= ADHESIVE_LAYER_BACK;
|
padLayerMask |= ADHESIVE_LAYER_BACK;
|
||||||
if( m_PadLayerPateCmp->GetValue() )
|
if( m_PadLayerPateCmp->GetValue() )
|
||||||
PadLayerMask |= SOLDERPASTE_LAYER_FRONT;
|
padLayerMask |= SOLDERPASTE_LAYER_FRONT;
|
||||||
if( m_PadLayerPateCu->GetValue() )
|
if( m_PadLayerPateCu->GetValue() )
|
||||||
PadLayerMask |= SOLDERPASTE_LAYER_BACK;
|
padLayerMask |= SOLDERPASTE_LAYER_BACK;
|
||||||
if( m_PadLayerSilkCmp->GetValue() )
|
if( m_PadLayerSilkCmp->GetValue() )
|
||||||
PadLayerMask |= SILKSCREEN_LAYER_FRONT;
|
padLayerMask |= SILKSCREEN_LAYER_FRONT;
|
||||||
if( m_PadLayerSilkCu->GetValue() )
|
if( m_PadLayerSilkCu->GetValue() )
|
||||||
PadLayerMask |= SILKSCREEN_LAYER_BACK;
|
padLayerMask |= SILKSCREEN_LAYER_BACK;
|
||||||
if( m_PadLayerMaskCmp->GetValue() )
|
if( m_PadLayerMaskCmp->GetValue() )
|
||||||
PadLayerMask |= SOLDERMASK_LAYER_FRONT;
|
padLayerMask |= SOLDERMASK_LAYER_FRONT;
|
||||||
if( m_PadLayerMaskCu->GetValue() )
|
if( m_PadLayerMaskCu->GetValue() )
|
||||||
PadLayerMask |= SOLDERMASK_LAYER_BACK;
|
padLayerMask |= SOLDERMASK_LAYER_BACK;
|
||||||
if( m_PadLayerECO1->GetValue() )
|
if( m_PadLayerECO1->GetValue() )
|
||||||
PadLayerMask |= ECO1_LAYER;
|
padLayerMask |= ECO1_LAYER;
|
||||||
if( m_PadLayerECO2->GetValue() )
|
if( m_PadLayerECO2->GetValue() )
|
||||||
PadLayerMask |= ECO2_LAYER;
|
padLayerMask |= ECO2_LAYER;
|
||||||
if( m_PadLayerDraft->GetValue() )
|
if( m_PadLayerDraft->GetValue() )
|
||||||
PadLayerMask |= DRAW_LAYER;
|
padLayerMask |= DRAW_LAYER;
|
||||||
|
|
||||||
aPad->m_layerMask = PadLayerMask;
|
aPad->SetLayerMask( padLayerMask );
|
||||||
|
|
||||||
/* Test for incorrect values */
|
// Test for incorrect values
|
||||||
if( aPromptOnError )
|
if( aPromptOnError )
|
||||||
{
|
{
|
||||||
if( (aPad->m_Size.x < aPad->m_Drill.x)
|
if( (aPad->GetSize().x < aPad->GetDrillSize().x) || (aPad->GetSize().y < aPad->GetDrillSize().y) )
|
||||||
|| (aPad->m_Size.y < aPad->m_Drill.y) )
|
|
||||||
{
|
{
|
||||||
DisplayError( NULL, _( "Incorrect value for pad drill: pad drill bigger than pad size" ) );
|
DisplayError( NULL, _( "Incorrect value for pad drill: pad drill bigger than pad size" ) );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int padlayers_mask = PadLayerMask & (LAYER_BACK | LAYER_FRONT);
|
int padlayers_mask = padLayerMask & (LAYER_BACK | LAYER_FRONT);
|
||||||
if( padlayers_mask == 0 )
|
if( padlayers_mask == 0 )
|
||||||
{
|
{
|
||||||
if( aPad->m_Drill.x || aPad->m_Drill.y )
|
if( aPad->GetDrillSize().x || aPad->GetDrillSize().y )
|
||||||
{
|
{
|
||||||
msg = _( "Error: pad is not on a copper layer and has a hole" );
|
msg = _( "Error: pad is not on a copper layer and has a hole" );
|
||||||
if( aPad->m_Attribut == PAD_HOLE_NOT_PLATED )
|
if( aPad->GetAttribute() == PAD_HOLE_NOT_PLATED )
|
||||||
{
|
{
|
||||||
msg += wxT("\n");
|
msg += wxT("\n");
|
||||||
msg += _( "For NPTH pad, set pad drill value to pad size value,\n\
|
msg += _( "For NPTH pad, set pad drill value to pad size value,\n\
|
||||||
|
@ -901,8 +948,8 @@ if you do not want this pad plotted in gerber files");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ( aPad->m_Size.x / 2 <= ABS( aPad->m_Offset.x ) )
|
if( aPad->GetSize().x / 2 <= ABS( aPad->GetOffset().x ) ||
|
||||||
|| ( aPad->m_Size.y / 2 <= ABS( aPad->m_Offset.y ) ) )
|
aPad->GetSize().y / 2 <= ABS( aPad->GetOffset().y ) )
|
||||||
{
|
{
|
||||||
DisplayError( NULL, _( "Incorrect value for pad offset" ) );
|
DisplayError( NULL, _( "Incorrect value for pad offset" ) );
|
||||||
return false;
|
return false;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -35,36 +35,36 @@ DRAG_SEGM::DRAG_SEGM( TRACK* segm )
|
||||||
/* Redraw the list of segments starting in g_DragSegmentList, while moving a footprint */
|
/* Redraw the list of segments starting in g_DragSegmentList, while moving a footprint */
|
||||||
void DrawSegmentWhileMovingFootprint( EDA_DRAW_PANEL* panel, wxDC* DC )
|
void DrawSegmentWhileMovingFootprint( EDA_DRAW_PANEL* panel, wxDC* DC )
|
||||||
{
|
{
|
||||||
D_PAD* pt_pad;
|
|
||||||
TRACK* Track;
|
|
||||||
|
|
||||||
if( g_DragSegmentList.size() == 0 )
|
if( g_DragSegmentList.size() == 0 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ )
|
for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ )
|
||||||
{
|
{
|
||||||
wxPoint pos;
|
wxPoint pos;
|
||||||
Track = g_DragSegmentList[ii].m_Segm;
|
|
||||||
|
TRACK* track = g_DragSegmentList[ii].m_Segm;
|
||||||
|
|
||||||
#ifndef USE_WX_OVERLAY
|
#ifndef USE_WX_OVERLAY
|
||||||
Track->Draw( panel, DC, GR_XOR ); // erase from screen at old position
|
track->Draw( panel, DC, GR_XOR ); // erase from screen at old position
|
||||||
#endif
|
#endif
|
||||||
pt_pad = g_DragSegmentList[ii].m_Pad_Start;
|
|
||||||
|
|
||||||
if( pt_pad )
|
D_PAD* pad = g_DragSegmentList[ii].m_Pad_Start;
|
||||||
|
|
||||||
|
if( pad )
|
||||||
{
|
{
|
||||||
pos = pt_pad->m_Pos - g_Offset_Module;
|
pos = pad->GetPosition() - g_Offset_Module;
|
||||||
Track->m_Start = pos;
|
track->m_Start = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
pt_pad = g_DragSegmentList[ii].m_Pad_End;
|
pad = g_DragSegmentList[ii].m_Pad_End;
|
||||||
|
|
||||||
if( pt_pad )
|
if( pad )
|
||||||
{
|
{
|
||||||
pos = pt_pad->m_Pos - g_Offset_Module;
|
pos = pad->GetPosition() - g_Offset_Module;
|
||||||
Track->m_End = pos;
|
track->m_End = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
Track->Draw( panel, DC, GR_XOR );
|
track->Draw( panel, DC, GR_XOR );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,15 +74,11 @@ void DrawSegmentWhileMovingFootprint( EDA_DRAW_PANEL* panel, wxDC* DC )
|
||||||
* For each selected track segment set the EDIT flag
|
* For each selected track segment set the EDIT flag
|
||||||
* and redraw them in EDIT mode (sketch mode)
|
* and redraw them in EDIT mode (sketch mode)
|
||||||
*/
|
*/
|
||||||
void Build_Drag_Liste( EDA_DRAW_PANEL* panel, wxDC* DC, MODULE* Module )
|
void Build_Drag_Liste( EDA_DRAW_PANEL* panel, wxDC* DC, MODULE* aModule )
|
||||||
{
|
{
|
||||||
D_PAD* pt_pad;
|
for( D_PAD* pad = aModule->m_Pads; pad; pad = pad->Next() )
|
||||||
|
|
||||||
pt_pad = Module->m_Pads;
|
|
||||||
|
|
||||||
for( ; pt_pad != NULL; pt_pad = (D_PAD*) pt_pad->Next() )
|
|
||||||
{
|
{
|
||||||
Build_1_Pad_SegmentsToDrag( panel, DC, pt_pad );
|
Build_1_Pad_SegmentsToDrag( panel, DC, pad );
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -95,37 +91,36 @@ void Build_Drag_Liste( EDA_DRAW_PANEL* panel, wxDC* DC, MODULE* Module )
|
||||||
* and redraw them in EDIT mode (sketch mode)
|
* and redraw them in EDIT mode (sketch mode)
|
||||||
* Net codes must be OK.
|
* Net codes must be OK.
|
||||||
*/
|
*/
|
||||||
void Build_1_Pad_SegmentsToDrag( EDA_DRAW_PANEL* panel, wxDC* DC, D_PAD* PtPad )
|
void Build_1_Pad_SegmentsToDrag( EDA_DRAW_PANEL* panel, wxDC* DC, D_PAD* aPad )
|
||||||
{
|
{
|
||||||
TRACK* Track;
|
|
||||||
int net_code = PtPad->GetNet();
|
|
||||||
int LayerMask;
|
|
||||||
wxPoint pos;
|
|
||||||
BOARD* pcb = ( (PCB_BASE_FRAME*)( panel->GetParent() ) )->GetBoard();
|
BOARD* pcb = ( (PCB_BASE_FRAME*)( panel->GetParent() ) )->GetBoard();
|
||||||
|
|
||||||
Track = pcb->m_Track->GetStartNetCode( net_code );
|
int net_code = aPad->GetNet();
|
||||||
|
|
||||||
pos = PtPad->m_Pos;
|
TRACK* track = pcb->m_Track->GetStartNetCode( net_code );
|
||||||
LayerMask = PtPad->m_layerMask;
|
|
||||||
|
|
||||||
for( ; Track; Track = Track->Next() )
|
wxPoint pos = aPad->GetPosition();
|
||||||
|
|
||||||
|
int layerMask = aPad->GetLayerMask();
|
||||||
|
|
||||||
|
for( ; track; track = track->Next() )
|
||||||
{
|
{
|
||||||
if( Track->GetNet() != net_code )
|
if( track->GetNet() != net_code )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if( ( LayerMask & Track->ReturnMaskLayer() ) == 0 )
|
if( ( layerMask & track->ReturnMaskLayer() ) == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( pos == Track->m_Start )
|
if( pos == track->m_Start )
|
||||||
{
|
{
|
||||||
AddSegmentToDragList( panel, DC, STARTPOINT, Track );
|
AddSegmentToDragList( panel, DC, STARTPOINT, track );
|
||||||
g_DragSegmentList.back().m_Pad_Start = PtPad;
|
g_DragSegmentList.back().m_Pad_Start = aPad;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( pos == Track->m_End )
|
if( pos == track->m_End )
|
||||||
{
|
{
|
||||||
AddSegmentToDragList( panel, DC, ENDPOINT, Track );
|
AddSegmentToDragList( panel, DC, ENDPOINT, track );
|
||||||
g_DragSegmentList.back().m_Pad_End = PtPad;
|
g_DragSegmentList.back().m_Pad_End = aPad;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -422,9 +422,10 @@ void DRC::testPad2Pad()
|
||||||
{
|
{
|
||||||
D_PAD* pad = sortedPads[i];
|
D_PAD* pad = sortedPads[i];
|
||||||
|
|
||||||
// m_ShapeMaxRadius is the radius value of the circle containing the pad
|
// GetBoundingRadius() is the radius of the minimum sized circle fully containing the pad
|
||||||
if( pad->m_ShapeMaxRadius > max_size )
|
int radius = pad->GetBoundingRadius();
|
||||||
max_size = pad->m_ShapeMaxRadius;
|
if( radius > max_size )
|
||||||
|
max_size = radius;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test the pads
|
// Test the pads
|
||||||
|
@ -435,7 +436,7 @@ void DRC::testPad2Pad()
|
||||||
D_PAD* pad = sortedPads[i];
|
D_PAD* pad = sortedPads[i];
|
||||||
|
|
||||||
int x_limit = max_size + pad->GetClearance() +
|
int x_limit = max_size + pad->GetClearance() +
|
||||||
pad->m_ShapeMaxRadius + pad->GetPosition().x;
|
pad->GetBoundingRadius() + pad->GetPosition().x;
|
||||||
|
|
||||||
if( !doPadToPadsDrc( pad, &sortedPads[i], listEnd, x_limit ) )
|
if( !doPadToPadsDrc( pad, &sortedPads[i], listEnd, x_limit ) )
|
||||||
{
|
{
|
||||||
|
@ -559,7 +560,7 @@ void DRC::testZones()
|
||||||
|
|
||||||
bool DRC::doPadToPadsDrc( D_PAD* aRefPad, D_PAD** aStart, D_PAD** aEnd, int x_limit )
|
bool DRC::doPadToPadsDrc( D_PAD* aRefPad, D_PAD** aStart, D_PAD** aEnd, int x_limit )
|
||||||
{
|
{
|
||||||
int layerMask = aRefPad->m_layerMask & ALL_CU_LAYERS;
|
int layerMask = aRefPad->GetLayerMask() & ALL_CU_LAYERS;
|
||||||
|
|
||||||
/* used to test DRC pad to holes: this dummy pad has the size and shape of the hole
|
/* used to test DRC pad to holes: this dummy pad has the size and shape of the hole
|
||||||
* to test pad to pad hole DRC, using the pad to pad DRC test function.
|
* to test pad to pad hole DRC, using the pad to pad DRC test function.
|
||||||
|
@ -569,12 +570,14 @@ bool DRC::doPadToPadsDrc( D_PAD* aRefPad, D_PAD** aStart, D_PAD** aEnd, int x_li
|
||||||
*/
|
*/
|
||||||
MODULE dummymodule( m_pcb ); // Creates a dummy parent
|
MODULE dummymodule( m_pcb ); // Creates a dummy parent
|
||||||
D_PAD dummypad( &dummymodule );
|
D_PAD dummypad( &dummymodule );
|
||||||
dummypad.m_layerMask |= ALL_CU_LAYERS; // Ensure the hole is on all copper layers
|
|
||||||
dummypad.m_LocalClearance = 1; /* Use the minimal local clearance value for the dummy pad
|
// Ensure the hole is on all copper layers
|
||||||
* the clearance of the active pad will be used
|
dummypad.SetLayerMask( ALL_CU_LAYERS | dummypad.GetLayerMask() );
|
||||||
* as minimum distance to a hole
|
|
||||||
* (a value = 0 means use netclass value)
|
// Use the minimal local clearance value for the dummy pad.
|
||||||
*/
|
// The clearance of the active pad will be used as minimum distance to a hole
|
||||||
|
// (a value = 0 means use netclass value)
|
||||||
|
dummypad.SetLocalClearance( 1 );
|
||||||
|
|
||||||
for( D_PAD** pad_list = aStart; pad_list<aEnd; ++pad_list )
|
for( D_PAD** pad_list = aStart; pad_list<aEnd; ++pad_list )
|
||||||
{
|
{
|
||||||
|
@ -583,43 +586,40 @@ bool DRC::doPadToPadsDrc( D_PAD* aRefPad, D_PAD** aStart, D_PAD** aEnd, int x_li
|
||||||
if( pad == aRefPad )
|
if( pad == aRefPad )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// We can stop the test when pad->m_Pos.x > x_limit
|
// We can stop the test when pad->GetPosition().x > x_limit
|
||||||
// because the list is sorted by X values
|
// because the list is sorted by X values
|
||||||
if( pad->m_Pos.x > x_limit )
|
if( pad->GetPosition().x > x_limit )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// No problem if pads are on different copper layers,
|
// No problem if pads are on different copper layers,
|
||||||
// but their hole (if any ) can create DRC error because they are on all
|
// but their hole (if any ) can create DRC error because they are on all
|
||||||
// copper layers, so we test them
|
// copper layers, so we test them
|
||||||
if( ( pad->m_layerMask & layerMask ) == 0 )
|
if( ( pad->GetLayerMask() & layerMask ) == 0 )
|
||||||
{
|
{
|
||||||
// if holes are in the same location and have the same size and shape,
|
// if holes are in the same location and have the same size and shape,
|
||||||
// this can be accepted
|
// this can be accepted
|
||||||
if( pad->GetPosition() == aRefPad->GetPosition()
|
if( pad->GetPosition() == aRefPad->GetPosition()
|
||||||
&& pad->m_Drill == aRefPad->m_Drill
|
&& pad->GetDrillSize() == aRefPad->GetDrillSize()
|
||||||
&& pad->m_DrillShape == aRefPad->m_DrillShape )
|
&& pad->GetDrillShape() == aRefPad->GetDrillShape() )
|
||||||
{
|
{
|
||||||
if( aRefPad->m_DrillShape == PAD_CIRCLE )
|
if( aRefPad->GetDrillShape() == PAD_CIRCLE )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// for oval holes: must also have the same orientation
|
// for oval holes: must also have the same orientation
|
||||||
if( pad->m_Orient == aRefPad->m_Orient )
|
if( pad->GetOrientation() == aRefPad->GetOrientation() )
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Here, we must test clearance between holes and pads
|
/* Here, we must test clearance between holes and pads
|
||||||
* dummy pad size and shape is adjusted to pad drill size and shape
|
* dummy pad size and shape is adjusted to pad drill size and shape
|
||||||
*/
|
*/
|
||||||
if( pad->m_Drill.x )
|
if( pad->GetDrillSize().x )
|
||||||
{
|
{
|
||||||
// pad under testing has a hole, test this hole against pad reference
|
// pad under testing has a hole, test this hole against pad reference
|
||||||
dummypad.SetPosition( pad->GetPosition() );
|
dummypad.SetPosition( pad->GetPosition() );
|
||||||
dummypad.m_Size = pad->m_Drill;
|
dummypad.SetSize( pad->GetDrillSize() );
|
||||||
dummypad.m_PadShape = (pad->m_DrillShape == PAD_OVAL) ? PAD_OVAL : PAD_CIRCLE;
|
dummypad.SetShape( pad->GetDrillShape() == PAD_OVAL ? PAD_OVAL : PAD_CIRCLE );
|
||||||
dummypad.m_Orient = pad->m_Orient;
|
dummypad.SetOrientation( pad->GetOrientation() );
|
||||||
|
|
||||||
// compute the radius of the circle containing this pad
|
|
||||||
dummypad.ComputeShapeMaxRadius();
|
|
||||||
|
|
||||||
if( !checkClearancePadToPad( aRefPad, &dummypad ) )
|
if( !checkClearancePadToPad( aRefPad, &dummypad ) )
|
||||||
{
|
{
|
||||||
|
@ -630,15 +630,12 @@ bool DRC::doPadToPadsDrc( D_PAD* aRefPad, D_PAD** aStart, D_PAD** aEnd, int x_li
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( aRefPad->m_Drill.x ) // pad reference has a hole
|
if( aRefPad->GetDrillSize().x ) // pad reference has a hole
|
||||||
{
|
{
|
||||||
dummypad.SetPosition( aRefPad->GetPosition() );
|
dummypad.SetPosition( aRefPad->GetPosition() );
|
||||||
dummypad.m_Size = aRefPad->m_Drill;
|
dummypad.SetSize( aRefPad->GetDrillSize() );
|
||||||
dummypad.m_PadShape = (aRefPad->m_DrillShape == PAD_OVAL) ? PAD_OVAL : PAD_CIRCLE;
|
dummypad.SetShape( aRefPad->GetDrillShape() == PAD_OVAL ? PAD_OVAL : PAD_CIRCLE );
|
||||||
dummypad.m_Orient = aRefPad->m_Orient;
|
dummypad.SetOrientation( aRefPad->GetOrientation() );
|
||||||
|
|
||||||
// compute the radius of the circle containing this pad
|
|
||||||
dummypad.ComputeShapeMaxRadius();
|
|
||||||
|
|
||||||
if( !checkClearancePadToPad( pad, &dummypad ) )
|
if( !checkClearancePadToPad( pad, &dummypad ) )
|
||||||
{
|
{
|
||||||
|
@ -652,7 +649,6 @@ bool DRC::doPadToPadsDrc( D_PAD* aRefPad, D_PAD** aStart, D_PAD** aEnd, int x_li
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// The pad must be in a net (i.e pt_pad->GetNet() != 0 ),
|
// The pad must be in a net (i.e pt_pad->GetNet() != 0 ),
|
||||||
// But no problem if pads have the same netcode (same net)
|
// But no problem if pads have the same netcode (same net)
|
||||||
if( pad->GetNet() && ( aRefPad->GetNet() == pad->GetNet() ) )
|
if( pad->GetNet() && ( aRefPad->GetNet() == pad->GetNet() ) )
|
||||||
|
|
|
@ -271,7 +271,8 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool testPads )
|
||||||
*/
|
*/
|
||||||
MODULE dummymodule( m_pcb ); // Creates a dummy parent
|
MODULE dummymodule( m_pcb ); // Creates a dummy parent
|
||||||
D_PAD dummypad( &dummymodule );
|
D_PAD dummypad( &dummymodule );
|
||||||
dummypad.m_layerMask = ALL_CU_LAYERS; // Ensure the hole is on all layers
|
|
||||||
|
dummypad.SetLayerMask( ALL_CU_LAYERS ); // Ensure the hole is on all layers
|
||||||
|
|
||||||
// Compute the min distance to pads
|
// Compute the min distance to pads
|
||||||
if( testPads )
|
if( testPads )
|
||||||
|
@ -284,20 +285,20 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool testPads )
|
||||||
* But if a drill hole exists (a pad on a single layer can have a hole!)
|
* But if a drill hole exists (a pad on a single layer can have a hole!)
|
||||||
* we must test the hole
|
* we must test the hole
|
||||||
*/
|
*/
|
||||||
if( (pad->m_layerMask & layerMask ) == 0 )
|
if( (pad->GetLayerMask() & layerMask ) == 0 )
|
||||||
{
|
{
|
||||||
/* We must test the pad hole. In order to use the function
|
/* We must test the pad hole. In order to use the function
|
||||||
* checkClearanceSegmToPad(),a pseudo pad is used, with a shape and a
|
* checkClearanceSegmToPad(),a pseudo pad is used, with a shape and a
|
||||||
* size like the hole
|
* size like the hole
|
||||||
*/
|
*/
|
||||||
if( pad->m_Drill.x == 0 )
|
if( pad->GetDrillSize().x == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
dummypad.m_Size = pad->m_Drill;
|
dummypad.SetSize( pad->GetDrillSize() );
|
||||||
dummypad.SetPosition( pad->GetPosition() );
|
dummypad.SetPosition( pad->GetPosition() );
|
||||||
dummypad.m_PadShape = pad->m_DrillShape;
|
dummypad.SetShape( pad->GetDrillShape() );
|
||||||
dummypad.m_Orient = pad->m_Orient;
|
dummypad.SetOrientation( pad->GetOrientation() );
|
||||||
dummypad.ComputeShapeMaxRadius(); // compute the radius of the circle containing this pad
|
|
||||||
m_padToTestPos = dummypad.GetPosition() - origin;
|
m_padToTestPos = dummypad.GetPosition() - origin;
|
||||||
|
|
||||||
if( !checkClearanceSegmToPad( &dummypad, aRefSeg->m_Width,
|
if( !checkClearanceSegmToPad( &dummypad, aRefSeg->m_Width,
|
||||||
|
@ -311,9 +312,8 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool testPads )
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The pad must be in a net (i.e pt_pad->GetNet() != 0 )
|
// The pad must be in a net (i.e pt_pad->GetNet() != 0 )
|
||||||
* but no problem if the pad netcode is the current netcode (same net)
|
// but no problem if the pad netcode is the current netcode (same net)
|
||||||
*/
|
|
||||||
if( pad->GetNet() // the pad must be connected
|
if( pad->GetNet() // the pad must be connected
|
||||||
&& net_code_ref == pad->GetNet() ) // the pad net is the same as current net -> Ok
|
&& net_code_ref == pad->GetNet() ) // the pad net is the same as current net -> Ok
|
||||||
continue;
|
continue;
|
||||||
|
@ -587,7 +587,7 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad )
|
||||||
dist = (int) hypot( relativePadPos.x, relativePadPos.y );
|
dist = (int) hypot( relativePadPos.x, relativePadPos.y );
|
||||||
|
|
||||||
// Quick test: Clearance is OK if the bounding circles are further away than "dist_min"
|
// Quick test: Clearance is OK if the bounding circles are further away than "dist_min"
|
||||||
if( (dist - aRefPad->m_ShapeMaxRadius - aPad->m_ShapeMaxRadius) >= dist_min )
|
if( (dist - aRefPad->GetBoundingRadius() - aPad->GetBoundingRadius()) >= dist_min )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
/* Here, pads are near and DRC depend on the pad shapes
|
/* Here, pads are near and DRC depend on the pad shapes
|
||||||
|
@ -600,11 +600,11 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad )
|
||||||
bool swap_pads;
|
bool swap_pads;
|
||||||
swap_pads = false;
|
swap_pads = false;
|
||||||
|
|
||||||
if( (aRefPad->m_PadShape != PAD_CIRCLE) && (aPad->m_PadShape == PAD_CIRCLE) )
|
if( aRefPad->GetShape() != PAD_CIRCLE && aPad->GetShape() == PAD_CIRCLE )
|
||||||
swap_pads = true;
|
swap_pads = true;
|
||||||
else if( (aRefPad->m_PadShape != PAD_OVAL) && (aPad->m_PadShape == PAD_OVAL) )
|
else if( aRefPad->GetShape() != PAD_OVAL && aPad->GetShape() == PAD_OVAL )
|
||||||
swap_pads = true;
|
swap_pads = true;
|
||||||
else if( (aRefPad->m_PadShape != PAD_RECT) && (aPad->m_PadShape == PAD_RECT) )
|
else if( aRefPad->GetShape() != PAD_RECT && aPad->GetShape() == PAD_RECT )
|
||||||
swap_pads = true;
|
swap_pads = true;
|
||||||
|
|
||||||
if( swap_pads )
|
if( swap_pads )
|
||||||
|
@ -620,12 +620,12 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad )
|
||||||
*/
|
*/
|
||||||
bool diag = true;
|
bool diag = true;
|
||||||
|
|
||||||
switch( aRefPad->m_PadShape )
|
switch( aRefPad->GetShape() )
|
||||||
{
|
{
|
||||||
case PAD_CIRCLE:
|
case PAD_CIRCLE:
|
||||||
|
|
||||||
/* One can use checkClearanceSegmToPad to test clearance
|
/* One can use checkClearanceSegmToPad to test clearance
|
||||||
* aRefPad is like a track segment with a null length and a witdth = m_Size.x
|
* aRefPad is like a track segment with a null length and a witdth = GetSize().x
|
||||||
*/
|
*/
|
||||||
m_segmLength = 0;
|
m_segmLength = 0;
|
||||||
m_segmAngle = 0;
|
m_segmAngle = 0;
|
||||||
|
@ -633,25 +633,25 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad )
|
||||||
m_segmEnd.x = m_segmEnd.y = 0;
|
m_segmEnd.x = m_segmEnd.y = 0;
|
||||||
|
|
||||||
m_padToTestPos = relativePadPos;
|
m_padToTestPos = relativePadPos;
|
||||||
diag = checkClearanceSegmToPad( aPad, aRefPad->m_Size.x, dist_min );
|
diag = checkClearanceSegmToPad( aPad, aRefPad->GetSize().x, dist_min );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAD_RECT:
|
case PAD_RECT:
|
||||||
|
|
||||||
// pad_angle = pad orient relative to the aRefPad orient
|
// pad_angle = pad orient relative to the aRefPad orient
|
||||||
pad_angle = aRefPad->m_Orient + aPad->m_Orient;
|
pad_angle = aRefPad->GetOrientation() + aPad->GetOrientation();
|
||||||
NORMALIZE_ANGLE_POS( pad_angle );
|
NORMALIZE_ANGLE_POS( pad_angle );
|
||||||
|
|
||||||
if( aPad->m_PadShape == PAD_RECT )
|
if( aPad->GetShape() == PAD_RECT )
|
||||||
{
|
{
|
||||||
wxSize size = aPad->m_Size;
|
wxSize size = aPad->GetSize();
|
||||||
|
|
||||||
// The trivial case is if both rects are rotated by multiple of 90 deg
|
// The trivial case is if both rects are rotated by multiple of 90 deg
|
||||||
// Most of time this is the case, and the test is fast
|
// Most of time this is the case, and the test is fast
|
||||||
if( ( (aRefPad->m_Orient == 0) || (aRefPad->m_Orient == 900)
|
if( ( (aRefPad->GetOrientation() == 0) || (aRefPad->GetOrientation() == 900)
|
||||||
|| (aRefPad->m_Orient == 1800) || (aRefPad->m_Orient == 2700) )
|
|| (aRefPad->GetOrientation() == 1800) || (aRefPad->GetOrientation() == 2700) )
|
||||||
&& ( (aPad->m_Orient == 0) || (aPad->m_Orient == 900) || (aPad->m_Orient == 1800)
|
&& ( (aPad->GetOrientation() == 0) || (aPad->GetOrientation() == 900) || (aPad->GetOrientation() == 1800)
|
||||||
|| (aPad->m_Orient == 2700) ) )
|
|| (aPad->GetOrientation() == 2700) ) )
|
||||||
{
|
{
|
||||||
if( (pad_angle == 900) || (pad_angle == 2700) )
|
if( (pad_angle == 900) || (pad_angle == 2700) )
|
||||||
{
|
{
|
||||||
|
@ -660,22 +660,22 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad )
|
||||||
|
|
||||||
// Test DRC:
|
// Test DRC:
|
||||||
diag = false;
|
diag = false;
|
||||||
RotatePoint( &relativePadPos, aRefPad->m_Orient );
|
RotatePoint( &relativePadPos, aRefPad->GetOrientation() );
|
||||||
relativePadPos.x = ABS( relativePadPos.x );
|
relativePadPos.x = ABS( relativePadPos.x );
|
||||||
relativePadPos.y = ABS( relativePadPos.y );
|
relativePadPos.y = ABS( relativePadPos.y );
|
||||||
|
|
||||||
if( ( relativePadPos.x - ( (size.x + aRefPad->m_Size.x) / 2 ) ) >= dist_min )
|
if( ( relativePadPos.x - ( (size.x + aRefPad->GetSize().x) / 2 ) ) >= dist_min )
|
||||||
diag = true;
|
diag = true;
|
||||||
|
|
||||||
if( ( relativePadPos.y - ( (size.y + aRefPad->m_Size.y) / 2 ) ) >= dist_min )
|
if( ( relativePadPos.y - ( (size.y + aRefPad->GetSize().y) / 2 ) ) >= dist_min )
|
||||||
diag = true;
|
diag = true;
|
||||||
}
|
}
|
||||||
else // at least one pad has any other orient. Test is more tricky
|
else // at least one pad has any other orient. Test is more tricky
|
||||||
{ // Use the trapezoid2trapezoidDRC which also compare 2 rectangles with any orientation
|
{ // Use the trapezoid2trapezoidDRC which also compare 2 rectangles with any orientation
|
||||||
wxPoint polyref[4]; // Shape of aRefPad
|
wxPoint polyref[4]; // Shape of aRefPad
|
||||||
wxPoint polycompare[4]; // Shape of aPad
|
wxPoint polycompare[4]; // Shape of aPad
|
||||||
aRefPad->BuildPadPolygon( polyref, wxSize( 0, 0 ), aRefPad->m_Orient );
|
aRefPad->BuildPadPolygon( polyref, wxSize( 0, 0 ), aRefPad->GetOrientation() );
|
||||||
aPad->BuildPadPolygon( polycompare, wxSize( 0, 0 ), aPad->m_Orient );
|
aPad->BuildPadPolygon( polycompare, wxSize( 0, 0 ), aPad->GetOrientation() );
|
||||||
|
|
||||||
// Move aPad shape to relativePadPos
|
// Move aPad shape to relativePadPos
|
||||||
for( int ii = 0; ii < 4; ii++ )
|
for( int ii = 0; ii < 4; ii++ )
|
||||||
|
@ -686,12 +686,12 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad )
|
||||||
diag = false;
|
diag = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( aPad->m_PadShape == PAD_TRAPEZOID )
|
else if( aPad->GetShape() == PAD_TRAPEZOID )
|
||||||
{
|
{
|
||||||
wxPoint polyref[4]; // Shape of aRefPad
|
wxPoint polyref[4]; // Shape of aRefPad
|
||||||
wxPoint polycompare[4]; // Shape of aPad
|
wxPoint polycompare[4]; // Shape of aPad
|
||||||
aRefPad->BuildPadPolygon( polyref, wxSize( 0, 0 ), aRefPad->m_Orient );
|
aRefPad->BuildPadPolygon( polyref, wxSize( 0, 0 ), aRefPad->GetOrientation() );
|
||||||
aPad->BuildPadPolygon( polycompare, wxSize( 0, 0 ), aPad->m_Orient );
|
aPad->BuildPadPolygon( polycompare, wxSize( 0, 0 ), aPad->GetOrientation() );
|
||||||
|
|
||||||
// Move aPad shape to relativePadPos
|
// Move aPad shape to relativePadPos
|
||||||
for( int ii = 0; ii < 4; ii++ )
|
for( int ii = 0; ii < 4; ii++ )
|
||||||
|
@ -714,17 +714,17 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad )
|
||||||
* and use checkClearanceSegmToPad function to test aPad to aRefPad clearance
|
* and use checkClearanceSegmToPad function to test aPad to aRefPad clearance
|
||||||
*/
|
*/
|
||||||
int segm_width;
|
int segm_width;
|
||||||
m_segmAngle = aRefPad->m_Orient; // Segment orient.
|
m_segmAngle = aRefPad->GetOrientation(); // Segment orient.
|
||||||
|
|
||||||
if( aRefPad->m_Size.y < aRefPad->m_Size.x ) // Build an horizontal equiv segment
|
if( aRefPad->GetSize().y < aRefPad->GetSize().x ) // Build an horizontal equiv segment
|
||||||
{
|
{
|
||||||
segm_width = aRefPad->m_Size.y;
|
segm_width = aRefPad->GetSize().y;
|
||||||
m_segmLength = aRefPad->m_Size.x - aRefPad->m_Size.y;
|
m_segmLength = aRefPad->GetSize().x - aRefPad->GetSize().y;
|
||||||
}
|
}
|
||||||
else // Vertical oval: build an horizontal equiv segment and rotate 90.0 deg
|
else // Vertical oval: build an horizontal equiv segment and rotate 90.0 deg
|
||||||
{
|
{
|
||||||
segm_width = aRefPad->m_Size.x;
|
segm_width = aRefPad->GetSize().x;
|
||||||
m_segmLength = aRefPad->m_Size.y - aRefPad->m_Size.x;
|
m_segmLength = aRefPad->GetSize().y - aRefPad->GetSize().x;
|
||||||
m_segmAngle += 900;
|
m_segmAngle += 900;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -754,12 +754,12 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad )
|
||||||
|
|
||||||
// at this point, aPad is also a trapezoid, because all other shapes
|
// at this point, aPad is also a trapezoid, because all other shapes
|
||||||
// have priority, and are already tested
|
// have priority, and are already tested
|
||||||
wxASSERT( aPad->m_PadShape == PAD_TRAPEZOID );
|
wxASSERT( aPad->GetShape() == PAD_TRAPEZOID );
|
||||||
{
|
{
|
||||||
wxPoint polyref[4]; // Shape of aRefPad
|
wxPoint polyref[4]; // Shape of aRefPad
|
||||||
wxPoint polycompare[4]; // Shape of aPad
|
wxPoint polycompare[4]; // Shape of aPad
|
||||||
aRefPad->BuildPadPolygon( polyref, wxSize( 0, 0 ), aRefPad->m_Orient );
|
aRefPad->BuildPadPolygon( polyref, wxSize( 0, 0 ), aRefPad->GetOrientation() );
|
||||||
aPad->BuildPadPolygon( polycompare, wxSize( 0, 0 ), aPad->m_Orient );
|
aPad->BuildPadPolygon( polycompare, wxSize( 0, 0 ), aPad->GetOrientation() );
|
||||||
|
|
||||||
// Move aPad shape to relativePadPos
|
// Move aPad shape to relativePadPos
|
||||||
for( int ii = 0; ii < 4; ii++ )
|
for( int ii = 0; ii < 4; ii++ )
|
||||||
|
@ -796,16 +796,16 @@ bool DRC::checkClearanceSegmToPad( const D_PAD* aPad, int aSegmentWidth, int aMi
|
||||||
int segmHalfWidth = aSegmentWidth / 2;
|
int segmHalfWidth = aSegmentWidth / 2;
|
||||||
|
|
||||||
seuil = segmHalfWidth + aMinDist;
|
seuil = segmHalfWidth + aMinDist;
|
||||||
padHalfsize.x = aPad->m_Size.x >> 1;
|
padHalfsize.x = aPad->GetSize().x >> 1;
|
||||||
padHalfsize.y = aPad->m_Size.y >> 1;
|
padHalfsize.y = aPad->GetSize().y >> 1;
|
||||||
|
|
||||||
if( aPad->m_PadShape == PAD_TRAPEZOID ) // The size is bigger, due to m_DeltaSize extra size
|
if( aPad->GetShape() == PAD_TRAPEZOID ) // The size is bigger, due to GetDelta() extra size
|
||||||
{
|
{
|
||||||
padHalfsize.x += ABS(aPad->m_DeltaSize.y) / 2; // Remember: m_DeltaSize.y is the m_Size.x change
|
padHalfsize.x += ABS(aPad->GetDelta().y) / 2; // Remember: GetDelta().y is the GetSize().x change
|
||||||
padHalfsize.y += ABS(aPad->m_DeltaSize.x) / 2; // Remember: m_DeltaSize.x is the m_Size.y change
|
padHalfsize.y += ABS(aPad->GetDelta().x) / 2; // Remember: GetDelta().x is the GetSize().y change
|
||||||
}
|
}
|
||||||
|
|
||||||
if( aPad->m_PadShape == PAD_CIRCLE )
|
if( aPad->GetShape() == PAD_CIRCLE )
|
||||||
{
|
{
|
||||||
/* Easy case: just test the distance between segment and pad centre
|
/* Easy case: just test the distance between segment and pad centre
|
||||||
* calculate pad coordinates in the X,Y axis with X axis = segment to test
|
* calculate pad coordinates in the X,Y axis with X axis = segment to test
|
||||||
|
@ -827,7 +827,7 @@ bool DRC::checkClearanceSegmToPad( const D_PAD* aPad, int aSegmentWidth, int aMi
|
||||||
startPoint.x = startPoint.y = 0;
|
startPoint.x = startPoint.y = 0;
|
||||||
endPoint = m_segmEnd;
|
endPoint = m_segmEnd;
|
||||||
|
|
||||||
orient = aPad->m_Orient;
|
orient = aPad->GetOrientation();
|
||||||
|
|
||||||
RotatePoint( &startPoint, m_padToTestPos, -orient );
|
RotatePoint( &startPoint, m_padToTestPos, -orient );
|
||||||
RotatePoint( &endPoint, m_padToTestPos, -orient );
|
RotatePoint( &endPoint, m_padToTestPos, -orient );
|
||||||
|
@ -838,7 +838,7 @@ bool DRC::checkClearanceSegmToPad( const D_PAD* aPad, int aSegmentWidth, int aMi
|
||||||
/* segment intersects the bounding box. But there is not always a DRC error.
|
/* segment intersects the bounding box. But there is not always a DRC error.
|
||||||
* A fine analysis of the pad shape must be done.
|
* A fine analysis of the pad shape must be done.
|
||||||
*/
|
*/
|
||||||
switch( aPad->m_PadShape )
|
switch( aPad->GetShape() )
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -59,36 +59,30 @@ void PCB_EDIT_FRAME::InstallModuleOptionsFrame( MODULE* Module, wxDC* DC )
|
||||||
/*
|
/*
|
||||||
* Move the footprint anchor position to the current cursor position.
|
* Move the footprint anchor position to the current cursor position.
|
||||||
*/
|
*/
|
||||||
void FOOTPRINT_EDIT_FRAME::Place_Ancre( MODULE* pt_mod )
|
void FOOTPRINT_EDIT_FRAME::Place_Ancre( MODULE* aModule )
|
||||||
{
|
{
|
||||||
wxPoint moveVector;
|
wxPoint moveVector;
|
||||||
EDA_ITEM* item;
|
|
||||||
D_PAD* pad;
|
|
||||||
|
|
||||||
if( pt_mod == NULL )
|
if( aModule == NULL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
moveVector = pt_mod->m_Pos - GetScreen()->GetCrossHairPosition();
|
moveVector = aModule->m_Pos - GetScreen()->GetCrossHairPosition();
|
||||||
|
|
||||||
pt_mod->m_Pos = GetScreen()->GetCrossHairPosition();
|
aModule->m_Pos = GetScreen()->GetCrossHairPosition();
|
||||||
|
|
||||||
/* Update the relative coordinates:
|
/* Update the relative coordinates:
|
||||||
* The coordinates are relative to the anchor point.
|
* The coordinates are relative to the anchor point.
|
||||||
* Calculate deltaX and deltaY from the anchor. */
|
* Calculate deltaX and deltaY from the anchor. */
|
||||||
RotatePoint( &moveVector, -pt_mod->m_Orient );
|
RotatePoint( &moveVector, -aModule->m_Orient );
|
||||||
|
|
||||||
/* Update the pad coordinates. */
|
// Update the pad coordinates.
|
||||||
pad = (D_PAD*) pt_mod->m_Pads;
|
for( D_PAD* pad = (D_PAD*) aModule->m_Pads; pad; pad = pad->Next() )
|
||||||
|
|
||||||
for( ; pad != NULL; pad = pad->Next() )
|
|
||||||
{
|
{
|
||||||
pad->m_Pos0 += moveVector;
|
pad->SetPos0( pad->GetPos0() + moveVector );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the draw element coordinates. */
|
// Update the draw element coordinates.
|
||||||
item = pt_mod->m_Drawings;
|
for( EDA_ITEM* item = aModule->m_Drawings; item; item = item->Next() )
|
||||||
|
|
||||||
for( ; item != NULL; item = item->Next() )
|
|
||||||
{
|
{
|
||||||
switch( item->Type() )
|
switch( item->Type() )
|
||||||
{
|
{
|
||||||
|
@ -110,7 +104,7 @@ void FOOTPRINT_EDIT_FRAME::Place_Ancre( MODULE* pt_mod )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pt_mod->CalculateBoundingBox();
|
aModule->CalculateBoundingBox();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ static void Abort_Create_Track( EDA_DRAW_PANEL* Panel, wxDC* DC )
|
||||||
|
|
||||||
if( track && ( track->Type()==PCB_VIA_T || track->Type()==PCB_TRACE_T ) )
|
if( track && ( track->Type()==PCB_VIA_T || track->Type()==PCB_TRACE_T ) )
|
||||||
{
|
{
|
||||||
/* Erase the current drawing */
|
// Erase the current drawing
|
||||||
ShowNewTrackWhenMovingCursor( Panel, DC, wxDefaultPosition, false );
|
ShowNewTrackWhenMovingCursor( Panel, DC, wxDefaultPosition, false );
|
||||||
|
|
||||||
if( pcb->IsHighLightNetON() )
|
if( pcb->IsHighLightNetON() )
|
||||||
|
@ -102,7 +102,7 @@ TRACK* PCB_EDIT_FRAME::Begin_Route( TRACK* aTrack, wxDC* aDC )
|
||||||
BOARD_CONNECTED_ITEM* LockPoint;
|
BOARD_CONNECTED_ITEM* LockPoint;
|
||||||
wxPoint pos = GetScreen()->GetCrossHairPosition();
|
wxPoint pos = GetScreen()->GetCrossHairPosition();
|
||||||
|
|
||||||
if( aTrack == NULL ) /* Starting a new track segment */
|
if( aTrack == NULL ) // Starting a new track segment
|
||||||
{
|
{
|
||||||
m_canvas->SetMouseCapture( ShowNewTrackWhenMovingCursor, Abort_Create_Track );
|
m_canvas->SetMouseCapture( ShowNewTrackWhenMovingCursor, Abort_Create_Track );
|
||||||
|
|
||||||
|
@ -130,11 +130,11 @@ TRACK* PCB_EDIT_FRAME::Begin_Route( TRACK* aTrack, wxDC* aDC )
|
||||||
{
|
{
|
||||||
pad = (D_PAD*) LockPoint;
|
pad = (D_PAD*) LockPoint;
|
||||||
|
|
||||||
/* A pad is found: put the starting point on pad center */
|
// A pad is found: put the starting point on pad center
|
||||||
pos = pad->m_Pos;
|
pos = pad->GetPosition();
|
||||||
GetBoard()->SetHighLightNet( pad->GetNet() );
|
GetBoard()->SetHighLightNet( pad->GetNet() );
|
||||||
}
|
}
|
||||||
else /* A track segment is found */
|
else // A track segment is found
|
||||||
{
|
{
|
||||||
TrackOnStartPoint = (TRACK*) LockPoint;
|
TrackOnStartPoint = (TRACK*) LockPoint;
|
||||||
GetBoard()->SetHighLightNet( TrackOnStartPoint->GetNet() );
|
GetBoard()->SetHighLightNet( TrackOnStartPoint->GetNet() );
|
||||||
|
@ -214,7 +214,7 @@ TRACK* PCB_EDIT_FRAME::Begin_Route( TRACK* aTrack, wxDC* aDC )
|
||||||
}
|
}
|
||||||
else // Track in progress : segment coordinates are updated by ShowNewTrackWhenMovingCursor.
|
else // Track in progress : segment coordinates are updated by ShowNewTrackWhenMovingCursor.
|
||||||
{
|
{
|
||||||
/* Test for a D.R.C. error: */
|
// Test for a D.R.C. error:
|
||||||
if( Drc_On )
|
if( Drc_On )
|
||||||
{
|
{
|
||||||
if( BAD_DRC == m_drc->Drc( g_CurrentTrackSegment, GetBoard()->m_Track ) )
|
if( BAD_DRC == m_drc->Drc( g_CurrentTrackSegment, GetBoard()->m_Track ) )
|
||||||
|
@ -244,7 +244,7 @@ TRACK* PCB_EDIT_FRAME::Begin_Route( TRACK* aTrack, wxDC* aDC )
|
||||||
|
|
||||||
if( CanCreateNewSegment )
|
if( CanCreateNewSegment )
|
||||||
{
|
{
|
||||||
/* Erase old track on screen */
|
// Erase old track on screen
|
||||||
D( g_CurrentTrackList.VerifyListIntegrity(); );
|
D( g_CurrentTrackList.VerifyListIntegrity(); );
|
||||||
|
|
||||||
ShowNewTrackWhenMovingCursor( m_canvas, aDC, wxDefaultPosition, false );
|
ShowNewTrackWhenMovingCursor( m_canvas, aDC, wxDefaultPosition, false );
|
||||||
|
@ -283,7 +283,7 @@ TRACK* PCB_EDIT_FRAME::Begin_Route( TRACK* aTrack, wxDC* aDC )
|
||||||
|
|
||||||
D( g_CurrentTrackList.VerifyListIntegrity(); );
|
D( g_CurrentTrackList.VerifyListIntegrity(); );
|
||||||
|
|
||||||
/* Show the new position */
|
// Show the new position
|
||||||
ShowNewTrackWhenMovingCursor( m_canvas, aDC, wxDefaultPosition, false );
|
ShowNewTrackWhenMovingCursor( m_canvas, aDC, wxDefaultPosition, false );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -298,7 +298,7 @@ bool PCB_EDIT_FRAME::Add45DegreeSegment( wxDC* aDC )
|
||||||
int dx0, dy0, dx1, dy1;
|
int dx0, dy0, dx1, dy1;
|
||||||
|
|
||||||
if( g_CurrentTrackList.GetCount() < 2 )
|
if( g_CurrentTrackList.GetCount() < 2 )
|
||||||
return false; /* There must be 2 segments. */
|
return false; // There must be 2 segments.
|
||||||
|
|
||||||
TRACK* curTrack = g_CurrentTrackSegment;
|
TRACK* curTrack = g_CurrentTrackSegment;
|
||||||
TRACK* prevTrack = curTrack->Back();
|
TRACK* prevTrack = curTrack->Back();
|
||||||
|
@ -328,7 +328,7 @@ bool PCB_EDIT_FRAME::Add45DegreeSegment( wxDC* aDC )
|
||||||
if( max( abs( dx1 ), abs( dy1 ) ) < ( segm_step_45 * 2 ) )
|
if( max( abs( dx1 ), abs( dy1 ) ) < ( segm_step_45 * 2 ) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* Create a new segment and connect it with the previous 2 segments. */
|
// Create a new segment and connect it with the previous 2 segments.
|
||||||
TRACK* newTrack = (TRACK*)curTrack->Clone();
|
TRACK* newTrack = (TRACK*)curTrack->Clone();
|
||||||
|
|
||||||
newTrack->m_Start = prevTrack->m_End;
|
newTrack->m_Start = prevTrack->m_End;
|
||||||
|
@ -418,7 +418,7 @@ bool PCB_EDIT_FRAME::End_Route( TRACK* aTrack, wxDC* aDC )
|
||||||
if( Drc_On && BAD_DRC == m_drc->Drc( g_CurrentTrackSegment, GetBoard()->m_Track ) )
|
if( Drc_On && BAD_DRC == m_drc->Drc( g_CurrentTrackSegment, GetBoard()->m_Track ) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* Saving the coordinate of end point of the trace */
|
// Saving the coordinate of end point of the trace
|
||||||
wxPoint pos = g_CurrentTrackSegment->m_End;
|
wxPoint pos = g_CurrentTrackSegment->m_End;
|
||||||
|
|
||||||
D( g_CurrentTrackList.VerifyListIntegrity(); );
|
D( g_CurrentTrackList.VerifyListIntegrity(); );
|
||||||
|
@ -554,7 +554,7 @@ TRACK* LocateIntrusion( TRACK* listStart, TRACK* aTrack, int aLayer, const wxPoi
|
||||||
if( track->GetNet() == net )
|
if( track->GetNet() == net )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* TRACK::HitTest */
|
// TRACK::HitTest
|
||||||
int dist = (width + track->m_Width) / 2 + aTrack->GetClearance( track );
|
int dist = (width + track->m_Width) / 2 + aTrack->GetClearance( track );
|
||||||
|
|
||||||
wxPoint pos = aRef - track->m_Start;
|
wxPoint pos = aRef - track->m_Start;
|
||||||
|
@ -565,7 +565,7 @@ TRACK* LocateIntrusion( TRACK* listStart, TRACK* aTrack, int aLayer, const wxPoi
|
||||||
|
|
||||||
found = track;
|
found = track;
|
||||||
|
|
||||||
/* prefer intrusions from the side, not the end */
|
// prefer intrusions from the side, not the end
|
||||||
double tmp = (double) pos.x * vec.x + (double) pos.y * vec.y;
|
double tmp = (double) pos.x * vec.x + (double) pos.y * vec.y;
|
||||||
|
|
||||||
if( tmp >= 0 && tmp <= (double) vec.x * vec.x + (double) vec.y * vec.y )
|
if( tmp >= 0 && tmp <= (double) vec.x * vec.x + (double) vec.y * vec.y )
|
||||||
|
@ -607,7 +607,7 @@ static void PushTrack( EDA_DRAW_PANEL* panel )
|
||||||
|
|
||||||
other = LocateIntrusion( pcb->m_Track, track, screen->m_Active_Layer, screen->RefPos( true ) );
|
other = LocateIntrusion( pcb->m_Track, track, screen->m_Active_Layer, screen->RefPos( true ) );
|
||||||
|
|
||||||
/* are we currently pointing into a conflicting trace ? */
|
// are we currently pointing into a conflicting trace ?
|
||||||
if( !other )
|
if( !other )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -619,7 +619,7 @@ static void PushTrack( EDA_DRAW_PANEL* panel )
|
||||||
|
|
||||||
det = (double) cv.x * vec.y - (double) cv.y * vec.x;
|
det = (double) cv.x * vec.y - (double) cv.y * vec.x;
|
||||||
|
|
||||||
/* cursor is right at the center of the old track */
|
// cursor is right at the center of the old track
|
||||||
if( !det )
|
if( !det )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -630,7 +630,7 @@ static void PushTrack( EDA_DRAW_PANEL* panel )
|
||||||
* We may have a quantization error of 1/sqrt(2), so +1 again.
|
* We may have a quantization error of 1/sqrt(2), so +1 again.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Vector "n" is perpendicular to "other", pointing towards the cursor. */
|
// Vector "n" is perpendicular to "other", pointing towards the cursor.
|
||||||
if( det > 0 )
|
if( det > 0 )
|
||||||
{
|
{
|
||||||
n.x = vec.y;
|
n.x = vec.y;
|
||||||
|
@ -674,7 +674,7 @@ void ShowNewTrackWhenMovingCursor( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPo
|
||||||
DisplayOpt.ShowTrackClearanceMode = SHOW_CLEARANCE_ALWAYS;
|
DisplayOpt.ShowTrackClearanceMode = SHOW_CLEARANCE_ALWAYS;
|
||||||
|
|
||||||
#ifndef USE_WX_OVERLAY
|
#ifndef USE_WX_OVERLAY
|
||||||
/* Erase old track */
|
// Erase old track
|
||||||
if( aErase )
|
if( aErase )
|
||||||
{
|
{
|
||||||
DrawTraces( aPanel, aDC, g_FirstTrackSegment, g_CurrentTrackList.GetCount(), GR_XOR );
|
DrawTraces( aPanel, aDC, g_FirstTrackSegment, g_CurrentTrackList.GetCount(), GR_XOR );
|
||||||
|
@ -740,12 +740,12 @@ void ShowNewTrackWhenMovingCursor( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPo
|
||||||
&g_CurrentTrackSegment->m_End.y );
|
&g_CurrentTrackSegment->m_End.y );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else /* Here the angle is arbitrary */
|
else // Here the angle is arbitrary
|
||||||
{
|
{
|
||||||
g_CurrentTrackSegment->m_End = screen->GetCrossHairPosition();
|
g_CurrentTrackSegment->m_End = screen->GetCrossHairPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Redraw the new track */
|
// Redraw the new track
|
||||||
D( g_CurrentTrackList.VerifyListIntegrity(); );
|
D( g_CurrentTrackList.VerifyListIntegrity(); );
|
||||||
DrawTraces( aPanel, aDC, g_FirstTrackSegment, g_CurrentTrackList.GetCount(), GR_XOR );
|
DrawTraces( aPanel, aDC, g_FirstTrackSegment, g_CurrentTrackList.GetCount(), GR_XOR );
|
||||||
|
|
||||||
|
@ -782,7 +782,7 @@ void ShowNewTrackWhenMovingCursor( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPo
|
||||||
if( g_FirstTrackSegment->GetState( BEGIN_ONPAD ) )
|
if( g_FirstTrackSegment->GetState( BEGIN_ONPAD ) )
|
||||||
{
|
{
|
||||||
D_PAD * pad = (D_PAD *) g_FirstTrackSegment->start;
|
D_PAD * pad = (D_PAD *) g_FirstTrackSegment->start;
|
||||||
lenDie = (double) pad->m_LengthDie;
|
lenDie = (double) pad->GetDieLength();
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate track len on board:
|
// calculate track len on board:
|
||||||
|
@ -853,7 +853,7 @@ void CalculateSegmentEndPoint( const wxPoint& aPosition, int ox, int oy, int* fx
|
||||||
deltax = min( deltax, deltay );
|
deltax = min( deltax, deltay );
|
||||||
deltay = deltax;
|
deltay = deltax;
|
||||||
|
|
||||||
/* Recalculate the signs for deltax and deltaY. */
|
// Recalculate the signs for deltax and deltaY.
|
||||||
if( ( aPosition.x - ox ) < 0 )
|
if( ( aPosition.x - ox ) < 0 )
|
||||||
deltax = -deltax;
|
deltax = -deltax;
|
||||||
|
|
||||||
|
@ -948,7 +948,7 @@ void ComputeBreakPoint( TRACK* track, int SegmentCount, wxPoint end )
|
||||||
iDx = min( iDx, iDy );
|
iDx = min( iDx, iDy );
|
||||||
iDy = iDx;
|
iDy = iDx;
|
||||||
|
|
||||||
/* Recalculate the signs for deltax and deltaY. */
|
// Recalculate the signs for deltax and deltaY.
|
||||||
if( ( end.x - track->m_Start.x ) < 0 )
|
if( ( end.x - track->m_Start.x ) < 0 )
|
||||||
iDx = -iDx;
|
iDx = -iDx;
|
||||||
|
|
||||||
|
@ -1064,11 +1064,11 @@ void DeleteNullTrackSegments( BOARD* pcb, DLIST<TRACK>& aTrackList )
|
||||||
* if no, create a new track segment if necessary
|
* if no, create a new track segment if necessary
|
||||||
* and move current (or new) end segment on pad
|
* and move current (or new) end segment on pad
|
||||||
*/
|
*/
|
||||||
void EnsureEndTrackOnPad( D_PAD* Pad )
|
void EnsureEndTrackOnPad( D_PAD* aPad )
|
||||||
{
|
{
|
||||||
if( g_CurrentTrackSegment->m_End == Pad->m_Pos ) // Ok !
|
if( g_CurrentTrackSegment->m_End == aPad->GetPosition() ) // Ok !
|
||||||
{
|
{
|
||||||
g_CurrentTrackSegment->end = Pad;
|
g_CurrentTrackSegment->end = aPad;
|
||||||
g_CurrentTrackSegment->SetState( END_ONPAD, ON );
|
g_CurrentTrackSegment->SetState( END_ONPAD, ON );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1077,15 +1077,15 @@ void EnsureEndTrackOnPad( D_PAD* Pad )
|
||||||
|
|
||||||
if( !g_CurrentTrackSegment->IsNull() )
|
if( !g_CurrentTrackSegment->IsNull() )
|
||||||
{
|
{
|
||||||
/* Must create a new segment, from track end to pad center */
|
// Must create a new segment, from track end to pad center
|
||||||
g_CurrentTrackList.PushBack( (TRACK*)lasttrack->Clone() );
|
g_CurrentTrackList.PushBack( (TRACK*)lasttrack->Clone() );
|
||||||
|
|
||||||
lasttrack->end = g_CurrentTrackSegment;
|
lasttrack->end = g_CurrentTrackSegment;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_CurrentTrackSegment->m_End = Pad->m_Pos;
|
g_CurrentTrackSegment->m_End = aPad->GetPosition();
|
||||||
g_CurrentTrackSegment->SetState( END_ONPAD, OFF );
|
g_CurrentTrackSegment->SetState( END_ONPAD, OFF );
|
||||||
|
|
||||||
g_CurrentTrackSegment->end = Pad;
|
g_CurrentTrackSegment->end = aPad;
|
||||||
g_CurrentTrackSegment->SetState( END_ONPAD, ON );
|
g_CurrentTrackSegment->SetState( END_ONPAD, ON );
|
||||||
}
|
}
|
||||||
|
|
|
@ -317,30 +317,30 @@ static void CreatePadsShapesSection( FILE* aFile, BOARD* aPcb )
|
||||||
fprintf( aFile, "PAD P%d", pad->GetSubRatsnest() );
|
fprintf( aFile, "PAD P%d", pad->GetSubRatsnest() );
|
||||||
|
|
||||||
padstacks.push_back( pad ); // Will have its own padstack later
|
padstacks.push_back( pad ); // Will have its own padstack later
|
||||||
int dx = pad->m_Size.x / 2;
|
int dx = pad->GetSize().x / 2;
|
||||||
int dy = pad->m_Size.y / 2;
|
int dy = pad->GetSize().y / 2;
|
||||||
|
|
||||||
switch( pad->m_PadShape )
|
switch( pad->GetShape() )
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
case PAD_CIRCLE:
|
case PAD_CIRCLE:
|
||||||
fprintf( aFile, " ROUND %g\n",
|
fprintf( aFile, " ROUND %g\n",
|
||||||
pad->m_Drill.x / SCALE_FACTOR );
|
pad->GetDrillSize().x / SCALE_FACTOR );
|
||||||
/* Circle is center, radius */
|
/* Circle is center, radius */
|
||||||
fprintf( aFile, "CIRCLE %g %g %g\n",
|
fprintf( aFile, "CIRCLE %g %g %g\n",
|
||||||
pad->m_Offset.x / SCALE_FACTOR,
|
pad->GetOffset().x / SCALE_FACTOR,
|
||||||
-pad->m_Offset.y / SCALE_FACTOR,
|
-pad->GetOffset().y / SCALE_FACTOR,
|
||||||
pad->m_Size.x / (SCALE_FACTOR * 2) );
|
pad->GetSize().x / (SCALE_FACTOR * 2) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAD_RECT:
|
case PAD_RECT:
|
||||||
fprintf( aFile, " RECTANGULAR %g\n",
|
fprintf( aFile, " RECTANGULAR %g\n",
|
||||||
pad->m_Drill.x / SCALE_FACTOR );
|
pad->GetDrillSize().x / SCALE_FACTOR );
|
||||||
|
|
||||||
// Rectangle is begin, size *not* begin, end!
|
// Rectangle is begin, size *not* begin, end!
|
||||||
fprintf( aFile, "RECTANGLE %g %g %g %g\n",
|
fprintf( aFile, "RECTANGLE %g %g %g %g\n",
|
||||||
(-dx + pad->m_Offset.x ) / SCALE_FACTOR,
|
(-dx + pad->GetOffset().x ) / SCALE_FACTOR,
|
||||||
(-dy - pad->m_Offset.y ) / SCALE_FACTOR,
|
(-dy - pad->GetOffset().y ) / SCALE_FACTOR,
|
||||||
dx / (SCALE_FACTOR / 2), dy / (SCALE_FACTOR / 2) );
|
dx / (SCALE_FACTOR / 2), dy / (SCALE_FACTOR / 2) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -348,76 +348,76 @@ static void CreatePadsShapesSection( FILE* aFile, BOARD* aPcb )
|
||||||
{
|
{
|
||||||
// OrCAD Layout call them OVAL or OBLONG - GenCAD call them FINGERs
|
// OrCAD Layout call them OVAL or OBLONG - GenCAD call them FINGERs
|
||||||
fprintf( aFile, " FINGER %g\n",
|
fprintf( aFile, " FINGER %g\n",
|
||||||
pad->m_Drill.x / SCALE_FACTOR );
|
pad->GetDrillSize().x / SCALE_FACTOR );
|
||||||
int dr = dx - dy;
|
int dr = dx - dy;
|
||||||
|
|
||||||
if( dr >= 0 ) // Horizontal oval
|
if( dr >= 0 ) // Horizontal oval
|
||||||
{
|
{
|
||||||
int radius = dy;
|
int radius = dy;
|
||||||
fprintf( aFile, "LINE %g %g %g %g\n",
|
fprintf( aFile, "LINE %g %g %g %g\n",
|
||||||
(-dr + pad->m_Offset.x) / SCALE_FACTOR,
|
(-dr + pad->GetOffset().x) / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y - radius) / SCALE_FACTOR,
|
(-pad->GetOffset().y - radius) / SCALE_FACTOR,
|
||||||
(dr + pad->m_Offset.x ) / SCALE_FACTOR,
|
(dr + pad->GetOffset().x ) / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y - radius) / SCALE_FACTOR );
|
(-pad->GetOffset().y - radius) / SCALE_FACTOR );
|
||||||
|
|
||||||
// GenCAD arcs are (start, end, center)
|
// GenCAD arcs are (start, end, center)
|
||||||
fprintf( aFile, "ARC %g %g %g %g %g %g\n",
|
fprintf( aFile, "ARC %g %g %g %g %g %g\n",
|
||||||
(dr + pad->m_Offset.x) / SCALE_FACTOR,
|
(dr + pad->GetOffset().x) / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y - radius) / SCALE_FACTOR,
|
(-pad->GetOffset().y - radius) / SCALE_FACTOR,
|
||||||
(dr + pad->m_Offset.x) / SCALE_FACTOR,
|
(dr + pad->GetOffset().x) / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y + radius) / SCALE_FACTOR,
|
(-pad->GetOffset().y + radius) / SCALE_FACTOR,
|
||||||
(dr + pad->m_Offset.x) / SCALE_FACTOR,
|
(dr + pad->GetOffset().x) / SCALE_FACTOR,
|
||||||
-pad->m_Offset.y / SCALE_FACTOR );
|
-pad->GetOffset().y / SCALE_FACTOR );
|
||||||
|
|
||||||
fprintf( aFile, "LINE %g %g %g %g\n",
|
fprintf( aFile, "LINE %g %g %g %g\n",
|
||||||
(dr + pad->m_Offset.x) / SCALE_FACTOR,
|
(dr + pad->GetOffset().x) / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y + radius) / SCALE_FACTOR,
|
(-pad->GetOffset().y + radius) / SCALE_FACTOR,
|
||||||
(-dr + pad->m_Offset.x) / SCALE_FACTOR,
|
(-dr + pad->GetOffset().x) / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y + radius) / SCALE_FACTOR );
|
(-pad->GetOffset().y + radius) / SCALE_FACTOR );
|
||||||
fprintf( aFile, "ARC %g %g %g %g %g %g\n",
|
fprintf( aFile, "ARC %g %g %g %g %g %g\n",
|
||||||
(-dr + pad->m_Offset.x) / SCALE_FACTOR,
|
(-dr + pad->GetOffset().x) / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y + radius) / SCALE_FACTOR,
|
(-pad->GetOffset().y + radius) / SCALE_FACTOR,
|
||||||
(-dr + pad->m_Offset.x) / SCALE_FACTOR,
|
(-dr + pad->GetOffset().x) / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y - radius) / SCALE_FACTOR,
|
(-pad->GetOffset().y - radius) / SCALE_FACTOR,
|
||||||
(-dr + pad->m_Offset.x) / SCALE_FACTOR,
|
(-dr + pad->GetOffset().x) / SCALE_FACTOR,
|
||||||
-pad->m_Offset.y / SCALE_FACTOR );
|
-pad->GetOffset().y / SCALE_FACTOR );
|
||||||
}
|
}
|
||||||
else // Vertical oval
|
else // Vertical oval
|
||||||
{
|
{
|
||||||
dr = -dr;
|
dr = -dr;
|
||||||
int radius = dx;
|
int radius = dx;
|
||||||
fprintf( aFile, "LINE %g %g %g %g\n",
|
fprintf( aFile, "LINE %g %g %g %g\n",
|
||||||
(-radius + pad->m_Offset.x) / SCALE_FACTOR,
|
(-radius + pad->GetOffset().x) / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y - dr) / SCALE_FACTOR,
|
(-pad->GetOffset().y - dr) / SCALE_FACTOR,
|
||||||
(-radius + pad->m_Offset.x ) / SCALE_FACTOR,
|
(-radius + pad->GetOffset().x ) / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y + dr) / SCALE_FACTOR );
|
(-pad->GetOffset().y + dr) / SCALE_FACTOR );
|
||||||
fprintf( aFile, "ARC %g %g %g %g %g %g\n",
|
fprintf( aFile, "ARC %g %g %g %g %g %g\n",
|
||||||
(-radius + pad->m_Offset.x ) / SCALE_FACTOR,
|
(-radius + pad->GetOffset().x ) / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y + dr) / SCALE_FACTOR,
|
(-pad->GetOffset().y + dr) / SCALE_FACTOR,
|
||||||
(radius + pad->m_Offset.x ) / SCALE_FACTOR,
|
(radius + pad->GetOffset().x ) / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y + dr) / SCALE_FACTOR,
|
(-pad->GetOffset().y + dr) / SCALE_FACTOR,
|
||||||
pad->m_Offset.x / SCALE_FACTOR,
|
pad->GetOffset().x / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y + dr) / SCALE_FACTOR );
|
(-pad->GetOffset().y + dr) / SCALE_FACTOR );
|
||||||
|
|
||||||
fprintf( aFile, "LINE %g %g %g %g\n",
|
fprintf( aFile, "LINE %g %g %g %g\n",
|
||||||
(radius + pad->m_Offset.x) / SCALE_FACTOR,
|
(radius + pad->GetOffset().x) / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y + dr) / SCALE_FACTOR,
|
(-pad->GetOffset().y + dr) / SCALE_FACTOR,
|
||||||
(radius + pad->m_Offset.x) / SCALE_FACTOR,
|
(radius + pad->GetOffset().x) / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y - dr) / SCALE_FACTOR );
|
(-pad->GetOffset().y - dr) / SCALE_FACTOR );
|
||||||
fprintf( aFile, "ARC %g %g %g %g %g %g\n",
|
fprintf( aFile, "ARC %g %g %g %g %g %g\n",
|
||||||
(radius + pad->m_Offset.x) / SCALE_FACTOR,
|
(radius + pad->GetOffset().x) / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y - dr) / SCALE_FACTOR,
|
(-pad->GetOffset().y - dr) / SCALE_FACTOR,
|
||||||
(-radius + pad->m_Offset.x) / SCALE_FACTOR,
|
(-radius + pad->GetOffset().x) / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y - dr) / SCALE_FACTOR,
|
(-pad->GetOffset().y - dr) / SCALE_FACTOR,
|
||||||
pad->m_Offset.x / SCALE_FACTOR,
|
pad->GetOffset().x / SCALE_FACTOR,
|
||||||
(-pad->m_Offset.y - dr) / SCALE_FACTOR );
|
(-pad->GetOffset().y - dr) / SCALE_FACTOR );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case PAD_TRAPEZOID:
|
case PAD_TRAPEZOID:
|
||||||
fprintf( aFile, " POLYGON %g\n",
|
fprintf( aFile, " POLYGON %g\n",
|
||||||
pad->m_Drill.x / SCALE_FACTOR );
|
pad->GetDrillSize().x / SCALE_FACTOR );
|
||||||
|
|
||||||
// XXX TO BE IMPLEMENTED! and I don't know if it could be actually imported by something
|
// XXX TO BE IMPLEMENTED! and I don't know if it could be actually imported by something
|
||||||
break;
|
break;
|
||||||
|
@ -461,10 +461,10 @@ static void CreatePadsShapesSection( FILE* aFile, BOARD* aPcb )
|
||||||
|
|
||||||
// Straight padstack
|
// Straight padstack
|
||||||
fprintf( aFile, "PADSTACK PAD%d %g\n", i,
|
fprintf( aFile, "PADSTACK PAD%d %g\n", i,
|
||||||
pad->m_Drill.x / SCALE_FACTOR );
|
pad->GetDrillSize().x / SCALE_FACTOR );
|
||||||
for( int layer = 0; layer < 32; layer++ )
|
for( int layer = 0; layer < 32; layer++ )
|
||||||
{
|
{
|
||||||
if( pad->m_layerMask & (1 << layer) & master_layermask )
|
if( pad->GetLayerMask() & (1 << layer) & master_layermask )
|
||||||
{
|
{
|
||||||
fprintf( aFile, "PAD P%d %s 0 0\n", i,
|
fprintf( aFile, "PAD P%d %s 0 0\n", i,
|
||||||
TO_UTF8( GenCADLayerName[layer] ) );
|
TO_UTF8( GenCADLayerName[layer] ) );
|
||||||
|
@ -473,10 +473,10 @@ static void CreatePadsShapesSection( FILE* aFile, BOARD* aPcb )
|
||||||
|
|
||||||
// Flipped padstack
|
// Flipped padstack
|
||||||
fprintf( aFile, "PADSTACK PAD%dF %g\n", i,
|
fprintf( aFile, "PADSTACK PAD%dF %g\n", i,
|
||||||
pad->m_Drill.x / SCALE_FACTOR );
|
pad->GetDrillSize().x / SCALE_FACTOR );
|
||||||
for( int layer = 0; layer < 32; layer++ )
|
for( int layer = 0; layer < 32; layer++ )
|
||||||
{
|
{
|
||||||
if( pad->m_layerMask & (1 << layer) & master_layermask )
|
if( pad->GetLayerMask() & (1 << layer) & master_layermask )
|
||||||
{
|
{
|
||||||
fprintf( aFile, "PAD P%d %s 0 0\n", i,
|
fprintf( aFile, "PAD P%d %s 0 0\n", i,
|
||||||
TO_UTF8( GenCADLayerNameFlipped[layer] ) );
|
TO_UTF8( GenCADLayerNameFlipped[layer] ) );
|
||||||
|
@ -516,11 +516,11 @@ static void CreateShapesSection( FILE* aFile, BOARD* aPcb )
|
||||||
* if the spec explicitly says it's not... */
|
* if the spec explicitly says it's not... */
|
||||||
layer = "ALL";
|
layer = "ALL";
|
||||||
|
|
||||||
if( ( pad->m_layerMask & ALL_CU_LAYERS ) == LAYER_BACK )
|
if( ( pad->GetLayerMask() & ALL_CU_LAYERS ) == LAYER_BACK )
|
||||||
{
|
{
|
||||||
layer = ( module->flag ) ? "TOP" : "BOTTOM";
|
layer = ( module->flag ) ? "TOP" : "BOTTOM";
|
||||||
}
|
}
|
||||||
else if( ( pad->m_layerMask & ALL_CU_LAYERS ) == LAYER_FRONT )
|
else if( ( pad->GetLayerMask() & ALL_CU_LAYERS ) == LAYER_FRONT )
|
||||||
{
|
{
|
||||||
layer = ( module->flag ) ? "BOTTOM" : "TOP";
|
layer = ( module->flag ) ? "BOTTOM" : "TOP";
|
||||||
}
|
}
|
||||||
|
@ -530,7 +530,7 @@ static void CreateShapesSection( FILE* aFile, BOARD* aPcb )
|
||||||
if( pinname.IsEmpty() )
|
if( pinname.IsEmpty() )
|
||||||
pinname = wxT( "none" );
|
pinname = wxT( "none" );
|
||||||
|
|
||||||
orient = pad->m_Orient - module->m_Orient;
|
orient = pad->GetOrientation() - module->GetOrientation();
|
||||||
NORMALIZE_ANGLE_POS( orient );
|
NORMALIZE_ANGLE_POS( orient );
|
||||||
|
|
||||||
// Bottom side modules use the flipped padstack
|
// Bottom side modules use the flipped padstack
|
||||||
|
@ -538,8 +538,8 @@ static void CreateShapesSection( FILE* aFile, BOARD* aPcb )
|
||||||
"PIN %s PAD%dF %g %g %s %g %s\n" :
|
"PIN %s PAD%dF %g %g %s %g %s\n" :
|
||||||
"PIN %s PAD%d %g %g %s %g %s\n",
|
"PIN %s PAD%d %g %g %s %g %s\n",
|
||||||
TO_UTF8( pinname ), pad->GetSubRatsnest(),
|
TO_UTF8( pinname ), pad->GetSubRatsnest(),
|
||||||
pad->m_Pos0.x / SCALE_FACTOR,
|
pad->GetPos0().x / SCALE_FACTOR,
|
||||||
-pad->m_Pos0.y / SCALE_FACTOR,
|
-pad->GetPos0().y / SCALE_FACTOR,
|
||||||
layer, orient / 10.0, mirror );
|
layer, orient / 10.0, mirror );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -562,7 +562,7 @@ static void CreateComponentsSection( FILE* aFile, BOARD* aPcb )
|
||||||
TEXTE_MODULE* textmod;
|
TEXTE_MODULE* textmod;
|
||||||
const char* mirror;
|
const char* mirror;
|
||||||
const char* flip;
|
const char* flip;
|
||||||
int orient = module->m_Orient;
|
int orient = module->GetOrientation();
|
||||||
|
|
||||||
if( module->flag )
|
if( module->flag )
|
||||||
{
|
{
|
||||||
|
@ -597,14 +597,14 @@ static void CreateComponentsSection( FILE* aFile, BOARD* aPcb )
|
||||||
|
|
||||||
for( int ii = 0; ii < 2; ii++ )
|
for( int ii = 0; ii < 2; ii++ )
|
||||||
{
|
{
|
||||||
int orient = textmod->m_Orient;
|
int orient = textmod->GetOrientation();
|
||||||
wxString layer = GenCADLayerName[(module->flag) ?
|
wxString layer = GenCADLayerName[(module->flag) ?
|
||||||
SILKSCREEN_N_BACK : SILKSCREEN_N_FRONT];
|
SILKSCREEN_N_BACK : SILKSCREEN_N_FRONT];
|
||||||
|
|
||||||
fprintf( aFile, "TEXT %g %g %g %g %s %s \"%s\"",
|
fprintf( aFile, "TEXT %g %g %g %g %s %s \"%s\"",
|
||||||
textmod->GetPos0().x / SCALE_FACTOR,
|
textmod->GetPos0().x / SCALE_FACTOR,
|
||||||
-textmod->GetPos0().y / SCALE_FACTOR,
|
-textmod->GetPos0().y / SCALE_FACTOR,
|
||||||
textmod->m_Size.x / SCALE_FACTOR,
|
textmod->GetSize().x / SCALE_FACTOR,
|
||||||
orient / 10.0,
|
orient / 10.0,
|
||||||
mirror,
|
mirror,
|
||||||
TO_UTF8( layer ),
|
TO_UTF8( layer ),
|
||||||
|
@ -612,9 +612,9 @@ static void CreateComponentsSection( FILE* aFile, BOARD* aPcb )
|
||||||
|
|
||||||
// Please note, the width is approx
|
// Please note, the width is approx
|
||||||
fprintf( aFile, " 0 0 %g %g\n",
|
fprintf( aFile, " 0 0 %g %g\n",
|
||||||
( textmod->m_Size.x * textmod->m_Text.Len() )
|
( textmod->GetSize().x * textmod->m_Text.Len() )
|
||||||
/ SCALE_FACTOR,
|
/ SCALE_FACTOR,
|
||||||
textmod->m_Size.y / SCALE_FACTOR );
|
textmod->GetSize().y / SCALE_FACTOR );
|
||||||
|
|
||||||
textmod = module->m_Value; // Dirty trick for the second iteration
|
textmod = module->m_Value; // Dirty trick for the second iteration
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,10 +94,10 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/* I use this a lot... */
|
// I use this a lot...
|
||||||
static const double PI2 = M_PI / 2;
|
static const double PI2 = M_PI / 2;
|
||||||
|
|
||||||
/* Absolutely not optimized triangle bag :D */
|
// Absolutely not optimized triangle bag :D
|
||||||
struct VRMLPt
|
struct VRMLPt
|
||||||
{
|
{
|
||||||
double x, y, z;
|
double x, y, z;
|
||||||
|
@ -122,7 +122,7 @@ struct Triangle
|
||||||
};
|
};
|
||||||
typedef std::vector<Triangle> TriangleBag;
|
typedef std::vector<Triangle> TriangleBag;
|
||||||
|
|
||||||
/* A flat triangle fan */
|
// A flat triangle fan
|
||||||
struct FlatFan
|
struct FlatFan
|
||||||
{
|
{
|
||||||
FlatPt c;
|
FlatPt c;
|
||||||
|
@ -134,7 +134,7 @@ struct FlatFan
|
||||||
void bag( int layer, bool close = true );
|
void bag( int layer, bool close = true );
|
||||||
};
|
};
|
||||||
|
|
||||||
/* A flat quad ring */
|
// A flat quad ring
|
||||||
struct FlatRing
|
struct FlatRing
|
||||||
{
|
{
|
||||||
std::vector<FlatPt> inner;
|
std::vector<FlatPt> inner;
|
||||||
|
@ -152,7 +152,7 @@ struct FlatRing
|
||||||
void bag( int layer, bool close = true );
|
void bag( int layer, bool close = true );
|
||||||
};
|
};
|
||||||
|
|
||||||
/* A vertical quad loop */
|
// A vertical quad loop
|
||||||
struct VLoop
|
struct VLoop
|
||||||
{
|
{
|
||||||
std::vector<FlatPt> pts;
|
std::vector<FlatPt> pts;
|
||||||
|
@ -165,12 +165,12 @@ struct VLoop
|
||||||
void bag( TriangleBag& triangles, bool close = true );
|
void bag( TriangleBag& triangles, bool close = true );
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The bags for all the layers */
|
// The bags for all the layers
|
||||||
static TriangleBag layer_triangles[LAYER_COUNT];
|
static TriangleBag layer_triangles[LAYER_COUNT];
|
||||||
static TriangleBag via_triangles[4];
|
static TriangleBag via_triangles[4];
|
||||||
static double layer_z[LAYER_COUNT];
|
static double layer_z[LAYER_COUNT];
|
||||||
|
|
||||||
static void bag_flat_triangle( int layer, /*{{{*/
|
static void bag_flat_triangle( int layer, //{{{
|
||||||
double x1, double y1,
|
double x1, double y1,
|
||||||
double x2, double y2,
|
double x2, double y2,
|
||||||
double x3, double y3 )
|
double x3, double y3 )
|
||||||
|
@ -181,7 +181,7 @@ static void bag_flat_triangle( int layer, /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void FlatFan::bag( int layer, bool close ) /*{{{*/
|
void FlatFan::bag( int layer, bool close ) //{{{
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
|
@ -193,7 +193,7 @@ void FlatFan::bag( int layer, bool close ) /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void bag_flat_quad( int layer, /*{{{*/
|
static void bag_flat_quad( int layer, //{{{
|
||||||
double x1, double y1,
|
double x1, double y1,
|
||||||
double x2, double y2,
|
double x2, double y2,
|
||||||
double x3, double y3,
|
double x3, double y3,
|
||||||
|
@ -204,7 +204,7 @@ static void bag_flat_quad( int layer, /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void FlatRing::bag( int layer, bool close ) /*{{{*/
|
void FlatRing::bag( int layer, bool close ) //{{{
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
|
@ -224,7 +224,7 @@ void FlatRing::bag( int layer, bool close ) /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void bag_vquad( TriangleBag& triangles, /*{{{*/
|
static void bag_vquad( TriangleBag& triangles, //{{{
|
||||||
double x1, double y1, double x2, double y2,
|
double x1, double y1, double x2, double y2,
|
||||||
double z1, double z2 )
|
double z1, double z2 )
|
||||||
{
|
{
|
||||||
|
@ -237,7 +237,7 @@ static void bag_vquad( TriangleBag& triangles, /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void VLoop::bag( TriangleBag& triangles, bool close ) /*{{{*/
|
void VLoop::bag( TriangleBag& triangles, bool close ) //{{{
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
|
@ -253,7 +253,7 @@ void VLoop::bag( TriangleBag& triangles, bool close ) /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void write_triangle_bag( FILE* output_file, int color_index, /*{{{*/
|
static void write_triangle_bag( FILE* output_file, int color_index, //{{{
|
||||||
const TriangleBag& triangles )
|
const TriangleBag& triangles )
|
||||||
{
|
{
|
||||||
/* A lot of nodes are not required, but blender sometimes chokes
|
/* A lot of nodes are not required, but blender sometimes chokes
|
||||||
|
@ -270,7 +270,7 @@ static void write_triangle_bag( FILE* output_file, int color_index, /*{{{*/
|
||||||
" Shape {\n",
|
" Shape {\n",
|
||||||
" appearance Appearance {\n",
|
" appearance Appearance {\n",
|
||||||
" material Material {\n",
|
" material Material {\n",
|
||||||
0, /* Material marker */
|
0, // Material marker
|
||||||
" ambientIntensity 0.8\n",
|
" ambientIntensity 0.8\n",
|
||||||
" transparency 0.2\n",
|
" transparency 0.2\n",
|
||||||
" shininess 0.2\n",
|
" shininess 0.2\n",
|
||||||
|
@ -280,11 +280,11 @@ static void write_triangle_bag( FILE* output_file, int color_index, /*{{{*/
|
||||||
" solid true\n",
|
" solid true\n",
|
||||||
" coord Coordinate {\n",
|
" coord Coordinate {\n",
|
||||||
" point [\n",
|
" point [\n",
|
||||||
0, /* Coordinates marker */
|
0, // Coordinates marker
|
||||||
" ]\n",
|
" ]\n",
|
||||||
" }\n",
|
" }\n",
|
||||||
" coordIndex [\n",
|
" coordIndex [\n",
|
||||||
0, /* Index marker */
|
0, // Index marker
|
||||||
" ]\n",
|
" ]\n",
|
||||||
" }\n",
|
" }\n",
|
||||||
" }\n",
|
" }\n",
|
||||||
|
@ -292,7 +292,7 @@ static void write_triangle_bag( FILE* output_file, int color_index, /*{{{*/
|
||||||
" }\n",
|
" }\n",
|
||||||
" ]\n",
|
" ]\n",
|
||||||
"}\n",
|
"}\n",
|
||||||
0 /* End marker */
|
0 // End marker
|
||||||
};
|
};
|
||||||
int marker_found = 0, lineno = 0;
|
int marker_found = 0, lineno = 0;
|
||||||
|
|
||||||
|
@ -305,7 +305,7 @@ static void write_triangle_bag( FILE* output_file, int color_index, /*{{{*/
|
||||||
marker_found++;
|
marker_found++;
|
||||||
switch( marker_found )
|
switch( marker_found )
|
||||||
{
|
{
|
||||||
case 1: /* Material marker */
|
case 1: // Material marker
|
||||||
fprintf( output_file,
|
fprintf( output_file,
|
||||||
" diffuseColor %g %g %g\n",
|
" diffuseColor %g %g %g\n",
|
||||||
(double) ColorRefs[color_index].m_Red / 255.0,
|
(double) ColorRefs[color_index].m_Red / 255.0,
|
||||||
|
@ -325,7 +325,7 @@ static void write_triangle_bag( FILE* output_file, int color_index, /*{{{*/
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
{
|
||||||
/* Coordinates marker */
|
// Coordinates marker
|
||||||
for( TriangleBag::const_iterator i = triangles.begin();
|
for( TriangleBag::const_iterator i = triangles.begin();
|
||||||
i != triangles.end();
|
i != triangles.end();
|
||||||
i++ )
|
i++ )
|
||||||
|
@ -342,8 +342,8 @@ static void write_triangle_bag( FILE* output_file, int color_index, /*{{{*/
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
{
|
||||||
/* Index marker */
|
// Index marker
|
||||||
/* OK, that's sick ... */
|
// OK, that's sick ...
|
||||||
int j = 0;
|
int j = 0;
|
||||||
for( TriangleBag::const_iterator i = triangles.begin();
|
for( TriangleBag::const_iterator i = triangles.begin();
|
||||||
i != triangles.end();
|
i != triangles.end();
|
||||||
|
@ -364,7 +364,7 @@ static void write_triangle_bag( FILE* output_file, int color_index, /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void compute_layer_Zs( BOARD* pcb ) /*{{{*/
|
static void compute_layer_Zs( BOARD* pcb ) //{{{
|
||||||
{
|
{
|
||||||
int copper_layers = pcb->GetCopperLayerCount( );
|
int copper_layers = pcb->GetCopperLayerCount( );
|
||||||
|
|
||||||
|
@ -372,18 +372,18 @@ static void compute_layer_Zs( BOARD* pcb ) /*{{{*/
|
||||||
double board_thickness = pcb->GetDesignSettings().m_BoardThickness;
|
double board_thickness = pcb->GetDesignSettings().m_BoardThickness;
|
||||||
double half_thickness = board_thickness / 2;
|
double half_thickness = board_thickness / 2;
|
||||||
|
|
||||||
/* Compute each layer's Z value, more or less like the 3d view */
|
// Compute each layer's Z value, more or less like the 3d view
|
||||||
for( int i = 0; i <= LAYER_N_FRONT; i++ )
|
for( int i = 0; i <= LAYER_N_FRONT; i++ )
|
||||||
{
|
{
|
||||||
if( i < copper_layers )
|
if( i < copper_layers )
|
||||||
layer_z[i] = board_thickness * i / (copper_layers - 1) - half_thickness;
|
layer_z[i] = board_thickness * i / (copper_layers - 1) - half_thickness;
|
||||||
else
|
else
|
||||||
layer_z[i] = half_thickness; /* The component layer... */
|
layer_z[i] = half_thickness; // The component layer...
|
||||||
}
|
}
|
||||||
|
|
||||||
/* To avoid rounding interference, we apply an epsilon to each
|
/* To avoid rounding interference, we apply an epsilon to each
|
||||||
* successive layer */
|
* successive layer */
|
||||||
const double epsilon_z = 10; /* That's 1 mils, about 1/50 mm */
|
const double epsilon_z = 10; // That's 1 mils, about 1/50 mm
|
||||||
layer_z[SOLDERPASTE_N_BACK] = -half_thickness - epsilon_z * 4;
|
layer_z[SOLDERPASTE_N_BACK] = -half_thickness - epsilon_z * 4;
|
||||||
layer_z[ADHESIVE_N_BACK] = -half_thickness - epsilon_z * 3;
|
layer_z[ADHESIVE_N_BACK] = -half_thickness - epsilon_z * 3;
|
||||||
layer_z[SILKSCREEN_N_BACK] = -half_thickness - epsilon_z * 2;
|
layer_z[SILKSCREEN_N_BACK] = -half_thickness - epsilon_z * 2;
|
||||||
|
@ -400,7 +400,7 @@ static void compute_layer_Zs( BOARD* pcb ) /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void export_vrml_line( int layer, double startx, double starty, /*{{{*/
|
static void export_vrml_line( int layer, double startx, double starty, //{{{
|
||||||
double endx, double endy, double width, int divisions )
|
double endx, double endy, double width, int divisions )
|
||||||
{
|
{
|
||||||
double r = width / 2;
|
double r = width / 2;
|
||||||
|
@ -408,28 +408,28 @@ static void export_vrml_line( int layer, double startx, double starty, /*{{{*/
|
||||||
double alpha;
|
double alpha;
|
||||||
FlatFan fan;
|
FlatFan fan;
|
||||||
|
|
||||||
/* Output the 'bone' as a triangle fan, this is the fan centre */
|
// Output the 'bone' as a triangle fan, this is the fan centre
|
||||||
fan.c.x = (startx + endx) / 2;
|
fan.c.x = (startx + endx) / 2;
|
||||||
fan.c.y = (starty + endy) / 2;
|
fan.c.y = (starty + endy) / 2;
|
||||||
|
|
||||||
/* The 'end' side cap */
|
// The 'end' side cap
|
||||||
for( alpha = angle - PI2; alpha < angle + PI2; alpha += PI2 / divisions )
|
for( alpha = angle - PI2; alpha < angle + PI2; alpha += PI2 / divisions )
|
||||||
fan.add( endx + r * cos( alpha ), endy + r * sin( alpha ) );
|
fan.add( endx + r * cos( alpha ), endy + r * sin( alpha ) );
|
||||||
|
|
||||||
alpha = angle + PI2;
|
alpha = angle + PI2;
|
||||||
fan.add( endx + r * cos( alpha ), endy + r * sin( alpha ) );
|
fan.add( endx + r * cos( alpha ), endy + r * sin( alpha ) );
|
||||||
/* The 'start' side cap */
|
// The 'start' side cap
|
||||||
for( alpha = angle + PI2; alpha < angle + 3 * PI2; alpha += PI2 / divisions )
|
for( alpha = angle + PI2; alpha < angle + 3 * PI2; alpha += PI2 / divisions )
|
||||||
fan.add( startx + r * cos( alpha ), starty + r * sin( alpha ) );
|
fan.add( startx + r * cos( alpha ), starty + r * sin( alpha ) );
|
||||||
|
|
||||||
alpha = angle + 3 * PI2;
|
alpha = angle + 3 * PI2;
|
||||||
fan.add( startx + r * cos( alpha ), starty + r * sin( alpha ) );
|
fan.add( startx + r * cos( alpha ), starty + r * sin( alpha ) );
|
||||||
/* Export the fan */
|
// Export the fan
|
||||||
fan.bag( layer );
|
fan.bag( layer );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void export_vrml_circle( int layer, double startx, double starty, /*{{{*/
|
static void export_vrml_circle( int layer, double startx, double starty, //{{{
|
||||||
double endx, double endy, double width, int divisions )
|
double endx, double endy, double width, int divisions )
|
||||||
{
|
{
|
||||||
double hole, radius;
|
double hole, radius;
|
||||||
|
@ -448,11 +448,11 @@ static void export_vrml_circle( int layer, double startx, double starty, /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void export_vrml_slot( TriangleBag& triangles, /*{{{*/
|
static void export_vrml_slot( TriangleBag& triangles, //{{{
|
||||||
int top_layer, int bottom_layer, double xc, double yc,
|
int top_layer, int bottom_layer, double xc, double yc,
|
||||||
double dx, double dy, int orient, int divisions )
|
double dx, double dy, int orient, int divisions )
|
||||||
{
|
{
|
||||||
double capx, capy; /* Cap center */
|
double capx, capy; // Cap center
|
||||||
VLoop loop;
|
VLoop loop;
|
||||||
|
|
||||||
loop.z_top = layer_z[top_layer];
|
loop.z_top = layer_z[top_layer];
|
||||||
|
@ -465,10 +465,10 @@ static void export_vrml_slot( TriangleBag& triangles, /*{{{*/
|
||||||
angle += PI2;
|
angle += PI2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The exchange above means that cutter radius is alvays dy/2 */
|
// The exchange above means that cutter radius is alvays dy/2
|
||||||
double r = dy / 2;
|
double r = dy / 2;
|
||||||
double alpha;
|
double alpha;
|
||||||
/* The first side cap */
|
// The first side cap
|
||||||
capx = xc + cos( angle ) * dx / 2;
|
capx = xc + cos( angle ) * dx / 2;
|
||||||
capy = yc + sin( angle ) * dx / 2;
|
capy = yc + sin( angle ) * dx / 2;
|
||||||
|
|
||||||
|
@ -478,7 +478,7 @@ static void export_vrml_slot( TriangleBag& triangles, /*{{{*/
|
||||||
alpha = angle + PI2;
|
alpha = angle + PI2;
|
||||||
loop.add( capx + r * cos( alpha ), capy + r * sin( alpha ) );
|
loop.add( capx + r * cos( alpha ), capy + r * sin( alpha ) );
|
||||||
|
|
||||||
/* The other side cap */
|
// The other side cap
|
||||||
capx = xc - cos( angle ) * dx / 2;
|
capx = xc - cos( angle ) * dx / 2;
|
||||||
capy = yc - sin( angle ) * dx / 2;
|
capy = yc - sin( angle ) * dx / 2;
|
||||||
|
|
||||||
|
@ -491,7 +491,7 @@ static void export_vrml_slot( TriangleBag& triangles, /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void export_vrml_hole( TriangleBag& triangles, /*{{{*/
|
static void export_vrml_hole( TriangleBag& triangles, //{{{
|
||||||
int top_layer, int bottom_layer, double xc, double yc, double hole,
|
int top_layer, int bottom_layer, double xc, double yc, double hole,
|
||||||
int divisions )
|
int divisions )
|
||||||
{
|
{
|
||||||
|
@ -507,7 +507,7 @@ static void export_vrml_hole( TriangleBag& triangles, /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void export_vrml_varc( TriangleBag& triangles, /*{{{*/
|
static void export_vrml_varc( TriangleBag& triangles, //{{{
|
||||||
int top_layer, int bottom_layer, double startx, double starty,
|
int top_layer, int bottom_layer, double startx, double starty,
|
||||||
double endx, double endy, int divisions )
|
double endx, double endy, int divisions )
|
||||||
{
|
{
|
||||||
|
@ -527,11 +527,11 @@ static void export_vrml_varc( TriangleBag& triangles, /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void export_vrml_oval_pad( int layer, /*{{{*/
|
static void export_vrml_oval_pad( int layer, //{{{
|
||||||
double xc, double yc,
|
double xc, double yc,
|
||||||
double dx, double dy, int orient, int divisions )
|
double dx, double dy, int orient, int divisions )
|
||||||
{
|
{
|
||||||
double capx, capy; /* Cap center */
|
double capx, capy; // Cap center
|
||||||
FlatFan fan;
|
FlatFan fan;
|
||||||
|
|
||||||
fan.c.x = xc;
|
fan.c.x = xc;
|
||||||
|
@ -544,11 +544,11 @@ static void export_vrml_oval_pad( int layer, /*{{{*/
|
||||||
angle += PI2;
|
angle += PI2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The exchange above means that cutter radius is alvays dy/2 */
|
// The exchange above means that cutter radius is alvays dy/2
|
||||||
double r = dy / 2;
|
double r = dy / 2;
|
||||||
double alpha;
|
double alpha;
|
||||||
|
|
||||||
/* The first side cap */
|
// The first side cap
|
||||||
capx = xc + cos( angle ) * dx / 2;
|
capx = xc + cos( angle ) * dx / 2;
|
||||||
capy = yc + sin( angle ) * dx / 2;
|
capy = yc + sin( angle ) * dx / 2;
|
||||||
|
|
||||||
|
@ -557,7 +557,7 @@ static void export_vrml_oval_pad( int layer, /*{{{*/
|
||||||
|
|
||||||
alpha = angle + PI2;
|
alpha = angle + PI2;
|
||||||
fan.add( capx + r * cos( alpha ), capy + r * sin( alpha ) );
|
fan.add( capx + r * cos( alpha ), capy + r * sin( alpha ) );
|
||||||
/* The other side cap */
|
// The other side cap
|
||||||
capx = xc - cos( angle ) * dx / 2;
|
capx = xc - cos( angle ) * dx / 2;
|
||||||
capy = yc - sin( angle ) * dx / 2;
|
capy = yc - sin( angle ) * dx / 2;
|
||||||
|
|
||||||
|
@ -570,7 +570,7 @@ static void export_vrml_oval_pad( int layer, /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void export_vrml_arc( int layer, double startx, double starty, /*{{{*/
|
static void export_vrml_arc( int layer, double startx, double starty, //{{{
|
||||||
double endx, double endy, double width, int divisions )
|
double endx, double endy, double width, int divisions )
|
||||||
{
|
{
|
||||||
FlatRing ring;
|
FlatRing ring;
|
||||||
|
@ -590,7 +590,7 @@ static void export_vrml_arc( int layer, double startx, double starty, /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void export_vrml_drawsegment( DRAWSEGMENT* drawseg ) /*{{{*/
|
static void export_vrml_drawsegment( DRAWSEGMENT* drawseg ) //{{{
|
||||||
{
|
{
|
||||||
int layer = drawseg->GetLayer();
|
int layer = drawseg->GetLayer();
|
||||||
double w = drawseg->GetWidth();
|
double w = drawseg->GetWidth();
|
||||||
|
@ -599,19 +599,19 @@ static void export_vrml_drawsegment( DRAWSEGMENT* drawseg ) /*{{{*/
|
||||||
double xf = drawseg->GetEnd().x;
|
double xf = drawseg->GetEnd().x;
|
||||||
double yf = drawseg->GetEnd().y;
|
double yf = drawseg->GetEnd().y;
|
||||||
|
|
||||||
/* Items on the edge layer are high, not thick */
|
// Items on the edge layer are high, not thick
|
||||||
if( layer == EDGE_N )
|
if( layer == EDGE_N )
|
||||||
{
|
{
|
||||||
switch( drawseg->GetShape() )
|
switch( drawseg->GetShape() )
|
||||||
{
|
{
|
||||||
/* There is a special 'varc' primitive for this */
|
// There is a special 'varc' primitive for this
|
||||||
case S_ARC:
|
case S_ARC:
|
||||||
export_vrml_varc( layer_triangles[layer],
|
export_vrml_varc( layer_triangles[layer],
|
||||||
FIRST_COPPER_LAYER, LAST_COPPER_LAYER,
|
FIRST_COPPER_LAYER, LAST_COPPER_LAYER,
|
||||||
x, y, xf, yf, 4 );
|
x, y, xf, yf, 4 );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Circles on edge are usually important holes */
|
// Circles on edge are usually important holes
|
||||||
case S_CIRCLE:
|
case S_CIRCLE:
|
||||||
export_vrml_hole( layer_triangles[layer],
|
export_vrml_hole( layer_triangles[layer],
|
||||||
FIRST_COPPER_LAYER, LAST_COPPER_LAYER, x, y,
|
FIRST_COPPER_LAYER, LAST_COPPER_LAYER, x, y,
|
||||||
|
@ -620,7 +620,7 @@ static void export_vrml_drawsegment( DRAWSEGMENT* drawseg ) /*{{{*/
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
/* Simply a quad */
|
// Simply a quad
|
||||||
double z_top = layer_z[FIRST_COPPER_LAYER];
|
double z_top = layer_z[FIRST_COPPER_LAYER];
|
||||||
double z_bottom = layer_z[LAST_COPPER_LAYER];
|
double z_bottom = layer_z[LAST_COPPER_LAYER];
|
||||||
bag_vquad( layer_triangles[layer], x, y, xf, yf, z_top, z_bottom );
|
bag_vquad( layer_triangles[layer], x, y, xf, yf, z_top, z_bottom );
|
||||||
|
@ -661,7 +661,7 @@ static void vrml_text_callback( int x0, int y0, int xf, int yf )
|
||||||
|
|
||||||
static void export_vrml_pcbtext( TEXTE_PCB* text )
|
static void export_vrml_pcbtext( TEXTE_PCB* text )
|
||||||
{
|
{
|
||||||
/* Coupling by globals! Ewwww... */
|
// Coupling by globals! Ewwww...
|
||||||
s_text_layer = text->GetLayer();
|
s_text_layer = text->GetLayer();
|
||||||
s_text_width = text->m_Thickness;
|
s_text_width = text->m_Thickness;
|
||||||
|
|
||||||
|
@ -677,12 +677,12 @@ static void export_vrml_pcbtext( TEXTE_PCB* text )
|
||||||
|
|
||||||
offset.y = text->GetInterline();
|
offset.y = text->GetInterline();
|
||||||
|
|
||||||
RotatePoint( &offset, text->m_Orient );
|
RotatePoint( &offset, text->GetOrientation() );
|
||||||
for( unsigned i = 0; i<list->Count(); i++ )
|
for( unsigned i = 0; i<list->Count(); i++ )
|
||||||
{
|
{
|
||||||
wxString txt = list->Item( i );
|
wxString txt = list->Item( i );
|
||||||
DrawGraphicText( NULL, NULL, pos, (EDA_Colors) 0,
|
DrawGraphicText( NULL, NULL, pos, (EDA_Colors) 0,
|
||||||
txt, text->m_Orient, size,
|
txt, text->GetOrientation(), size,
|
||||||
text->m_HJustify, text->m_VJustify,
|
text->m_HJustify, text->m_VJustify,
|
||||||
text->m_Thickness, text->m_Italic,
|
text->m_Thickness, text->m_Italic,
|
||||||
true,
|
true,
|
||||||
|
@ -695,7 +695,7 @@ static void export_vrml_pcbtext( TEXTE_PCB* text )
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DrawGraphicText( NULL, NULL, text->m_Pos, (EDA_Colors) 0,
|
DrawGraphicText( NULL, NULL, text->m_Pos, (EDA_Colors) 0,
|
||||||
text->m_Text, text->m_Orient, size,
|
text->m_Text, text->GetOrientation(), size,
|
||||||
text->m_HJustify, text->m_VJustify,
|
text->m_HJustify, text->m_VJustify,
|
||||||
text->m_Thickness, text->m_Italic,
|
text->m_Thickness, text->m_Italic,
|
||||||
true,
|
true,
|
||||||
|
@ -704,9 +704,9 @@ static void export_vrml_pcbtext( TEXTE_PCB* text )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void export_vrml_drawings( BOARD* pcb ) /*{{{*/
|
static void export_vrml_drawings( BOARD* pcb ) //{{{
|
||||||
{
|
{
|
||||||
/* draw graphic items */
|
// draw graphic items
|
||||||
for( EDA_ITEM* drawing = pcb->m_Drawings; drawing != 0; drawing = drawing->Next() )
|
for( EDA_ITEM* drawing = pcb->m_Drawings; drawing != 0; drawing = drawing->Next() )
|
||||||
{
|
{
|
||||||
switch( drawing->Type() )
|
switch( drawing->Type() )
|
||||||
|
@ -726,14 +726,14 @@ static void export_vrml_drawings( BOARD* pcb ) /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void export_round_padstack( BOARD* pcb, double x, double y, double r, /*{{{*/
|
static void export_round_padstack( BOARD* pcb, double x, double y, double r, //{{{
|
||||||
int bottom_layer, int top_layer, int divisions )
|
int bottom_layer, int top_layer, int divisions )
|
||||||
{
|
{
|
||||||
int copper_layers = pcb->GetCopperLayerCount( );
|
int copper_layers = pcb->GetCopperLayerCount( );
|
||||||
|
|
||||||
for( int layer = bottom_layer; layer < copper_layers; layer++ )
|
for( int layer = bottom_layer; layer < copper_layers; layer++ )
|
||||||
{
|
{
|
||||||
/* The last layer is always the component one, unless it's single face */
|
// The last layer is always the component one, unless it's single face
|
||||||
if( (layer > FIRST_COPPER_LAYER) && (layer == copper_layers - 1) )
|
if( (layer > FIRST_COPPER_LAYER) && (layer == copper_layers - 1) )
|
||||||
layer = LAST_COPPER_LAYER;
|
layer = LAST_COPPER_LAYER;
|
||||||
|
|
||||||
|
@ -743,7 +743,7 @@ static void export_round_padstack( BOARD* pcb, double x, double y, double r, /*{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void export_vrml_via( BOARD* pcb, SEGVIA* via ) /*{{{*/
|
static void export_vrml_via( BOARD* pcb, SEGVIA* via ) //{{{
|
||||||
{
|
{
|
||||||
double x, y, r, hole;
|
double x, y, r, hole;
|
||||||
int top_layer, bottom_layer;
|
int top_layer, bottom_layer;
|
||||||
|
@ -754,15 +754,15 @@ static void export_vrml_via( BOARD* pcb, SEGVIA* via ) /*{{{*/
|
||||||
y = via->m_Start.y;
|
y = via->m_Start.y;
|
||||||
via->ReturnLayerPair( &top_layer, &bottom_layer );
|
via->ReturnLayerPair( &top_layer, &bottom_layer );
|
||||||
|
|
||||||
/* Export the via padstack */
|
// Export the via padstack
|
||||||
export_round_padstack( pcb, x, y, r, bottom_layer, top_layer, 8 );
|
export_round_padstack( pcb, x, y, r, bottom_layer, top_layer, 8 );
|
||||||
|
|
||||||
/* Drill a rough hole */
|
// Drill a rough hole
|
||||||
export_vrml_hole( via_triangles[via->m_Shape], top_layer, bottom_layer, x, y, hole, 8 );
|
export_vrml_hole( via_triangles[via->m_Shape], top_layer, bottom_layer, x, y, hole, 8 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void export_vrml_tracks( BOARD* pcb ) /*{{{*/
|
static void export_vrml_tracks( BOARD* pcb ) //{{{
|
||||||
{
|
{
|
||||||
for( TRACK* track = pcb->m_Track; track != NULL; track = track->Next() )
|
for( TRACK* track = pcb->m_Track; track != NULL; track = track->Next() )
|
||||||
{
|
{
|
||||||
|
@ -832,7 +832,7 @@ static void export_vrml_zones( BOARD* pcb )
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void export_vrml_text_module( TEXTE_MODULE* module ) /*{{{*/
|
static void export_vrml_text_module( TEXTE_MODULE* module ) //{{{
|
||||||
{
|
{
|
||||||
if( module->IsVisible() )
|
if( module->IsVisible() )
|
||||||
{
|
{
|
||||||
|
@ -853,7 +853,7 @@ static void export_vrml_text_module( TEXTE_MODULE* module ) /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void export_vrml_edge_module( EDGE_MODULE* module ) /*{{{*/
|
static void export_vrml_edge_module( EDGE_MODULE* module ) //{{{
|
||||||
{
|
{
|
||||||
int layer = module->GetLayer();
|
int layer = module->GetLayer();
|
||||||
double x = module->GetStart().x;
|
double x = module->GetStart().x;
|
||||||
|
@ -879,23 +879,23 @@ static void export_vrml_edge_module( EDGE_MODULE* module ) /*{{{*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void export_vrml_pad( BOARD* pcb, D_PAD* pad ) /*{{{*/
|
static void export_vrml_pad( BOARD* pcb, D_PAD* aPad ) //{{{
|
||||||
{
|
{
|
||||||
double hole_drill_w = (double) pad->m_Drill.x / 2;
|
double hole_drill_w = (double) aPad->GetDrillSize().x / 2;
|
||||||
double hole_drill_h = (double) pad->m_Drill.y / 2;
|
double hole_drill_h = (double) aPad->GetDrillSize().y / 2;
|
||||||
double hole_drill = MIN( hole_drill_w, hole_drill_h );
|
double hole_drill = MIN( hole_drill_w, hole_drill_h );
|
||||||
double hole_x = pad->m_Pos.x;
|
double hole_x = aPad->GetPosition().x;
|
||||||
double hole_y = pad->m_Pos.y;
|
double hole_y = aPad->GetPosition().y;
|
||||||
|
|
||||||
/* Export the hole on the edge layer */
|
// Export the hole on the edge layer
|
||||||
if( hole_drill > 0 )
|
if( hole_drill > 0 )
|
||||||
{
|
{
|
||||||
if( pad->m_DrillShape == PAD_OVAL )
|
if( aPad->GetDrillShape() == PAD_OVAL )
|
||||||
{
|
{
|
||||||
/* Oblong hole (slot) */
|
// Oblong hole (slot)
|
||||||
export_vrml_slot( layer_triangles[EDGE_N],
|
export_vrml_slot( layer_triangles[EDGE_N],
|
||||||
FIRST_COPPER_LAYER, LAST_COPPER_LAYER,
|
FIRST_COPPER_LAYER, LAST_COPPER_LAYER,
|
||||||
hole_x, hole_y, hole_drill_w, hole_drill_h, pad->m_Orient, 6 );
|
hole_x, hole_y, hole_drill_w, hole_drill_h, aPad->GetOrientation(), 6 );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -906,29 +906,32 @@ static void export_vrml_pad( BOARD* pcb, D_PAD* pad ) /*{{{*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The pad proper, on the selected layers */
|
// The pad proper, on the selected layers
|
||||||
unsigned long layer_mask = pad->m_layerMask;
|
int layer_mask = aPad->GetLayerMask();
|
||||||
int copper_layers = pcb->GetCopperLayerCount( );
|
int copper_layers = pcb->GetCopperLayerCount( );
|
||||||
/* The (maybe offseted) pad position */
|
|
||||||
wxPoint pad_pos = pad->ReturnShapePos();
|
// The (maybe offseted) pad position
|
||||||
double pad_x = pad_pos.x;
|
wxPoint pad_pos = aPad->ReturnShapePos();
|
||||||
double pad_y = pad_pos.y;
|
double pad_x = pad_pos.x;
|
||||||
wxSize pad_delta = pad->m_DeltaSize;
|
double pad_y = pad_pos.y;
|
||||||
double pad_dx = pad_delta.x / 2;
|
wxSize pad_delta = aPad->GetDelta();
|
||||||
double pad_dy = pad_delta.y / 2;
|
|
||||||
double pad_w = pad->m_Size.x / 2;
|
double pad_dx = pad_delta.x / 2;
|
||||||
double pad_h = pad->m_Size.y / 2;
|
double pad_dy = pad_delta.y / 2;
|
||||||
|
|
||||||
|
double pad_w = aPad->GetSize().x / 2;
|
||||||
|
double pad_h = aPad->GetSize().y / 2;
|
||||||
|
|
||||||
for( int layer = FIRST_COPPER_LAYER; layer < copper_layers; layer++ )
|
for( int layer = FIRST_COPPER_LAYER; layer < copper_layers; layer++ )
|
||||||
{
|
{
|
||||||
/* The last layer is always the component one, unless it's single face */
|
// The last layer is always the component one, unless it's single face
|
||||||
if( (layer > FIRST_COPPER_LAYER) && (layer == copper_layers - 1) )
|
if( (layer > FIRST_COPPER_LAYER) && (layer == copper_layers - 1) )
|
||||||
layer = LAST_COPPER_LAYER;
|
layer = LAST_COPPER_LAYER;
|
||||||
|
|
||||||
if( layer_mask & (1 << layer) )
|
if( layer_mask & (1 << layer) )
|
||||||
{
|
{
|
||||||
/* OK, the pad is on this layer, export it */
|
// OK, the pad is on this layer, export it
|
||||||
switch( pad->m_PadShape & 0x7F ) /* What is the masking for? */
|
switch( aPad->GetShape() )
|
||||||
{
|
{
|
||||||
case PAD_CIRCLE:
|
case PAD_CIRCLE:
|
||||||
export_vrml_circle( layer, pad_x, pad_y,
|
export_vrml_circle( layer, pad_x, pad_y,
|
||||||
|
@ -938,44 +941,47 @@ static void export_vrml_pad( BOARD* pcb, D_PAD* pad ) /*{{{*/
|
||||||
case PAD_OVAL:
|
case PAD_OVAL:
|
||||||
export_vrml_oval_pad( layer,
|
export_vrml_oval_pad( layer,
|
||||||
pad_x, pad_y,
|
pad_x, pad_y,
|
||||||
pad_w * 2, pad_h * 2, pad->m_Orient, 4 );
|
pad_w * 2, pad_h * 2, aPad->GetOrientation(), 4 );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAD_RECT:
|
case PAD_RECT:
|
||||||
/* Just to be sure :D */
|
// Just to be sure :D
|
||||||
pad_dx = 0;
|
pad_dx = 0;
|
||||||
pad_dy = 0;
|
pad_dy = 0;
|
||||||
|
|
||||||
case PAD_TRAPEZOID:
|
case PAD_TRAPEZOID:
|
||||||
{
|
|
||||||
int coord[8] =
|
|
||||||
{
|
{
|
||||||
wxRound(-pad_w - pad_dy), wxRound(+pad_h + pad_dx),
|
int coord[8] =
|
||||||
wxRound(-pad_w + pad_dy), wxRound(-pad_h - pad_dx),
|
{
|
||||||
wxRound(+pad_w - pad_dy), wxRound(+pad_h - pad_dx),
|
wxRound(-pad_w - pad_dy), wxRound(+pad_h + pad_dx),
|
||||||
wxRound(+pad_w + pad_dy), wxRound(-pad_h + pad_dx),
|
wxRound(-pad_w + pad_dy), wxRound(-pad_h - pad_dx),
|
||||||
};
|
wxRound(+pad_w - pad_dy), wxRound(+pad_h - pad_dx),
|
||||||
|
wxRound(+pad_w + pad_dy), wxRound(-pad_h + pad_dx),
|
||||||
|
};
|
||||||
|
|
||||||
for( int i = 0; i < 4; i++ )
|
for( int i = 0; i < 4; i++ )
|
||||||
{
|
{
|
||||||
RotatePoint( &coord[i * 2], &coord[i * 2 + 1], pad->m_Orient );
|
RotatePoint( &coord[i * 2], &coord[i * 2 + 1], aPad->GetOrientation() );
|
||||||
coord[i * 2] += wxRound( pad_x );
|
coord[i * 2] += wxRound( pad_x );
|
||||||
coord[i * 2 + 1] += wxRound( pad_y );
|
coord[i * 2 + 1] += wxRound( pad_y );
|
||||||
|
}
|
||||||
|
|
||||||
|
bag_flat_quad( layer, coord[0], coord[1],
|
||||||
|
coord[2], coord[3],
|
||||||
|
coord[4], coord[5],
|
||||||
|
coord[6], coord[7] );
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
bag_flat_quad( layer, coord[0], coord[1],
|
default:
|
||||||
coord[2], coord[3],
|
;
|
||||||
coord[4], coord[5],
|
|
||||||
coord[6], coord[7] );
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* From axis/rot to quaternion */
|
// From axis/rot to quaternion
|
||||||
static void build_quat( double x, double y, double z, double a, double q[4] )
|
static void build_quat( double x, double y, double z, double a, double q[4] )
|
||||||
{
|
{
|
||||||
double sina = sin( a / 2 );
|
double sina = sin( a / 2 );
|
||||||
|
@ -987,7 +993,7 @@ static void build_quat( double x, double y, double z, double a, double q[4] )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* From quaternion to axis/rot */
|
// From quaternion to axis/rot
|
||||||
static void from_quat( double q[4], double rot[4] )
|
static void from_quat( double q[4], double rot[4] )
|
||||||
{
|
{
|
||||||
rot[3] = acos( q[3] ) * 2;
|
rot[3] = acos( q[3] ) * 2;
|
||||||
|
@ -999,7 +1005,7 @@ static void from_quat( double q[4], double rot[4] )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Quaternion composition */
|
// Quaternion composition
|
||||||
static void compose_quat( double q1[4], double q2[4], double qr[4] )
|
static void compose_quat( double q1[4], double q2[4], double qr[4] )
|
||||||
{
|
{
|
||||||
double tmp[4];
|
double tmp[4];
|
||||||
|
@ -1017,11 +1023,11 @@ static void export_vrml_module( BOARD* aPcb, MODULE* aModule,
|
||||||
FILE* aOutputFile, double aScalingFactor,
|
FILE* aOutputFile, double aScalingFactor,
|
||||||
bool aExport3DFiles, const wxString & a3D_Subdir )
|
bool aExport3DFiles, const wxString & a3D_Subdir )
|
||||||
{
|
{
|
||||||
/* Reference and value */
|
// Reference and value
|
||||||
export_vrml_text_module( aModule->m_Reference );
|
export_vrml_text_module( aModule->m_Reference );
|
||||||
export_vrml_text_module( aModule->m_Value );
|
export_vrml_text_module( aModule->m_Value );
|
||||||
|
|
||||||
/* Export module edges */
|
// Export module edges
|
||||||
for( EDA_ITEM* item = aModule->m_Drawings; item != NULL; item = item->Next() )
|
for( EDA_ITEM* item = aModule->m_Drawings; item != NULL; item = item->Next() )
|
||||||
{
|
{
|
||||||
switch( item->Type() )
|
switch( item->Type() )
|
||||||
|
@ -1039,13 +1045,13 @@ static void export_vrml_module( BOARD* aPcb, MODULE* aModule,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Export pads */
|
// Export pads
|
||||||
for( D_PAD* pad = aModule->m_Pads; pad != 0; pad = pad->Next() )
|
for( D_PAD* pad = aModule->m_Pads; pad; pad = pad->Next() )
|
||||||
export_vrml_pad( aPcb, pad );
|
export_vrml_pad( aPcb, pad );
|
||||||
|
|
||||||
bool isFlipped = aModule->GetLayer() == LAYER_N_BACK;
|
bool isFlipped = aModule->GetLayer() == LAYER_N_BACK;
|
||||||
|
|
||||||
/* Export the object VRML model(s) */
|
// Export the object VRML model(s)
|
||||||
for( S3D_MASTER* vrmlm = aModule->m_3D_Drawings; vrmlm != 0; vrmlm = vrmlm->Next() )
|
for( S3D_MASTER* vrmlm = aModule->m_3D_Drawings; vrmlm != 0; vrmlm = vrmlm->Next() )
|
||||||
{
|
{
|
||||||
wxString fname = vrmlm->m_Shape3DName;
|
wxString fname = vrmlm->m_Shape3DName;
|
||||||
|
@ -1090,21 +1096,21 @@ static void export_vrml_module( BOARD* aPcb, MODULE* aModule,
|
||||||
NEGATE(rotz);
|
NEGATE(rotz);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do some quaternion munching */
|
// Do some quaternion munching
|
||||||
double q1[4], q2[4], rot[4];
|
double q1[4], q2[4], rot[4];
|
||||||
build_quat( 1, 0, 0, rotx / 180.0 * M_PI, q1 );
|
build_quat( 1, 0, 0, rotx / 180.0 * M_PI, q1 );
|
||||||
build_quat( 0, 1, 0, roty / 180.0 * M_PI, q2 );
|
build_quat( 0, 1, 0, roty / 180.0 * M_PI, q2 );
|
||||||
compose_quat( q1, q2, q1 );
|
compose_quat( q1, q2, q1 );
|
||||||
build_quat( 0, 0, 1, rotz / 180.0 * M_PI, q2 );
|
build_quat( 0, 0, 1, rotz / 180.0 * M_PI, q2 );
|
||||||
compose_quat( q1, q2, q1 );
|
compose_quat( q1, q2, q1 );
|
||||||
// Note here aModule->m_Orient is in 0.1 degrees,
|
// Note here aModule->GetOrientation() is in 0.1 degrees,
|
||||||
// so module rotation is aModule->m_Orient / 1800.0
|
// so module rotation is aModule->GetOrientation() / 1800.0
|
||||||
build_quat( 0, 0, 1, aModule->m_Orient / 1800.0 * M_PI, q2 );
|
build_quat( 0, 0, 1, aModule->GetOrientation() / 1800.0 * M_PI, q2 );
|
||||||
compose_quat( q1, q2, q1 );
|
compose_quat( q1, q2, q1 );
|
||||||
from_quat( q1, rot );
|
from_quat( q1, rot );
|
||||||
|
|
||||||
fprintf( aOutputFile, "Transform {\n" );
|
fprintf( aOutputFile, "Transform {\n" );
|
||||||
/* A null rotation would fail the acos! */
|
// A null rotation would fail the acos!
|
||||||
if( rot[3] != 0.0 )
|
if( rot[3] != 0.0 )
|
||||||
{
|
{
|
||||||
fprintf( aOutputFile, " rotation %g %g %g %g\n", rot[0], rot[1], rot[2], rot[3] );
|
fprintf( aOutputFile, " rotation %g %g %g %g\n", rot[0], rot[1], rot[2], rot[3] );
|
||||||
|
@ -1115,7 +1121,7 @@ static void export_vrml_module( BOARD* aPcb, MODULE* aModule,
|
||||||
vrmlm->m_MatScale.y * aScalingFactor,
|
vrmlm->m_MatScale.y * aScalingFactor,
|
||||||
vrmlm->m_MatScale.z * aScalingFactor );
|
vrmlm->m_MatScale.z * aScalingFactor );
|
||||||
|
|
||||||
/* adjust 3D shape offset position (offset is given inch) */
|
// adjust 3D shape offset position (offset is given inch)
|
||||||
#define UNITS_3D_TO_PCB_UNITS PCB_INTERNAL_UNIT
|
#define UNITS_3D_TO_PCB_UNITS PCB_INTERNAL_UNIT
|
||||||
int offsetx = wxRound( vrmlm->m_MatPosition.x * UNITS_3D_TO_PCB_UNITS );
|
int offsetx = wxRound( vrmlm->m_MatPosition.x * UNITS_3D_TO_PCB_UNITS );
|
||||||
int offsety = wxRound( vrmlm->m_MatPosition.y * UNITS_3D_TO_PCB_UNITS );
|
int offsety = wxRound( vrmlm->m_MatPosition.y * UNITS_3D_TO_PCB_UNITS );
|
||||||
|
@ -1126,7 +1132,7 @@ static void export_vrml_module( BOARD* aPcb, MODULE* aModule,
|
||||||
else // In normal mode, Y axis is reversed in Pcbnew.
|
else // In normal mode, Y axis is reversed in Pcbnew.
|
||||||
NEGATE(offsety);
|
NEGATE(offsety);
|
||||||
|
|
||||||
RotatePoint(&offsetx, &offsety, aModule->m_Orient);
|
RotatePoint(&offsetx, &offsety, aModule->GetOrientation());
|
||||||
|
|
||||||
fprintf( aOutputFile, " translation %g %g %g\n",
|
fprintf( aOutputFile, " translation %g %g %g\n",
|
||||||
(double) (offsetx + aModule->m_Pos.x),
|
(double) (offsetx + aModule->m_Pos.x),
|
||||||
|
@ -1220,7 +1226,7 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName,
|
||||||
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
|
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
|
||||||
SetLocaleTo_C_standard();
|
SetLocaleTo_C_standard();
|
||||||
|
|
||||||
/* Begin with the usual VRML boilerplate */
|
// Begin with the usual VRML boilerplate
|
||||||
wxString name = aFullFileName;
|
wxString name = aFullFileName;
|
||||||
|
|
||||||
name.Replace(wxT("\\"), wxT("/" ) );
|
name.Replace(wxT("\\"), wxT("/" ) );
|
||||||
|
@ -1266,20 +1272,20 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
double wrml_3D_models_scaling_factor = 0.1 / board_scaling_factor;
|
double wrml_3D_models_scaling_factor = 0.1 / board_scaling_factor;
|
||||||
/* Preliminary computation: the z value for each layer */
|
// Preliminary computation: the z value for each layer
|
||||||
compute_layer_Zs( pcb );
|
compute_layer_Zs( pcb );
|
||||||
|
|
||||||
/* Drawing and text on the board, and edges which are special */
|
// Drawing and text on the board, and edges which are special
|
||||||
export_vrml_drawings( pcb );
|
export_vrml_drawings( pcb );
|
||||||
|
|
||||||
/* Export vias and trackage */
|
// Export vias and trackage
|
||||||
export_vrml_tracks( pcb );
|
export_vrml_tracks( pcb );
|
||||||
|
|
||||||
/* Export zone fills */
|
// Export zone fills
|
||||||
/* TODO export_vrml_zones(pcb);
|
/* TODO export_vrml_zones(pcb);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Export footprints */
|
// Export footprints
|
||||||
for( MODULE* module = pcb->m_Modules; module != 0; module = module->Next() )
|
for( MODULE* module = pcb->m_Modules; module != 0; module = module->Next() )
|
||||||
export_vrml_module( pcb, module, output_file,
|
export_vrml_module( pcb, module, output_file,
|
||||||
wrml_3D_models_scaling_factor,
|
wrml_3D_models_scaling_factor,
|
||||||
|
@ -1292,13 +1298,13 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName,
|
||||||
layer_triangles[layer],
|
layer_triangles[layer],
|
||||||
pcb->GetLayerColor(layer) );
|
pcb->GetLayerColor(layer) );
|
||||||
|
|
||||||
/* Same thing for the via layers */
|
// Same thing for the via layers
|
||||||
for( int i = 0; i < 4; i++ )
|
for( int i = 0; i < 4; i++ )
|
||||||
write_and_empty_triangle_bag( output_file,
|
write_and_empty_triangle_bag( output_file,
|
||||||
via_triangles[i],
|
via_triangles[i],
|
||||||
pcb->GetVisibleElementColor( VIAS_VISIBLE + i ) );
|
pcb->GetVisibleElementColor( VIAS_VISIBLE + i ) );
|
||||||
|
|
||||||
/* Close the outer 'transform' node */
|
// Close the outer 'transform' node
|
||||||
fputs( "]\n}\n", output_file );
|
fputs( "]\n}\n", output_file );
|
||||||
|
|
||||||
// End of work
|
// End of work
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
#include <gendrill.h>
|
#include <gendrill.h>
|
||||||
|
|
||||||
|
|
||||||
/* Local Functions */
|
// Local Functions
|
||||||
|
|
||||||
/* Compare function used for sorting holes by increasing diameter value
|
/* Compare function used for sorting holes by increasing diameter value
|
||||||
* and X value
|
* and X value
|
||||||
|
@ -109,39 +109,35 @@ void Build_Holes_List( BOARD* aPcb,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* build hole list for pads (assumed always through holes) */
|
// build hole list for pads (assumed always through holes)
|
||||||
if( !aExcludeThroughHoles || aGenerateNPTH_list )
|
if( !aExcludeThroughHoles || aGenerateNPTH_list )
|
||||||
{
|
{
|
||||||
MODULE* Module = aPcb->m_Modules;
|
for( MODULE* module = aPcb->m_Modules; module; module->Next() )
|
||||||
|
|
||||||
for( ; Module != NULL; Module = Module->Next() )
|
|
||||||
{
|
{
|
||||||
/* Read and analyse pads */
|
// Read and analyse pads
|
||||||
D_PAD* pad = Module->m_Pads;
|
for( D_PAD* pad = module->m_Pads; pad; pad = pad->Next() )
|
||||||
|
|
||||||
for( ; pad != NULL; pad = pad->Next() )
|
|
||||||
{
|
{
|
||||||
if( ! aGenerateNPTH_list && pad->m_Attribut == PAD_HOLE_NOT_PLATED )
|
if( ! aGenerateNPTH_list && pad->GetAttribute() == PAD_HOLE_NOT_PLATED )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( aGenerateNPTH_list && pad->m_Attribut != PAD_HOLE_NOT_PLATED )
|
if( aGenerateNPTH_list && pad->GetAttribute() != PAD_HOLE_NOT_PLATED )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( pad->m_Drill.x == 0 )
|
if( pad->GetDrillSize().x == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
new_hole.m_Hole_NotPlated = (pad->m_Attribut == PAD_HOLE_NOT_PLATED);
|
new_hole.m_Hole_NotPlated = (pad->GetAttribute() == PAD_HOLE_NOT_PLATED);
|
||||||
new_hole.m_Tool_Reference = -1; // Flag is: Not initialized
|
new_hole.m_Tool_Reference = -1; // Flag is: Not initialized
|
||||||
new_hole.m_Hole_Orient = pad->m_Orient;
|
new_hole.m_Hole_Orient = pad->GetOrientation();
|
||||||
new_hole.m_Hole_Shape = 0; // hole shape: round
|
new_hole.m_Hole_Shape = 0; // hole shape: round
|
||||||
new_hole.m_Hole_Diameter = min( pad->m_Drill.x, pad->m_Drill.y );
|
new_hole.m_Hole_Diameter = min( pad->GetDrillSize().x, pad->GetDrillSize().y );
|
||||||
new_hole.m_Hole_Size.x = new_hole.m_Hole_Size.y = new_hole.m_Hole_Diameter;
|
new_hole.m_Hole_Size.x = new_hole.m_Hole_Size.y = new_hole.m_Hole_Diameter;
|
||||||
|
|
||||||
if( pad->m_DrillShape != PAD_CIRCLE )
|
if( pad->GetDrillShape() != PAD_CIRCLE )
|
||||||
new_hole.m_Hole_Shape = 1; // oval flag set
|
new_hole.m_Hole_Shape = 1; // oval flag set
|
||||||
|
|
||||||
new_hole.m_Hole_Size = pad->m_Drill;
|
new_hole.m_Hole_Size = pad->GetDrillSize();
|
||||||
new_hole.m_Hole_Pos = pad->m_Pos; // hole position
|
new_hole.m_Hole_Pos = pad->GetPosition(); // hole position
|
||||||
new_hole.m_Hole_Bottom_Layer = LAYER_N_BACK;
|
new_hole.m_Hole_Bottom_Layer = LAYER_N_BACK;
|
||||||
new_hole.m_Hole_Top_Layer = LAYER_N_FRONT;// pad holes are through holes
|
new_hole.m_Hole_Top_Layer = LAYER_N_FRONT;// pad holes are through holes
|
||||||
aHoleListBuffer.push_back( new_hole );
|
aHoleListBuffer.push_back( new_hole );
|
||||||
|
|
|
@ -69,7 +69,7 @@ static bool HasNonSMDPins( MODULE* aModule )
|
||||||
|
|
||||||
for( pad = aModule->m_Pads; pad; pad = pad->Next() )
|
for( pad = aModule->m_Pads; pad; pad = pad->Next() )
|
||||||
{
|
{
|
||||||
if( pad->m_Attribut != PAD_SMD )
|
if( pad->GetAttribute() != PAD_SMD )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,37 +438,42 @@ void PCB_EDIT_FRAME::GenModuleReport( wxCommandEvent& event )
|
||||||
{
|
{
|
||||||
fprintf( rptfile, "$PAD \"%s\"\n", TO_UTF8( pad->GetPadName() ) );
|
fprintf( rptfile, "$PAD \"%s\"\n", TO_UTF8( pad->GetPadName() ) );
|
||||||
sprintf( line, "position %9.6f %9.6f\n",
|
sprintf( line, "position %9.6f %9.6f\n",
|
||||||
pad->m_Pos0.x * conv_unit,
|
pad->GetPos0().x * conv_unit,
|
||||||
pad->m_Pos0.y * conv_unit );
|
pad->GetPos0().y * conv_unit );
|
||||||
fputs( line, rptfile );
|
fputs( line, rptfile );
|
||||||
|
|
||||||
sprintf( line, "size %9.6f %9.6f\n",
|
sprintf( line, "size %9.6f %9.6f\n",
|
||||||
pad->m_Size.x * conv_unit,
|
pad->GetSize().x * conv_unit,
|
||||||
pad->m_Size.y * conv_unit );
|
pad->GetSize().y * conv_unit );
|
||||||
fputs( line, rptfile );
|
fputs( line, rptfile );
|
||||||
sprintf( line, "drill %9.6f\n", pad->m_Drill.x * conv_unit );
|
|
||||||
|
sprintf( line, "drill %9.6f\n", pad->GetDrillSize().x * conv_unit );
|
||||||
fputs( line, rptfile );
|
fputs( line, rptfile );
|
||||||
|
|
||||||
sprintf( line, "shape_offset %9.6f %9.6f\n",
|
sprintf( line, "shape_offset %9.6f %9.6f\n",
|
||||||
pad->m_Offset.x * conv_unit,
|
pad->GetOffset().x * conv_unit,
|
||||||
pad->m_Offset.y * conv_unit );
|
pad->GetOffset().y * conv_unit );
|
||||||
fputs( line, rptfile );
|
fputs( line, rptfile );
|
||||||
|
|
||||||
sprintf( line, "orientation %.2f\n",
|
sprintf( line, "orientation %.2f\n",
|
||||||
double(pad->m_Orient - Module->m_Orient) / 10 );
|
double(pad->GetOrientation() - Module->GetOrientation()) / 10 );
|
||||||
fputs( line, rptfile );
|
fputs( line, rptfile );
|
||||||
const char* shape_name[6] = { "??? ", "Circ", "Rect", "Oval", "trap", "spec" };
|
|
||||||
sprintf( line, "Shape %s\n", shape_name[pad->m_PadShape] );
|
static const char* shape_name[6] = { "??? ", "Circ", "Rect", "Oval", "trap", "spec" };
|
||||||
|
|
||||||
|
sprintf( line, "Shape %s\n", shape_name[pad->GetShape()] );
|
||||||
fputs( line, rptfile );
|
fputs( line, rptfile );
|
||||||
|
|
||||||
int layer = 0;
|
int layer = 0;
|
||||||
|
|
||||||
if( pad->m_layerMask & LAYER_BACK )
|
if( pad->GetLayerMask() & LAYER_BACK )
|
||||||
layer = 1;
|
layer = 1;
|
||||||
|
|
||||||
if( pad->m_layerMask & LAYER_FRONT )
|
if( pad->GetLayerMask() & LAYER_FRONT )
|
||||||
layer |= 2;
|
layer |= 2;
|
||||||
|
|
||||||
const char* layer_name[4] = { "??? ", "copper", "component", "all" };
|
static const char* layer_name[4] = { "??? ", "copper", "component", "all" };
|
||||||
|
|
||||||
sprintf( line, "Layer %s\n", layer_name[layer] );
|
sprintf( line, "Layer %s\n", layer_name[layer] );
|
||||||
fputs( line, rptfile );
|
fputs( line, rptfile );
|
||||||
fprintf( rptfile, "$EndPAD\n" );
|
fprintf( rptfile, "$EndPAD\n" );
|
||||||
|
|
|
@ -33,8 +33,7 @@ public:
|
||||||
static bool m_Pad_Orient_Filter;
|
static bool m_Pad_Orient_Filter;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DIALOG_GLOBAL_PADS_EDITION( PCB_BASE_FRAME* parent, D_PAD* Pad );
|
DIALOG_GLOBAL_PADS_EDITION( PCB_BASE_FRAME* aParent, D_PAD* aPad );
|
||||||
~DIALOG_GLOBAL_PADS_EDITION() { }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void InstallPadEditor( wxCommandEvent& event );
|
void InstallPadEditor( wxCommandEvent& event );
|
||||||
|
@ -43,11 +42,11 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
DIALOG_GLOBAL_PADS_EDITION::DIALOG_GLOBAL_PADS_EDITION( PCB_BASE_FRAME* parent, D_PAD* Pad ) :
|
DIALOG_GLOBAL_PADS_EDITION::DIALOG_GLOBAL_PADS_EDITION( PCB_BASE_FRAME* aParent, D_PAD* aPad ) :
|
||||||
DIALOG_GLOBAL_PADS_EDITION_BASE( parent )
|
DIALOG_GLOBAL_PADS_EDITION_BASE( aParent )
|
||||||
{
|
{
|
||||||
m_Parent = parent;
|
m_Parent = aParent;
|
||||||
m_CurrentPad = Pad;
|
m_CurrentPad = aPad;
|
||||||
|
|
||||||
// Pad filter selection.
|
// Pad filter selection.
|
||||||
m_Pad_Shape_Filter_CB->SetValue( m_Pad_Shape_Filter );
|
m_Pad_Shape_Filter_CB->SetValue( m_Pad_Shape_Filter );
|
||||||
|
@ -61,7 +60,7 @@ DIALOG_GLOBAL_PADS_EDITION::DIALOG_GLOBAL_PADS_EDITION( PCB_BASE_FRAME* parent,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Class DIALOG_GLOBAL_PADS_EDITION static variables */
|
// Class DIALOG_GLOBAL_PADS_EDITION static variables
|
||||||
bool DIALOG_GLOBAL_PADS_EDITION::m_Pad_Shape_Filter = true;
|
bool DIALOG_GLOBAL_PADS_EDITION::m_Pad_Shape_Filter = true;
|
||||||
bool DIALOG_GLOBAL_PADS_EDITION::m_Pad_Layer_Filter = true;
|
bool DIALOG_GLOBAL_PADS_EDITION::m_Pad_Layer_Filter = true;
|
||||||
bool DIALOG_GLOBAL_PADS_EDITION::m_Pad_Orient_Filter = true;
|
bool DIALOG_GLOBAL_PADS_EDITION::m_Pad_Orient_Filter = true;
|
||||||
|
@ -119,22 +118,23 @@ void PCB_EDIT_FRAME::DlgGlobalChange_PadSettings( D_PAD* aPad, bool aRedraw )
|
||||||
int diag;
|
int diag;
|
||||||
|
|
||||||
if( aPad == NULL )
|
if( aPad == NULL )
|
||||||
aPad = &g_Pad_Master;
|
aPad = &GetDesignSettings().m_Pad_Master;
|
||||||
|
|
||||||
MODULE* Module = (MODULE*) aPad->GetParent();
|
MODULE* module = aPad->GetParent();
|
||||||
|
|
||||||
if( Module == NULL )
|
if( module == NULL )
|
||||||
{
|
{
|
||||||
DisplayError( this, wxT( "Global_Import_Pad_Settings() Error: NULL module" ) );
|
DisplayError( this, wxT( "Global_Import_Pad_Settings() Error: NULL module" ) );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Module->DisplayInfo( this );
|
module->DisplayInfo( this );
|
||||||
|
|
||||||
DIALOG_GLOBAL_PADS_EDITION* dlg = new DIALOG_GLOBAL_PADS_EDITION( this, aPad );
|
{
|
||||||
|
DIALOG_GLOBAL_PADS_EDITION dlg( this, aPad );
|
||||||
|
|
||||||
diag = dlg->ShowModal();
|
diag = dlg.ShowModal();
|
||||||
dlg->Destroy();
|
}
|
||||||
|
|
||||||
if( diag == -1 )
|
if( diag == -1 )
|
||||||
return;
|
return;
|
||||||
|
@ -162,23 +162,25 @@ void FOOTPRINT_EDIT_FRAME::DlgGlobalChange_PadSettings( D_PAD* aPad )
|
||||||
int diag;
|
int diag;
|
||||||
|
|
||||||
if( aPad == NULL )
|
if( aPad == NULL )
|
||||||
aPad = &g_Pad_Master;
|
aPad = &GetDesignSettings().m_Pad_Master;
|
||||||
|
|
||||||
MODULE* Module = (MODULE*) aPad->GetParent();
|
MODULE* module = aPad->GetParent();
|
||||||
|
|
||||||
if( Module == NULL )
|
if( module == NULL )
|
||||||
{
|
{
|
||||||
DisplayError( this, wxT( "Global_Import_Pad_Settings() Error: NULL module" ) );
|
DisplayError( this, wxT( "Global_Import_Pad_Settings() Error: NULL module" ) );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Module->DisplayInfo( this );
|
module->DisplayInfo( this );
|
||||||
|
|
||||||
DIALOG_GLOBAL_PADS_EDITION* dlg = new DIALOG_GLOBAL_PADS_EDITION( this, aPad );
|
{
|
||||||
dlg->m_buttonIdModules->Enable( false );
|
DIALOG_GLOBAL_PADS_EDITION dlg( this, aPad );
|
||||||
|
|
||||||
diag = dlg->ShowModal();
|
dlg.m_buttonIdModules->Enable( false );
|
||||||
dlg->Destroy();
|
|
||||||
|
diag = dlg.ShowModal();
|
||||||
|
}
|
||||||
|
|
||||||
if( diag == -1 )
|
if( diag == -1 )
|
||||||
return;
|
return;
|
||||||
|
@ -187,7 +189,7 @@ void FOOTPRINT_EDIT_FRAME::DlgGlobalChange_PadSettings( D_PAD* aPad )
|
||||||
if( diag == 1 )
|
if( diag == 1 )
|
||||||
edit_Same_Modules = true;
|
edit_Same_Modules = true;
|
||||||
|
|
||||||
GlobalChange_PadSettings( aPad,edit_Same_Modules,
|
GlobalChange_PadSettings( aPad, edit_Same_Modules,
|
||||||
DIALOG_GLOBAL_PADS_EDITION::m_Pad_Shape_Filter,
|
DIALOG_GLOBAL_PADS_EDITION::m_Pad_Shape_Filter,
|
||||||
DIALOG_GLOBAL_PADS_EDITION::m_Pad_Orient_Filter,
|
DIALOG_GLOBAL_PADS_EDITION::m_Pad_Orient_Filter,
|
||||||
DIALOG_GLOBAL_PADS_EDITION::m_Pad_Layer_Filter,
|
DIALOG_GLOBAL_PADS_EDITION::m_Pad_Layer_Filter,
|
||||||
|
@ -215,48 +217,47 @@ void PCB_BASE_FRAME::GlobalChange_PadSettings( D_PAD* aPad,
|
||||||
bool aRedraw, bool aSaveForUndo )
|
bool aRedraw, bool aSaveForUndo )
|
||||||
{
|
{
|
||||||
if( aPad == NULL )
|
if( aPad == NULL )
|
||||||
aPad = &g_Pad_Master;
|
aPad = &GetDesignSettings().m_Pad_Master;
|
||||||
|
|
||||||
MODULE* Module = (MODULE*) aPad->GetParent();
|
MODULE* module = aPad->GetParent();
|
||||||
|
|
||||||
if( Module == NULL )
|
if( module == NULL )
|
||||||
{
|
{
|
||||||
DisplayError( this, wxT( "Global_Import_Pad_Settings() Error: NULL module" ) );
|
DisplayError( this, wxT( "Global_Import_Pad_Settings() Error: NULL module" ) );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Search and copy the name of library reference. */
|
// Search and copy the name of library reference.
|
||||||
MODULE* Module_Ref = Module;
|
MODULE* Module_Ref = module;
|
||||||
int pad_orient = aPad->m_Orient - Module_Ref->m_Orient;
|
int pad_orient = aPad->GetOrientation() - Module_Ref->GetOrientation();
|
||||||
|
|
||||||
// Prepare an undo list:
|
// Prepare an undo list:
|
||||||
if( aSaveForUndo )
|
if( aSaveForUndo )
|
||||||
{
|
{
|
||||||
PICKED_ITEMS_LIST itemsList;
|
PICKED_ITEMS_LIST itemsList;
|
||||||
Module = (MODULE*) m_Pcb->m_Modules;
|
|
||||||
for( ; Module != NULL; Module = Module->Next() )
|
for( module = m_Pcb->m_Modules; module; module = module->Next() )
|
||||||
{
|
{
|
||||||
if( !aSameFootprints && (Module != Module_Ref) )
|
if( !aSameFootprints && (module != Module_Ref) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( Module->m_LibRef != Module_Ref->m_LibRef )
|
if( module->m_LibRef != Module_Ref->m_LibRef )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
bool saveMe = false;
|
bool saveMe = false;
|
||||||
D_PAD* pt_pad = (D_PAD*) Module->m_Pads;
|
|
||||||
|
|
||||||
for( ; pt_pad != NULL; pt_pad = pt_pad->Next() )
|
for( D_PAD* pad = module->m_Pads; pad; pad = pad->Next() )
|
||||||
{
|
{
|
||||||
/* Filters changes prohibited. */
|
// Filters changes prohibited.
|
||||||
if( aPadShapeFilter && ( pt_pad->m_PadShape != aPad->m_PadShape ) )
|
if( aPadShapeFilter && ( pad->GetShape() != aPad->GetShape() ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int currpad_orient = pt_pad->m_Orient - Module->m_Orient;
|
int currpad_orient = pad->GetOrientation() - module->GetOrientation();
|
||||||
|
|
||||||
if( aPadOrientFilter && ( currpad_orient != pad_orient ) )
|
if( aPadOrientFilter && ( currpad_orient != pad_orient ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( aPadLayerFilter
|
if( aPadLayerFilter && pad->GetLayerMask() != aPad->GetLayerMask() )
|
||||||
&& ( pt_pad->m_layerMask != aPad->m_layerMask ) )
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
saveMe = true;
|
saveMe = true;
|
||||||
|
@ -264,7 +265,8 @@ void PCB_BASE_FRAME::GlobalChange_PadSettings( D_PAD* aPad,
|
||||||
|
|
||||||
if( saveMe )
|
if( saveMe )
|
||||||
{
|
{
|
||||||
ITEM_PICKER itemWrapper( Module, UR_CHANGED );
|
ITEM_PICKER itemWrapper( module, UR_CHANGED );
|
||||||
|
|
||||||
itemsList.PushItem( itemWrapper );
|
itemsList.PushItem( itemWrapper );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -272,96 +274,86 @@ void PCB_BASE_FRAME::GlobalChange_PadSettings( D_PAD* aPad,
|
||||||
SaveCopyInUndoList( itemsList, UR_CHANGED );
|
SaveCopyInUndoList( itemsList, UR_CHANGED );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the current module and same others modules if requested. */
|
// Update the current module and same others modules if requested.
|
||||||
Module = m_Pcb->m_Modules;
|
for( module = m_Pcb->m_Modules; module; module = module->Next() )
|
||||||
|
|
||||||
for( ; Module != NULL; Module = Module->Next() )
|
|
||||||
{
|
{
|
||||||
if( !aSameFootprints && (Module != Module_Ref) )
|
if( !aSameFootprints && (module != Module_Ref) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( Module->m_LibRef != Module_Ref->m_LibRef )
|
if( module->m_LibRef != Module_Ref->m_LibRef )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Erase module on screen */
|
// Erase module on screen
|
||||||
if( aRedraw )
|
if( aRedraw )
|
||||||
{
|
{
|
||||||
Module->SetFlags( DO_NOT_DRAW );
|
module->SetFlags( DO_NOT_DRAW );
|
||||||
m_canvas->RefreshDrawingRect( Module->GetBoundingBox() );
|
m_canvas->RefreshDrawingRect( module->GetBoundingBox() );
|
||||||
Module->ClearFlags( DO_NOT_DRAW );
|
module->ClearFlags( DO_NOT_DRAW );
|
||||||
}
|
}
|
||||||
|
|
||||||
D_PAD* pt_pad = Module->m_Pads;
|
for( D_PAD* pad = module->m_Pads; pad; pad = pad->Next() )
|
||||||
|
|
||||||
for( ; pt_pad != NULL; pt_pad = pt_pad->Next() )
|
|
||||||
{
|
{
|
||||||
// Filters changes prohibited.
|
// Filters changes prohibited.
|
||||||
if( aPadShapeFilter && ( pt_pad->m_PadShape != aPad->m_PadShape ) )
|
if( aPadShapeFilter && ( pad->GetShape() != aPad->GetShape() ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( aPadOrientFilter
|
if( aPadOrientFilter && (pad->GetOrientation() - module->GetOrientation()) != pad_orient )
|
||||||
&& ( (pt_pad->m_Orient - Module->m_Orient) != pad_orient ) )
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( aPadLayerFilter )
|
if( aPadLayerFilter )
|
||||||
{
|
{
|
||||||
if( pt_pad->m_layerMask != aPad->m_layerMask )
|
if( pad->GetLayerMask() != aPad->GetLayerMask() )
|
||||||
continue;
|
continue;
|
||||||
else
|
else
|
||||||
m_Pcb->m_Status_Pcb &= ~( LISTE_RATSNEST_ITEM_OK | CONNEXION_OK);
|
m_Pcb->m_Status_Pcb &= ~( LISTE_RATSNEST_ITEM_OK | CONNEXION_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Change characteristics:
|
// Change characteristics:
|
||||||
pt_pad->m_Attribut = aPad->m_Attribut;
|
pad->SetAttribute( aPad->GetAttribute() );
|
||||||
pt_pad->m_PadShape = aPad->m_PadShape;
|
pad->SetShape( aPad->GetShape() );
|
||||||
|
|
||||||
pt_pad->m_layerMask = aPad->m_layerMask;
|
pad->SetLayerMask( aPad->GetLayerMask() );
|
||||||
|
|
||||||
pt_pad->m_Size = aPad->m_Size;
|
pad->SetSize( aPad->GetSize() );
|
||||||
pt_pad->m_DeltaSize = aPad->m_DeltaSize;
|
pad->SetDelta( aPad->GetDelta() );
|
||||||
pt_pad->m_Offset = aPad->m_Offset;
|
pad->SetOffset( aPad->GetOffset() );
|
||||||
|
|
||||||
pt_pad->m_Drill = aPad->m_Drill;
|
pad->SetDrillSize( aPad->GetDrillSize() );
|
||||||
pt_pad->m_DrillShape = aPad->m_DrillShape;
|
pad->SetDrillShape( aPad->GetDrillShape() );
|
||||||
|
|
||||||
pt_pad->m_Orient = pad_orient + Module->m_Orient;
|
pad->SetOrientation( pad_orient + module->GetOrientation() );
|
||||||
|
|
||||||
// copy also local mask margins,
|
// copy also local mask margins, because these parameters usually depend on
|
||||||
// because these parameters usually depend on
|
// pad sizes and layers
|
||||||
// pads sizes and layers
|
pad->SetLocalSolderMaskMargin( aPad->GetLocalSolderMaskMargin() );
|
||||||
pt_pad->m_LocalSolderMaskMargin = aPad->m_LocalSolderMaskMargin;
|
pad->SetLocalSolderPasteMargin( aPad->GetLocalSolderPasteMargin() );
|
||||||
pt_pad->m_LocalSolderPasteMargin = aPad->m_LocalSolderPasteMargin;
|
pad->SetLocalSolderPasteMarginRatio( aPad->GetLocalSolderPasteMarginRatio() );
|
||||||
pt_pad->m_LocalSolderPasteMarginRatio = aPad->m_LocalSolderPasteMarginRatio;
|
|
||||||
|
|
||||||
|
if( pad->GetShape() != PAD_TRAPEZOID )
|
||||||
if( pt_pad->m_PadShape != PAD_TRAPEZOID )
|
|
||||||
{
|
{
|
||||||
pt_pad->m_DeltaSize.x = 0;
|
pad->SetDelta( wxSize( 0, 0 ) );
|
||||||
pt_pad->m_DeltaSize.y = 0;
|
|
||||||
}
|
}
|
||||||
if( pt_pad->m_PadShape == PAD_CIRCLE )
|
|
||||||
pt_pad->m_Size.y = pt_pad->m_Size.x;
|
|
||||||
|
|
||||||
switch( pt_pad->m_Attribut & 0x7F )
|
if( pad->GetShape() == PAD_CIRCLE )
|
||||||
|
pad->SetY( pad->GetSize().x );
|
||||||
|
|
||||||
|
switch( pad->GetAttribute() )
|
||||||
{
|
{
|
||||||
case PAD_SMD:
|
case PAD_SMD:
|
||||||
case PAD_CONN:
|
case PAD_CONN:
|
||||||
pt_pad->m_Drill = wxSize( 0, 0 );
|
pad->SetDrillSize( wxSize( 0, 0 ) );
|
||||||
pt_pad->m_Offset.x = 0;
|
pad->SetOffset( wxPoint( 0, 0 ) );
|
||||||
pt_pad->m_Offset.y = 0;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pt_pad->ComputeShapeMaxRadius();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Module->CalculateBoundingBox();
|
module->CalculateBoundingBox();
|
||||||
|
|
||||||
if( aRedraw )
|
if( aRedraw )
|
||||||
m_canvas->RefreshDrawingRect( Module->GetBoundingBox() );
|
m_canvas->RefreshDrawingRect( module->GetBoundingBox() );
|
||||||
}
|
}
|
||||||
|
|
||||||
OnModify();
|
OnModify();
|
||||||
|
|
|
@ -167,7 +167,7 @@ bool MODULE::Read_GPCB_Descr( const wxString& CmpFullFileName )
|
||||||
char* line;
|
char* line;
|
||||||
long ibuf[100];
|
long ibuf[100];
|
||||||
EDGE_MODULE* drawSeg;
|
EDGE_MODULE* drawSeg;
|
||||||
D_PAD* Pad;
|
D_PAD* pad;
|
||||||
wxArrayString params;
|
wxArrayString params;
|
||||||
int iprmcnt, icnt_max, iflgidx;
|
int iprmcnt, icnt_max, iflgidx;
|
||||||
|
|
||||||
|
@ -257,6 +257,7 @@ bool MODULE::Read_GPCB_Descr( const wxString& CmpFullFileName )
|
||||||
// real size is: default * ibuf[idx+3] / 100 (size in gpcb is given in percent of default size
|
// real size is: default * ibuf[idx+3] / 100 (size in gpcb is given in percent of default size
|
||||||
int tsize = ( ibuf[idx+3] * TEXT_DEFAULT_SIZE ) / 100;
|
int tsize = ( ibuf[idx+3] * TEXT_DEFAULT_SIZE ) / 100;
|
||||||
int thickness = m_Reference->m_Size.x / 6;
|
int thickness = m_Reference->m_Size.x / 6;
|
||||||
|
|
||||||
tsize = MAX( 40, tsize );
|
tsize = MAX( 40, tsize );
|
||||||
m_Reference->SetSize( wxSize( tsize, tsize ) );
|
m_Reference->SetSize( wxSize( tsize, tsize ) );
|
||||||
m_Reference->m_Thickness = thickness;
|
m_Reference->m_Thickness = thickness;
|
||||||
|
@ -369,16 +370,17 @@ bool MODULE::Read_GPCB_Descr( const wxString& CmpFullFileName )
|
||||||
}
|
}
|
||||||
|
|
||||||
if( params[0].CmpNoCase( wxT( "Pad" ) ) == 0 ) // Pad with no hole (smd pad)
|
if( params[0].CmpNoCase( wxT( "Pad" ) ) == 0 ) // Pad with no hole (smd pad)
|
||||||
{ // format: Pad [x1 y1 x2 y2 thickness clearance mask "name" "pad_number" flags]
|
{
|
||||||
Pad = new D_PAD( this );
|
// format: Pad [x1 y1 x2 y2 thickness clearance mask "name" "pad_number" flags]
|
||||||
Pad->m_PadShape = PAD_RECT;
|
pad = new D_PAD( this );
|
||||||
Pad->m_layerMask = LAYER_FRONT | SOLDERMASK_LAYER_FRONT | SOLDERPASTE_LAYER_FRONT;
|
pad->SetShape( PAD_RECT );
|
||||||
|
pad->SetLayerMask( LAYER_FRONT | SOLDERMASK_LAYER_FRONT | SOLDERPASTE_LAYER_FRONT );
|
||||||
|
|
||||||
// Set shape from flags
|
// Set shape from flags
|
||||||
iflgidx = params.GetCount() - 2;
|
iflgidx = params.GetCount() - 2;
|
||||||
|
|
||||||
if( TestFlags( params[iflgidx], 0x0080, wxT( "onsolder" ) ) )
|
if( TestFlags( params[iflgidx], 0x0080, wxT( "onsolder" ) ) )
|
||||||
Pad->m_layerMask = LAYER_BACK | SOLDERMASK_LAYER_BACK | SOLDERPASTE_LAYER_BACK;
|
pad->SetLayerMask( LAYER_BACK | SOLDERMASK_LAYER_BACK | SOLDERPASTE_LAYER_BACK );
|
||||||
|
|
||||||
for( unsigned ii = 0; ii < 5; ii++ )
|
for( unsigned ii = 0; ii < 5; ii++ )
|
||||||
{
|
{
|
||||||
|
@ -401,11 +403,11 @@ bool MODULE::Read_GPCB_Descr( const wxString& CmpFullFileName )
|
||||||
// Read pad number:
|
// Read pad number:
|
||||||
if( params[1] == wxT( "(" ) )
|
if( params[1] == wxT( "(" ) )
|
||||||
{
|
{
|
||||||
Pad->SetPadName( params[8] );
|
pad->SetPadName( params[8] );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Pad->SetPadName( params[10] );
|
pad->SetPadName( params[10] );
|
||||||
}
|
}
|
||||||
// Calculate the Pad parameters.
|
// Calculate the Pad parameters.
|
||||||
// In Pcb the shape is a segment
|
// In Pcb the shape is a segment
|
||||||
|
@ -418,43 +420,50 @@ bool MODULE::Read_GPCB_Descr( const wxString& CmpFullFileName )
|
||||||
wxPoint delta;
|
wxPoint delta;
|
||||||
delta.x = ibuf[2] - ibuf[0];
|
delta.x = ibuf[2] - ibuf[0];
|
||||||
delta.y = ibuf[3] - ibuf[1];
|
delta.y = ibuf[3] - ibuf[1];
|
||||||
|
|
||||||
double angle = atan2( (double)delta.y, (double)delta.x );
|
double angle = atan2( (double)delta.y, (double)delta.x );
|
||||||
|
|
||||||
// Negate angle (due to Y reversed axis) and convert it to internal units
|
// Negate angle (due to Y reversed axis) and convert it to internal units
|
||||||
angle = - angle * 1800.0 / M_PI;
|
angle = - angle * 1800.0 / M_PI;
|
||||||
Pad->SetOrientation( wxRound( angle ) );
|
pad->SetOrientation( wxRound( angle ) );
|
||||||
wxPoint padPos;
|
|
||||||
padPos.x = (ibuf[0] + ibuf[2]) / 2;
|
wxPoint padPos( (ibuf[0] + ibuf[2]) / 2, (ibuf[1] + ibuf[3]) / 2 );
|
||||||
padPos.y = (ibuf[1] + ibuf[3]) / 2;
|
|
||||||
Pad->m_Size.x = wxRound( hypot( (double)delta.x, (double)delta.y ) ) + ibuf[4];
|
pad->SetSize( wxSize(
|
||||||
Pad->m_Size.y = ibuf[4];
|
wxRound( hypot( (double)delta.x, (double)delta.y ) ) + ibuf[4],
|
||||||
|
ibuf[4] ) );
|
||||||
|
|
||||||
padPos += m_Pos;
|
padPos += m_Pos;
|
||||||
Pad->SetPos0( padPos );
|
pad->SetPos0( padPos );
|
||||||
Pad->SetPosition( padPos );
|
pad->SetPosition( padPos );
|
||||||
|
|
||||||
if( !TestFlags( params[iflgidx], 0x0100, wxT( "square" ) ) )
|
if( !TestFlags( params[iflgidx], 0x0100, wxT( "square" ) ) )
|
||||||
{
|
{
|
||||||
if( Pad->m_Size.x == Pad->m_Size.y )
|
if( pad->GetSize().x == pad->GetSize().y )
|
||||||
Pad->m_PadShape = PAD_ROUND;
|
pad->SetShape( PAD_ROUND );
|
||||||
else
|
else
|
||||||
Pad->m_PadShape = PAD_OVAL;
|
pad->SetShape( PAD_OVAL );
|
||||||
}
|
}
|
||||||
|
|
||||||
m_Pads.PushBack( Pad );
|
m_Pads.PushBack( pad );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( params[0].CmpNoCase( wxT( "Pin" ) ) == 0 ) // Pad with hole (trough pad)
|
if( params[0].CmpNoCase( wxT( "Pin" ) ) == 0 ) // Pad with hole (trough pad)
|
||||||
{ // format: Pin[x y Thickness Clearance Mask DrillHole Name Number Flags]
|
{
|
||||||
Pad = new D_PAD( this );
|
// format: Pin[x y Thickness Clearance Mask DrillHole Name Number Flags]
|
||||||
Pad->m_PadShape = PAD_ROUND;
|
pad = new D_PAD( this );
|
||||||
Pad->m_layerMask = ALL_CU_LAYERS |
|
pad->SetShape( PAD_ROUND );
|
||||||
|
|
||||||
|
pad->SetLayerMask( ALL_CU_LAYERS |
|
||||||
SILKSCREEN_LAYER_FRONT |
|
SILKSCREEN_LAYER_FRONT |
|
||||||
SOLDERMASK_LAYER_FRONT |
|
SOLDERMASK_LAYER_FRONT |
|
||||||
SOLDERMASK_LAYER_BACK;
|
SOLDERMASK_LAYER_BACK );
|
||||||
|
|
||||||
iflgidx = params.GetCount() - 2;
|
iflgidx = params.GetCount() - 2;
|
||||||
|
|
||||||
if( TestFlags( params[iflgidx], 0x0100, wxT( "square" ) ) )
|
if( TestFlags( params[iflgidx], 0x0100, wxT( "square" ) ) )
|
||||||
Pad->m_PadShape = PAD_RECT;
|
pad->SetShape( PAD_RECT );
|
||||||
|
|
||||||
for( unsigned ii = 0; ii < 6; ii++ )
|
for( unsigned ii = 0; ii < 6; ii++ )
|
||||||
{
|
{
|
||||||
|
@ -476,25 +485,30 @@ bool MODULE::Read_GPCB_Descr( const wxString& CmpFullFileName )
|
||||||
// Read pad number:
|
// Read pad number:
|
||||||
if( params[1] == wxT( "(" ) )
|
if( params[1] == wxT( "(" ) )
|
||||||
{
|
{
|
||||||
Pad->SetPadName( params[7] );
|
pad->SetPadName( params[7] );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Pad->SetPadName( params[9] );
|
pad->SetPadName( params[9] );
|
||||||
}
|
}
|
||||||
wxPoint padPos;
|
|
||||||
padPos.x = ibuf[0];
|
wxPoint padPos( ibuf[0], ibuf[1] );
|
||||||
padPos.y = ibuf[1];
|
|
||||||
Pad->m_Drill.x = Pad->m_Drill.y = ibuf[5];
|
pad->SetDrillSize( wxSize( ibuf[5], ibuf[5] ) );
|
||||||
Pad->m_Size.x = Pad->m_Size.y = ibuf[3] + Pad->m_Drill.x;
|
|
||||||
|
int sz = ibuf[3] + pad->GetDrillSize().x;
|
||||||
|
|
||||||
|
pad->SetSize( wxSize( sz, sz ) );
|
||||||
|
|
||||||
padPos += m_Pos;
|
padPos += m_Pos;
|
||||||
Pad->SetPos0( padPos );
|
|
||||||
Pad->SetPosition( padPos );
|
|
||||||
|
|
||||||
if( (Pad->m_PadShape == PAD_ROUND) && (Pad->m_Size.x != Pad->m_Size.y) )
|
pad->SetPos0( padPos );
|
||||||
Pad->m_PadShape = PAD_OVAL;
|
pad->SetPosition( padPos );
|
||||||
|
|
||||||
m_Pads.PushBack( Pad );
|
if( pad->GetShape() == PAD_ROUND && pad->GetSize().x != pad->GetSize().y )
|
||||||
|
pad->SetShape( PAD_OVAL );
|
||||||
|
|
||||||
|
m_Pads.PushBack( pad );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -508,7 +522,7 @@ bool MODULE::Read_GPCB_Descr( const wxString& CmpFullFileName )
|
||||||
m_Reference->m_Text = filename.GetName();
|
m_Reference->m_Text = filename.GetName();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Recalculate the bounding box */
|
// Recalculate the bounding box
|
||||||
CalculateBoundingBox();
|
CalculateBoundingBox();
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ static void DrawSegmentQcq( int ux0,
|
||||||
int color,
|
int color,
|
||||||
int op_logic );
|
int op_logic );
|
||||||
|
|
||||||
static void TraceFilledCircle( BOARD* Pcb,
|
static void TraceFilledCircle( BOARD* aPcb,
|
||||||
int cx,
|
int cx,
|
||||||
int cy,
|
int cy,
|
||||||
int radius,
|
int radius,
|
||||||
|
@ -84,50 +84,49 @@ int ToMatrixCoordinate( int aPhysicalCoordinate )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PlacePad( BOARD* Pcb, D_PAD* pt_pad, int color, int marge, int op_logic )
|
void PlacePad( BOARD* aPcb, D_PAD* aPad, int color, int marge, int op_logic )
|
||||||
{
|
{
|
||||||
int dx, dy;
|
int dx, dy;
|
||||||
wxPoint shape_pos = pt_pad->ReturnShapePos();
|
wxPoint shape_pos = aPad->ReturnShapePos();
|
||||||
|
|
||||||
dx = pt_pad->m_Size.x / 2;
|
dx = aPad->GetSize().x / 2;
|
||||||
dx += marge;
|
dx += marge;
|
||||||
|
|
||||||
if( pt_pad->m_PadShape == PAD_CIRCLE )
|
if( aPad->GetShape() == PAD_CIRCLE )
|
||||||
{
|
{
|
||||||
TraceFilledCircle( Pcb, shape_pos.x, shape_pos.y, dx,
|
TraceFilledCircle( aPcb, shape_pos.x, shape_pos.y, dx,
|
||||||
pt_pad->m_layerMask, color, op_logic );
|
aPad->GetLayerMask(), color, op_logic );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dy = aPad->GetSize().y / 2;
|
||||||
dy = pt_pad->m_Size.y / 2;
|
|
||||||
dy += marge;
|
dy += marge;
|
||||||
|
|
||||||
if( pt_pad->m_PadShape == PAD_TRAPEZOID )
|
if( aPad->GetShape() == PAD_TRAPEZOID )
|
||||||
{
|
{
|
||||||
dx += abs( pt_pad->m_DeltaSize.y ) / 2;
|
dx += abs( aPad->GetDelta().y ) / 2;
|
||||||
dy += abs( pt_pad->m_DeltaSize.x ) / 2;
|
dy += abs( aPad->GetDelta().x ) / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The pad is a rectangle horizontally or vertically.
|
// The pad is a rectangle horizontally or vertically.
|
||||||
if( int( pt_pad->GetOrientation() ) % 900 == 0 )
|
if( int( aPad->GetOrientation() ) % 900 == 0 )
|
||||||
{
|
{
|
||||||
// Orientation turned 90 deg.
|
// Orientation turned 90 deg.
|
||||||
if( ( pt_pad->m_Orient == 900 ) || ( pt_pad->m_Orient == 2700 ) )
|
if( aPad->GetOrientation() == 900 || aPad->GetOrientation() == 2700 )
|
||||||
{
|
{
|
||||||
EXCHG( dx, dy );
|
EXCHG( dx, dy );
|
||||||
}
|
}
|
||||||
|
|
||||||
TraceFilledRectangle( Pcb, shape_pos.x - dx, shape_pos.y - dy,
|
TraceFilledRectangle( aPcb, shape_pos.x - dx, shape_pos.y - dy,
|
||||||
shape_pos.x + dx, shape_pos.y + dy,
|
shape_pos.x + dx, shape_pos.y + dy,
|
||||||
pt_pad->m_layerMask, color, op_logic );
|
aPad->GetLayerMask(), color, op_logic );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TraceFilledRectangle( Pcb, shape_pos.x - dx, shape_pos.y - dy,
|
TraceFilledRectangle( aPcb, shape_pos.x - dx, shape_pos.y - dy,
|
||||||
shape_pos.x + dx, shape_pos.y + dy,
|
shape_pos.x + dx, shape_pos.y + dy,
|
||||||
(int) pt_pad->m_Orient,
|
(int) aPad->GetOrientation(),
|
||||||
pt_pad->m_layerMask, color, op_logic );
|
aPad->GetLayerMask(), color, op_logic );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,7 +139,7 @@ void PlacePad( BOARD* Pcb, D_PAD* pt_pad, int color, int marge, int op_logic )
|
||||||
* color: mask write in cells
|
* color: mask write in cells
|
||||||
* op_logic: type of writing in the cell (WRITE, OR)
|
* op_logic: type of writing in the cell (WRITE, OR)
|
||||||
*/
|
*/
|
||||||
void TraceFilledCircle( BOARD* Pcb,
|
void TraceFilledCircle( BOARD* aPcb,
|
||||||
int cx,
|
int cx,
|
||||||
int cy,
|
int cy,
|
||||||
int radius,
|
int radius,
|
||||||
|
@ -197,8 +196,8 @@ void TraceFilledCircle( BOARD* Pcb,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
cx -= Pcb->GetBoundingBox().GetX();
|
cx -= aPcb->GetBoundingBox().GetX();
|
||||||
cy -= Pcb->GetBoundingBox().GetY();
|
cy -= aPcb->GetBoundingBox().GetY();
|
||||||
|
|
||||||
distmin = radius;
|
distmin = radius;
|
||||||
|
|
||||||
|
@ -290,7 +289,7 @@ void TraceFilledCircle( BOARD* Pcb,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void TraceSegmentPcb( BOARD* Pcb, TRACK* pt_segm, int color, int marge, int op_logic )
|
void TraceSegmentPcb( BOARD* aPcb, TRACK* pt_segm, int color, int marge, int op_logic )
|
||||||
{
|
{
|
||||||
int half_width;
|
int half_width;
|
||||||
int ux0, uy0, ux1, uy1;
|
int ux0, uy0, ux1, uy1;
|
||||||
|
@ -298,10 +297,10 @@ void TraceSegmentPcb( BOARD* Pcb, TRACK* pt_segm, int color, int marge, int op_l
|
||||||
half_width = ( pt_segm->m_Width / 2 ) + marge;
|
half_width = ( pt_segm->m_Width / 2 ) + marge;
|
||||||
|
|
||||||
// Calculate the bounding rectangle of the segment (if H, V or Via)
|
// Calculate the bounding rectangle of the segment (if H, V or Via)
|
||||||
ux0 = pt_segm->m_Start.x - Pcb->GetBoundingBox().GetX();
|
ux0 = pt_segm->m_Start.x - aPcb->GetBoundingBox().GetX();
|
||||||
uy0 = pt_segm->m_Start.y - Pcb->GetBoundingBox().GetY();
|
uy0 = pt_segm->m_Start.y - aPcb->GetBoundingBox().GetY();
|
||||||
ux1 = pt_segm->m_End.x - Pcb->GetBoundingBox().GetX();
|
ux1 = pt_segm->m_End.x - aPcb->GetBoundingBox().GetX();
|
||||||
uy1 = pt_segm->m_End.y - Pcb->GetBoundingBox().GetY();
|
uy1 = pt_segm->m_End.y - aPcb->GetBoundingBox().GetY();
|
||||||
|
|
||||||
// Test if VIA (filled circle was drawn)
|
// Test if VIA (filled circle was drawn)
|
||||||
if( pt_segm->Type() == PCB_VIA_T )
|
if( pt_segm->Type() == PCB_VIA_T )
|
||||||
|
@ -323,7 +322,7 @@ void TraceSegmentPcb( BOARD* Pcb, TRACK* pt_segm, int color, int marge, int op_l
|
||||||
mask_layer = -1;
|
mask_layer = -1;
|
||||||
|
|
||||||
if( mask_layer )
|
if( mask_layer )
|
||||||
TraceFilledCircle( Pcb, pt_segm->m_Start.x, pt_segm->m_Start.y,
|
TraceFilledCircle( aPcb, pt_segm->m_Start.x, pt_segm->m_Start.y,
|
||||||
half_width, mask_layer, color, op_logic );
|
half_width, mask_layer, color, op_logic );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -516,7 +515,7 @@ void TracePcbLine( int x0, int y0, int x1, int y1, int layer, int color, int op_
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void TraceFilledRectangle( BOARD* Pcb, int ux0, int uy0, int ux1, int uy1,
|
void TraceFilledRectangle( BOARD* aPcb, int ux0, int uy0, int ux1, int uy1,
|
||||||
int aLayerMask, int color, int op_logic )
|
int aLayerMask, int color, int op_logic )
|
||||||
{
|
{
|
||||||
int row, col;
|
int row, col;
|
||||||
|
@ -558,10 +557,10 @@ void TraceFilledRectangle( BOARD* Pcb, int ux0, int uy0, int ux1, int uy1,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ux0 -= Pcb->GetBoundingBox().GetX();
|
ux0 -= aPcb->GetBoundingBox().GetX();
|
||||||
uy0 -= Pcb->GetBoundingBox().GetY();
|
uy0 -= aPcb->GetBoundingBox().GetY();
|
||||||
ux1 -= Pcb->GetBoundingBox().GetX();
|
ux1 -= aPcb->GetBoundingBox().GetX();
|
||||||
uy1 -= Pcb->GetBoundingBox().GetY();
|
uy1 -= aPcb->GetBoundingBox().GetY();
|
||||||
|
|
||||||
// Calculating limits coord cells belonging to the rectangle.
|
// Calculating limits coord cells belonging to the rectangle.
|
||||||
row_max = uy1 / Board.m_GridRouting;
|
row_max = uy1 / Board.m_GridRouting;
|
||||||
|
@ -602,7 +601,7 @@ void TraceFilledRectangle( BOARD* Pcb, int ux0, int uy0, int ux1, int uy1,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void TraceFilledRectangle( BOARD* Pcb, int ux0, int uy0, int ux1, int uy1,
|
void TraceFilledRectangle( BOARD* aPcb, int ux0, int uy0, int ux1, int uy1,
|
||||||
int angle, int aLayerMask, int color, int op_logic )
|
int angle, int aLayerMask, int color, int op_logic )
|
||||||
{
|
{
|
||||||
int row, col;
|
int row, col;
|
||||||
|
@ -650,10 +649,10 @@ void TraceFilledRectangle( BOARD* Pcb, int ux0, int uy0, int ux1, int uy1,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ux0 -= Pcb->GetBoundingBox().GetX();
|
ux0 -= aPcb->GetBoundingBox().GetX();
|
||||||
uy0 -= Pcb->GetBoundingBox().GetY();
|
uy0 -= aPcb->GetBoundingBox().GetY();
|
||||||
ux1 -= Pcb->GetBoundingBox().GetX();
|
ux1 -= aPcb->GetBoundingBox().GetX();
|
||||||
uy1 -= Pcb->GetBoundingBox().GetY();
|
uy1 -= aPcb->GetBoundingBox().GetY();
|
||||||
|
|
||||||
cx = (ux0 + ux1) / 2;
|
cx = (ux0 + ux1) / 2;
|
||||||
cy = (uy0 + uy1) / 2;
|
cy = (uy0 + uy1) / 2;
|
||||||
|
|
|
@ -334,6 +334,7 @@ int PCB_BASE_FRAME::ReadSetup( LINE_READER* aReader )
|
||||||
|
|
||||||
NETCLASS* netclass_default = GetBoard()->m_NetClasses.GetDefault();
|
NETCLASS* netclass_default = GetBoard()->m_NetClasses.GetDefault();
|
||||||
ZONE_SETTINGS zoneInfo = GetBoard()->GetZoneSettings();
|
ZONE_SETTINGS zoneInfo = GetBoard()->GetZoneSettings();
|
||||||
|
BOARD_DESIGN_SETTINGS bds = GetBoard()->GetDesignSettings();
|
||||||
|
|
||||||
while( aReader->ReadLine() )
|
while( aReader->ReadLine() )
|
||||||
{
|
{
|
||||||
|
@ -456,7 +457,7 @@ int PCB_BASE_FRAME::ReadSetup( LINE_READER* aReader )
|
||||||
|
|
||||||
if( stricmp( line, "TrackMinWidth" ) == 0 )
|
if( stricmp( line, "TrackMinWidth" ) == 0 )
|
||||||
{
|
{
|
||||||
GetBoard()->GetDesignSettings().m_TrackMinWidth = atoi( data );
|
bds.m_TrackMinWidth = atoi( data );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -468,13 +469,13 @@ int PCB_BASE_FRAME::ReadSetup( LINE_READER* aReader )
|
||||||
|
|
||||||
if( stricmp( line, "DrawSegmWidth" ) == 0 )
|
if( stricmp( line, "DrawSegmWidth" ) == 0 )
|
||||||
{
|
{
|
||||||
GetBoard()->GetDesignSettings().m_DrawSegmentWidth = atoi( data );
|
bds.m_DrawSegmentWidth = atoi( data );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( stricmp( line, "EdgeSegmWidth" ) == 0 )
|
if( stricmp( line, "EdgeSegmWidth" ) == 0 )
|
||||||
{
|
{
|
||||||
GetBoard()->GetDesignSettings().m_EdgeSegmentWidth = atoi( data );
|
bds.m_EdgeSegmentWidth = atoi( data );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -485,7 +486,7 @@ int PCB_BASE_FRAME::ReadSetup( LINE_READER* aReader )
|
||||||
|
|
||||||
if( stricmp( line, "ViaMinSize" ) == 0 )
|
if( stricmp( line, "ViaMinSize" ) == 0 )
|
||||||
{
|
{
|
||||||
GetBoard()->GetDesignSettings().m_ViasMinSize = atoi( data );
|
bds.m_ViasMinSize = atoi( data );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -496,7 +497,7 @@ int PCB_BASE_FRAME::ReadSetup( LINE_READER* aReader )
|
||||||
|
|
||||||
if( stricmp( line, "MicroViaMinSize" ) == 0 )
|
if( stricmp( line, "MicroViaMinSize" ) == 0 )
|
||||||
{
|
{
|
||||||
GetBoard()->GetDesignSettings().m_MicroViasMinSize = atoi( data );
|
bds.m_MicroViasMinSize = atoi( data );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -526,7 +527,7 @@ int PCB_BASE_FRAME::ReadSetup( LINE_READER* aReader )
|
||||||
|
|
||||||
if( stricmp( line, "ViaMinDrill" ) == 0 )
|
if( stricmp( line, "ViaMinDrill" ) == 0 )
|
||||||
{
|
{
|
||||||
GetBoard()->GetDesignSettings().m_ViasMinDrill = atoi( data );
|
bds.m_ViasMinDrill = atoi( data );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -540,80 +541,81 @@ int PCB_BASE_FRAME::ReadSetup( LINE_READER* aReader )
|
||||||
if( stricmp( line, "MicroViaMinDrill" ) == 0 )
|
if( stricmp( line, "MicroViaMinDrill" ) == 0 )
|
||||||
{
|
{
|
||||||
int diameter = atoi( data );
|
int diameter = atoi( data );
|
||||||
GetBoard()->GetDesignSettings().m_MicroViasMinDrill = diameter;
|
bds.m_MicroViasMinDrill = diameter;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( stricmp( line, "MicroViasAllowed" ) == 0 )
|
if( stricmp( line, "MicroViasAllowed" ) == 0 )
|
||||||
{
|
{
|
||||||
GetBoard()->GetDesignSettings().m_MicroViasAllowed = atoi( data );
|
bds.m_MicroViasAllowed = atoi( data );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( stricmp( line, "TextPcbWidth" ) == 0 )
|
if( stricmp( line, "TextPcbWidth" ) == 0 )
|
||||||
{
|
{
|
||||||
GetBoard()->GetDesignSettings().m_PcbTextWidth = atoi( data );
|
bds.m_PcbTextWidth = atoi( data );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( stricmp( line, "TextPcbSize" ) == 0 )
|
if( stricmp( line, "TextPcbSize" ) == 0 )
|
||||||
{
|
{
|
||||||
GetBoard()->GetDesignSettings().m_PcbTextSize.x = atoi( data );
|
bds.m_PcbTextSize.x = atoi( data );
|
||||||
data = strtok( NULL, delims );
|
data = strtok( NULL, delims );
|
||||||
GetBoard()->GetDesignSettings().m_PcbTextSize.y = atoi( data );
|
bds.m_PcbTextSize.y = atoi( data );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( stricmp( line, "EdgeModWidth" ) == 0 )
|
if( stricmp( line, "EdgeModWidth" ) == 0 )
|
||||||
{
|
{
|
||||||
GetBoard()->GetDesignSettings().m_ModuleSegmentWidth = atoi( data );
|
bds.m_ModuleSegmentWidth = atoi( data );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( stricmp( line, "TextModWidth" ) == 0 )
|
if( stricmp( line, "TextModWidth" ) == 0 )
|
||||||
{
|
{
|
||||||
GetBoard()->GetDesignSettings().m_ModuleTextWidth = atoi( data );
|
bds.m_ModuleTextWidth = atoi( data );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( stricmp( line, "TextModSize" ) == 0 )
|
if( stricmp( line, "TextModSize" ) == 0 )
|
||||||
{
|
{
|
||||||
GetBoard()->GetDesignSettings().m_ModuleTextSize.x = atoi( data );
|
bds.m_ModuleTextSize.x = atoi( data );
|
||||||
data = strtok( NULL, delims );
|
data = strtok( NULL, delims );
|
||||||
GetBoard()->GetDesignSettings().m_ModuleTextSize.y = atoi( data );
|
bds.m_ModuleTextSize.y = atoi( data );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( stricmp( line, "PadSize" ) == 0 )
|
if( stricmp( line, "PadSize" ) == 0 )
|
||||||
{
|
{
|
||||||
g_Pad_Master.m_Size.x = atoi( data );
|
int x = atoi( data );
|
||||||
data = strtok( NULL, delims );
|
data = strtok( NULL, delims );
|
||||||
g_Pad_Master.m_Size.y = atoi( data );
|
int y = atoi( data );
|
||||||
|
bds.m_Pad_Master.SetSize( wxSize( x, y ) );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( stricmp( line, "PadDrill" ) == 0 )
|
if( stricmp( line, "PadDrill" ) == 0 )
|
||||||
{
|
{
|
||||||
g_Pad_Master.m_Drill.x = atoi( data );
|
int sz = atoi( data );
|
||||||
g_Pad_Master.m_Drill.y = g_Pad_Master.m_Drill.x;
|
bds.m_Pad_Master.SetSize( wxSize( sz, sz ) );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( stricmp( line, "Pad2MaskClearance" ) == 0 )
|
if( stricmp( line, "Pad2MaskClearance" ) == 0 )
|
||||||
{
|
{
|
||||||
GetBoard()->GetDesignSettings().m_SolderMaskMargin = atoi( data );
|
bds.m_SolderMaskMargin = atoi( data );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( stricmp( line, "Pad2PasteClearance" ) == 0 )
|
if( stricmp( line, "Pad2PasteClearance" ) == 0 )
|
||||||
{
|
{
|
||||||
GetBoard()->GetDesignSettings().m_SolderPasteMargin = atoi( data );
|
bds.m_SolderPasteMargin = atoi( data );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( stricmp( line, "Pad2PasteClearanceRatio" ) == 0 )
|
if( stricmp( line, "Pad2PasteClearanceRatio" ) == 0 )
|
||||||
{
|
{
|
||||||
GetBoard()->GetDesignSettings().m_SolderPasteMarginRatio = atof( data );
|
bds.m_SolderPasteMarginRatio = atof( data );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -670,6 +672,7 @@ int PCB_BASE_FRAME::ReadSetup( LINE_READER* aReader )
|
||||||
|
|
||||||
static int WriteSetup( FILE* aFile, PCB_EDIT_FRAME* aFrame, BOARD* aBoard )
|
static int WriteSetup( FILE* aFile, PCB_EDIT_FRAME* aFrame, BOARD* aBoard )
|
||||||
{
|
{
|
||||||
|
const BOARD_DESIGN_SETTINGS& bds = aBoard->GetDesignSettings();
|
||||||
NETCLASS* netclass_default = aBoard->m_NetClasses.GetDefault();
|
NETCLASS* netclass_default = aBoard->m_NetClasses.GetDefault();
|
||||||
char text[1024];
|
char text[1024];
|
||||||
|
|
||||||
|
@ -701,16 +704,16 @@ static int WriteSetup( FILE* aFile, PCB_EDIT_FRAME* aFrame, BOARD* aBoard )
|
||||||
|
|
||||||
fprintf( aFile, "TrackClearence %d\n", netclass_default->GetClearance() );
|
fprintf( aFile, "TrackClearence %d\n", netclass_default->GetClearance() );
|
||||||
fprintf( aFile, "ZoneClearence %d\n", aBoard->GetZoneSettings().m_ZoneClearance );
|
fprintf( aFile, "ZoneClearence %d\n", aBoard->GetZoneSettings().m_ZoneClearance );
|
||||||
fprintf( aFile, "TrackMinWidth %d\n", aBoard->GetDesignSettings().m_TrackMinWidth );
|
fprintf( aFile, "TrackMinWidth %d\n", bds.m_TrackMinWidth );
|
||||||
|
|
||||||
fprintf( aFile, "DrawSegmWidth %d\n", aBoard->GetDesignSettings().m_DrawSegmentWidth );
|
fprintf( aFile, "DrawSegmWidth %d\n", bds.m_DrawSegmentWidth );
|
||||||
fprintf( aFile, "EdgeSegmWidth %d\n", aBoard->GetDesignSettings().m_EdgeSegmentWidth );
|
fprintf( aFile, "EdgeSegmWidth %d\n", bds.m_EdgeSegmentWidth );
|
||||||
|
|
||||||
// Save current default via size, for compatibility with older Pcbnew version;
|
// Save current default via size, for compatibility with older Pcbnew version;
|
||||||
fprintf( aFile, "ViaSize %d\n", netclass_default->GetViaDiameter() );
|
fprintf( aFile, "ViaSize %d\n", netclass_default->GetViaDiameter() );
|
||||||
fprintf( aFile, "ViaDrill %d\n", netclass_default->GetViaDrill() );
|
fprintf( aFile, "ViaDrill %d\n", netclass_default->GetViaDrill() );
|
||||||
fprintf( aFile, "ViaMinSize %d\n", aBoard->GetDesignSettings().m_ViasMinSize );
|
fprintf( aFile, "ViaMinSize %d\n", bds.m_ViasMinSize );
|
||||||
fprintf( aFile, "ViaMinDrill %d\n", aBoard->GetDesignSettings().m_ViasMinDrill );
|
fprintf( aFile, "ViaMinDrill %d\n", bds.m_ViasMinDrill );
|
||||||
|
|
||||||
// Save custom vias diameters list (the first is not saved here: this is
|
// Save custom vias diameters list (the first is not saved here: this is
|
||||||
// the netclass value
|
// the netclass value
|
||||||
|
@ -724,38 +727,41 @@ static int WriteSetup( FILE* aFile, PCB_EDIT_FRAME* aFrame, BOARD* aBoard )
|
||||||
fprintf( aFile, "MicroViaDrill %d\n", netclass_default->GetuViaDrill() );
|
fprintf( aFile, "MicroViaDrill %d\n", netclass_default->GetuViaDrill() );
|
||||||
fprintf( aFile,
|
fprintf( aFile,
|
||||||
"MicroViasAllowed %d\n",
|
"MicroViasAllowed %d\n",
|
||||||
aBoard->GetDesignSettings().m_MicroViasAllowed );
|
bds.m_MicroViasAllowed );
|
||||||
fprintf( aFile,
|
fprintf( aFile,
|
||||||
"MicroViaMinSize %d\n",
|
"MicroViaMinSize %d\n",
|
||||||
aBoard->GetDesignSettings().m_MicroViasMinSize );
|
bds.m_MicroViasMinSize );
|
||||||
fprintf( aFile,
|
fprintf( aFile,
|
||||||
"MicroViaMinDrill %d\n",
|
"MicroViaMinDrill %d\n",
|
||||||
aBoard->GetDesignSettings().m_MicroViasMinDrill );
|
bds.m_MicroViasMinDrill );
|
||||||
|
|
||||||
fprintf( aFile, "TextPcbWidth %d\n", aBoard->GetDesignSettings().m_PcbTextWidth );
|
fprintf( aFile, "TextPcbWidth %d\n", bds.m_PcbTextWidth );
|
||||||
fprintf( aFile,
|
fprintf( aFile,
|
||||||
"TextPcbSize %d %d\n",
|
"TextPcbSize %d %d\n",
|
||||||
aBoard->GetDesignSettings().m_PcbTextSize.x,
|
bds.m_PcbTextSize.x,
|
||||||
aBoard->GetDesignSettings().m_PcbTextSize.y );
|
bds.m_PcbTextSize.y );
|
||||||
|
|
||||||
fprintf( aFile, "EdgeModWidth %d\n", aBoard->GetDesignSettings().m_ModuleSegmentWidth );
|
fprintf( aFile, "EdgeModWidth %d\n", bds.m_ModuleSegmentWidth );
|
||||||
fprintf( aFile, "TextModSize %d %d\n", aBoard->GetDesignSettings().m_ModuleTextSize.x, aBoard->GetDesignSettings().m_ModuleTextSize.y );
|
fprintf( aFile, "TextModSize %d %d\n", bds.m_ModuleTextSize.x, bds.m_ModuleTextSize.y );
|
||||||
fprintf( aFile, "TextModWidth %d\n", aBoard->GetDesignSettings().m_ModuleTextWidth );
|
fprintf( aFile, "TextModWidth %d\n", bds.m_ModuleTextWidth );
|
||||||
fprintf( aFile, "PadSize %d %d\n", g_Pad_Master.m_Size.x, g_Pad_Master.m_Size.y );
|
|
||||||
fprintf( aFile, "PadDrill %d\n", g_Pad_Master.m_Drill.x );
|
fprintf( aFile, "PadSize %d %d\n", bds.m_Pad_Master.GetSize().x,
|
||||||
|
bds.m_Pad_Master.GetSize().y );
|
||||||
|
|
||||||
|
fprintf( aFile, "PadDrill %d\n", bds.m_Pad_Master.GetDrillSize().x );
|
||||||
fprintf( aFile,
|
fprintf( aFile,
|
||||||
"Pad2MaskClearance %d\n",
|
"Pad2MaskClearance %d\n",
|
||||||
aBoard->GetDesignSettings().m_SolderMaskMargin );
|
bds.m_SolderMaskMargin );
|
||||||
|
|
||||||
if( aBoard->GetDesignSettings().m_SolderPasteMargin != 0 )
|
if( bds.m_SolderPasteMargin != 0 )
|
||||||
fprintf( aFile,
|
fprintf( aFile,
|
||||||
"Pad2PasteClearance %d\n",
|
"Pad2PasteClearance %d\n",
|
||||||
aBoard->GetDesignSettings().m_SolderPasteMargin );
|
bds.m_SolderPasteMargin );
|
||||||
|
|
||||||
if( aBoard->GetDesignSettings().m_SolderPasteMarginRatio != 0 )
|
if( bds.m_SolderPasteMarginRatio != 0 )
|
||||||
fprintf( aFile,
|
fprintf( aFile,
|
||||||
"Pad2PasteClearanceRatio %g\n",
|
"Pad2PasteClearanceRatio %g\n",
|
||||||
aBoard->GetDesignSettings().m_SolderPasteMarginRatio );
|
bds.m_SolderPasteMarginRatio );
|
||||||
|
|
||||||
if ( aFrame->GetScreen()->m_GridOrigin != wxPoint( 0, 0 ) )
|
if ( aFrame->GetScreen()->m_GridOrigin != wxPoint( 0, 0 ) )
|
||||||
{
|
{
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
#include <pcbnew.h>
|
#include <pcbnew.h>
|
||||||
#include <drawtxt.h>
|
#include <drawtxt.h>
|
||||||
|
|
||||||
#define MAX_WIDTH 10000 /* Thickness (in 1 / 10000 ") of maximum reasonable features, text... */
|
#define MAX_WIDTH 10000 // Thickness (in 1 / 10000 ") of maximum reasonable features, text...
|
||||||
|
|
||||||
|
|
||||||
#if 1 || !defined(USE_NEW_PCBNEW_SAVE)
|
#if 1 || !defined(USE_NEW_PCBNEW_SAVE)
|
||||||
|
@ -678,7 +678,7 @@ bool D_PAD::Save( FILE* aFile ) const
|
||||||
|
|
||||||
fprintf( aFile, "\n" );
|
fprintf( aFile, "\n" );
|
||||||
|
|
||||||
switch( m_Attribut )
|
switch( GetAttribute() )
|
||||||
{
|
{
|
||||||
case PAD_STANDARD:
|
case PAD_STANDARD:
|
||||||
texttype = "STD"; break;
|
texttype = "STD"; break;
|
||||||
|
@ -704,20 +704,20 @@ bool D_PAD::Save( FILE* aFile ) const
|
||||||
|
|
||||||
fprintf( aFile, "Po %d %d\n", m_Pos0.x, m_Pos0.y );
|
fprintf( aFile, "Po %d %d\n", m_Pos0.x, m_Pos0.y );
|
||||||
|
|
||||||
if( m_LengthDie != 0 )
|
if( GetDieLength() != 0 )
|
||||||
fprintf( aFile, "Le %d\n", m_LengthDie );
|
fprintf( aFile, "Le %d\n", GetDieLength() );
|
||||||
|
|
||||||
if( m_LocalSolderMaskMargin != 0 )
|
if( GetLocalSolderMaskMargin() != 0 )
|
||||||
fprintf( aFile, ".SolderMask %d\n", m_LocalSolderMaskMargin );
|
fprintf( aFile, ".SolderMask %d\n", GetLocalSolderMaskMargin() );
|
||||||
|
|
||||||
if( m_LocalSolderPasteMargin != 0 )
|
if( GetLocalSolderPasteMargin() != 0 )
|
||||||
fprintf( aFile, ".SolderPaste %d\n", m_LocalSolderPasteMargin );
|
fprintf( aFile, ".SolderPaste %d\n", GetLocalSolderPasteMargin() );
|
||||||
|
|
||||||
if( m_LocalSolderPasteMarginRatio != 0 )
|
if( GetLocalSolderPasteMarginRatio() != 0 )
|
||||||
fprintf( aFile, ".SolderPasteRatio %g\n", m_LocalSolderPasteMarginRatio );
|
fprintf( aFile, ".SolderPasteRatio %g\n", GetLocalSolderPasteMarginRatio() );
|
||||||
|
|
||||||
if( m_LocalClearance != 0 )
|
if( GetLocalClearance() != 0 )
|
||||||
fprintf( aFile, ".LocalClearance %d\n", m_LocalClearance );
|
fprintf( aFile, ".LocalClearance %d\n", GetLocalClearance() );
|
||||||
|
|
||||||
if( fprintf( aFile, "$EndPAD\n" ) != sizeof("$EndPAD\n") - 1 )
|
if( fprintf( aFile, "$EndPAD\n" ) != sizeof("$EndPAD\n") - 1 )
|
||||||
return false;
|
return false;
|
||||||
|
@ -767,17 +767,17 @@ bool MODULE::Save( FILE* aFile ) const
|
||||||
fprintf( aFile, "AR %s\n", TO_UTF8( m_Path ) );
|
fprintf( aFile, "AR %s\n", TO_UTF8( m_Path ) );
|
||||||
fprintf( aFile, "Op %X %X 0\n", m_CntRot90, m_CntRot180 );
|
fprintf( aFile, "Op %X %X 0\n", m_CntRot90, m_CntRot180 );
|
||||||
|
|
||||||
if( m_LocalSolderMaskMargin != 0 )
|
if( GetLocalSolderMaskMargin() != 0 )
|
||||||
fprintf( aFile, ".SolderMask %d\n", m_LocalSolderMaskMargin );
|
fprintf( aFile, ".SolderMask %d\n", GetLocalSolderMaskMargin() );
|
||||||
|
|
||||||
if( m_LocalSolderPasteMargin != 0 )
|
if( m_LocalSolderPasteMargin != 0 )
|
||||||
fprintf( aFile, ".SolderPaste %d\n", m_LocalSolderPasteMargin );
|
fprintf( aFile, ".SolderPaste %d\n", GetLocalSolderPasteMargin() );
|
||||||
|
|
||||||
if( m_LocalSolderPasteMarginRatio != 0 )
|
if( GetLocalSolderPasteMarginRatio() != 0 )
|
||||||
fprintf( aFile, ".SolderPasteRatio %g\n", m_LocalSolderPasteMarginRatio );
|
fprintf( aFile, ".SolderPasteRatio %g\n", GetLocalSolderPasteMarginRatio() );
|
||||||
|
|
||||||
if( m_LocalClearance != 0 )
|
if( m_LocalClearance != 0 )
|
||||||
fprintf( aFile, ".LocalClearance %d\n", m_LocalClearance );
|
fprintf( aFile, ".LocalClearance %d\n", GetLocalClearance() );
|
||||||
|
|
||||||
// attributes
|
// attributes
|
||||||
if( m_Attributs != MOD_DEFAULT )
|
if( m_Attributs != MOD_DEFAULT )
|
||||||
|
@ -892,10 +892,10 @@ int MODULE::Write_3D_Descr( FILE* File ) const
|
||||||
*/
|
*/
|
||||||
int D_PAD::ReadDescr( LINE_READER* aReader )
|
int D_PAD::ReadDescr( LINE_READER* aReader )
|
||||||
{
|
{
|
||||||
char* Line;
|
char* Line;
|
||||||
char BufLine[1024], BufCar[256];
|
char BufLine[1024], BufCar[256];
|
||||||
char* PtLine;
|
char* PtLine;
|
||||||
int nn, ll, dx, dy;
|
int nn, ll, dx, dy;
|
||||||
|
|
||||||
while( aReader->ReadLine() )
|
while( aReader->ReadLine() )
|
||||||
{
|
{
|
||||||
|
@ -911,7 +911,7 @@ int D_PAD::ReadDescr( LINE_READER* aReader )
|
||||||
switch( Line[0] )
|
switch( Line[0] )
|
||||||
{
|
{
|
||||||
case 'S': // = Sh
|
case 'S': // = Sh
|
||||||
/* Read pad name */
|
// Read pad name
|
||||||
nn = 0;
|
nn = 0;
|
||||||
|
|
||||||
while( (*PtLine != '"') && *PtLine )
|
while( (*PtLine != '"') && *PtLine )
|
||||||
|
@ -944,25 +944,19 @@ int D_PAD::ReadDescr( LINE_READER* aReader )
|
||||||
|
|
||||||
ll = 0xFF & BufCar[0];
|
ll = 0xFF & BufCar[0];
|
||||||
|
|
||||||
/* Read pad shape */
|
// Read pad shape
|
||||||
m_PadShape = PAD_CIRCLE;
|
PAD_SHAPE_T shape;
|
||||||
|
|
||||||
switch( ll )
|
switch( ll )
|
||||||
{
|
{
|
||||||
case 'C':
|
default:
|
||||||
m_PadShape = PAD_CIRCLE; break;
|
case 'C': shape = PAD_CIRCLE; break;
|
||||||
|
case 'R': shape = PAD_RECT; break;
|
||||||
case 'R':
|
case 'O': shape = PAD_OVAL; break;
|
||||||
m_PadShape = PAD_RECT; break;
|
case 'T': shape = PAD_TRAPEZOID; break;
|
||||||
|
|
||||||
case 'O':
|
|
||||||
m_PadShape = PAD_OVAL; break;
|
|
||||||
|
|
||||||
case 'T':
|
|
||||||
m_PadShape = PAD_TRAPEZOID; break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ComputeShapeMaxRadius();
|
SetShape( shape ); // sets m_boundingRadius = -1
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'D':
|
case 'D':
|
||||||
|
@ -976,7 +970,9 @@ int D_PAD::ReadDescr( LINE_READER* aReader )
|
||||||
{
|
{
|
||||||
if( BufCar[0] == 'O' )
|
if( BufCar[0] == 'O' )
|
||||||
{
|
{
|
||||||
m_Drill.x = dx; m_Drill.y = dy;
|
m_Drill.x = dx;
|
||||||
|
m_Drill.y = dy;
|
||||||
|
|
||||||
m_DrillShape = PAD_OVAL;
|
m_DrillShape = PAD_OVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -987,25 +983,25 @@ int D_PAD::ReadDescr( LINE_READER* aReader )
|
||||||
nn = sscanf( PtLine, "%s %s %X", BufLine, BufCar,
|
nn = sscanf( PtLine, "%s %s %X", BufLine, BufCar,
|
||||||
&m_layerMask );
|
&m_layerMask );
|
||||||
|
|
||||||
/* BufCar is not used now update attributes */
|
// BufCar is not used now update attributes
|
||||||
m_Attribut = PAD_STANDARD;
|
SetAttribute( PAD_STANDARD );
|
||||||
if( strncmp( BufLine, "SMD", 3 ) == 0 )
|
if( strncmp( BufLine, "SMD", 3 ) == 0 )
|
||||||
m_Attribut = PAD_SMD;
|
SetAttribute( PAD_SMD );
|
||||||
|
|
||||||
if( strncmp( BufLine, "CONN", 4 ) == 0 )
|
if( strncmp( BufLine, "CONN", 4 ) == 0 )
|
||||||
m_Attribut = PAD_CONN;
|
SetAttribute( PAD_CONN );
|
||||||
|
|
||||||
if( strncmp( BufLine, "HOLE", 4 ) == 0 )
|
if( strncmp( BufLine, "HOLE", 4 ) == 0 )
|
||||||
m_Attribut = PAD_HOLE_NOT_PLATED;
|
SetAttribute( PAD_HOLE_NOT_PLATED );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'N': /* Read Netname */
|
case 'N': // Read Netname
|
||||||
int netcode;
|
int netcode;
|
||||||
nn = sscanf( PtLine, "%d", &netcode );
|
nn = sscanf( PtLine, "%d", &netcode );
|
||||||
SetNet( netcode );
|
SetNet( netcode );
|
||||||
|
|
||||||
/* read Netname */
|
// read Netname
|
||||||
ReadDelimitedText( BufLine, PtLine, sizeof(BufLine) );
|
ReadDelimitedText( BufLine, PtLine, sizeof(BufLine) );
|
||||||
SetNetname( FROM_UTF8( StrPurge( BufLine ) ) );
|
SetNetname( FROM_UTF8( StrPurge( BufLine ) ) );
|
||||||
break;
|
break;
|
||||||
|
@ -1018,18 +1014,18 @@ int D_PAD::ReadDescr( LINE_READER* aReader )
|
||||||
case 'L':
|
case 'L':
|
||||||
int lengthdie;
|
int lengthdie;
|
||||||
nn = sscanf( PtLine, "%d", &lengthdie );
|
nn = sscanf( PtLine, "%d", &lengthdie );
|
||||||
m_LengthDie = lengthdie;
|
SetDieLength( lengthdie );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '.': /* Read specific data */
|
case '.': // Read specific data
|
||||||
if( strnicmp( Line, ".SolderMask ", 12 ) == 0 )
|
if( strnicmp( Line, ".SolderMask ", 12 ) == 0 )
|
||||||
m_LocalSolderMaskMargin = atoi( Line + 12 );
|
SetLocalSolderMaskMargin( atoi( Line + 12 ) );
|
||||||
else if( strnicmp( Line, ".SolderPaste ", 13 ) == 0 )
|
else if( strnicmp( Line, ".SolderPaste ", 13 ) == 0 )
|
||||||
m_LocalSolderPasteMargin = atoi( Line + 13 );
|
SetLocalSolderPasteMargin( atoi( Line + 13 ) );
|
||||||
else if( strnicmp( Line, ".SolderPasteRatio ", 18 ) == 0 )
|
else if( strnicmp( Line, ".SolderPasteRatio ", 18 ) == 0 )
|
||||||
m_LocalSolderPasteMarginRatio = atoi( Line + 18 );
|
SetLocalSolderPasteMarginRatio( atoi( Line + 18 ) );
|
||||||
else if( strnicmp( Line, ".LocalClearance ", 16 ) == 0 )
|
else if( strnicmp( Line, ".LocalClearance ", 16 ) == 0 )
|
||||||
m_LocalClearance = atoi( Line + 16 );
|
SetLocalClearance( atoi( Line + 16 ) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -1038,7 +1034,7 @@ int D_PAD::ReadDescr( LINE_READER* aReader )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 2; /* error : EOF */
|
return 2; // error : EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1133,10 +1129,14 @@ int MODULE::ReadDescr( LINE_READER* aReader )
|
||||||
if( Line[1] == 'P' )
|
if( Line[1] == 'P' )
|
||||||
{
|
{
|
||||||
D_PAD* pad = new D_PAD( this );
|
D_PAD* pad = new D_PAD( this );
|
||||||
|
|
||||||
pad->ReadDescr( aReader );
|
pad->ReadDescr( aReader );
|
||||||
RotatePoint( &pad->m_Pos, m_Orient );
|
|
||||||
pad->m_Pos.x += m_Pos.x;
|
wxPoint padpos = pad->GetPosition();
|
||||||
pad->m_Pos.y += m_Pos.y;
|
|
||||||
|
RotatePoint( &padpos, m_Orient );
|
||||||
|
|
||||||
|
pad->SetPosition( padpos + m_Pos );
|
||||||
|
|
||||||
m_Pads.PushBack( pad );
|
m_Pads.PushBack( pad );
|
||||||
continue;
|
continue;
|
||||||
|
@ -1176,7 +1176,7 @@ int MODULE::ReadDescr( LINE_READER* aReader )
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'L': /* Li = read the library name of the footprint */
|
case 'L': // Li = read the library name of the footprint
|
||||||
*BufLine = 0;
|
*BufLine = 0;
|
||||||
sscanf( PtLine, " %s", BufLine );
|
sscanf( PtLine, " %s", BufLine );
|
||||||
m_LibRef = FROM_UTF8( BufLine );
|
m_LibRef = FROM_UTF8( BufLine );
|
||||||
|
@ -1187,7 +1187,7 @@ int MODULE::ReadDescr( LINE_READER* aReader )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
case 'O': /* (Op)tions for auto placement */
|
case 'O': // (Op)tions for auto placement
|
||||||
itmp1 = itmp2 = 0;
|
itmp1 = itmp2 = 0;
|
||||||
sscanf( PtLine, " %X %X", &itmp1, &itmp2 );
|
sscanf( PtLine, " %X %X", &itmp1, &itmp2 );
|
||||||
|
|
||||||
|
@ -1212,7 +1212,7 @@ int MODULE::ReadDescr( LINE_READER* aReader )
|
||||||
case 'A':
|
case 'A':
|
||||||
if( Line[1] == 't' )
|
if( Line[1] == 't' )
|
||||||
{
|
{
|
||||||
/* At = (At)tributes of module */
|
// At = (At)tributes of module
|
||||||
if( strstr( PtLine, "SMD" ) )
|
if( strstr( PtLine, "SMD" ) )
|
||||||
m_Attributs |= MOD_CMS;
|
m_Attributs |= MOD_CMS;
|
||||||
|
|
||||||
|
@ -1238,7 +1238,7 @@ int MODULE::ReadDescr( LINE_READER* aReader )
|
||||||
textm = m_Reference;
|
textm = m_Reference;
|
||||||
else if( itmp1 == TEXT_is_VALUE )
|
else if( itmp1 == TEXT_is_VALUE )
|
||||||
textm = m_Value;
|
textm = m_Value;
|
||||||
else /* text is a drawing */
|
else // text is a drawing
|
||||||
{
|
{
|
||||||
textm = new TEXTE_MODULE( this );
|
textm = new TEXTE_MODULE( this );
|
||||||
m_Drawings.PushBack( textm );
|
m_Drawings.PushBack( textm );
|
||||||
|
@ -1246,7 +1246,7 @@ int MODULE::ReadDescr( LINE_READER* aReader )
|
||||||
textm->ReadDescr( aReader );
|
textm->ReadDescr( aReader );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'D': /* read a drawing item */
|
case 'D': // read a drawing item
|
||||||
EDGE_MODULE * edge;
|
EDGE_MODULE * edge;
|
||||||
edge = new EDGE_MODULE( this );
|
edge = new EDGE_MODULE( this );
|
||||||
m_Drawings.PushBack( edge );
|
m_Drawings.PushBack( edge );
|
||||||
|
@ -1254,23 +1254,23 @@ int MODULE::ReadDescr( LINE_READER* aReader )
|
||||||
edge->SetDrawCoord();
|
edge->SetDrawCoord();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'C': /* read documentation data */
|
case 'C': // read documentation data
|
||||||
m_Doc = FROM_UTF8( StrPurge( PtLine ) );
|
m_Doc = FROM_UTF8( StrPurge( PtLine ) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'K': /* Read key words */
|
case 'K': // Read key words
|
||||||
m_KeyWord = FROM_UTF8( StrPurge( PtLine ) );
|
m_KeyWord = FROM_UTF8( StrPurge( PtLine ) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '.': /* Read specific data */
|
case '.': // Read specific data
|
||||||
if( strnicmp( Line, ".SolderMask ", 12 ) == 0 )
|
if( strnicmp( Line, ".SolderMask ", 12 ) == 0 )
|
||||||
m_LocalSolderMaskMargin = atoi( Line + 12 );
|
SetLocalSolderMaskMargin( atoi( Line + 12 ) );
|
||||||
else if( strnicmp( Line, ".SolderPaste ", 13 ) == 0 )
|
else if( strnicmp( Line, ".SolderPaste ", 13 ) == 0 )
|
||||||
m_LocalSolderPasteMargin = atoi( Line + 13 );
|
SetLocalSolderPasteMargin( atoi( Line + 13 ) );
|
||||||
else if( strnicmp( Line, ".SolderPasteRatio ", 18 ) == 0 )
|
else if( strnicmp( Line, ".SolderPasteRatio ", 18 ) == 0 )
|
||||||
m_LocalSolderPasteMarginRatio = atof( Line + 18 );
|
SetLocalSolderPasteMarginRatio( atof( Line + 18 ) );
|
||||||
else if( strnicmp( Line, ".LocalClearance ", 16 ) == 0 )
|
else if( strnicmp( Line, ".LocalClearance ", 16 ) == 0 )
|
||||||
m_LocalClearance = atoi( Line + 16 );
|
SetLocalClearance( atoi( Line + 16 ) );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1279,7 +1279,7 @@ int MODULE::ReadDescr( LINE_READER* aReader )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Recalculate the bounding box */
|
// Recalculate the bounding box
|
||||||
CalculateBoundingBox();
|
CalculateBoundingBox();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1555,7 +1555,7 @@ bool DRAWSEGMENT::ReadDrawSegmentDescr( LINE_READER* aReader )
|
||||||
Line = aReader->Line();
|
Line = aReader->Line();
|
||||||
|
|
||||||
if( strnicmp( Line, "$End", 4 ) == 0 )
|
if( strnicmp( Line, "$End", 4 ) == 0 )
|
||||||
return true; /* End of description */
|
return true; // End of description
|
||||||
|
|
||||||
if( Line[0] == 'P' )
|
if( Line[0] == 'P' )
|
||||||
{
|
{
|
||||||
|
@ -1595,7 +1595,7 @@ bool DRAWSEGMENT::ReadDrawSegmentDescr( LINE_READER* aReader )
|
||||||
case 4:
|
case 4:
|
||||||
sscanf( token,"%X",&status );
|
sscanf( token,"%X",&status );
|
||||||
break;
|
break;
|
||||||
/* Bezier Control Points*/
|
// Bezier Control Points
|
||||||
case 5:
|
case 5:
|
||||||
sscanf( token,"%d",&m_BezierC1.x );
|
sscanf( token,"%d",&m_BezierC1.x );
|
||||||
break;
|
break;
|
||||||
|
@ -1794,7 +1794,7 @@ int ZONE_CONTAINER::ReadDescr( LINE_READER* aReader )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Set hatch mode later, after reading outlines corners data */
|
// Set hatch mode later, after reading outlines corners data
|
||||||
}
|
}
|
||||||
|
|
||||||
else if( strnicmp( Line, "ZPriority", 9 ) == 0 )
|
else if( strnicmp( Line, "ZPriority", 9 ) == 0 )
|
||||||
|
@ -1950,7 +1950,7 @@ int ZONE_CONTAINER::ReadDescr( LINE_READER* aReader )
|
||||||
SetNet( 0 );
|
SetNet( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set hatch here, when outlines corners are read */
|
// Set hatch here, when outlines corners are read
|
||||||
m_Poly->SetHatch( outline_hatch );
|
m_Poly->SetHatch( outline_hatch );
|
||||||
|
|
||||||
return error ? 0 : 1;
|
return error ? 0 : 1;
|
||||||
|
@ -2065,13 +2065,13 @@ int TEXTE_PCB::ReadTextePcbDescr( LINE_READER* aReader )
|
||||||
line = aReader->Line();
|
line = aReader->Line();
|
||||||
if( strnicmp( line, "$EndTEXTPCB", 11 ) == 0 )
|
if( strnicmp( line, "$EndTEXTPCB", 11 ) == 0 )
|
||||||
return 0;
|
return 0;
|
||||||
if( strncmp( line, "Te", 2 ) == 0 ) /* Text line (first line for multi line texts */
|
if( strncmp( line, "Te", 2 ) == 0 ) // Text line (first line for multi line texts
|
||||||
{
|
{
|
||||||
ReadDelimitedText( text, line + 2, sizeof(text) );
|
ReadDelimitedText( text, line + 2, sizeof(text) );
|
||||||
m_Text = FROM_UTF8( text );
|
m_Text = FROM_UTF8( text );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if( strncmp( line, "nl", 2 ) == 0 ) /* next line of the current text */
|
if( strncmp( line, "nl", 2 ) == 0 ) // next line of the current text
|
||||||
{
|
{
|
||||||
ReadDelimitedText( text, line + 2, sizeof(text) );
|
ReadDelimitedText( text, line + 2, sizeof(text) );
|
||||||
m_Text.Append( '\n' );
|
m_Text.Append( '\n' );
|
||||||
|
|
|
@ -755,18 +755,14 @@ void KICAD_PLUGIN::loadSETUP()
|
||||||
{
|
{
|
||||||
BIU x = biuParse( line + SZ( "PadSize" ), &data );
|
BIU x = biuParse( line + SZ( "PadSize" ), &data );
|
||||||
BIU y = biuParse( data );
|
BIU y = biuParse( data );
|
||||||
/* @todo
|
|
||||||
g_Pad_Master.m_Size = wxSize( x, y );
|
bds.m_Pad_Master.SetSize( wxSize( x, y ) );
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if( TESTLINE( "PadDrill" ) )
|
else if( TESTLINE( "PadDrill" ) )
|
||||||
{
|
{
|
||||||
BIU tmp = biuParse( line + SZ( "PadDrill" ) );
|
BIU tmp = biuParse( line + SZ( "PadDrill" ) );
|
||||||
/* @todo
|
bds.m_Pad_Master.SetDrillSize( wxSize( tmp, tmp ) );
|
||||||
g_Pad_Master.m_Drill.x( tmp );
|
|
||||||
g_Pad_Master.m_Drill.y( tmp );
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if( TESTLINE( "Pad2MaskClearance" ) )
|
else if( TESTLINE( "Pad2MaskClearance" ) )
|
||||||
|
@ -1102,11 +1098,10 @@ void KICAD_PLUGIN::loadPAD( MODULE* aModule )
|
||||||
// chances are both were ASCII, but why take chances?
|
// chances are both were ASCII, but why take chances?
|
||||||
|
|
||||||
pad->SetPadName( padname );
|
pad->SetPadName( padname );
|
||||||
pad->SetShape( padshape );
|
pad->SetShape( PAD_SHAPE_T( padshape ) );
|
||||||
pad->SetSize( wxSize( size_x, size_y ) );
|
pad->SetSize( wxSize( size_x, size_y ) );
|
||||||
pad->SetDelta( wxSize( delta_x, delta_y ) );
|
pad->SetDelta( wxSize( delta_x, delta_y ) );
|
||||||
pad->SetOrientation( orient );
|
pad->SetOrientation( orient );
|
||||||
pad->ComputeShapeMaxRadius();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if( TESTLINE( "Dr" ) ) // (Dr)ill
|
else if( TESTLINE( "Dr" ) ) // (Dr)ill
|
||||||
|
@ -1118,7 +1113,8 @@ void KICAD_PLUGIN::loadPAD( MODULE* aModule )
|
||||||
BIU drill_y = drill_x;
|
BIU drill_y = drill_x;
|
||||||
BIU offs_x = biuParse( data, &data );
|
BIU offs_x = biuParse( data, &data );
|
||||||
BIU offs_y = biuParse( data, &data );
|
BIU offs_y = biuParse( data, &data );
|
||||||
int drShape = PAD_CIRCLE;
|
|
||||||
|
PAD_SHAPE_T drShape = PAD_CIRCLE;
|
||||||
|
|
||||||
data = strtok( (char*) data, delims );
|
data = strtok( (char*) data, delims );
|
||||||
if( data ) // optional shape
|
if( data ) // optional shape
|
||||||
|
@ -1136,7 +1132,7 @@ void KICAD_PLUGIN::loadPAD( MODULE* aModule )
|
||||||
}
|
}
|
||||||
|
|
||||||
pad->SetDrillShape( drShape );
|
pad->SetDrillShape( drShape );
|
||||||
pad->SetOffset( wxSize( offs_x, offs_y ) );
|
pad->SetOffset( wxPoint( offs_x, offs_y ) );
|
||||||
pad->SetDrillSize( wxSize( drill_x, drill_y ) );
|
pad->SetDrillSize( wxSize( drill_x, drill_y ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1145,8 +1141,8 @@ void KICAD_PLUGIN::loadPAD( MODULE* aModule )
|
||||||
// e.g. "At SMD N 00888000"
|
// e.g. "At SMD N 00888000"
|
||||||
// sscanf( PtLine, "%s %s %X", BufLine, BufCar, &m_layerMask );
|
// sscanf( PtLine, "%s %s %X", BufLine, BufCar, &m_layerMask );
|
||||||
|
|
||||||
int attribute;
|
PAD_ATTR_T attribute;
|
||||||
int layer_mask;
|
int layer_mask;
|
||||||
|
|
||||||
data = strtok( line + SZ( "At" ), delims );
|
data = strtok( line + SZ( "At" ), delims );
|
||||||
|
|
||||||
|
@ -1226,9 +1222,11 @@ void KICAD_PLUGIN::loadPAD( MODULE* aModule )
|
||||||
|
|
||||||
else if( TESTLINE( "$EndPAD" ) )
|
else if( TESTLINE( "$EndPAD" ) )
|
||||||
{
|
{
|
||||||
RotatePoint( &pad->m_Pos, aModule->GetOrientation() );
|
wxPoint padpos = pad->GetPosition();
|
||||||
|
|
||||||
pad->m_Pos += aModule->GetPosition();
|
RotatePoint( &padpos, aModule->GetOrientation() );
|
||||||
|
|
||||||
|
pad->SetPosition( padpos + aModule->GetPosition() );
|
||||||
|
|
||||||
aModule->m_Pads.PushBack( pad.release() );
|
aModule->m_Pads.PushBack( pad.release() );
|
||||||
return; // preferred exit
|
return; // preferred exit
|
||||||
|
@ -2849,10 +2847,8 @@ void KICAD_PLUGIN::saveSETUP() const
|
||||||
fprintf( m_fp, "TextModSize %s\n", fmtBIUSize( bds.m_ModuleTextSize ).c_str() );
|
fprintf( m_fp, "TextModSize %s\n", fmtBIUSize( bds.m_ModuleTextSize ).c_str() );
|
||||||
fprintf( m_fp, "TextModWidth %s\n", fmtBIU( bds.m_ModuleTextWidth ).c_str() );
|
fprintf( m_fp, "TextModWidth %s\n", fmtBIU( bds.m_ModuleTextWidth ).c_str() );
|
||||||
|
|
||||||
/* @todo
|
fprintf( m_fp, "PadSize %s\n", fmtBIUSize( bds.m_Pad_Master.GetSize() ).c_str() );
|
||||||
fprintf( m_fp, "PadSize %d %d\n", g_Pad_Master.m_Size.x, g_Pad_Master.m_Size.y );
|
fprintf( m_fp, "PadDrill %s\n", fmtBIU( bds.m_Pad_Master.GetDrillSize().x ).c_str() );
|
||||||
fprintf( m_fp, "PadDrill %d\n", g_Pad_Master.m_Drill.x );
|
|
||||||
*/
|
|
||||||
|
|
||||||
fprintf( m_fp, "Pad2MaskClearance %s\n", fmtBIU( bds.m_SolderMaskMargin ).c_str() );
|
fprintf( m_fp, "Pad2MaskClearance %s\n", fmtBIU( bds.m_SolderMaskMargin ).c_str() );
|
||||||
|
|
||||||
|
@ -3138,7 +3134,7 @@ void KICAD_PLUGIN::savePAD( const D_PAD* me ) const
|
||||||
|
|
||||||
fprintf( m_fp, "Dr %s %s",
|
fprintf( m_fp, "Dr %s %s",
|
||||||
fmtBIU( me->GetDrillSize().x ).c_str(),
|
fmtBIU( me->GetDrillSize().x ).c_str(),
|
||||||
fmtBIUSize( me->GetOffset() ).c_str() );
|
fmtBIUPoint( me->GetOffset() ).c_str() );
|
||||||
|
|
||||||
if( me->GetDrillShape() == PAD_OVAL )
|
if( me->GetDrillShape() == PAD_OVAL )
|
||||||
{
|
{
|
||||||
|
|
|
@ -165,7 +165,7 @@ bool Magnetize( BOARD* m_Pcb, PCB_EDIT_FRAME* frame, int aCurrentTool, wxSize gr
|
||||||
if( doCheckNet && currTrack && currTrack->GetNet() != pad->GetNet() )
|
if( doCheckNet && currTrack && currTrack->GetNet() != pad->GetNet() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
*curpos = pad->m_Pos;
|
*curpos = pad->GetPosition();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -718,11 +718,13 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
||||||
|
|
||||||
void FOOTPRINT_EDIT_FRAME::Transform( MODULE* module, int transform )
|
void FOOTPRINT_EDIT_FRAME::Transform( MODULE* module, int transform )
|
||||||
{
|
{
|
||||||
D_PAD* pad = module->m_Pads;
|
D_PAD* pad = module->m_Pads;
|
||||||
EDA_ITEM* item = module->m_Drawings;
|
EDA_ITEM* item = module->m_Drawings;
|
||||||
TEXTE_MODULE* textmod;
|
TEXTE_MODULE* textmod;
|
||||||
EDGE_MODULE* edgemod;
|
EDGE_MODULE* edgemod;
|
||||||
double angle = 900; // Necessary +- 900 (+- 90 degrees) )
|
wxPoint pt;
|
||||||
|
wxSize size;
|
||||||
|
double angle = 900; // Necessary +- 900 (+- 90 degrees) )
|
||||||
|
|
||||||
switch( transform )
|
switch( transform )
|
||||||
{
|
{
|
||||||
|
@ -731,11 +733,20 @@ void FOOTPRINT_EDIT_FRAME::Transform( MODULE* module, int transform )
|
||||||
|
|
||||||
for( ; pad; pad = pad->Next() )
|
for( ; pad; pad = pad->Next() )
|
||||||
{
|
{
|
||||||
pad->SetPos0( pad->m_Pos );
|
pad->SetPos0( pad->GetPosition() );
|
||||||
pad->m_Orient -= angle;
|
pad->SetOrientation( pad->GetOrientation() - angle );
|
||||||
RotatePoint( &pad->m_Offset.x, &pad->m_Offset.y, angle );
|
|
||||||
EXCHG( pad->m_Size.x, pad->m_Size.y );
|
pt = pad->GetOffset();
|
||||||
RotatePoint( &pad->m_DeltaSize.x, &pad->m_DeltaSize.y, -angle );
|
RotatePoint( &pt, angle );
|
||||||
|
pad->SetOffset( pt );
|
||||||
|
|
||||||
|
size = pad->GetSize();
|
||||||
|
EXCHG( size.x, size.y );
|
||||||
|
pad->SetSize( size );
|
||||||
|
|
||||||
|
size = pad->GetDelta();
|
||||||
|
RotatePoint( &size.x, &size.y, -angle );
|
||||||
|
pad->SetDelta( size );
|
||||||
}
|
}
|
||||||
|
|
||||||
module->m_Reference->SetPos0( module->m_Reference->m_Pos );
|
module->m_Reference->SetPos0( module->m_Reference->m_Pos );
|
||||||
|
@ -772,13 +783,22 @@ void FOOTPRINT_EDIT_FRAME::Transform( MODULE* module, int transform )
|
||||||
case ID_MODEDIT_MODULE_MIRROR:
|
case ID_MODEDIT_MODULE_MIRROR:
|
||||||
for( ; pad; pad = pad->Next() )
|
for( ; pad; pad = pad->Next() )
|
||||||
{
|
{
|
||||||
NEGATE( pad->m_Pos.y );
|
pad->SetY( -pad->GetPosition().y );
|
||||||
NEGATE( pad->m_Pos0.y );
|
|
||||||
NEGATE( pad->m_Offset.y );
|
|
||||||
NEGATE( pad->m_DeltaSize.y );
|
|
||||||
|
|
||||||
if( pad->m_Orient )
|
pt = pad->GetPos0();
|
||||||
pad->m_Orient = 3600 - pad->m_Orient;
|
NEGATE( pt.y );
|
||||||
|
pad->SetPos0( pt );
|
||||||
|
|
||||||
|
pt = pad->GetOffset();
|
||||||
|
NEGATE( pt.y );
|
||||||
|
pad->SetOffset( pt );
|
||||||
|
|
||||||
|
size = pad->GetDelta();
|
||||||
|
NEGATE( size.y );
|
||||||
|
pad->SetDelta( size );
|
||||||
|
|
||||||
|
if( pad->GetOrientation() )
|
||||||
|
pad->SetOrientation( 3600 - pad->GetOrientation() );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reverse mirror of reference.
|
// Reverse mirror of reference.
|
||||||
|
|
|
@ -124,9 +124,9 @@ public:
|
||||||
void ToPrinter( wxCommandEvent& event );
|
void ToPrinter( wxCommandEvent& event );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Virtual function PrintPage
|
* Function PrintPage
|
||||||
* used to print a page
|
* is used to print a page. Prints the page pointed by ActiveScreen,
|
||||||
* Print the page pointed by ActiveScreen, set by the calling print function
|
* set by the calling print function.
|
||||||
* @param aDC = wxDC given by the calling print function
|
* @param aDC = wxDC given by the calling print function
|
||||||
* @param aPrintMaskLayer = not used here
|
* @param aPrintMaskLayer = not used here
|
||||||
* @param aPrintMirrorMode = not used here (Set when printing in mirror mode)
|
* @param aPrintMirrorMode = not used here (Set when printing in mirror mode)
|
||||||
|
@ -341,8 +341,8 @@ public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function DlgGlobalChange_PadSettings
|
* Function DlgGlobalChange_PadSettings
|
||||||
* Function to change pad caracteristics for the given footprint
|
* changes pad caracteristics for the given footprint
|
||||||
* or all footprints which look like the given footprint
|
* or all footprints which look like the given footprint.
|
||||||
* Options are set by the opened dialog.
|
* Options are set by the opened dialog.
|
||||||
* @param aPad is the pattern. The given footprint is the parent of this pad
|
* @param aPad is the pattern. The given footprint is the parent of this pad
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file move-drag_pads.cpp
|
* @file move-drag_pads.cpp
|
||||||
* @brief Edit footprint pads.
|
* @brief Edit footprint pads.
|
||||||
|
@ -39,10 +41,10 @@ static void Abort_Move_Pad( EDA_DRAW_PANEL* Panel, wxDC* DC )
|
||||||
|
|
||||||
pad->Draw( Panel, DC, GR_XOR );
|
pad->Draw( Panel, DC, GR_XOR );
|
||||||
pad->ClearFlags();
|
pad->ClearFlags();
|
||||||
pad->m_Pos = Pad_OldPos;
|
pad->SetPosition( Pad_OldPos );
|
||||||
pad->Draw( Panel, DC, GR_XOR );
|
pad->Draw( Panel, DC, GR_XOR );
|
||||||
|
|
||||||
/* Pad move in progress: the restore origin. */
|
// Pad move in progress: the restore origin.
|
||||||
if( g_Drag_Pistes_On )
|
if( g_Drag_Pistes_On )
|
||||||
{
|
{
|
||||||
for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ )
|
for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ )
|
||||||
|
@ -76,7 +78,7 @@ static void Show_Pad_Move( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPo
|
||||||
if( aErase )
|
if( aErase )
|
||||||
pad->Draw( aPanel, aDC, GR_XOR );
|
pad->Draw( aPanel, aDC, GR_XOR );
|
||||||
|
|
||||||
pad->m_Pos = screen->GetCrossHairPosition();
|
pad->SetPosition( screen->GetCrossHairPosition() );
|
||||||
pad->Draw( aPanel, aDC, GR_XOR );
|
pad->Draw( aPanel, aDC, GR_XOR );
|
||||||
|
|
||||||
if( !g_Drag_Pistes_On )
|
if( !g_Drag_Pistes_On )
|
||||||
|
@ -91,12 +93,12 @@ static void Show_Pad_Move( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPo
|
||||||
|
|
||||||
if( g_DragSegmentList[ii].m_Pad_Start )
|
if( g_DragSegmentList[ii].m_Pad_Start )
|
||||||
{
|
{
|
||||||
Track->m_Start = pad->m_Pos;
|
Track->m_Start = pad->GetPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
if( g_DragSegmentList[ii].m_Pad_End )
|
if( g_DragSegmentList[ii].m_Pad_End )
|
||||||
{
|
{
|
||||||
Track->m_End = pad->m_Pos;
|
Track->m_End = pad->GetPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
Track->Draw( aPanel, aDC, GR_XOR );
|
Track->Draw( aPanel, aDC, GR_XOR );
|
||||||
|
@ -106,29 +108,31 @@ static void Show_Pad_Move( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPo
|
||||||
|
|
||||||
/* Load list of features for default pad selection.
|
/* Load list of features for default pad selection.
|
||||||
*/
|
*/
|
||||||
void PCB_BASE_FRAME::Export_Pad_Settings( D_PAD* pt_pad )
|
void PCB_BASE_FRAME::Export_Pad_Settings( D_PAD* aPad )
|
||||||
{
|
{
|
||||||
if( pt_pad == NULL )
|
if( aPad == NULL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pt_pad->DisplayInfo( this );
|
aPad->DisplayInfo( this );
|
||||||
|
|
||||||
g_Pad_Master.m_PadShape = pt_pad->m_PadShape;
|
D_PAD& mp = GetDesignSettings().m_Pad_Master;
|
||||||
g_Pad_Master.m_Attribut = pt_pad->m_Attribut;
|
|
||||||
g_Pad_Master.m_layerMask = pt_pad->m_layerMask;
|
|
||||||
g_Pad_Master.m_Orient = pt_pad->m_Orient -
|
|
||||||
( (MODULE*) pt_pad->GetParent() )->m_Orient;
|
|
||||||
g_Pad_Master.m_Size = pt_pad->m_Size;
|
|
||||||
g_Pad_Master.m_DeltaSize = pt_pad->m_DeltaSize;
|
|
||||||
pt_pad->ComputeShapeMaxRadius();
|
|
||||||
|
|
||||||
g_Pad_Master.m_Offset = pt_pad->m_Offset;
|
mp.SetShape( aPad->GetShape() );
|
||||||
g_Pad_Master.m_Drill = pt_pad->m_Drill;
|
mp.SetAttribute( aPad->GetAttribute() );
|
||||||
g_Pad_Master.m_DrillShape = pt_pad->m_DrillShape;
|
mp.SetLayerMask( aPad->GetLayerMask() );
|
||||||
|
|
||||||
|
mp.SetOrientation( aPad->GetOrientation() - aPad->GetParent()->GetOrientation() );
|
||||||
|
|
||||||
|
mp.SetSize( aPad->GetSize() );
|
||||||
|
mp.SetDelta( aPad->GetDelta() );
|
||||||
|
|
||||||
|
mp.SetOffset( aPad->GetOffset() );
|
||||||
|
mp.SetDrillSize( aPad->GetDrillSize() );
|
||||||
|
mp.SetDrillShape( aPad->GetDrillShape() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Imports the new values of dimensions of the pad edge by pt_pad
|
/* Imports the new values of dimensions of the pad edge by aPad
|
||||||
* - Source: selected values of general characteristics
|
* - Source: selected values of general characteristics
|
||||||
* - Measurements are modified
|
* - Measurements are modified
|
||||||
* - The position, names, and keys are not.
|
* - The position, names, and keys are not.
|
||||||
|
@ -142,72 +146,77 @@ void PCB_BASE_FRAME::Import_Pad_Settings( D_PAD* aPad, bool aDraw )
|
||||||
aPad->ClearFlags( DO_NOT_DRAW );
|
aPad->ClearFlags( DO_NOT_DRAW );
|
||||||
}
|
}
|
||||||
|
|
||||||
aPad->m_PadShape = g_Pad_Master.m_PadShape;
|
D_PAD& mp = GetDesignSettings().m_Pad_Master;
|
||||||
aPad->m_layerMask = g_Pad_Master.m_layerMask;
|
|
||||||
aPad->m_Attribut = g_Pad_Master.m_Attribut;
|
|
||||||
aPad->m_Orient = g_Pad_Master.m_Orient + ( (MODULE*) aPad->GetParent() )->m_Orient;
|
|
||||||
aPad->m_Size = g_Pad_Master.m_Size;
|
|
||||||
aPad->m_DeltaSize = wxSize( 0, 0 );
|
|
||||||
aPad->m_Offset = g_Pad_Master.m_Offset;
|
|
||||||
aPad->m_Drill = g_Pad_Master.m_Drill;
|
|
||||||
aPad->m_DrillShape = g_Pad_Master.m_DrillShape;
|
|
||||||
|
|
||||||
switch( g_Pad_Master.m_PadShape )
|
aPad->SetShape( mp.GetShape() );
|
||||||
|
aPad->SetLayerMask( mp.GetLayerMask() );
|
||||||
|
aPad->SetAttribute( mp.GetAttribute() );
|
||||||
|
aPad->SetOrientation( mp.GetOrientation() + aPad->GetParent()->GetOrientation() );
|
||||||
|
aPad->SetSize( mp.GetSize() );
|
||||||
|
aPad->SetDelta( wxSize( 0, 0 ) );
|
||||||
|
aPad->SetOffset( mp.GetOffset() );
|
||||||
|
aPad->SetDrillSize( mp.GetDrillSize() );
|
||||||
|
aPad->SetDrillShape( mp.GetDrillShape() );
|
||||||
|
|
||||||
|
switch( mp.GetShape() )
|
||||||
{
|
{
|
||||||
case PAD_TRAPEZOID:
|
case PAD_TRAPEZOID:
|
||||||
aPad->m_DeltaSize = g_Pad_Master.m_DeltaSize;
|
aPad->SetDelta( mp.GetDelta() );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAD_CIRCLE:
|
case PAD_CIRCLE:
|
||||||
aPad->m_Size.y = aPad->m_Size.x;
|
// set size.y to size.x
|
||||||
|
aPad->SetSize( wxSize( aPad->GetSize().x, aPad->GetSize().x ) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch( g_Pad_Master.m_Attribut & 0x7F )
|
switch( mp.GetAttribute() )
|
||||||
{
|
{
|
||||||
case PAD_SMD:
|
case PAD_SMD:
|
||||||
case PAD_CONN:
|
case PAD_CONN:
|
||||||
aPad->m_Drill = wxSize( 0, 0 );
|
aPad->SetDrillSize( wxSize( 0, 0 ) );
|
||||||
aPad->m_Offset.x = 0;
|
aPad->SetOffset( wxPoint( 0, 0 ) );
|
||||||
aPad->m_Offset.y = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
aPad->ComputeShapeMaxRadius();
|
|
||||||
|
|
||||||
if( aDraw )
|
if( aDraw )
|
||||||
m_canvas->RefreshDrawingRect( aPad->GetBoundingBox() );
|
m_canvas->RefreshDrawingRect( aPad->GetBoundingBox() );
|
||||||
|
|
||||||
( (MODULE*) aPad->GetParent() )->m_LastEdit_Time = time( NULL );
|
aPad->GetParent()->m_LastEdit_Time = time( NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Add a pad on the selected module.
|
/* Add a pad on the selected module.
|
||||||
*/
|
*/
|
||||||
void PCB_BASE_FRAME::AddPad( MODULE* Module, bool draw )
|
void PCB_BASE_FRAME::AddPad( MODULE* aModule, bool draw )
|
||||||
{
|
{
|
||||||
wxString lastPadName; // Last used pad name (pad num)
|
// Last used pad name (pad num)
|
||||||
lastPadName = g_Pad_Master.GetPadName();
|
wxString lastPadName = GetDesignSettings().m_Pad_Master.GetPadName();
|
||||||
|
|
||||||
m_Pcb->m_Status_Pcb = 0;
|
m_Pcb->m_Status_Pcb = 0;
|
||||||
Module->m_LastEdit_Time = time( NULL );
|
aModule->m_LastEdit_Time = time( NULL );
|
||||||
|
|
||||||
D_PAD* Pad = new D_PAD( Module );
|
D_PAD* pad = new D_PAD( aModule );
|
||||||
|
|
||||||
/* Add the new pad to end of the module pad list. */
|
// Add the new pad to end of the module pad list.
|
||||||
Module->m_Pads.PushBack( Pad );
|
aModule->m_Pads.PushBack( pad );
|
||||||
|
|
||||||
/* Update the pad properties. */
|
// Update the pad properties.
|
||||||
Import_Pad_Settings( Pad, false );
|
Import_Pad_Settings( pad, false );
|
||||||
Pad->SetNetname( wxEmptyString );
|
pad->SetNetname( wxEmptyString );
|
||||||
|
|
||||||
Pad->m_Pos = GetScreen()->GetCrossHairPosition();
|
pad->SetPosition( GetScreen()->GetCrossHairPosition() );
|
||||||
|
|
||||||
// Set the relative pad position
|
// Set the relative pad position
|
||||||
// ( pad position for module orient, 0, and relative to the module position)
|
// ( pad position for module orient, 0, and relative to the module position)
|
||||||
Pad->m_Pos0 = Pad->m_Pos - Module->m_Pos;
|
|
||||||
RotatePoint( &Pad->m_Pos0, -Module->m_Orient );
|
|
||||||
|
|
||||||
/* Automatically increment the current pad number. */
|
wxPoint pos0 = pad->GetPosition() - aModule->GetPosition();
|
||||||
|
RotatePoint( &pos0, -aModule->GetOrientation() );
|
||||||
|
pad->SetPos0( pos0 );
|
||||||
|
|
||||||
|
// Automatically increment the current pad number.
|
||||||
long num = 0;
|
long num = 0;
|
||||||
int ponder = 1;
|
int ponder = 1;
|
||||||
|
|
||||||
|
@ -220,14 +229,15 @@ void PCB_BASE_FRAME::AddPad( MODULE* Module, bool draw )
|
||||||
|
|
||||||
num++; // Use next number for the new pad
|
num++; // Use next number for the new pad
|
||||||
lastPadName << num;
|
lastPadName << num;
|
||||||
Pad->SetPadName( lastPadName );
|
pad->SetPadName( lastPadName );
|
||||||
g_Pad_Master.SetPadName(lastPadName);
|
|
||||||
|
|
||||||
Module->CalculateBoundingBox();
|
GetDesignSettings().m_Pad_Master.SetPadName(lastPadName);
|
||||||
Pad->DisplayInfo( this );
|
|
||||||
|
aModule->CalculateBoundingBox();
|
||||||
|
pad->DisplayInfo( this );
|
||||||
|
|
||||||
if( draw )
|
if( draw )
|
||||||
m_canvas->RefreshDrawingRect( Module->GetBoundingBox() );
|
m_canvas->RefreshDrawingRect( aModule->GetBoundingBox() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -241,20 +251,20 @@ void PCB_BASE_FRAME::AddPad( MODULE* Module, bool draw )
|
||||||
*/
|
*/
|
||||||
void PCB_BASE_FRAME::DeletePad( D_PAD* aPad, bool aQuery )
|
void PCB_BASE_FRAME::DeletePad( D_PAD* aPad, bool aQuery )
|
||||||
{
|
{
|
||||||
MODULE* Module;
|
MODULE* module;
|
||||||
|
|
||||||
if( aPad == NULL )
|
if( aPad == NULL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Module = (MODULE*) aPad->GetParent();
|
module = (MODULE*) aPad->GetParent();
|
||||||
Module->m_LastEdit_Time = time( NULL );
|
module->m_LastEdit_Time = time( NULL );
|
||||||
|
|
||||||
if( aQuery )
|
if( aQuery )
|
||||||
{
|
{
|
||||||
wxString msg;
|
wxString msg;
|
||||||
msg.Printf( _( "Delete Pad (module %s %s) " ),
|
msg.Printf( _( "Delete Pad (module %s %s) " ),
|
||||||
GetChars( Module->m_Reference->m_Text ),
|
GetChars( module->m_Reference->m_Text ),
|
||||||
GetChars( Module->m_Value->m_Text ) );
|
GetChars( module->m_Value->m_Text ) );
|
||||||
|
|
||||||
if( !IsOK( this, msg ) )
|
if( !IsOK( this, msg ) )
|
||||||
return;
|
return;
|
||||||
|
@ -262,53 +272,54 @@ void PCB_BASE_FRAME::DeletePad( D_PAD* aPad, bool aQuery )
|
||||||
|
|
||||||
m_Pcb->m_Status_Pcb = 0;
|
m_Pcb->m_Status_Pcb = 0;
|
||||||
aPad->DeleteStructure();
|
aPad->DeleteStructure();
|
||||||
m_canvas->RefreshDrawingRect( Module->GetBoundingBox() );
|
m_canvas->RefreshDrawingRect( module->GetBoundingBox() );
|
||||||
Module->CalculateBoundingBox();
|
module->CalculateBoundingBox();
|
||||||
|
|
||||||
OnModify();
|
OnModify();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Function to initialize the "move pad" command */
|
// Function to initialize the "move pad" command
|
||||||
void PCB_BASE_FRAME::StartMovePad( D_PAD* Pad, wxDC* DC )
|
void PCB_BASE_FRAME::StartMovePad( D_PAD* aPad, wxDC* DC )
|
||||||
{
|
{
|
||||||
if( Pad == NULL )
|
if( aPad == NULL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
s_CurrentSelectedPad = Pad;
|
s_CurrentSelectedPad = aPad;
|
||||||
Pad_OldPos = Pad->m_Pos;
|
|
||||||
Pad->DisplayInfo( this );
|
Pad_OldPos = aPad->GetPosition();
|
||||||
|
|
||||||
|
aPad->DisplayInfo( this );
|
||||||
m_canvas->SetMouseCapture( Show_Pad_Move, Abort_Move_Pad );
|
m_canvas->SetMouseCapture( Show_Pad_Move, Abort_Move_Pad );
|
||||||
|
|
||||||
/* Draw the pad (SKETCH mode) */
|
// Draw the pad (SKETCH mode)
|
||||||
Pad->Draw( m_canvas, DC, GR_XOR );
|
aPad->Draw( m_canvas, DC, GR_XOR );
|
||||||
Pad->SetFlags( IS_MOVED );
|
aPad->SetFlags( IS_MOVED );
|
||||||
Pad->Draw( m_canvas, DC, GR_XOR );
|
aPad->Draw( m_canvas, DC, GR_XOR );
|
||||||
|
|
||||||
/* Build the list of track segments to drag if the command is a drag pad*/
|
// Build the list of track segments to drag if the command is a drag pad
|
||||||
if( g_Drag_Pistes_On )
|
if( g_Drag_Pistes_On )
|
||||||
Build_1_Pad_SegmentsToDrag( m_canvas, DC, Pad );
|
Build_1_Pad_SegmentsToDrag( m_canvas, DC, aPad );
|
||||||
else
|
else
|
||||||
EraseDragList();
|
EraseDragList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Routine to place a moved pad. */
|
// Routine to place a moved pad.
|
||||||
void PCB_BASE_FRAME::PlacePad( D_PAD* Pad, wxDC* DC )
|
void PCB_BASE_FRAME::PlacePad( D_PAD* aPad, wxDC* DC )
|
||||||
{
|
{
|
||||||
int dX, dY;
|
int dX, dY;
|
||||||
TRACK* Track;
|
TRACK* Track;
|
||||||
MODULE* Module;
|
|
||||||
|
|
||||||
if( Pad == NULL )
|
if( aPad == NULL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Module = (MODULE*) Pad->GetParent();
|
MODULE* module = aPad->GetParent();
|
||||||
|
|
||||||
ITEM_PICKER picker( NULL, UR_CHANGED );
|
ITEM_PICKER picker( NULL, UR_CHANGED );
|
||||||
PICKED_ITEMS_LIST pickList;
|
PICKED_ITEMS_LIST pickList;
|
||||||
|
|
||||||
/* Save dragged track segments in undo list */
|
// Save dragged track segments in undo list
|
||||||
for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ )
|
for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ )
|
||||||
{
|
{
|
||||||
Track = g_DragSegmentList[ii].m_Segm;
|
Track = g_DragSegmentList[ii].m_Segm;
|
||||||
|
@ -324,34 +335,34 @@ void PCB_BASE_FRAME::PlacePad( D_PAD* Pad, wxDC* DC )
|
||||||
pickList.PushItem( picker );
|
pickList.PushItem( picker );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save old module and old items values */
|
// Save old module and old items values
|
||||||
wxPoint pad_curr_position = Pad->m_Pos;
|
wxPoint pad_curr_position = aPad->GetPosition();
|
||||||
|
|
||||||
Pad->m_Pos = Pad_OldPos;
|
aPad->SetPosition( Pad_OldPos );
|
||||||
|
|
||||||
if( g_DragSegmentList.size() == 0 )
|
if( g_DragSegmentList.size() == 0 )
|
||||||
SaveCopyInUndoList( Module, UR_CHANGED );
|
SaveCopyInUndoList( module, UR_CHANGED );
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
picker.SetItem( Module );
|
picker.SetItem( module );
|
||||||
pickList.PushItem( picker );
|
pickList.PushItem( picker );
|
||||||
SaveCopyInUndoList( pickList, UR_CHANGED );
|
SaveCopyInUndoList( pickList, UR_CHANGED );
|
||||||
}
|
}
|
||||||
|
|
||||||
Pad->m_Pos = pad_curr_position;
|
aPad->SetPosition( pad_curr_position );
|
||||||
Pad->Draw( m_canvas, DC, GR_XOR );
|
aPad->Draw( m_canvas, DC, GR_XOR );
|
||||||
|
|
||||||
/* Redraw dragged track segments */
|
// Redraw dragged track segments
|
||||||
for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ )
|
for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ )
|
||||||
{
|
{
|
||||||
Track = g_DragSegmentList[ii].m_Segm;
|
Track = g_DragSegmentList[ii].m_Segm;
|
||||||
|
|
||||||
// Set the new state
|
// Set the new state
|
||||||
if( g_DragSegmentList[ii].m_Pad_Start )
|
if( g_DragSegmentList[ii].m_Pad_Start )
|
||||||
Track->m_Start = Pad->m_Pos;
|
Track->m_Start = aPad->GetPosition();
|
||||||
|
|
||||||
if( g_DragSegmentList[ii].m_Pad_End )
|
if( g_DragSegmentList[ii].m_Pad_End )
|
||||||
Track->m_End = Pad->m_Pos;
|
Track->m_End = aPad->GetPosition();
|
||||||
|
|
||||||
Track->SetState( IN_EDIT, OFF );
|
Track->SetState( IN_EDIT, OFF );
|
||||||
|
|
||||||
|
@ -359,21 +370,23 @@ void PCB_BASE_FRAME::PlacePad( D_PAD* Pad, wxDC* DC )
|
||||||
Track->Draw( m_canvas, DC, GR_OR );
|
Track->Draw( m_canvas, DC, GR_OR );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compute local coordinates (i.e refer to Module position and for Module orient = 0) */
|
// Compute local coordinates (i.e refer to module position and for module orient = 0)
|
||||||
dX = Pad->m_Pos.x - Pad_OldPos.x;
|
dX = aPad->GetPosition().x - Pad_OldPos.x;
|
||||||
dY = Pad->m_Pos.y - Pad_OldPos.y;
|
dY = aPad->GetPosition().y - Pad_OldPos.y;
|
||||||
RotatePoint( &dX, &dY, -Module->m_Orient );
|
|
||||||
|
|
||||||
Pad->m_Pos0.x += dX;
|
RotatePoint( &dX, &dY, -module->GetOrientation() );
|
||||||
s_CurrentSelectedPad->m_Pos0.y += dY;
|
|
||||||
|
|
||||||
Pad->ClearFlags();
|
aPad->SetX0( dX + aPad->GetPos0().x );
|
||||||
|
|
||||||
|
s_CurrentSelectedPad->SetY0( dY + s_CurrentSelectedPad->GetPos0().y );
|
||||||
|
|
||||||
|
aPad->ClearFlags();
|
||||||
|
|
||||||
if( DC )
|
if( DC )
|
||||||
Pad->Draw( m_canvas, DC, GR_OR );
|
aPad->Draw( m_canvas, DC, GR_OR );
|
||||||
|
|
||||||
Module->CalculateBoundingBox();
|
module->CalculateBoundingBox();
|
||||||
Module->m_LastEdit_Time = time( NULL );
|
module->m_LastEdit_Time = time( NULL );
|
||||||
|
|
||||||
EraseDragList();
|
EraseDragList();
|
||||||
|
|
||||||
|
@ -383,33 +396,43 @@ void PCB_BASE_FRAME::PlacePad( D_PAD* Pad, wxDC* DC )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Rotate selected pad 90 degrees.
|
// Rotate selected pad 90 degrees.
|
||||||
*/
|
void PCB_BASE_FRAME::RotatePad( D_PAD* aPad, wxDC* DC )
|
||||||
void PCB_BASE_FRAME::RotatePad( D_PAD* Pad, wxDC* DC )
|
|
||||||
{
|
{
|
||||||
MODULE* Module;
|
if( aPad == NULL )
|
||||||
|
|
||||||
if( Pad == NULL )
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Module = (MODULE*) Pad->GetParent();
|
MODULE* module = aPad->GetParent();
|
||||||
Module->m_LastEdit_Time = time( NULL );
|
|
||||||
|
module->m_LastEdit_Time = time( NULL );
|
||||||
|
|
||||||
OnModify();
|
OnModify();
|
||||||
|
|
||||||
if( DC )
|
if( DC )
|
||||||
Module->Draw( m_canvas, DC, GR_XOR );
|
module->Draw( m_canvas, DC, GR_XOR );
|
||||||
|
|
||||||
EXCHG( Pad->m_Size.x, Pad->m_Size.y );
|
wxSize sz = aPad->GetSize();
|
||||||
EXCHG( Pad->m_Drill.x, Pad->m_Drill.y );
|
EXCHG( sz.x, sz.y );
|
||||||
EXCHG( Pad->m_Offset.x, Pad->m_Offset.y );
|
aPad->SetSize( sz );
|
||||||
Pad->m_Offset.y = -Pad->m_Offset.y;
|
|
||||||
|
|
||||||
EXCHG( Pad->m_DeltaSize.x, Pad->m_DeltaSize.y );
|
sz = aPad->GetDrillSize();
|
||||||
Pad->m_DeltaSize.x = -Pad->m_DeltaSize.x;
|
EXCHG( sz.x, sz.y );
|
||||||
Module->CalculateBoundingBox();
|
aPad->SetDrillSize( sz );
|
||||||
Pad->DisplayInfo( this );
|
|
||||||
|
wxPoint pt = aPad->GetOffset();
|
||||||
|
EXCHG( pt.x, pt.y );
|
||||||
|
aPad->SetOffset( pt );
|
||||||
|
|
||||||
|
aPad->SetOffset( wxPoint( aPad->GetOffset().x, -aPad->GetOffset().y ) );
|
||||||
|
|
||||||
|
sz = aPad->GetDelta();
|
||||||
|
EXCHG( sz.x, sz.y );
|
||||||
|
sz.x = -sz.x;
|
||||||
|
aPad->SetDelta( sz );
|
||||||
|
|
||||||
|
module->CalculateBoundingBox();
|
||||||
|
aPad->DisplayInfo( this );
|
||||||
|
|
||||||
if( DC )
|
if( DC )
|
||||||
Module->Draw( m_canvas, DC, GR_OR );
|
module->Draw( m_canvas, DC, GR_OR );
|
||||||
}
|
}
|
||||||
|
|
|
@ -164,7 +164,7 @@ void PCB_EDIT_FRAME::Begin_Self( wxDC* DC )
|
||||||
|
|
||||||
Self_On = 1;
|
Self_On = 1;
|
||||||
|
|
||||||
/* Update the initial coordinates. */
|
// Update the initial coordinates.
|
||||||
GetScreen()->m_O_Curseur = GetScreen()->GetCrossHairPosition();
|
GetScreen()->m_O_Curseur = GetScreen()->GetCrossHairPosition();
|
||||||
UpdateStatusBar();
|
UpdateStatusBar();
|
||||||
|
|
||||||
|
@ -175,7 +175,7 @@ void PCB_EDIT_FRAME::Begin_Self( wxDC* DC )
|
||||||
|
|
||||||
MODULE* PCB_EDIT_FRAME::Genere_Self( wxDC* DC )
|
MODULE* PCB_EDIT_FRAME::Genere_Self( wxDC* DC )
|
||||||
{
|
{
|
||||||
D_PAD* PtPad;
|
D_PAD* pad;
|
||||||
int ll;
|
int ll;
|
||||||
wxString msg;
|
wxString msg;
|
||||||
|
|
||||||
|
@ -254,27 +254,28 @@ MODULE* PCB_EDIT_FRAME::Genere_Self( wxDC* DC )
|
||||||
}
|
}
|
||||||
|
|
||||||
// Place a pad on each end of coil.
|
// Place a pad on each end of coil.
|
||||||
PtPad = new D_PAD( module );
|
pad = new D_PAD( module );
|
||||||
|
|
||||||
module->m_Pads.PushFront( PtPad );
|
module->m_Pads.PushFront( pad );
|
||||||
|
|
||||||
PtPad->SetPadName( wxT( "1" ) );
|
pad->SetPadName( wxT( "1" ) );
|
||||||
PtPad->m_Pos = Mself.m_End;
|
pad->SetPosition( Mself.m_End );
|
||||||
PtPad->m_Pos0 = PtPad->m_Pos - module->m_Pos;
|
pad->SetPos0( pad->GetPosition() - module->GetPosition() );
|
||||||
PtPad->m_Size.x = PtPad->m_Size.y = Mself.m_Width;
|
|
||||||
PtPad->m_layerMask = GetLayerMask( module->GetLayer() );
|
|
||||||
PtPad->m_Attribut = PAD_SMD;
|
|
||||||
PtPad->m_PadShape = PAD_CIRCLE;
|
|
||||||
PtPad->ComputeShapeMaxRadius();
|
|
||||||
|
|
||||||
D_PAD* newpad = new D_PAD( *PtPad );
|
pad->SetSize( wxSize( Mself.m_Width, Mself.m_Width ) );
|
||||||
|
|
||||||
module->m_Pads.Insert( newpad, PtPad->Next() );
|
pad->SetLayerMask( GetLayerMask( module->GetLayer() ) );
|
||||||
|
pad->SetAttribute( PAD_SMD );
|
||||||
|
pad->SetShape( PAD_CIRCLE );
|
||||||
|
|
||||||
PtPad = newpad;
|
D_PAD* newpad = new D_PAD( *pad );
|
||||||
PtPad->SetPadName( wxT( "2" ) );
|
|
||||||
PtPad->m_Pos = Mself.m_Start;
|
module->m_Pads.Insert( newpad, pad->Next() );
|
||||||
PtPad->m_Pos0 = PtPad->m_Pos - module->m_Pos;
|
|
||||||
|
pad = newpad;
|
||||||
|
pad->SetPadName( wxT( "2" ) );
|
||||||
|
pad->SetPosition( Mself.m_Start );
|
||||||
|
pad->SetPos0( pad->GetPosition() - module->GetPosition() );
|
||||||
|
|
||||||
// Modify text positions.
|
// Modify text positions.
|
||||||
module->DisplayInfo( this );
|
module->DisplayInfo( this );
|
||||||
|
@ -381,7 +382,7 @@ int BuildCornersList_S_Shape( std::vector <wxPoint>& aBuffer,
|
||||||
*/
|
*/
|
||||||
wxSize size;
|
wxSize size;
|
||||||
|
|
||||||
// This scale factor adjust the arc lenght to handle
|
// This scale factor adjusts the arc length to handle
|
||||||
// the arc to segment approximation.
|
// the arc to segment approximation.
|
||||||
// because we use SEGM_COUNT_PER_360DEG segment to approximate a circle,
|
// because we use SEGM_COUNT_PER_360DEG segment to approximate a circle,
|
||||||
// the trace len must be corrected when calculated using arcs
|
// the trace len must be corrected when calculated using arcs
|
||||||
|
@ -468,7 +469,7 @@ int BuildCornersList_S_Shape( std::vector <wxPoint>& aBuffer,
|
||||||
aBuffer.push_back( pt );
|
aBuffer.push_back( pt );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create shape. */
|
// Create shape.
|
||||||
int ii;
|
int ii;
|
||||||
int sign = 1;
|
int sign = 1;
|
||||||
segm_count += 1; // increase segm_count to create the last half_size segment
|
segm_count += 1; // increase segm_count to create the last half_size segment
|
||||||
|
@ -477,7 +478,7 @@ int BuildCornersList_S_Shape( std::vector <wxPoint>& aBuffer,
|
||||||
{
|
{
|
||||||
int arc_angle;
|
int arc_angle;
|
||||||
|
|
||||||
if( ii & 1 ) /* odd order arcs are greater than 0 */
|
if( ii & 1 ) // odd order arcs are greater than 0
|
||||||
sign = -1;
|
sign = -1;
|
||||||
else
|
else
|
||||||
sign = 1;
|
sign = 1;
|
||||||
|
@ -548,21 +549,22 @@ MODULE* PCB_EDIT_FRAME::Create_MuWaveBasicShape( const wxString& name, int pad_c
|
||||||
|
|
||||||
module->m_Reference->m_Thickness = DEFAULT_SIZE / 4;
|
module->m_Reference->m_Thickness = DEFAULT_SIZE / 4;
|
||||||
|
|
||||||
/* Create 2 pads used in gaps and stubs.
|
// Create 2 pads used in gaps and stubs. The gap is between these 2 pads
|
||||||
* The gap is between these 2 pads
|
// the stub is the pad 2
|
||||||
* the stub is the pad 2
|
|
||||||
*/
|
|
||||||
while( pad_count-- )
|
while( pad_count-- )
|
||||||
{
|
{
|
||||||
D_PAD* pad = new D_PAD( module );
|
D_PAD* pad = new D_PAD( module );
|
||||||
|
|
||||||
module->m_Pads.PushFront( pad );
|
module->m_Pads.PushFront( pad );
|
||||||
|
|
||||||
pad->m_Size.x = pad->m_Size.y = GetBoard()->GetCurrentTrackWidth();
|
int tw = GetBoard()->GetCurrentTrackWidth();
|
||||||
pad->m_Pos = module->m_Pos;
|
pad->SetSize( wxSize( tw, tw ) );
|
||||||
pad->m_PadShape = PAD_RECT;
|
|
||||||
pad->m_Attribut = PAD_SMD;
|
pad->SetPosition( module->GetPosition() );
|
||||||
pad->m_layerMask = LAYER_FRONT;
|
pad->SetShape( PAD_RECT );
|
||||||
|
pad->SetAttribute( PAD_SMD );
|
||||||
|
pad->SetLayerMask( LAYER_FRONT );
|
||||||
|
|
||||||
Line.Printf( wxT( "%d" ), pad_num );
|
Line.Printf( wxT( "%d" ), pad_num );
|
||||||
pad->SetPadName( Line );
|
pad->SetPadName( Line );
|
||||||
pad_num++;
|
pad_num++;
|
||||||
|
@ -581,7 +583,7 @@ MODULE* PCB_EDIT_FRAME::Create_MuWaveComponent( int shape_type )
|
||||||
int pad_count = 2;
|
int pad_count = 2;
|
||||||
int angle = 0;
|
int angle = 0;
|
||||||
|
|
||||||
/* Enter the size of the gap or stub*/
|
// Enter the size of the gap or stub
|
||||||
int gap_size = GetBoard()->GetCurrentTrackWidth();
|
int gap_size = GetBoard()->GetCurrentTrackWidth();
|
||||||
|
|
||||||
switch( shape_type )
|
switch( shape_type )
|
||||||
|
@ -662,57 +664,61 @@ MODULE* PCB_EDIT_FRAME::Create_MuWaveComponent( int shape_type )
|
||||||
switch( shape_type )
|
switch( shape_type )
|
||||||
{
|
{
|
||||||
case 0: //Gap :
|
case 0: //Gap :
|
||||||
oX = pad->m_Pos0.x = -( gap_size + pad->m_Size.x ) / 2;
|
oX = -( gap_size + pad->GetSize().x ) / 2;
|
||||||
pad->m_Pos.x += pad->m_Pos0.x;
|
pad->SetX0( oX );
|
||||||
|
|
||||||
|
pad->SetX( pad->GetPos0().x + pad->GetPosition().x );
|
||||||
|
|
||||||
pad = pad->Next();
|
pad = pad->Next();
|
||||||
pad->m_Pos0.x = oX + gap_size + pad->m_Size.x;
|
|
||||||
pad->m_Pos.x += pad->m_Pos0.x;
|
pad->SetX0( oX + gap_size + pad->GetSize().x );
|
||||||
|
pad->SetX( pad->GetPos0().x + pad->GetPosition().x );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1: //Stub :
|
case 1: //Stub :
|
||||||
pad->SetPadName( wxT( "1" ) );
|
pad->SetPadName( wxT( "1" ) );
|
||||||
pad = pad->Next();
|
pad = pad->Next();
|
||||||
pad->m_Pos0.y = -( gap_size + pad->m_Size.y ) / 2;
|
pad->SetY0( -( gap_size + pad->GetSize().y ) / 2 );
|
||||||
pad->m_Size.y = gap_size;
|
pad->SetSize( wxSize( pad->GetSize().x, gap_size ) );
|
||||||
pad->m_Pos.y += pad->m_Pos0.y;
|
pad->SetY( pad->GetPos0().y + pad->GetPosition().y );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2: // Arc Stub created by a polygonal approach:
|
case 2: // Arc Stub created by a polygonal approach:
|
||||||
{
|
|
||||||
EDGE_MODULE* edge = new EDGE_MODULE( module );
|
|
||||||
module->m_Drawings.PushFront( edge );
|
|
||||||
|
|
||||||
edge->SetShape( S_POLYGON );
|
|
||||||
edge->SetLayer( LAYER_N_FRONT );
|
|
||||||
|
|
||||||
int numPoints = angle / 50 + 3; // Note: angles are in 0.1 degrees
|
|
||||||
std::vector<wxPoint> polyPoints = edge->GetPolyPoints();
|
|
||||||
polyPoints.reserve( numPoints );
|
|
||||||
|
|
||||||
edge->m_Start0.y = -pad->m_Size.y / 2;
|
|
||||||
|
|
||||||
polyPoints.push_back( wxPoint( 0, 0 ) );
|
|
||||||
|
|
||||||
int theta = -angle / 2;
|
|
||||||
|
|
||||||
for( int ii = 1; ii<numPoints - 1; ii++ )
|
|
||||||
{
|
{
|
||||||
wxPoint pt( 0, -gap_size );
|
EDGE_MODULE* edge = new EDGE_MODULE( module );
|
||||||
|
module->m_Drawings.PushFront( edge );
|
||||||
|
|
||||||
RotatePoint( &pt.x, &pt.y, theta );
|
edge->SetShape( S_POLYGON );
|
||||||
|
edge->SetLayer( LAYER_N_FRONT );
|
||||||
|
|
||||||
polyPoints.push_back( pt );
|
int numPoints = angle / 50 + 3; // Note: angles are in 0.1 degrees
|
||||||
|
std::vector<wxPoint> polyPoints = edge->GetPolyPoints();
|
||||||
|
polyPoints.reserve( numPoints );
|
||||||
|
|
||||||
theta += 50;
|
edge->m_Start0.y = -pad->GetSize().y / 2;
|
||||||
|
|
||||||
if( theta > angle / 2 )
|
polyPoints.push_back( wxPoint( 0, 0 ) );
|
||||||
theta = angle / 2;
|
|
||||||
|
int theta = -angle / 2;
|
||||||
|
|
||||||
|
for( int ii = 1; ii<numPoints - 1; ii++ )
|
||||||
|
{
|
||||||
|
wxPoint pt( 0, -gap_size );
|
||||||
|
|
||||||
|
RotatePoint( &pt.x, &pt.y, theta );
|
||||||
|
|
||||||
|
polyPoints.push_back( pt );
|
||||||
|
|
||||||
|
theta += 50;
|
||||||
|
|
||||||
|
if( theta > angle / 2 )
|
||||||
|
theta = angle / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close the polygon:
|
||||||
|
polyPoints.push_back( polyPoints[0] );
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
// Close the polygon:
|
|
||||||
polyPoints.push_back( polyPoints[0] );
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -873,7 +879,7 @@ void WinEDA_SetParamShapeFrame::ReadDataShapeDescr( wxCommandEvent& event )
|
||||||
|
|
||||||
FILTER_READER reader( fileReader );
|
FILTER_READER reader( fileReader );
|
||||||
|
|
||||||
SetLocaleTo_C_standard();
|
LOCALE_IO toggle;
|
||||||
|
|
||||||
while( reader.ReadLine() )
|
while( reader.ReadLine() )
|
||||||
{
|
{
|
||||||
|
@ -920,8 +926,6 @@ void WinEDA_SetParamShapeFrame::ReadDataShapeDescr( wxCommandEvent& event )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SetLocaleTo_Default(); // revert to the current locale
|
|
||||||
|
|
||||||
ShapeScaleX *= unitconv;
|
ShapeScaleX *= unitconv;
|
||||||
ShapeScaleY *= unitconv;
|
ShapeScaleY *= unitconv;
|
||||||
|
|
||||||
|
@ -973,12 +977,12 @@ MODULE* PCB_EDIT_FRAME::Create_MuWavePolygonShape()
|
||||||
module = Create_MuWaveBasicShape( cmp_name, pad_count );
|
module = Create_MuWaveBasicShape( cmp_name, pad_count );
|
||||||
pad1 = module->m_Pads;
|
pad1 = module->m_Pads;
|
||||||
|
|
||||||
pad1->m_Pos0.x = -ShapeSize.x / 2;
|
pad1->SetX0( -ShapeSize.x / 2 );
|
||||||
pad1->m_Pos.x += pad1->m_Pos0.x;
|
pad1->SetX( pad1->GetPos0().x + pad1->GetPosition().x );
|
||||||
|
|
||||||
pad2 = (D_PAD*) pad1->Next();
|
pad2 = (D_PAD*) pad1->Next();
|
||||||
pad2->m_Pos0.x = pad1->m_Pos0.x + ShapeSize.x;
|
pad2->SetX0( pad1->GetPos0().x + ShapeSize.x );
|
||||||
pad2->m_Pos.x += pad2->m_Pos0.x;
|
pad2->SetX( pad2->GetPos0().x + pad2->GetPosition().x );
|
||||||
|
|
||||||
edge = new EDGE_MODULE( module );
|
edge = new EDGE_MODULE( module );
|
||||||
|
|
||||||
|
@ -991,13 +995,13 @@ MODULE* PCB_EDIT_FRAME::Create_MuWavePolygonShape()
|
||||||
polyPoints.reserve( 2 * PolyEdges.size() + 2 );
|
polyPoints.reserve( 2 * PolyEdges.size() + 2 );
|
||||||
|
|
||||||
// Init start point coord:
|
// Init start point coord:
|
||||||
polyPoints.push_back( wxPoint( pad1->m_Pos0.x, 0 ) );
|
polyPoints.push_back( wxPoint( pad1->GetPos0().x, 0 ) );
|
||||||
|
|
||||||
wxPoint first_coordinate, last_coordinate;
|
wxPoint first_coordinate, last_coordinate;
|
||||||
|
|
||||||
for( unsigned ii = 0; ii < PolyEdges.size(); ii++ ) // Copy points
|
for( unsigned ii = 0; ii < PolyEdges.size(); ii++ ) // Copy points
|
||||||
{
|
{
|
||||||
last_coordinate.x = wxRound( PolyEdges[ii] * ShapeScaleX ) + pad1->m_Pos0.x;
|
last_coordinate.x = wxRound( PolyEdges[ii] * ShapeScaleX ) + pad1->GetPos0().x;
|
||||||
last_coordinate.y = -wxRound( PolyEdges[ii] * ShapeScaleY );
|
last_coordinate.y = -wxRound( PolyEdges[ii] * ShapeScaleY );
|
||||||
polyPoints.push_back( last_coordinate );
|
polyPoints.push_back( last_coordinate );
|
||||||
}
|
}
|
||||||
|
@ -1008,16 +1012,19 @@ MODULE* PCB_EDIT_FRAME::Create_MuWavePolygonShape()
|
||||||
{
|
{
|
||||||
case 0: // Single
|
case 0: // Single
|
||||||
case 2: // Single mirrored
|
case 2: // Single mirrored
|
||||||
|
|
||||||
// Init end point coord:
|
// Init end point coord:
|
||||||
pad2->m_Pos0.x = last_coordinate.x;
|
pad2->SetX0( last_coordinate.x );
|
||||||
polyPoints.push_back( wxPoint( last_coordinate.x, 0 ) );
|
polyPoints.push_back( wxPoint( last_coordinate.x, 0 ) );
|
||||||
|
|
||||||
pad1->m_Size.x = pad1->m_Size.y = ABS( first_coordinate.y );
|
pad1->SetSize( wxSize( ABS( first_coordinate.y ), ABS( first_coordinate.y ) ) );
|
||||||
pad2->m_Size.x = pad2->m_Size.y = ABS( last_coordinate.y );
|
pad2->SetSize( wxSize( ABS( last_coordinate.y ), ABS( last_coordinate.y ) ) );
|
||||||
pad1->m_Pos0.y = first_coordinate.y / 2;
|
|
||||||
pad2->m_Pos0.y = last_coordinate.y / 2;
|
pad1->SetY0( first_coordinate.y / 2 );
|
||||||
pad1->m_Pos.y = pad1->m_Pos0.y + module->m_Pos.y;
|
pad2->SetY0( last_coordinate.y / 2 );
|
||||||
pad2->m_Pos.y = pad2->m_Pos0.y + module->m_Pos.y;
|
|
||||||
|
pad1->SetY( pad1->GetPos0().y + module->GetPosition().y );
|
||||||
|
pad2->SetY( pad2->GetPos0().y + module->GetPosition().y );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1: // Symmetric
|
case 1: // Symmetric
|
||||||
|
@ -1030,8 +1037,8 @@ MODULE* PCB_EDIT_FRAME::Create_MuWavePolygonShape()
|
||||||
polyPoints.push_back( pt );
|
polyPoints.push_back( pt );
|
||||||
}
|
}
|
||||||
|
|
||||||
pad1->m_Size.x = pad1->m_Size.y = 2 * ABS( first_coordinate.y );
|
pad1->SetSize( wxSize( 2 * ABS( first_coordinate.y ), 2 * ABS( first_coordinate.y ) ) );
|
||||||
pad2->m_Size.x = pad2->m_Size.y = 2 * ABS( last_coordinate.y );
|
pad2->SetSize( wxSize( 2 * ABS( last_coordinate.y ), 2 * ABS( last_coordinate.y ) ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1043,22 +1050,22 @@ MODULE* PCB_EDIT_FRAME::Create_MuWavePolygonShape()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::Edit_Gap( wxDC* DC, MODULE* Module )
|
void PCB_EDIT_FRAME::Edit_Gap( wxDC* DC, MODULE* aModule )
|
||||||
{
|
{
|
||||||
int gap_size, oX;
|
int gap_size, oX;
|
||||||
D_PAD* pad, * next_pad;
|
D_PAD* pad, * next_pad;
|
||||||
wxString msg;
|
wxString msg;
|
||||||
|
|
||||||
if( Module == NULL )
|
if( aModule == NULL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Test if module is a gap type (name begins with GAP, and has 2 pads). */
|
// Test if module is a gap type (name begins with GAP, and has 2 pads).
|
||||||
msg = Module->m_Reference->m_Text.Left( 3 );
|
msg = aModule->m_Reference->m_Text.Left( 3 );
|
||||||
|
|
||||||
if( msg != wxT( "GAP" ) )
|
if( msg != wxT( "GAP" ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pad = Module->m_Pads;
|
pad = aModule->m_Pads;
|
||||||
|
|
||||||
if( pad == NULL )
|
if( pad == NULL )
|
||||||
{
|
{
|
||||||
|
@ -1074,12 +1081,12 @@ void PCB_EDIT_FRAME::Edit_Gap( wxDC* DC, MODULE* Module )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Module->Draw( m_canvas, DC, GR_XOR );
|
aModule->Draw( m_canvas, DC, GR_XOR );
|
||||||
|
|
||||||
/* Calculate the current dimension. */
|
// Calculate the current dimension.
|
||||||
gap_size = next_pad->m_Pos0.x - pad->m_Pos0.x - pad->m_Size.x;
|
gap_size = next_pad->GetPos0().x - pad->GetPos0().x - pad->GetSize().x;
|
||||||
|
|
||||||
/* Entrer the desired length of the gap. */
|
// Entrer the desired length of the gap.
|
||||||
msg = ReturnStringFromValue( g_UserUnit, gap_size, GetScreen()->GetInternalUnits() );
|
msg = ReturnStringFromValue( g_UserUnit, gap_size, GetScreen()->GetInternalUnits() );
|
||||||
wxTextEntryDialog dlg( this, _( "Gap:" ), _( "Create Microwave Gap" ), msg );
|
wxTextEntryDialog dlg( this, _( "Gap:" ), _( "Create Microwave Gap" ), msg );
|
||||||
|
|
||||||
|
@ -1089,22 +1096,33 @@ void PCB_EDIT_FRAME::Edit_Gap( wxDC* DC, MODULE* Module )
|
||||||
msg = dlg.GetValue();
|
msg = dlg.GetValue();
|
||||||
gap_size = ReturnValueFromString( g_UserUnit, msg, GetScreen()->GetInternalUnits() );
|
gap_size = ReturnValueFromString( g_UserUnit, msg, GetScreen()->GetInternalUnits() );
|
||||||
|
|
||||||
/* Updating sizes of pads forming the gap. */
|
// Updating sizes of pads forming the gap.
|
||||||
pad->m_Size.x = pad->m_Size.y = GetBoard()->GetCurrentTrackWidth();
|
int tw = GetBoard()->GetCurrentTrackWidth();
|
||||||
pad->m_Pos0.y = 0;
|
pad->SetSize( wxSize( tw, tw ) );
|
||||||
oX = pad->m_Pos0.x = -( (gap_size + pad->m_Size.x) / 2 );
|
|
||||||
pad->m_Pos.x = pad->m_Pos0.x + Module->m_Pos.x;
|
|
||||||
pad->m_Pos.y = pad->m_Pos0.y + Module->m_Pos.y;
|
|
||||||
RotatePoint( &pad->m_Pos.x, &pad->m_Pos.y,
|
|
||||||
Module->m_Pos.x, Module->m_Pos.y, Module->m_Orient );
|
|
||||||
|
|
||||||
next_pad->m_Size.x = next_pad->m_Size.y = GetBoard()->GetCurrentTrackWidth();
|
pad->SetY0( 0 );
|
||||||
next_pad->m_Pos0.y = 0;
|
oX = -( gap_size + pad->GetSize().x ) / 2;
|
||||||
next_pad->m_Pos0.x = oX + gap_size + next_pad->m_Size.x;
|
pad->SetX0( oX );
|
||||||
next_pad->m_Pos.x = next_pad->m_Pos0.x + Module->m_Pos.x;
|
|
||||||
next_pad->m_Pos.y = next_pad->m_Pos0.y + Module->m_Pos.y;
|
|
||||||
RotatePoint( &next_pad->m_Pos.x, &next_pad->m_Pos.y,
|
|
||||||
Module->m_Pos.x, Module->m_Pos.y, Module->m_Orient );
|
|
||||||
|
|
||||||
Module->Draw( m_canvas, DC, GR_OR );
|
wxPoint padpos = pad->GetPos0() + aModule->GetPosition();
|
||||||
|
|
||||||
|
RotatePoint( &padpos.x, &padpos.y,
|
||||||
|
aModule->m_Pos.x, aModule->m_Pos.y, aModule->GetOrientation() );
|
||||||
|
|
||||||
|
pad->SetPosition( padpos );
|
||||||
|
|
||||||
|
tw = GetBoard()->GetCurrentTrackWidth();
|
||||||
|
next_pad->SetSize( wxSize( tw, tw ) );
|
||||||
|
|
||||||
|
next_pad->SetY0( 0 );
|
||||||
|
next_pad->SetX0( oX + gap_size + next_pad->GetSize().x );
|
||||||
|
|
||||||
|
padpos = next_pad->GetPos0() + aModule->GetPosition();
|
||||||
|
|
||||||
|
RotatePoint( &padpos.x, &padpos.y,
|
||||||
|
aModule->m_Pos.x, aModule->m_Pos.y, aModule->GetOrientation() );
|
||||||
|
|
||||||
|
next_pad->SetPosition( padpos );
|
||||||
|
|
||||||
|
aModule->Draw( m_canvas, DC, GR_OR );
|
||||||
}
|
}
|
||||||
|
|
|
@ -220,57 +220,18 @@ void PCB_EDIT_FRAME::SaveProjectSettings()
|
||||||
PARAM_CFG_ARRAY PCB_EDIT_FRAME::GetProjectFileParameters()
|
PARAM_CFG_ARRAY PCB_EDIT_FRAME::GetProjectFileParameters()
|
||||||
{
|
{
|
||||||
PARAM_CFG_ARRAY pca;
|
PARAM_CFG_ARRAY pca;
|
||||||
BOARD_DESIGN_SETTINGS& bds = GetBoard()->GetDesignSettings();
|
|
||||||
|
|
||||||
pca.push_back( new PARAM_CFG_FILENAME( wxT( "LibDir" ),&g_UserLibDirBuffer,
|
pca.push_back( new PARAM_CFG_FILENAME( wxT( "LibDir" ),&g_UserLibDirBuffer,
|
||||||
GROUPLIB ) );
|
GROUPLIB ) );
|
||||||
pca.push_back( new PARAM_CFG_LIBNAME_LIST( wxT( "LibName" ),
|
pca.push_back( new PARAM_CFG_LIBNAME_LIST( wxT( "LibName" ),
|
||||||
&g_LibraryNames,
|
&g_LibraryNames,
|
||||||
GROUPLIB ) );
|
GROUPLIB ) );
|
||||||
pca.push_back( new PARAM_CFG_INT( wxT( "PadDrlX" ), &g_Pad_Master.m_Drill.x,
|
|
||||||
320, 0, 0x7FFF ) );
|
|
||||||
pca.push_back( new PARAM_CFG_INT( wxT( "PadDimH" ), &g_Pad_Master.m_Size.x,
|
|
||||||
550, 0, 0x7FFF ) );
|
|
||||||
pca.push_back( new PARAM_CFG_INT( wxT( "PadDimV" ), &g_Pad_Master.m_Size.y,
|
|
||||||
550, 0, 0x7FFF ) );
|
|
||||||
|
|
||||||
pca.push_back( new PARAM_CFG_INT( wxT( "BoardThickness" ),
|
|
||||||
&bds.m_BoardThickness,
|
|
||||||
630, 0, 0xFFFF ) );
|
|
||||||
|
|
||||||
pca.push_back( new PARAM_CFG_INT( wxT( "TxtPcbV" ),
|
|
||||||
&bds.m_PcbTextSize.y,
|
|
||||||
600, TEXTS_MIN_SIZE, TEXTS_MAX_SIZE ) );
|
|
||||||
|
|
||||||
pca.push_back( new PARAM_CFG_INT( wxT( "TxtPcbH" ),
|
|
||||||
&bds.m_PcbTextSize.x,
|
|
||||||
600, TEXTS_MIN_SIZE, TEXTS_MAX_SIZE ) );
|
|
||||||
|
|
||||||
pca.push_back( new PARAM_CFG_INT( wxT( "TxtModV" ), &bds.m_ModuleTextSize.y,
|
|
||||||
500, TEXTS_MIN_SIZE, TEXTS_MAX_SIZE ) );
|
|
||||||
pca.push_back( new PARAM_CFG_INT( wxT( "TxtModH" ), &bds.m_ModuleTextSize.x,
|
|
||||||
500, TEXTS_MIN_SIZE, TEXTS_MAX_SIZE ) );
|
|
||||||
pca.push_back( new PARAM_CFG_INT( wxT( "TxtModW" ), &bds.m_ModuleTextWidth,
|
|
||||||
100, 1, TEXTS_MAX_WIDTH ) );
|
|
||||||
|
|
||||||
pca.push_back( new PARAM_CFG_INT( wxT( "VEgarde" ),
|
|
||||||
&bds.m_SolderMaskMargin,
|
|
||||||
100, 0, 10000 ) );
|
|
||||||
|
|
||||||
pca.push_back( new PARAM_CFG_INT( wxT( "DrawLar" ),
|
|
||||||
&bds.m_DrawSegmentWidth,
|
|
||||||
120, 0, 0xFFFF ) );
|
|
||||||
|
|
||||||
pca.push_back( new PARAM_CFG_INT( wxT( "EdgeLar" ),
|
|
||||||
&bds.m_EdgeSegmentWidth,
|
|
||||||
120, 0, 0xFFFF ) );
|
|
||||||
pca.push_back( new PARAM_CFG_INT( wxT( "TxtLar" ),
|
|
||||||
&bds.m_PcbTextWidth,
|
|
||||||
120, 0, 0xFFFF ) );
|
|
||||||
pca.push_back( new PARAM_CFG_INT( wxT( "MSegLar" ), &bds.m_ModuleSegmentWidth,
|
|
||||||
120, 0, 0xFFFF ) );
|
|
||||||
pca.push_back( new PARAM_CFG_FILENAME( wxT( "LastNetListRead" ),
|
pca.push_back( new PARAM_CFG_FILENAME( wxT( "LastNetListRead" ),
|
||||||
&m_lastNetListRead ) );
|
&m_lastNetListRead ) );
|
||||||
|
|
||||||
|
GetBoard()->GetDesignSettings().AppendConfigs( &pca );
|
||||||
|
|
||||||
return pca;
|
return pca;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,29 +3,29 @@
|
||||||
* @brief Common plot routines.
|
* @brief Common plot routines.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "fctsys.h"
|
#include <fctsys.h>
|
||||||
#include "common.h"
|
#include <common.h>
|
||||||
#include "plot_common.h"
|
#include <plot_common.h>
|
||||||
#include "base_struct.h"
|
#include <base_struct.h>
|
||||||
#include "drawtxt.h"
|
#include <drawtxt.h>
|
||||||
#include "confirm.h"
|
#include <confirm.h>
|
||||||
#include "trigo.h"
|
#include <trigo.h>
|
||||||
#include "wxBasePcbFrame.h"
|
#include <wxBasePcbFrame.h>
|
||||||
#include "pcbcommon.h"
|
#include <pcbcommon.h>
|
||||||
#include "macros.h"
|
#include <macros.h>
|
||||||
|
|
||||||
#include "class_board.h"
|
#include <class_board.h>
|
||||||
#include "class_module.h"
|
#include <class_module.h>
|
||||||
#include "class_track.h"
|
#include <class_track.h>
|
||||||
#include "class_edge_mod.h"
|
#include <class_edge_mod.h>
|
||||||
#include "class_pcb_text.h"
|
#include <class_pcb_text.h>
|
||||||
#include "class_zone.h"
|
#include <class_zone.h>
|
||||||
#include "class_drawsegment.h"
|
#include <class_drawsegment.h>
|
||||||
#include "class_mire.h"
|
#include <class_mire.h>
|
||||||
#include "class_dimension.h"
|
#include <class_dimension.h>
|
||||||
|
|
||||||
#include "pcbnew.h"
|
#include <pcbnew.h>
|
||||||
#include "pcbplot.h"
|
#include <pcbplot.h>
|
||||||
|
|
||||||
static void Plot_Edges_Modules( PLOTTER* plotter, BOARD* pcb, int aLayerMask,
|
static void Plot_Edges_Modules( PLOTTER* plotter, BOARD* pcb, int aLayerMask,
|
||||||
EDA_DRAW_MODE_T trace_mode );
|
EDA_DRAW_MODE_T trace_mode );
|
||||||
|
@ -45,28 +45,27 @@ void PCB_BASE_FRAME::PlotSilkScreen( PLOTTER* plotter, int aLayerMask, EDA_DRAW_
|
||||||
{
|
{
|
||||||
bool trace_val, trace_ref;
|
bool trace_val, trace_ref;
|
||||||
TEXTE_MODULE* pt_texte;
|
TEXTE_MODULE* pt_texte;
|
||||||
EDA_ITEM* PtStruct;
|
|
||||||
|
|
||||||
/* Plot edge layer and graphic items */
|
// Plot edge layer and graphic items
|
||||||
|
|
||||||
for( PtStruct = m_Pcb->m_Drawings; PtStruct != NULL; PtStruct = PtStruct->Next() )
|
for( EDA_ITEM* item = m_Pcb->m_Drawings; item; item = item->Next() )
|
||||||
{
|
{
|
||||||
switch( PtStruct->Type() )
|
switch( item->Type() )
|
||||||
{
|
{
|
||||||
case PCB_LINE_T:
|
case PCB_LINE_T:
|
||||||
PlotDrawSegment( plotter, (DRAWSEGMENT*) PtStruct, aLayerMask, trace_mode );
|
PlotDrawSegment( plotter, (DRAWSEGMENT*) item, aLayerMask, trace_mode );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCB_TEXT_T:
|
case PCB_TEXT_T:
|
||||||
PlotTextePcb( plotter, (TEXTE_PCB*) PtStruct, aLayerMask, trace_mode );
|
PlotTextePcb( plotter, (TEXTE_PCB*) item, aLayerMask, trace_mode );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCB_DIMENSION_T:
|
case PCB_DIMENSION_T:
|
||||||
PlotDimension( plotter, (DIMENSION*) PtStruct, aLayerMask, trace_mode );
|
PlotDimension( plotter, (DIMENSION*) item, aLayerMask, trace_mode );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCB_TARGET_T:
|
case PCB_TARGET_T:
|
||||||
PlotPcbTarget( plotter, (PCB_TARGET*) PtStruct, aLayerMask, trace_mode );
|
PlotPcbTarget( plotter, (PCB_TARGET*) item, aLayerMask, trace_mode );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCB_MARKER_T:
|
case PCB_MARKER_T:
|
||||||
|
@ -78,10 +77,10 @@ void PCB_BASE_FRAME::PlotSilkScreen( PLOTTER* plotter, int aLayerMask, EDA_DRAW_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Plot footprint outlines : */
|
// Plot footprint outlines :
|
||||||
Plot_Edges_Modules( plotter, m_Pcb, aLayerMask, trace_mode );
|
Plot_Edges_Modules( plotter, m_Pcb, aLayerMask, trace_mode );
|
||||||
|
|
||||||
/* Plot pads (creates pads outlines, for pads on silkscreen layers) */
|
// Plot pads (creates pads outlines, for pads on silkscreen layers)
|
||||||
int layersmask_plotpads = aLayerMask;
|
int layersmask_plotpads = aLayerMask;
|
||||||
// Calculate the mask layers of allowed layers for pads
|
// Calculate the mask layers of allowed layers for pads
|
||||||
|
|
||||||
|
@ -94,43 +93,43 @@ void PCB_BASE_FRAME::PlotSilkScreen( PLOTTER* plotter, int aLayerMask, EDA_DRAW_
|
||||||
{
|
{
|
||||||
for( D_PAD * pad = Module->m_Pads; pad != NULL; pad = pad->Next() )
|
for( D_PAD * pad = Module->m_Pads; pad != NULL; pad = pad->Next() )
|
||||||
{
|
{
|
||||||
/* See if the pad is on this layer */
|
// See if the pad is on this layer
|
||||||
if( (pad->m_layerMask & layersmask_plotpads) == 0 )
|
if( (pad->GetLayerMask() & layersmask_plotpads) == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
wxPoint shape_pos = pad->ReturnShapePos();
|
wxPoint shape_pos = pad->ReturnShapePos();
|
||||||
|
|
||||||
switch( pad->m_PadShape & 0x7F )
|
switch( pad->GetShape() )
|
||||||
{
|
{
|
||||||
case PAD_CIRCLE:
|
case PAD_CIRCLE:
|
||||||
plotter->flash_pad_circle( shape_pos, pad->m_Size.x, LINE );
|
plotter->flash_pad_circle( shape_pos, pad->GetSize().x, LINE );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAD_OVAL:
|
case PAD_OVAL:
|
||||||
plotter->flash_pad_oval( shape_pos, pad->m_Size, pad->m_Orient, LINE );
|
plotter->flash_pad_oval( shape_pos, pad->GetSize(), pad->GetOrientation(), LINE );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAD_TRAPEZOID:
|
case PAD_TRAPEZOID:
|
||||||
{
|
{
|
||||||
wxPoint coord[4];
|
wxPoint coord[4];
|
||||||
pad->BuildPadPolygon( coord, wxSize(0,0), 0 );
|
pad->BuildPadPolygon( coord, wxSize(0,0), 0 );
|
||||||
plotter->flash_pad_trapez( shape_pos, coord, pad->m_Orient, LINE );
|
plotter->flash_pad_trapez( shape_pos, coord, pad->GetOrientation(), LINE );
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case PAD_RECT:
|
case PAD_RECT:
|
||||||
default:
|
default:
|
||||||
plotter->flash_pad_rect( shape_pos, pad->m_Size, pad->m_Orient, LINE );
|
plotter->flash_pad_rect( shape_pos, pad->GetSize(), pad->GetOrientation(), LINE );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Plot footprints fields (ref, value ...) */
|
// Plot footprints fields (ref, value ...)
|
||||||
for( MODULE* Module = m_Pcb->m_Modules; Module; Module = Module->Next() )
|
for( MODULE* Module = m_Pcb->m_Modules; Module; Module = Module->Next() )
|
||||||
{
|
{
|
||||||
/* see if we want to plot VALUE and REF fields */
|
// see if we want to plot VALUE and REF fields
|
||||||
trace_val = g_PcbPlotOptions.m_PlotValue;
|
trace_val = g_PcbPlotOptions.m_PlotValue;
|
||||||
trace_ref = g_PcbPlotOptions.m_PlotReference;
|
trace_ref = g_PcbPlotOptions.m_PlotReference;
|
||||||
|
|
||||||
|
@ -174,7 +173,7 @@ module\n %s's \"value\" text." ),
|
||||||
if( !text->IsVisible() && !g_PcbPlotOptions.m_PlotInvisibleTexts )
|
if( !text->IsVisible() && !g_PcbPlotOptions.m_PlotInvisibleTexts )
|
||||||
trace_val = false;
|
trace_val = false;
|
||||||
|
|
||||||
/* Plot text fields, if allowed */
|
// Plot text fields, if allowed
|
||||||
if( trace_ref )
|
if( trace_ref )
|
||||||
PlotTextModule( plotter, Module->m_Reference, trace_mode );
|
PlotTextModule( plotter, Module->m_Reference, trace_mode );
|
||||||
|
|
||||||
|
@ -215,7 +214,7 @@ for module\n %s's \"module text\" text of %s." ),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Plot filled areas */
|
// Plot filled areas
|
||||||
for( int ii = 0; ii < m_Pcb->GetAreaCount(); ii++ )
|
for( int ii = 0; ii < m_Pcb->GetAreaCount(); ii++ )
|
||||||
{
|
{
|
||||||
ZONE_CONTAINER* edge_zone = m_Pcb->GetArea( ii );
|
ZONE_CONTAINER* edge_zone = m_Pcb->GetArea( ii );
|
||||||
|
@ -244,7 +243,7 @@ static void PlotTextModule( PLOTTER* plotter, TEXTE_MODULE* pt_texte, EDA_DRAW_M
|
||||||
wxPoint pos;
|
wxPoint pos;
|
||||||
int orient, thickness;
|
int orient, thickness;
|
||||||
|
|
||||||
/* calculate some text parameters :*/
|
// calculate some text parameters :
|
||||||
size = pt_texte->m_Size;
|
size = pt_texte->m_Size;
|
||||||
pos = pt_texte->m_Pos;
|
pos = pt_texte->m_Pos;
|
||||||
|
|
||||||
|
@ -360,7 +359,7 @@ void PlotPcbTarget( PLOTTER* plotter, PCB_TARGET* aMire, int aLayerMask,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Plot footprints graphic items (outlines) */
|
// Plot footprints graphic items (outlines)
|
||||||
void Plot_Edges_Modules( PLOTTER* plotter, BOARD* pcb, int aLayerMask, EDA_DRAW_MODE_T trace_mode )
|
void Plot_Edges_Modules( PLOTTER* plotter, BOARD* pcb, int aLayerMask, EDA_DRAW_MODE_T trace_mode )
|
||||||
{
|
{
|
||||||
for( MODULE* module = pcb->m_Modules; module; module = module->Next() )
|
for( MODULE* module = pcb->m_Modules; module; module = module->Next() )
|
||||||
|
@ -381,7 +380,7 @@ void Plot_Edges_Modules( PLOTTER* plotter, BOARD* pcb, int aLayerMask, EDA_DRAW_
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Plot a graphic item (outline) relative to a footprint */
|
//* Plot a graphic item (outline) relative to a footprint
|
||||||
void Plot_1_EdgeModule( PLOTTER* plotter, EDGE_MODULE* aEdge, EDA_DRAW_MODE_T trace_mode, int masque_layer )
|
void Plot_1_EdgeModule( PLOTTER* plotter, EDGE_MODULE* aEdge, EDA_DRAW_MODE_T trace_mode, int masque_layer )
|
||||||
{
|
{
|
||||||
int type_trace; // Type of item to plot.
|
int type_trace; // Type of item to plot.
|
||||||
|
@ -419,7 +418,7 @@ void Plot_1_EdgeModule( PLOTTER* plotter, EDGE_MODULE* aEdge, EDA_DRAW_MODE_T tr
|
||||||
double endAngle = startAngle + aEdge->GetAngle();
|
double endAngle = startAngle + aEdge->GetAngle();
|
||||||
|
|
||||||
if ( ( g_PcbPlotOptions.GetPlotFormat() == PLOT_FORMAT_DXF ) &&
|
if ( ( g_PcbPlotOptions.GetPlotFormat() == PLOT_FORMAT_DXF ) &&
|
||||||
( masque_layer & ( SILKSCREEN_LAYER_BACK | DRAW_LAYER | COMMENT_LAYER ) ) )
|
( masque_layer & ( SILKSCREEN_LAYER_BACK | DRAW_LAYER | COMMENT_LAYER ) ) )
|
||||||
plotter->thick_arc( pos,
|
plotter->thick_arc( pos,
|
||||||
-startAngle,
|
-startAngle,
|
||||||
-endAngle,
|
-endAngle,
|
||||||
|
@ -471,7 +470,7 @@ void Plot_1_EdgeModule( PLOTTER* plotter, EDGE_MODULE* aEdge, EDA_DRAW_MODE_T tr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Plot a PCB Text, i;e. a text found on a copper or technical layer */
|
// Plot a PCB Text, i;e. a text found on a copper or technical layer
|
||||||
void PlotTextePcb( PLOTTER* plotter, TEXTE_PCB* pt_texte, int aLayerMask,
|
void PlotTextePcb( PLOTTER* plotter, TEXTE_PCB* pt_texte, int aLayerMask,
|
||||||
EDA_DRAW_MODE_T trace_mode )
|
EDA_DRAW_MODE_T trace_mode )
|
||||||
{
|
{
|
||||||
|
@ -791,7 +790,7 @@ void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Draw footprint shapes without pads (pads will plotted later) */
|
// Draw footprint shapes without pads (pads will plotted later)
|
||||||
for( MODULE* module = m_Pcb->m_Modules; module; module = module->Next() )
|
for( MODULE* module = m_Pcb->m_Modules; module; module = module->Next() )
|
||||||
{
|
{
|
||||||
for( BOARD_ITEM* item = module->m_Drawings; item; item = item->Next() )
|
for( BOARD_ITEM* item = module->m_Drawings; item; item = item->Next() )
|
||||||
|
@ -810,14 +809,14 @@ void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Plot footprint pads */
|
// Plot footprint pads
|
||||||
for( MODULE* module = m_Pcb->m_Modules; module; module = module->Next() )
|
for( MODULE* module = m_Pcb->m_Modules; module; module = module->Next() )
|
||||||
{
|
{
|
||||||
for( D_PAD* pad = module->m_Pads; pad; pad = pad->Next() )
|
for( D_PAD* pad = module->m_Pads; pad; pad = pad->Next() )
|
||||||
{
|
{
|
||||||
wxPoint shape_pos;
|
wxPoint shape_pos;
|
||||||
|
|
||||||
if( (pad->m_layerMask & aLayerMask) == 0 )
|
if( (pad->GetLayerMask() & aLayerMask) == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
shape_pos = pad->ReturnShapePos();
|
shape_pos = pad->ReturnShapePos();
|
||||||
|
@ -848,19 +847,19 @@ void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
size.x = pad->m_Size.x + ( 2 * margin.x ) + width_adj;
|
size.x = pad->GetSize().x + ( 2 * margin.x ) + width_adj;
|
||||||
size.y = pad->m_Size.y + ( 2 * margin.y ) + width_adj;
|
size.y = pad->GetSize().y + ( 2 * margin.y ) + width_adj;
|
||||||
|
|
||||||
/* Don't draw a null size item : */
|
// Don't draw a null size item :
|
||||||
if( size.x <= 0 || size.y <= 0 )
|
if( size.x <= 0 || size.y <= 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
switch( pad->m_PadShape )
|
switch( pad->GetShape() )
|
||||||
{
|
{
|
||||||
case PAD_CIRCLE:
|
case PAD_CIRCLE:
|
||||||
if( aSkipNPTH_Pads &&
|
if( aSkipNPTH_Pads &&
|
||||||
(pad->m_Size == pad->m_Drill) &&
|
(pad->GetSize() == pad->GetDrillSize()) &&
|
||||||
(pad->m_Attribut == PAD_HOLE_NOT_PLATED) )
|
(pad->GetAttribute() == PAD_HOLE_NOT_PLATED) )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
aPlotter->flash_pad_circle( pos, size.x, aPlotMode );
|
aPlotter->flash_pad_circle( pos, size.x, aPlotMode );
|
||||||
|
@ -868,30 +867,30 @@ void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter,
|
||||||
|
|
||||||
case PAD_OVAL:
|
case PAD_OVAL:
|
||||||
if( aSkipNPTH_Pads &&
|
if( aSkipNPTH_Pads &&
|
||||||
(pad->m_Size == pad->m_Drill) &&
|
(pad->GetSize() == pad->GetDrillSize()) &&
|
||||||
(pad->m_Attribut == PAD_HOLE_NOT_PLATED) )
|
(pad->GetAttribute() == PAD_HOLE_NOT_PLATED) )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
aPlotter->flash_pad_oval( pos, size, pad->m_Orient, aPlotMode );
|
aPlotter->flash_pad_oval( pos, size, pad->GetOrientation(), aPlotMode );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAD_TRAPEZOID:
|
case PAD_TRAPEZOID:
|
||||||
{
|
{
|
||||||
wxPoint coord[4];
|
wxPoint coord[4];
|
||||||
pad->BuildPadPolygon( coord, margin, 0 );
|
pad->BuildPadPolygon( coord, margin, 0 );
|
||||||
aPlotter->flash_pad_trapez( pos, coord, pad->m_Orient, aPlotMode );
|
aPlotter->flash_pad_trapez( pos, coord, pad->GetOrientation(), aPlotMode );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAD_RECT:
|
case PAD_RECT:
|
||||||
default:
|
default:
|
||||||
aPlotter->flash_pad_rect( pos, size, pad->m_Orient, aPlotMode );
|
aPlotter->flash_pad_rect( pos, size, pad->GetOrientation(), aPlotMode );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Plot vias : */
|
// Plot vias :
|
||||||
if( aPlotVia )
|
if( aPlotVia )
|
||||||
{
|
{
|
||||||
for( TRACK* track = m_Pcb->m_Track; track; track = track->Next() )
|
for( TRACK* track = m_Pcb->m_Track; track; track = track->Next() )
|
||||||
|
@ -931,7 +930,7 @@ void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter,
|
||||||
pos = Via->m_Start;
|
pos = Via->m_Start;
|
||||||
size.x = size.y = Via->m_Width + 2 * via_margin + width_adj;
|
size.x = size.y = Via->m_Width + 2 * via_margin + width_adj;
|
||||||
|
|
||||||
/* Don't draw a null size item : */
|
// Don't draw a null size item :
|
||||||
if( size.x <= 0 )
|
if( size.x <= 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -939,7 +938,7 @@ void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Plot tracks (not vias) : */
|
// Plot tracks (not vias) :
|
||||||
for( TRACK* track = m_Pcb->m_Track; track; track = track->Next() )
|
for( TRACK* track = m_Pcb->m_Track; track; track = track->Next() )
|
||||||
{
|
{
|
||||||
wxPoint end;
|
wxPoint end;
|
||||||
|
@ -957,7 +956,7 @@ void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter,
|
||||||
aPlotter->thick_segment( pos, end, size.x, aPlotMode );
|
aPlotter->thick_segment( pos, end, size.x, aPlotMode );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Plot zones (outdated, for old boards compatibility): */
|
// Plot zones (outdated, for old boards compatibility):
|
||||||
for( TRACK* track = m_Pcb->m_Zone; track; track = track->Next() )
|
for( TRACK* track = m_Pcb->m_Zone; track; track = track->Next() )
|
||||||
{
|
{
|
||||||
wxPoint end;
|
wxPoint end;
|
||||||
|
@ -972,7 +971,7 @@ void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter,
|
||||||
aPlotter->thick_segment( pos, end, size.x, aPlotMode );
|
aPlotter->thick_segment( pos, end, size.x, aPlotMode );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Plot filled ares */
|
// Plot filled ares
|
||||||
for( int ii = 0; ii < m_Pcb->GetAreaCount(); ii++ )
|
for( int ii = 0; ii < m_Pcb->GetAreaCount(); ii++ )
|
||||||
{
|
{
|
||||||
ZONE_CONTAINER* edge_zone = m_Pcb->GetArea( ii );
|
ZONE_CONTAINER* edge_zone = m_Pcb->GetArea( ii );
|
||||||
|
@ -1003,7 +1002,7 @@ void PCB_BASE_FRAME::PlotDrillMark( PLOTTER* aPlotter,
|
||||||
wxPoint pos;
|
wxPoint pos;
|
||||||
wxSize diam;
|
wxSize diam;
|
||||||
MODULE* Module;
|
MODULE* Module;
|
||||||
D_PAD* PtPad;
|
D_PAD* pad;
|
||||||
TRACK* pts;
|
TRACK* pts;
|
||||||
|
|
||||||
if( aTraceMode == FILLED )
|
if( aTraceMode == FILLED )
|
||||||
|
@ -1017,13 +1016,13 @@ void PCB_BASE_FRAME::PlotDrillMark( PLOTTER* aPlotter,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
pos = pts->m_Start;
|
pos = pts->m_Start;
|
||||||
|
|
||||||
// It is quite possible that the real drill value is less then small drill value.
|
// It is quite possible that the real drill value is less then small drill value.
|
||||||
if( g_PcbPlotOptions.m_DrillShapeOpt == PCB_PLOT_PARAMS::SMALL_DRILL_SHAPE )
|
if( g_PcbPlotOptions.m_DrillShapeOpt == PCB_PLOT_PARAMS::SMALL_DRILL_SHAPE )
|
||||||
diam.x = diam.y = MIN( SMALL_DRILL, pts->GetDrillValue() );
|
diam.x = diam.y = MIN( SMALL_DRILL, pts->GetDrillValue() );
|
||||||
else
|
else
|
||||||
diam.x = diam.y = pts->GetDrillValue();
|
diam.x = diam.y = pts->GetDrillValue();
|
||||||
|
|
||||||
diam.x -= aPlotter->get_plot_width_adj();
|
diam.x -= aPlotter->get_plot_width_adj();
|
||||||
diam.x = doIntValueFitToBand( diam.x, 1, pts->m_Width - 1 );
|
diam.x = doIntValueFitToBand( diam.x, 1, pts->m_Width - 1 );
|
||||||
aPlotter->flash_pad_circle( pos, diam.x, aTraceMode );
|
aPlotter->flash_pad_circle( pos, diam.x, aTraceMode );
|
||||||
|
@ -1031,29 +1030,29 @@ void PCB_BASE_FRAME::PlotDrillMark( PLOTTER* aPlotter,
|
||||||
|
|
||||||
for( Module = m_Pcb->m_Modules; Module != NULL; Module = Module->Next() )
|
for( Module = m_Pcb->m_Modules; Module != NULL; Module = Module->Next() )
|
||||||
{
|
{
|
||||||
for( PtPad = Module->m_Pads; PtPad != NULL; PtPad = PtPad->Next() )
|
for( pad = Module->m_Pads; pad != NULL; pad = pad->Next() )
|
||||||
{
|
{
|
||||||
if( PtPad->m_Drill.x == 0 )
|
if( pad->GetDrillSize().x == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Output hole shapes:
|
// Output hole shapes:
|
||||||
pos = PtPad->m_Pos;
|
pos = pad->GetPosition();
|
||||||
|
|
||||||
if( PtPad->m_DrillShape == PAD_OVAL )
|
if( pad->GetDrillShape() == PAD_OVAL )
|
||||||
{
|
{
|
||||||
diam = PtPad->m_Drill;
|
diam = pad->GetDrillSize();
|
||||||
diam.x -= aPlotter->get_plot_width_adj();
|
diam.x -= aPlotter->get_plot_width_adj();
|
||||||
diam.x = doIntValueFitToBand( diam.x, 1, PtPad->m_Size.x - 1 );
|
diam.x = doIntValueFitToBand( diam.x, 1, pad->GetSize().x - 1 );
|
||||||
diam.y -= aPlotter->get_plot_width_adj();
|
diam.y -= aPlotter->get_plot_width_adj();
|
||||||
diam.y = doIntValueFitToBand( diam.y, 1, PtPad->m_Size.y - 1 );
|
diam.y = doIntValueFitToBand( diam.y, 1, pad->GetSize().y - 1 );
|
||||||
aPlotter->flash_pad_oval( pos, diam, PtPad->m_Orient, aTraceMode );
|
aPlotter->flash_pad_oval( pos, diam, pad->GetOrientation(), aTraceMode );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// It is quite possible that the real pad drill value is less then small drill value.
|
// It is quite possible that the real pad drill value is less then small drill value.
|
||||||
diam.x = aSmallDrillShape ? MIN( SMALL_DRILL, PtPad->m_Drill.x ) : PtPad->m_Drill.x;
|
diam.x = aSmallDrillShape ? MIN( SMALL_DRILL, pad->GetDrillSize().x ) : pad->GetDrillSize().x;
|
||||||
diam.x -= aPlotter->get_plot_width_adj();
|
diam.x -= aPlotter->get_plot_width_adj();
|
||||||
diam.x = doIntValueFitToBand( diam.x, 1, PtPad->m_Size.x - 1 );
|
diam.x = doIntValueFitToBand( diam.x, 1, pad->GetSize().x - 1 );
|
||||||
aPlotter->flash_pad_circle( pos, diam.x, aTraceMode );
|
aPlotter->flash_pad_circle( pos, diam.x, aTraceMode );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -198,7 +198,7 @@ void PCB_EDIT_FRAME::PrintPage( wxDC* aDC,
|
||||||
if( GetGRForceBlackPenState() == false )
|
if( GetGRForceBlackPenState() == false )
|
||||||
drawmode = GR_OR;
|
drawmode = GR_OR;
|
||||||
|
|
||||||
/* Print the pcb graphic items (texts, ...) */
|
// Print the pcb graphic items (texts, ...)
|
||||||
GRSetDrawMode( aDC, drawmode );
|
GRSetDrawMode( aDC, drawmode );
|
||||||
|
|
||||||
for( BOARD_ITEM* item = Pcb->m_Drawings; item; item = item->Next() )
|
for( BOARD_ITEM* item = Pcb->m_Drawings; item; item = item->Next() )
|
||||||
|
@ -221,7 +221,7 @@ void PCB_EDIT_FRAME::PrintPage( wxDC* aDC,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print tracks */
|
// Print tracks
|
||||||
pt_trace = Pcb->m_Track;
|
pt_trace = Pcb->m_Track;
|
||||||
|
|
||||||
for( ; pt_trace != NULL; pt_trace = pt_trace->Next() )
|
for( ; pt_trace != NULL; pt_trace = pt_trace->Next() )
|
||||||
|
@ -229,7 +229,7 @@ void PCB_EDIT_FRAME::PrintPage( wxDC* aDC,
|
||||||
if( ( aPrintMaskLayer & pt_trace->ReturnMaskLayer() ) == 0 )
|
if( ( aPrintMaskLayer & pt_trace->ReturnMaskLayer() ) == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( pt_trace->Type() == PCB_VIA_T ) /* VIA encountered. */
|
if( pt_trace->Type() == PCB_VIA_T ) // VIA encountered.
|
||||||
{
|
{
|
||||||
int radius = pt_trace->m_Width >> 1;
|
int radius = pt_trace->m_Width >> 1;
|
||||||
int color = g_ColorsSettings.GetItemColor( VIAS_VISIBLE + pt_trace->m_Shape );
|
int color = g_ColorsSettings.GetItemColor( VIAS_VISIBLE + pt_trace->m_Shape );
|
||||||
|
@ -256,7 +256,7 @@ void PCB_EDIT_FRAME::PrintPage( wxDC* aDC,
|
||||||
pt_trace->Draw( m_canvas, aDC, drawmode );
|
pt_trace->Draw( m_canvas, aDC, drawmode );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Draw filled areas (i.e. zones) */
|
// Draw filled areas (i.e. zones)
|
||||||
for( int ii = 0; ii < Pcb->GetAreaCount(); ii++ )
|
for( int ii = 0; ii < Pcb->GetAreaCount(); ii++ )
|
||||||
{
|
{
|
||||||
ZONE_CONTAINER* zone = Pcb->GetArea( ii );
|
ZONE_CONTAINER* zone = Pcb->GetArea( ii );
|
||||||
|
@ -295,7 +295,7 @@ void PCB_EDIT_FRAME::PrintPage( wxDC* aDC,
|
||||||
if( ( aPrintMaskLayer & pt_trace->ReturnMaskLayer() ) == 0 )
|
if( ( aPrintMaskLayer & pt_trace->ReturnMaskLayer() ) == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( pt_trace->Type() == PCB_VIA_T ) /* VIA encountered. */
|
if( pt_trace->Type() == PCB_VIA_T ) // VIA encountered.
|
||||||
{
|
{
|
||||||
int diameter;
|
int diameter;
|
||||||
|
|
||||||
|
@ -332,43 +332,41 @@ static void Print_Module( EDA_DRAW_PANEL* aPanel, wxDC* aDC, MODULE* aModule,
|
||||||
int aDraw_mode, int aMasklayer,
|
int aDraw_mode, int aMasklayer,
|
||||||
PRINT_PARAMETERS::DrillShapeOptT aDrillShapeOpt )
|
PRINT_PARAMETERS::DrillShapeOptT aDrillShapeOpt )
|
||||||
{
|
{
|
||||||
D_PAD* pt_pad;
|
// Print pads
|
||||||
EDA_ITEM* PtStruct;
|
for( D_PAD* pad = aModule->m_Pads; pad; pad = pad->Next() )
|
||||||
TEXTE_MODULE* TextMod;
|
|
||||||
int mlayer;
|
|
||||||
|
|
||||||
/* Print pads */
|
|
||||||
pt_pad = aModule->m_Pads;
|
|
||||||
|
|
||||||
for( ; pt_pad != NULL; pt_pad = pt_pad->Next() )
|
|
||||||
{
|
{
|
||||||
if( (pt_pad->m_layerMask & aMasklayer ) == 0 )
|
if( (pad->GetLayerMask() & aMasklayer ) == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Manage hole according to the print drill option
|
// Manage hole according to the print drill option
|
||||||
wxSize drill_tmp = pt_pad->m_Drill;
|
wxSize drill_tmp = pad->GetDrillSize();
|
||||||
|
|
||||||
switch ( aDrillShapeOpt )
|
switch( aDrillShapeOpt )
|
||||||
{
|
{
|
||||||
case PRINT_PARAMETERS::NO_DRILL_SHAPE:
|
case PRINT_PARAMETERS::NO_DRILL_SHAPE:
|
||||||
pt_pad->m_Drill = wxSize(0,0);
|
pad->SetDrillSize( wxSize(0,0) );
|
||||||
break;
|
break;
|
||||||
case PRINT_PARAMETERS::SMALL_DRILL_SHAPE:
|
|
||||||
pt_pad->m_Drill.x = min(SMALL_DRILL,pt_pad->m_Drill.x);
|
case PRINT_PARAMETERS::SMALL_DRILL_SHAPE:
|
||||||
pt_pad->m_Drill.y = min(SMALL_DRILL,pt_pad->m_Drill.y);
|
{
|
||||||
break;
|
wxSize sz( min( SMALL_DRILL, pad->GetDrillSize().x ),
|
||||||
case PRINT_PARAMETERS::FULL_DRILL_SHAPE:
|
min( SMALL_DRILL, pad->GetDrillSize().y ) );
|
||||||
// Do nothing
|
|
||||||
break;
|
pad->SetDrillSize( sz );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRINT_PARAMETERS::FULL_DRILL_SHAPE:
|
||||||
|
// Do nothing
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pt_pad->Draw( aPanel, aDC, aDraw_mode );
|
pad->Draw( aPanel, aDC, aDraw_mode );
|
||||||
pt_pad->m_Drill = drill_tmp;
|
pad->SetDrillSize( drill_tmp );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print footprint graphic shapes */
|
// Print footprint graphic shapes
|
||||||
PtStruct = aModule->m_Drawings;
|
int mlayer = GetLayerMask( aModule->GetLayer() );
|
||||||
mlayer = GetLayerMask( aModule->GetLayer() );
|
|
||||||
|
|
||||||
if( aModule->GetLayer() == LAYER_N_BACK )
|
if( aModule->GetLayer() == LAYER_N_BACK )
|
||||||
mlayer = SILKSCREEN_LAYER_BACK;
|
mlayer = SILKSCREEN_LAYER_BACK;
|
||||||
|
@ -384,28 +382,29 @@ static void Print_Module( EDA_DRAW_PANEL* aPanel, wxDC* aDC, MODULE* aModule,
|
||||||
aModule->m_Value->Draw( aPanel, aDC, aDraw_mode );
|
aModule->m_Value->Draw( aPanel, aDC, aDraw_mode );
|
||||||
}
|
}
|
||||||
|
|
||||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
|
for( EDA_ITEM* item = aModule->m_Drawings; item; item = item->Next() )
|
||||||
{
|
{
|
||||||
switch( PtStruct->Type() )
|
switch( item->Type() )
|
||||||
{
|
{
|
||||||
case PCB_MODULE_TEXT_T:
|
case PCB_MODULE_TEXT_T:
|
||||||
if( ( mlayer & aMasklayer ) == 0 )
|
if( ( mlayer & aMasklayer ) == 0 )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
TextMod = (TEXTE_MODULE*) PtStruct;
|
TEXTE_MODULE* textMod;
|
||||||
TextMod->Draw( aPanel, aDC, aDraw_mode );
|
textMod = (TEXTE_MODULE*) item;
|
||||||
|
textMod->Draw( aPanel, aDC, aDraw_mode );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCB_MODULE_EDGE_T:
|
case PCB_MODULE_EDGE_T:
|
||||||
{
|
{
|
||||||
EDGE_MODULE* edge = (EDGE_MODULE*) PtStruct;
|
EDGE_MODULE* edge = (EDGE_MODULE*) item;
|
||||||
|
|
||||||
if( ( GetLayerMask( edge->GetLayer() ) & aMasklayer ) == 0 )
|
if( ( GetLayerMask( edge->GetLayer() ) & aMasklayer ) == 0 )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
edge->Draw( aPanel, aDC, aDraw_mode );
|
edge->Draw( aPanel, aDC, aDraw_mode );
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -55,7 +55,21 @@ void DrawTraces( EDA_DRAW_PANEL* panel,
|
||||||
/*************/
|
/*************/
|
||||||
/* MODULES.C */
|
/* MODULES.C */
|
||||||
/*************/
|
/*************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function ChangeSideMaskLayer
|
||||||
|
* calculates the mask layer when flipping a footprint.
|
||||||
|
* BACK and FRONT copper layers , mask, paste, solder layers are swapped.
|
||||||
|
*/
|
||||||
|
int ChangeSideMaskLayer( int aMask );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function ChangeSideNumLayer
|
||||||
|
* calculates the layer number for changing cu / cmp layers for Cu / CMP.
|
||||||
|
* (Copper, Mask, Paste, solder)
|
||||||
|
*/
|
||||||
int ChangeSideNumLayer( int oldlayer );
|
int ChangeSideNumLayer( int oldlayer );
|
||||||
|
|
||||||
void DrawModuleOutlines( EDA_DRAW_PANEL* panel, wxDC* DC, MODULE* module );
|
void DrawModuleOutlines( EDA_DRAW_PANEL* panel, wxDC* DC, MODULE* module );
|
||||||
void MoveFootprint( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition, bool aErase );
|
void MoveFootprint( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition, bool aErase );
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,7 @@ void MIN_SPAN_TREE_PADS::AddTreeToRatsnest( std::vector<RATSNEST_ITEM> &aRatsnes
|
||||||
// The first edge (i.e. rastnest) starts at index 1
|
// The first edge (i.e. rastnest) starts at index 1
|
||||||
for( int ii = 1; ii < m_Size; ii++ )
|
for( int ii = 1; ii < m_Size; ii++ )
|
||||||
{
|
{
|
||||||
/* Create the new ratsnest */
|
// Create the new ratsnest
|
||||||
RATSNEST_ITEM net;
|
RATSNEST_ITEM net;
|
||||||
net.SetNet( netcode );
|
net.SetNet( netcode );
|
||||||
net.m_Status = CH_ACTIF | CH_VISIBLE;
|
net.m_Status = CH_ACTIF | CH_VISIBLE;
|
||||||
|
@ -107,8 +107,8 @@ int MIN_SPAN_TREE_PADS::GetWeight( int aItem1, int aItem2 )
|
||||||
|
|
||||||
if( pad1 == pad2 )
|
if( pad1 == pad2 )
|
||||||
return 0;
|
return 0;
|
||||||
int weight = abs( pad2->m_Pos.x - pad1->m_Pos.x ) +
|
int weight = abs( pad2->GetPosition().x - pad1->GetPosition().x ) +
|
||||||
abs( pad2->m_Pos.y - pad1->m_Pos.y );
|
abs( pad2->GetPosition().y - pad1->GetPosition().y );
|
||||||
return weight + 1;
|
return weight + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,7 +209,7 @@ void PCB_BASE_FRAME::Build_Board_Ratsnest()
|
||||||
if( m_Pcb->GetPadCount() == 0 )
|
if( m_Pcb->GetPadCount() == 0 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Created pad list and the net_codes if needed */
|
// Created pad list and the net_codes if needed
|
||||||
if( (m_Pcb->m_Status_Pcb & NET_CODES_OK) == 0 )
|
if( (m_Pcb->m_Status_Pcb & NET_CODES_OK) == 0 )
|
||||||
m_Pcb->BuildListOfNets();
|
m_Pcb->BuildListOfNets();
|
||||||
|
|
||||||
|
@ -220,9 +220,9 @@ void PCB_BASE_FRAME::Build_Board_Ratsnest()
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_Pcb->GetNodesCount() == 0 )
|
if( m_Pcb->GetNodesCount() == 0 )
|
||||||
return; /* No useful connections. */
|
return; // No useful connections.
|
||||||
|
|
||||||
/* Ratsnest computation */
|
// Ratsnest computation
|
||||||
unsigned current_net_code = 1; // First net code is analyzed.
|
unsigned current_net_code = 1; // First net code is analyzed.
|
||||||
// (net_code = 0 -> no connect)
|
// (net_code = 0 -> no connect)
|
||||||
noconn = 0;
|
noconn = 0;
|
||||||
|
@ -309,7 +309,7 @@ static int tst_links_between_blocks( NETINFO_ITEM* aNetinfo,
|
||||||
int subratsnest_id, min_id;
|
int subratsnest_id, min_id;
|
||||||
RATSNEST_ITEM* link, * best_link;
|
RATSNEST_ITEM* link, * best_link;
|
||||||
|
|
||||||
/* Search a link from a block to an other block */
|
// Search a link from a block to an other block
|
||||||
best_link = NULL;
|
best_link = NULL;
|
||||||
|
|
||||||
for( unsigned ii = aNetinfo->m_RatsnestStartIdx; ii < aNetinfo->m_RatsnestEndIdx; ii++ )
|
for( unsigned ii = aNetinfo->m_RatsnestStartIdx; ii < aNetinfo->m_RatsnestEndIdx; ii++ )
|
||||||
|
@ -544,11 +544,11 @@ void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule )
|
||||||
pads_module_count = localPadList.size();
|
pads_module_count = localPadList.size();
|
||||||
|
|
||||||
if( pads_module_count == 0 )
|
if( pads_module_count == 0 )
|
||||||
return; /* no connection! */
|
return; // no connection!
|
||||||
|
|
||||||
sort( localPadList.begin(), localPadList.end(), sortByNetcode );
|
sort( localPadList.begin(), localPadList.end(), sortByNetcode );
|
||||||
|
|
||||||
/* Build the list of pads linked to the current footprint pads */
|
// Build the list of pads linked to the current footprint pads
|
||||||
current_net_code = 0;
|
current_net_code = 0;
|
||||||
|
|
||||||
for( unsigned ii = 0; ii < pads_module_count; ii++ )
|
for( unsigned ii = 0; ii < pads_module_count; ii++ )
|
||||||
|
@ -581,7 +581,7 @@ void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sort the pad list by net_code */
|
// Sort the pad list by net_code
|
||||||
sort( localPadList.begin() + pads_module_count, localPadList.end(),
|
sort( localPadList.begin() + pads_module_count, localPadList.end(),
|
||||||
sortByNetcode );
|
sortByNetcode );
|
||||||
|
|
||||||
|
@ -596,7 +596,7 @@ void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule )
|
||||||
std::vector<D_PAD*> padsBuffer; // contains pads of only one net
|
std::vector<D_PAD*> padsBuffer; // contains pads of only one net
|
||||||
for( unsigned ii = 0; ii < pads_module_count; ii++ )
|
for( unsigned ii = 0; ii < pads_module_count; ii++ )
|
||||||
{
|
{
|
||||||
/* Search the end of pad list relative to the current net */
|
// Search the end of pad list relative to the current net
|
||||||
unsigned jj = ii + 1;
|
unsigned jj = ii + 1;
|
||||||
|
|
||||||
for( ; jj <= pads_module_count; jj++ )
|
for( ; jj <= pads_module_count; jj++ )
|
||||||
|
@ -656,7 +656,7 @@ void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule )
|
||||||
|
|
||||||
if( pad_ref->GetNet() != current_net_code )
|
if( pad_ref->GetNet() != current_net_code )
|
||||||
{
|
{
|
||||||
/* if needed, creates a new ratsnest for the old net */
|
// if needed, creates a new ratsnest for the old net
|
||||||
if( addRats )
|
if( addRats )
|
||||||
{
|
{
|
||||||
m_Pcb->m_LocalRatsnest.push_back( local_rats );
|
m_Pcb->m_LocalRatsnest.push_back( local_rats );
|
||||||
|
@ -667,22 +667,22 @@ void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule )
|
||||||
local_rats.m_Lenght = INT_MAX;
|
local_rats.m_Lenght = INT_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
pad_pos = pad_ref->m_Pos - g_Offset_Module;
|
pad_pos = pad_ref->GetPosition() - g_Offset_Module;
|
||||||
|
|
||||||
// Search the nearest external pad of this current pad
|
// Search the nearest external pad of this current pad
|
||||||
for( unsigned jj = pads_module_count; jj < localPadList.size(); jj++ )
|
for( unsigned jj = pads_module_count; jj < localPadList.size(); jj++ )
|
||||||
{
|
{
|
||||||
pad_externe = localPadList[jj];
|
pad_externe = localPadList[jj];
|
||||||
|
|
||||||
/* we search pads having the same net code */
|
// we search pads having the same net code
|
||||||
if( pad_externe->GetNet() < pad_ref->GetNet() )
|
if( pad_externe->GetNet() < pad_ref->GetNet() )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( pad_externe->GetNet() > pad_ref->GetNet() ) // pads are sorted by net code
|
if( pad_externe->GetNet() > pad_ref->GetNet() ) // pads are sorted by net code
|
||||||
break;
|
break;
|
||||||
|
|
||||||
distance = abs( pad_externe->m_Pos.x - pad_pos.x ) +
|
distance = abs( pad_externe->GetPosition().x - pad_pos.x ) +
|
||||||
abs( pad_externe->m_Pos.y - pad_pos.y );
|
abs( pad_externe->GetPosition().y - pad_pos.y );
|
||||||
|
|
||||||
if( distance < local_rats.m_Lenght )
|
if( distance < local_rats.m_Lenght )
|
||||||
{
|
{
|
||||||
|
@ -724,10 +724,13 @@ void PCB_BASE_FRAME::TraceModuleRatsNest( wxDC* DC )
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_ColorsSettings.SetItemColor(RATSNEST_VISIBLE, tmpcolor);
|
g_ColorsSettings.SetItemColor(RATSNEST_VISIBLE, tmpcolor);
|
||||||
wxPoint tmp = rats->m_PadStart->m_Pos;
|
|
||||||
rats->m_PadStart->m_Pos -= g_Offset_Module;
|
wxPoint tmp = rats->m_PadStart->GetPosition();
|
||||||
|
|
||||||
|
rats->m_PadStart->SetPosition( tmp - g_Offset_Module );
|
||||||
rats->Draw( m_canvas, DC, GR_XOR, wxPoint( 0, 0 ) );
|
rats->Draw( m_canvas, DC, GR_XOR, wxPoint( 0, 0 ) );
|
||||||
rats->m_PadStart->m_Pos = tmp;
|
|
||||||
|
rats->m_PadStart->SetPosition( tmp );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -827,7 +830,7 @@ void PCB_BASE_FRAME::BuildAirWiresTargetsList( BOARD_CONNECTED_ITEM* aItemRef,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( !pad->GetSubNet() || (pad->GetSubNet() != subnet) )
|
if( !pad->GetSubNet() || (pad->GetSubNet() != subnet) )
|
||||||
s_TargetsLocations.push_back( pad->m_Pos );
|
s_TargetsLocations.push_back( pad->GetPosition() );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a list of tracks ends candidates, not already connected to the
|
// Create a list of tracks ends candidates, not already connected to the
|
||||||
|
@ -851,10 +854,11 @@ void PCB_BASE_FRAME::BuildAirWiresTargetsList( BOARD_CONNECTED_ITEM* aItemRef,
|
||||||
// Remove duplicate targets, using the C++ unique algorithm
|
// Remove duplicate targets, using the C++ unique algorithm
|
||||||
sort( s_TargetsLocations.begin(), s_TargetsLocations.end(), sort_by_point );
|
sort( s_TargetsLocations.begin(), s_TargetsLocations.end(), sort_by_point );
|
||||||
std::vector< wxPoint >::iterator it = unique( s_TargetsLocations.begin(), s_TargetsLocations.end() );
|
std::vector< wxPoint >::iterator it = unique( s_TargetsLocations.begin(), s_TargetsLocations.end() );
|
||||||
|
|
||||||
// Using the C++ unique algorithm only moves the duplicate entries to the end of
|
// Using the C++ unique algorithm only moves the duplicate entries to the end of
|
||||||
// of the array. This removes the duplicate entries from the array.
|
// of the array. This removes the duplicate entries from the array.
|
||||||
s_TargetsLocations.resize( it - s_TargetsLocations.begin() );
|
s_TargetsLocations.resize( it - s_TargetsLocations.begin() );
|
||||||
} /* end if Init */
|
} // end if Init
|
||||||
|
|
||||||
// in all cases, sort by distances:
|
// in all cases, sort by distances:
|
||||||
sort( s_TargetsLocations.begin(), s_TargetsLocations.end(), sort_by_distance );
|
sort( s_TargetsLocations.begin(), s_TargetsLocations.end(), sort_by_distance );
|
||||||
|
|
|
@ -447,9 +447,11 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
|
||||||
routeLayerMask = topLayerMask | bottomLayerMask;
|
routeLayerMask = topLayerMask | bottomLayerMask;
|
||||||
|
|
||||||
pt_cur_ch = pt_rat;
|
pt_cur_ch = pt_rat;
|
||||||
current_net_code = pt_rat->GetNet();
|
|
||||||
padLayerMaskStart = pt_cur_ch->m_PadStart->m_layerMask;
|
current_net_code = pt_rat->GetNet();
|
||||||
padLayerMaskEnd = pt_cur_ch->m_PadEnd->m_layerMask;
|
padLayerMaskStart = pt_cur_ch->m_PadStart->GetLayerMask();
|
||||||
|
|
||||||
|
padLayerMaskEnd = pt_cur_ch->m_PadEnd->GetLayerMask();
|
||||||
|
|
||||||
|
|
||||||
/* First Test if routing possible ie if the pads are accessible
|
/* First Test if routing possible ie if the pads are accessible
|
||||||
|
@ -469,12 +471,12 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
|
||||||
+ pcbframe->GetBoard()->GetBoundingBox().GetX();
|
+ pcbframe->GetBoard()->GetBoundingBox().GetX();
|
||||||
int cY = ( Board.m_GridRouting * row_source )
|
int cY = ( Board.m_GridRouting * row_source )
|
||||||
+ pcbframe->GetBoard()->GetBoundingBox().GetY();
|
+ pcbframe->GetBoard()->GetBoundingBox().GetY();
|
||||||
int dx = pt_cur_ch->m_PadStart->m_Size.x / 2;
|
int dx = pt_cur_ch->m_PadStart->GetSize().x / 2;
|
||||||
int dy = pt_cur_ch->m_PadStart->m_Size.y / 2;
|
int dy = pt_cur_ch->m_PadStart->GetSize().y / 2;
|
||||||
int px = pt_cur_ch->m_PadStart->GetPosition().x;
|
int px = pt_cur_ch->m_PadStart->GetPosition().x;
|
||||||
int py = pt_cur_ch->m_PadStart->GetPosition().y;
|
int py = pt_cur_ch->m_PadStart->GetPosition().y;
|
||||||
|
|
||||||
if( ( ( int( pt_cur_ch->m_PadStart->m_Orient ) / 900 ) & 1 ) != 0 )
|
if( ( ( int( pt_cur_ch->m_PadStart->GetOrientation() ) / 900 ) & 1 ) != 0 )
|
||||||
EXCHG( dx, dy );
|
EXCHG( dx, dy );
|
||||||
|
|
||||||
if( ( abs( cX - px ) > dx ) || ( abs( cY - py ) > dy ) )
|
if( ( abs( cX - px ) > dx ) || ( abs( cY - py ) > dy ) )
|
||||||
|
@ -484,12 +486,12 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
|
||||||
+ pcbframe->GetBoard()->GetBoundingBox().GetX();
|
+ pcbframe->GetBoard()->GetBoundingBox().GetX();
|
||||||
cY = ( Board.m_GridRouting * row_target )
|
cY = ( Board.m_GridRouting * row_target )
|
||||||
+ pcbframe->GetBoard()->GetBoundingBox().GetY();
|
+ pcbframe->GetBoard()->GetBoundingBox().GetY();
|
||||||
dx = pt_cur_ch->m_PadEnd->m_Size.x / 2;
|
dx = pt_cur_ch->m_PadEnd->GetSize().x / 2;
|
||||||
dy = pt_cur_ch->m_PadEnd->m_Size.y / 2;
|
dy = pt_cur_ch->m_PadEnd->GetSize().y / 2;
|
||||||
px = pt_cur_ch->m_PadEnd->GetPosition().x;
|
px = pt_cur_ch->m_PadEnd->GetPosition().x;
|
||||||
py = pt_cur_ch->m_PadEnd->GetPosition().y;
|
py = pt_cur_ch->m_PadEnd->GetPosition().y;
|
||||||
|
|
||||||
if( ( ( int( pt_cur_ch->m_PadEnd->m_Orient ) / 900) & 1 ) != 0 )
|
if( ( ( int( pt_cur_ch->m_PadEnd->GetOrientation() ) / 900) & 1 ) != 0 )
|
||||||
EXCHG( dx, dy );
|
EXCHG( dx, dy );
|
||||||
|
|
||||||
if( ( abs( cX - px ) > dx ) || ( abs( cY - py ) > dy ) )
|
if( ( abs( cX - px ) > dx ) || ( abs( cY - py ) > dy ) )
|
||||||
|
|
|
@ -259,12 +259,12 @@ static DRAWSEGMENT* findPoint( const wxPoint& aPoint, TYPE_COLLECTOR* items )
|
||||||
*/
|
*/
|
||||||
static bool isRoundKeepout( D_PAD* aPad )
|
static bool isRoundKeepout( D_PAD* aPad )
|
||||||
{
|
{
|
||||||
if( aPad->m_PadShape==PAD_CIRCLE )
|
if( aPad->GetShape()==PAD_CIRCLE )
|
||||||
{
|
{
|
||||||
if( aPad->m_Drill.x >= aPad->m_Size.x )
|
if( aPad->GetDrillSize().x >= aPad->GetSize().x )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if( (aPad->m_layerMask & ALL_CU_LAYERS) == 0 )
|
if( (aPad->GetLayerMask() & ALL_CU_LAYERS) == 0 )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,7 +302,7 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad )
|
||||||
|
|
||||||
uniqifier = '[';
|
uniqifier = '[';
|
||||||
|
|
||||||
bool onAllCopperLayers = ( (aPad->m_layerMask & ALL_CU_LAYERS) == ALL_CU_LAYERS );
|
bool onAllCopperLayers = ( (aPad->GetLayerMask() & ALL_CU_LAYERS) == ALL_CU_LAYERS );
|
||||||
|
|
||||||
if( onAllCopperLayers )
|
if( onAllCopperLayers )
|
||||||
uniqifier += 'A'; // A for all layers
|
uniqifier += 'A'; // A for all layers
|
||||||
|
@ -332,11 +332,11 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad )
|
||||||
|
|
||||||
POINT dsnOffset;
|
POINT dsnOffset;
|
||||||
|
|
||||||
if( aPad->m_Offset.x || aPad->m_Offset.y )
|
if( aPad->GetOffset().x || aPad->GetOffset().y )
|
||||||
{
|
{
|
||||||
char offsetTxt[64];
|
char offsetTxt[64];
|
||||||
|
|
||||||
wxPoint offset( aPad->m_Offset.x, aPad->m_Offset.y );
|
wxPoint offset( aPad->GetOffset().x, aPad->GetOffset().y );
|
||||||
|
|
||||||
dsnOffset = mapPt( offset );
|
dsnOffset = mapPt( offset );
|
||||||
|
|
||||||
|
@ -347,12 +347,12 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad )
|
||||||
uniqifier += offsetTxt;
|
uniqifier += offsetTxt;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch( aPad->m_PadShape )
|
switch( aPad->GetShape() )
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
case PAD_CIRCLE:
|
case PAD_CIRCLE:
|
||||||
{
|
{
|
||||||
double diameter = scale(aPad->m_Size.x);
|
double diameter = scale(aPad->GetSize().x);
|
||||||
|
|
||||||
for( int ndx=0; ndx<reportedLayers; ++ndx )
|
for( int ndx=0; ndx<reportedLayers; ++ndx )
|
||||||
{
|
{
|
||||||
|
@ -368,7 +368,7 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad )
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf( name, sizeof(name), "Round%sPad_%.6g_mil",
|
snprintf( name, sizeof(name), "Round%sPad_%.6g_mil",
|
||||||
uniqifier.c_str(), scale(aPad->m_Size.x) );
|
uniqifier.c_str(), scale(aPad->GetSize().x) );
|
||||||
name[ sizeof(name)-1 ] = 0;
|
name[ sizeof(name)-1 ] = 0;
|
||||||
|
|
||||||
padstack->SetPadstackId( name );
|
padstack->SetPadstackId( name );
|
||||||
|
@ -377,8 +377,8 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad )
|
||||||
|
|
||||||
case PAD_RECT:
|
case PAD_RECT:
|
||||||
{
|
{
|
||||||
double dx = scale( aPad->m_Size.x ) / 2.0;
|
double dx = scale( aPad->GetSize().x ) / 2.0;
|
||||||
double dy = scale( aPad->m_Size.y ) / 2.0;
|
double dy = scale( aPad->GetSize().y ) / 2.0;
|
||||||
|
|
||||||
POINT lowerLeft( -dx, -dy );
|
POINT lowerLeft( -dx, -dy );
|
||||||
POINT upperRight( dx, dy );
|
POINT upperRight( dx, dy );
|
||||||
|
@ -399,7 +399,7 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad )
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf( name, sizeof(name), "Rect%sPad_%.6gx%.6g_mil",
|
snprintf( name, sizeof(name), "Rect%sPad_%.6gx%.6g_mil",
|
||||||
uniqifier.c_str(), scale(aPad->m_Size.x), scale(aPad->m_Size.y) );
|
uniqifier.c_str(), scale(aPad->GetSize().x), scale(aPad->GetSize().y) );
|
||||||
name[ sizeof(name)-1 ] = 0;
|
name[ sizeof(name)-1 ] = 0;
|
||||||
|
|
||||||
padstack->SetPadstackId( name );
|
padstack->SetPadstackId( name );
|
||||||
|
@ -408,8 +408,8 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad )
|
||||||
|
|
||||||
case PAD_OVAL:
|
case PAD_OVAL:
|
||||||
{
|
{
|
||||||
double dx = scale( aPad->m_Size.x ) / 2.0;
|
double dx = scale( aPad->GetSize().x ) / 2.0;
|
||||||
double dy = scale( aPad->m_Size.y ) / 2.0;
|
double dy = scale( aPad->GetSize().y ) / 2.0;
|
||||||
double dr = dx - dy;
|
double dr = dx - dy;
|
||||||
double radius;
|
double radius;
|
||||||
POINT start;
|
POINT start;
|
||||||
|
@ -447,7 +447,7 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad )
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf( name, sizeof(name), "Oval%sPad_%.6gx%.6g_mil",
|
snprintf( name, sizeof(name), "Oval%sPad_%.6gx%.6g_mil",
|
||||||
uniqifier.c_str(), scale(aPad->m_Size.x), scale(aPad->m_Size.y) );
|
uniqifier.c_str(), scale(aPad->GetSize().x), scale(aPad->GetSize().y) );
|
||||||
name[ sizeof(name)-1 ] = 0;
|
name[ sizeof(name)-1 ] = 0;
|
||||||
|
|
||||||
padstack->SetPadstackId( name );
|
padstack->SetPadstackId( name );
|
||||||
|
@ -456,11 +456,11 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad )
|
||||||
|
|
||||||
case PAD_TRAPEZOID:
|
case PAD_TRAPEZOID:
|
||||||
{
|
{
|
||||||
double dx = scale( aPad->m_Size.x ) / 2.0;
|
double dx = scale( aPad->GetSize().x ) / 2.0;
|
||||||
double dy = scale( aPad->m_Size.y ) / 2.0;
|
double dy = scale( aPad->GetSize().y ) / 2.0;
|
||||||
|
|
||||||
double ddx = scale( aPad->m_DeltaSize.x ) / 2.0;
|
double ddx = scale( aPad->GetDelta().x ) / 2.0;
|
||||||
double ddy = scale( aPad->m_DeltaSize.y ) / 2.0;
|
double ddy = scale( aPad->GetDelta().y ) / 2.0;
|
||||||
|
|
||||||
// see class_pad_draw_functions.cpp which draws the trapezoid pad
|
// see class_pad_draw_functions.cpp which draws the trapezoid pad
|
||||||
POINT lowerLeft( -dx - ddy, -dy - ddx );
|
POINT lowerLeft( -dx - ddy, -dy - ddx );
|
||||||
|
@ -490,15 +490,15 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad )
|
||||||
polygon->AppendPoint( lowerRight );
|
polygon->AppendPoint( lowerRight );
|
||||||
}
|
}
|
||||||
|
|
||||||
D(printf( "m_DeltaSize: %d,%d\n", aPad->m_DeltaSize.x, aPad->m_DeltaSize.y );)
|
D(printf( "m_DeltaSize: %d,%d\n", aPad->GetDelta().x, aPad->GetDelta().y );)
|
||||||
|
|
||||||
// this string _must_ be unique for a given physical shape
|
// this string _must_ be unique for a given physical shape
|
||||||
snprintf( name, sizeof(name), "Trapz%sPad_%.6gx%.6g_%c%.6gx%c%.6g_mil",
|
snprintf( name, sizeof(name), "Trapz%sPad_%.6gx%.6g_%c%.6gx%c%.6g_mil",
|
||||||
uniqifier.c_str(), scale(aPad->m_Size.x), scale(aPad->m_Size.y),
|
uniqifier.c_str(), scale(aPad->GetSize().x), scale(aPad->GetSize().y),
|
||||||
aPad->m_DeltaSize.x < 0 ? 'n' : 'p',
|
aPad->GetDelta().x < 0 ? 'n' : 'p',
|
||||||
abs( scale( aPad->m_DeltaSize.x )),
|
abs( scale( aPad->GetDelta().x )),
|
||||||
aPad->m_DeltaSize.y < 0 ? 'n' : 'p',
|
aPad->GetDelta().y < 0 ? 'n' : 'p',
|
||||||
abs( scale( aPad->m_DeltaSize.y ))
|
abs( scale( aPad->GetDelta().y ))
|
||||||
);
|
);
|
||||||
name[ sizeof(name)-1 ] = 0;
|
name[ sizeof(name)-1 ] = 0;
|
||||||
|
|
||||||
|
@ -538,8 +538,8 @@ IMAGE* SPECCTRA_DB::makeIMAGE( BOARD* aBoard, MODULE* aModule )
|
||||||
// see if this pad is a through hole with no copper on its perimeter
|
// see if this pad is a through hole with no copper on its perimeter
|
||||||
if( isRoundKeepout( pad ) )
|
if( isRoundKeepout( pad ) )
|
||||||
{
|
{
|
||||||
double diameter = scale( pad->m_Drill.x );
|
double diameter = scale( pad->GetDrillSize().x );
|
||||||
POINT vertex = mapPt( pad->m_Pos0 );
|
POINT vertex = mapPt( pad->GetPos0() );
|
||||||
|
|
||||||
int layerCount = aBoard->GetCopperLayerCount();
|
int layerCount = aBoard->GetCopperLayerCount();
|
||||||
for( int layer=0; layer<layerCount; ++layer )
|
for( int layer=0; layer<layerCount; ++layer )
|
||||||
|
@ -600,14 +600,14 @@ IMAGE* SPECCTRA_DB::makeIMAGE( BOARD* aBoard, MODULE* aModule )
|
||||||
|
|
||||||
pin->padstack_id = padstack->padstack_id;
|
pin->padstack_id = padstack->padstack_id;
|
||||||
|
|
||||||
int angle = pad->m_Orient - aModule->m_Orient; // tenths of degrees
|
int angle = pad->GetOrientation() - aModule->GetOrientation(); // tenths of degrees
|
||||||
if( angle )
|
if( angle )
|
||||||
{
|
{
|
||||||
NORMALIZE_ANGLE_POS(angle);
|
NORMALIZE_ANGLE_POS(angle);
|
||||||
pin->SetRotation( angle / 10.0 );
|
pin->SetRotation( angle / 10.0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
wxPoint pos( pad->m_Pos0 );
|
wxPoint pos( pad->GetPos0() );
|
||||||
|
|
||||||
pin->SetVertex( mapPt( pos ) );
|
pin->SetVertex( mapPt( pos ) );
|
||||||
}
|
}
|
||||||
|
@ -1255,7 +1255,7 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IO_ERROR )
|
||||||
PLACE* place = new PLACE( comp );
|
PLACE* place = new PLACE( comp );
|
||||||
comp->places.push_back( place );
|
comp->places.push_back( place );
|
||||||
|
|
||||||
place->SetRotation( module->m_Orient/10.0 );
|
place->SetRotation( module->GetOrientation()/10.0 );
|
||||||
place->SetVertex( mapPt( module->m_Pos ) );
|
place->SetVertex( mapPt( module->m_Pos ) );
|
||||||
place->component_id = componentId;
|
place->component_id = componentId;
|
||||||
place->part_number = TO_UTF8( module->GetValue() );
|
place->part_number = TO_UTF8( module->GetValue() );
|
||||||
|
@ -1263,7 +1263,7 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IO_ERROR )
|
||||||
// module is flipped from bottom side, set side to T_back
|
// module is flipped from bottom side, set side to T_back
|
||||||
if( module->flag )
|
if( module->flag )
|
||||||
{
|
{
|
||||||
int angle = 1800 - module->m_Orient;
|
int angle = 1800 - module->GetOrientation();
|
||||||
NORMALIZE_ANGLE_POS(angle);
|
NORMALIZE_ANGLE_POS(angle);
|
||||||
place->SetRotation( angle/10.0 );
|
place->SetRotation( angle/10.0 );
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,7 @@ int PCB_EDIT_FRAME::EraseRedundantTrack( wxDC* aDC,
|
||||||
wxASSERT( aNewTrack );
|
wxASSERT( aNewTrack );
|
||||||
|
|
||||||
#if 0 && defined(DEBUG)
|
#if 0 && defined(DEBUG)
|
||||||
TRACK* EndNewTrack; /* The last segment of the list chained to the track */
|
TRACK* EndNewTrack; // The last segment of the list chained to the track
|
||||||
|
|
||||||
EndNewTrack = aNewTrack;
|
EndNewTrack = aNewTrack;
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ int PCB_EDIT_FRAME::EraseRedundantTrack( wxDC* aDC,
|
||||||
TRACK* bufStart = m_Pcb->m_Track->GetStartNetCode( netcode ); // Beginning of tracks of the net
|
TRACK* bufStart = m_Pcb->m_Track->GetStartNetCode( netcode ); // Beginning of tracks of the net
|
||||||
TRACK* bufEnd = bufStart->GetEndNetCode( netcode ); // End of tracks of the net
|
TRACK* bufEnd = bufStart->GetEndNetCode( netcode ); // End of tracks of the net
|
||||||
|
|
||||||
/* Flags for cleaning the net. */
|
// Flags for cleaning the net.
|
||||||
for( pt_del = bufStart; pt_del; pt_del = pt_del->Next() )
|
for( pt_del = bufStart; pt_del; pt_del = pt_del->Next() )
|
||||||
{
|
{
|
||||||
// D( std::cout<<"track "<<pt_del<<" turning off BUSY | IN_EDIT | IS_LINKED"<<std::endl; )
|
// D( std::cout<<"track "<<pt_del<<" turning off BUSY | IN_EDIT | IS_LINKED"<<std::endl; )
|
||||||
|
@ -118,15 +118,15 @@ int PCB_EDIT_FRAME::EraseRedundantTrack( wxDC* aDC,
|
||||||
start = StartTrack->m_Start;
|
start = StartTrack->m_Start;
|
||||||
end = EndTrack->m_End;
|
end = EndTrack->m_End;
|
||||||
|
|
||||||
/* The start and end points cannot be the same. */
|
// The start and end points cannot be the same.
|
||||||
if( start == end )
|
if( start == end )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Determine layers interconnected these points. */
|
// Determine layers interconnected these points.
|
||||||
startmasklayer = StartTrack->ReturnMaskLayer();
|
startmasklayer = StartTrack->ReturnMaskLayer();
|
||||||
endmasklayer = EndTrack->ReturnMaskLayer();
|
endmasklayer = EndTrack->ReturnMaskLayer();
|
||||||
|
|
||||||
/* There may be a via or a pad on the end points. */
|
// There may be a via or a pad on the end points.
|
||||||
pt_segm = m_Pcb->m_Track->GetVia( NULL, start, startmasklayer );
|
pt_segm = m_Pcb->m_Track->GetVia( NULL, start, startmasklayer );
|
||||||
|
|
||||||
if( pt_segm )
|
if( pt_segm )
|
||||||
|
@ -134,9 +134,9 @@ int PCB_EDIT_FRAME::EraseRedundantTrack( wxDC* aDC,
|
||||||
|
|
||||||
if( StartTrack->start && ( StartTrack->start->Type() == PCB_PAD_T ) )
|
if( StartTrack->start && ( StartTrack->start->Type() == PCB_PAD_T ) )
|
||||||
{
|
{
|
||||||
/* Start on pad. */
|
// Start on pad.
|
||||||
D_PAD* pt_pad = (D_PAD*)(StartTrack->start);
|
D_PAD* pad = (D_PAD*) StartTrack->start;
|
||||||
startmasklayer |= pt_pad->m_layerMask;
|
startmasklayer |= pad->GetLayerMask();
|
||||||
}
|
}
|
||||||
|
|
||||||
pt_segm = m_Pcb->m_Track->GetVia( NULL, end, endmasklayer );
|
pt_segm = m_Pcb->m_Track->GetVia( NULL, end, endmasklayer );
|
||||||
|
@ -146,8 +146,8 @@ int PCB_EDIT_FRAME::EraseRedundantTrack( wxDC* aDC,
|
||||||
|
|
||||||
if( EndTrack->end && ( EndTrack->end->Type() == PCB_PAD_T ) )
|
if( EndTrack->end && ( EndTrack->end->Type() == PCB_PAD_T ) )
|
||||||
{
|
{
|
||||||
D_PAD* pt_pad = (D_PAD*)(EndTrack->end);
|
D_PAD* pad = (D_PAD*) EndTrack->end;
|
||||||
endmasklayer |= pt_pad->m_layerMask;
|
endmasklayer |= pad->GetLayerMask();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mark as deleted a new track (which is not involved in the search for other connections)
|
// Mark as deleted a new track (which is not involved in the search for other connections)
|
||||||
|
@ -158,9 +158,9 @@ int PCB_EDIT_FRAME::EraseRedundantTrack( wxDC* aDC,
|
||||||
*/
|
*/
|
||||||
pt_segm = GetTrace( bufStart, bufEnd, start, startmasklayer );
|
pt_segm = GetTrace( bufStart, bufEnd, start, startmasklayer );
|
||||||
|
|
||||||
if( pt_segm == NULL ) /* Not connected to the track starting point. */
|
if( pt_segm == NULL ) // Not connected to the track starting point.
|
||||||
{
|
{
|
||||||
/* Clear the delete flag. */
|
// Clear the delete flag.
|
||||||
ListSetState( aNewTrack, aNewTrackSegmentsCount, IS_DELETED, OFF );
|
ListSetState( aNewTrack, aNewTrackSegmentsCount, IS_DELETED, OFF );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -193,7 +193,7 @@ int PCB_EDIT_FRAME::EraseRedundantTrack( wxDC* aDC,
|
||||||
|
|
||||||
if( nbconnect == 0 )
|
if( nbconnect == 0 )
|
||||||
{
|
{
|
||||||
/* Clear used flags */
|
// Clear used flags
|
||||||
for( pt_del = bufStart; pt_del; pt_del = pt_del->Next() )
|
for( pt_del = bufStart; pt_del; pt_del = pt_del->Next() )
|
||||||
{
|
{
|
||||||
pt_del->SetState( BUSY | IS_DELETED | IN_EDIT | IS_LINKED, OFF );
|
pt_del->SetState( BUSY | IS_DELETED | IN_EDIT | IS_LINKED, OFF );
|
||||||
|
@ -209,7 +209,7 @@ int PCB_EDIT_FRAME::EraseRedundantTrack( wxDC* aDC,
|
||||||
ListSetState( aNewTrack, aNewTrackSegmentsCount, IS_DELETED, OFF );
|
ListSetState( aNewTrack, aNewTrackSegmentsCount, IS_DELETED, OFF );
|
||||||
ListSetState( aNewTrack, aNewTrackSegmentsCount, IN_EDIT, ON );
|
ListSetState( aNewTrack, aNewTrackSegmentsCount, IN_EDIT, ON );
|
||||||
|
|
||||||
/* Test all marked segments. */
|
// Test all marked segments.
|
||||||
while( nbconnect )
|
while( nbconnect )
|
||||||
{
|
{
|
||||||
for( pt_del = bufStart; pt_del; pt_del = pt_del->Next() )
|
for( pt_del = bufStart; pt_del; pt_del = pt_del->Next() )
|
||||||
|
@ -239,7 +239,7 @@ int PCB_EDIT_FRAME::EraseRedundantTrack( wxDC* aDC,
|
||||||
|
|
||||||
if( pt_segm->m_Start == start || pt_segm->m_End == start )
|
if( pt_segm->m_Start == start || pt_segm->m_End == start )
|
||||||
{
|
{
|
||||||
/* Marked track can be erased. */
|
// Marked track can be erased.
|
||||||
TRACK* NextS;
|
TRACK* NextS;
|
||||||
|
|
||||||
DrawTraces( m_canvas, aDC, pt_del, nb_segm, GR_XOR | GR_HIGHLIGHT );
|
DrawTraces( m_canvas, aDC, pt_del, nb_segm, GR_XOR | GR_HIGHLIGHT );
|
||||||
|
@ -262,7 +262,7 @@ int PCB_EDIT_FRAME::EraseRedundantTrack( wxDC* aDC,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clean up flags. */
|
// Clean up flags.
|
||||||
for( pt_del = m_Pcb->m_Track; pt_del != NULL; pt_del = pt_del->Next() )
|
for( pt_del = m_Pcb->m_Track; pt_del != NULL; pt_del = pt_del->Next() )
|
||||||
{
|
{
|
||||||
if( pt_del->GetState( IN_EDIT ) )
|
if( pt_del->GetState( IN_EDIT ) )
|
||||||
|
@ -284,7 +284,7 @@ int PCB_EDIT_FRAME::EraseRedundantTrack( wxDC* aDC,
|
||||||
ListSetState( pt_del, nb_segm, BUSY, OFF );
|
ListSetState( pt_del, nb_segm, BUSY, OFF );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear used flags */
|
// Clear used flags
|
||||||
for( pt_del = m_Pcb->m_Track; pt_del; pt_del = pt_del->Next() )
|
for( pt_del = m_Pcb->m_Track; pt_del; pt_del = pt_del->Next() )
|
||||||
{
|
{
|
||||||
pt_del->SetState( BUSY | IS_DELETED | IN_EDIT | IS_LINKED, OFF );
|
pt_del->SetState( BUSY | IS_DELETED | IN_EDIT | IS_LINKED, OFF );
|
||||||
|
|
|
@ -71,7 +71,7 @@ void FOOTPRINT_EDIT_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg )
|
||||||
m_canvas->DrawBackGround( DC );
|
m_canvas->DrawBackGround( DC );
|
||||||
TraceWorkSheet( DC, screen, 0 );
|
TraceWorkSheet( DC, screen, 0 );
|
||||||
|
|
||||||
/* Redraw the footprints */
|
// Redraw the footprints
|
||||||
for( MODULE* module = GetBoard()->m_Modules; module; module = module->Next() )
|
for( MODULE* module = GetBoard()->m_Modules; module; module = module->Next() )
|
||||||
{
|
{
|
||||||
module->Draw( m_canvas, DC, GR_OR );
|
module->Draw( m_canvas, DC, GR_OR );
|
||||||
|
@ -89,7 +89,7 @@ void FOOTPRINT_EDIT_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg )
|
||||||
if( m_canvas->IsMouseCaptured() )
|
if( m_canvas->IsMouseCaptured() )
|
||||||
m_canvas->CallMouseCapture( DC, wxDefaultPosition, false );
|
m_canvas->CallMouseCapture( DC, wxDefaultPosition, false );
|
||||||
|
|
||||||
/* Redraw the cursor */
|
// Redraw the cursor
|
||||||
m_canvas->DrawCrossHair( DC );
|
m_canvas->DrawCrossHair( DC );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ void PCB_EDIT_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Redraw the BOARD items but not cursors, axis or grid */
|
// Redraw the BOARD items but not cursors, axis or grid
|
||||||
void BOARD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* DC, int aDrawMode, const wxPoint& offset )
|
void BOARD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* DC, int aDrawMode, const wxPoint& offset )
|
||||||
{
|
{
|
||||||
/* The order of drawing is flexible on some systems and not on others. For
|
/* The order of drawing is flexible on some systems and not on others. For
|
||||||
|
@ -178,7 +178,7 @@ void BOARD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* DC, int aDrawMode, const wxPoint
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Draw areas (i.e. zones) */
|
// Draw areas (i.e. zones)
|
||||||
for( int ii = 0; ii < GetAreaCount(); ii++ )
|
for( int ii = 0; ii < GetAreaCount(); ii++ )
|
||||||
{
|
{
|
||||||
ZONE_CONTAINER* zone = GetArea(ii);
|
ZONE_CONTAINER* zone = GetArea(ii);
|
||||||
|
@ -280,21 +280,19 @@ void BOARD::DrawHighLight( EDA_DRAW_PANEL* am_canvas, wxDC* DC, int aNetCode )
|
||||||
* and we want to see pad through.
|
* and we want to see pad through.
|
||||||
* The pads must appear on the layers selected in LayerMask
|
* The pads must appear on the layers selected in LayerMask
|
||||||
*/
|
*/
|
||||||
void Trace_Pads_Only( EDA_DRAW_PANEL* panel, wxDC* DC, MODULE* Module,
|
void Trace_Pads_Only( EDA_DRAW_PANEL* panel, wxDC* DC, MODULE* aModule,
|
||||||
int ox, int oy, int LayerMask, int draw_mode )
|
int ox, int oy, int aLayerMask, int draw_mode )
|
||||||
{
|
{
|
||||||
int tmp;
|
PCB_BASE_FRAME* frame = (PCB_BASE_FRAME*) panel->GetParent();
|
||||||
PCB_BASE_FRAME* frame;
|
|
||||||
|
|
||||||
frame = (PCB_BASE_FRAME*) panel->GetParent();
|
int tmp = frame->m_DisplayPadFill;
|
||||||
|
|
||||||
tmp = frame->m_DisplayPadFill;
|
|
||||||
frame->m_DisplayPadFill = false;
|
frame->m_DisplayPadFill = false;
|
||||||
|
|
||||||
/* Draw pads. */
|
// Draw pads.
|
||||||
for( D_PAD* pad = Module->m_Pads; pad; pad = pad->Next() )
|
for( D_PAD* pad = aModule->m_Pads; pad; pad = pad->Next() )
|
||||||
{
|
{
|
||||||
if( (pad->m_layerMask & LayerMask) == 0 )
|
if( (pad->GetLayerMask() & aLayerMask) == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
pad->Draw( panel, DC, draw_mode, wxPoint( ox, oy ) );
|
pad->Draw( panel, DC, draw_mode, wxPoint( ox, oy ) );
|
||||||
|
|
|
@ -71,7 +71,7 @@ static int CopyPolygonsFromFilledPolysListTotKPolygonList( ZONE_CONTAINER* aZon
|
||||||
// Local Variables:
|
// Local Variables:
|
||||||
static int s_thermalRot = 450; // angle of stubs in thermal reliefs for round pads
|
static int s_thermalRot = 450; // angle of stubs in thermal reliefs for round pads
|
||||||
|
|
||||||
/* how many segments are used to create a polygon from a circle: */
|
// how many segments are used to create a polygon from a circle:
|
||||||
static int s_CircleToSegmentsCount = ARC_APPROX_SEGMENTS_COUNT_LOW_DEF; /* default value. the real value will be changed to
|
static int s_CircleToSegmentsCount = ARC_APPROX_SEGMENTS_COUNT_LOW_DEF; /* default value. the real value will be changed to
|
||||||
* ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF
|
* ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF
|
||||||
* if m_ArcToSegmentsCount == ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF
|
* if m_ArcToSegmentsCount == ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF
|
||||||
|
@ -201,15 +201,16 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
* inside the board (in fact inside the hole. Some photo diodes and Leds are
|
* inside the board (in fact inside the hole. Some photo diodes and Leds are
|
||||||
* like this)
|
* like this)
|
||||||
*/
|
*/
|
||||||
if( (pad->m_Drill.x == 0) && (pad->m_Drill.y == 0) )
|
if( pad->GetDrillSize().x == 0 && pad->GetDrillSize().y == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Use a dummy pad to calculate a hole shape that have the same dimension as
|
// Use a dummy pad to calculate a hole shape that have the same dimension as
|
||||||
// the pad hole
|
// the pad hole
|
||||||
dummypad.m_Size = pad->m_Drill;
|
dummypad.SetSize( pad->GetDrillSize() );
|
||||||
dummypad.m_Orient = pad->m_Orient;
|
dummypad.SetOrientation( pad->GetOrientation() );
|
||||||
dummypad.m_PadShape = pad->m_DrillShape;
|
dummypad.SetShape( pad->GetDrillShape() );
|
||||||
dummypad.m_Pos = pad->m_Pos;
|
dummypad.SetPosition( pad->GetPosition() );
|
||||||
|
|
||||||
pad = &dummypad;
|
pad = &dummypad;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,7 +234,7 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
int gap = zone_clearance;
|
int gap = zone_clearance;
|
||||||
|
|
||||||
if( (m_PadOption == PAD_NOT_IN_ZONE)
|
if( (m_PadOption == PAD_NOT_IN_ZONE)
|
||||||
|| (GetNet() == 0) || pad->m_PadShape == PAD_TRAPEZOID )
|
|| (GetNet() == 0) || pad->GetShape() == PAD_TRAPEZOID )
|
||||||
|
|
||||||
// PAD_TRAPEZOID shapes are not in zones because they are used in microwave apps
|
// PAD_TRAPEZOID shapes are not in zones because they are used in microwave apps
|
||||||
// and i think it is good that shapes are not changed by thermal pads or others
|
// and i think it is good that shapes are not changed by thermal pads or others
|
||||||
|
@ -407,18 +408,19 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
if( m_PadOption == THERMAL_PAD )
|
if( m_PadOption == THERMAL_PAD )
|
||||||
{
|
{
|
||||||
cornerBufferPolysToSubstract.clear();
|
cornerBufferPolysToSubstract.clear();
|
||||||
|
|
||||||
// Test thermal stubs connections and add polygons to remove unconnected stubs.
|
// Test thermal stubs connections and add polygons to remove unconnected stubs.
|
||||||
BuildUnconnectedThermalStubsPolygonList( cornerBufferPolysToSubstract, aPcb, this,
|
BuildUnconnectedThermalStubsPolygonList( cornerBufferPolysToSubstract, aPcb, this,
|
||||||
s_Correction, s_thermalRot );
|
s_Correction, s_thermalRot );
|
||||||
|
|
||||||
/* remove copper areas */
|
// remove copper areas
|
||||||
if( cornerBufferPolysToSubstract.size() )
|
if( cornerBufferPolysToSubstract.size() )
|
||||||
{
|
{
|
||||||
KPolygonSet polyset_holes;
|
KPolygonSet polyset_holes;
|
||||||
AddPolygonCornersToKPolygonList( cornerBufferPolysToSubstract, polyset_holes );
|
AddPolygonCornersToKPolygonList( cornerBufferPolysToSubstract, polyset_holes );
|
||||||
polyset_zone_solid_areas -= polyset_holes;
|
polyset_zone_solid_areas -= polyset_holes;
|
||||||
|
|
||||||
/* put these areas in m_FilledPolysList */
|
// put these areas in m_FilledPolysList
|
||||||
m_FilledPolysList.clear();
|
m_FilledPolysList.clear();
|
||||||
CopyPolygonsFromKPolygonListToFilledPolysList( this, polyset_zone_solid_areas );
|
CopyPolygonsFromKPolygonListToFilledPolysList( this, polyset_zone_solid_areas );
|
||||||
|
|
||||||
|
|
|
@ -68,21 +68,21 @@ void BuildUnconnectedThermalStubsPolygonList( std::vector<CPolyPt>& aCornerBuffe
|
||||||
// Thermal bridges are like a segment from a starting point inside the pad
|
// Thermal bridges are like a segment from a starting point inside the pad
|
||||||
// to an ending point outside the pad
|
// to an ending point outside the pad
|
||||||
wxPoint startpoint, endpoint;
|
wxPoint startpoint, endpoint;
|
||||||
endpoint.x = ( pad->m_Size.x / 2 ) + aZone->m_ThermalReliefGap;
|
endpoint.x = ( pad->GetSize().x / 2 ) + aZone->m_ThermalReliefGap;
|
||||||
endpoint.y = ( pad->m_Size.y / 2 ) + aZone->m_ThermalReliefGap;
|
endpoint.y = ( pad->GetSize().y / 2 ) + aZone->m_ThermalReliefGap;
|
||||||
|
|
||||||
int copperThickness = aZone->m_ThermalReliefCopperBridge - aZone->m_ZoneMinThickness;
|
int copperThickness = aZone->m_ThermalReliefCopperBridge - aZone->m_ZoneMinThickness;
|
||||||
if( copperThickness < 0 )
|
if( copperThickness < 0 )
|
||||||
copperThickness = 0;
|
copperThickness = 0;
|
||||||
|
|
||||||
startpoint.x = min( pad->m_Size.x, copperThickness );
|
startpoint.x = min( pad->GetSize().x, copperThickness );
|
||||||
startpoint.y = min( pad->m_Size.y, copperThickness );
|
startpoint.y = min( pad->GetSize().y, copperThickness );
|
||||||
startpoint.x /= 2;
|
startpoint.x /= 2;
|
||||||
startpoint.y /= 2;
|
startpoint.y /= 2;
|
||||||
|
|
||||||
// This is CIRCLE pad tweak (for circle pads the thermal stubs are at 45 deg)
|
// This is CIRCLE pad tweak (for circle pads the thermal stubs are at 45 deg)
|
||||||
int fAngle = pad->m_Orient;
|
int fAngle = pad->GetOrientation();
|
||||||
if( pad->m_PadShape == PAD_CIRCLE )
|
if( pad->GetShape() == PAD_CIRCLE )
|
||||||
{
|
{
|
||||||
endpoint.x = (int) ( endpoint.x * aArcCorrection );
|
endpoint.x = (int) ( endpoint.x * aArcCorrection );
|
||||||
endpoint.y = endpoint.x;
|
endpoint.y = endpoint.x;
|
||||||
|
|
|
@ -28,7 +28,7 @@ void ZONE_CONTAINER::Test_For_Copper_Island_And_Remove_Insulated_Islands( BOARD
|
||||||
|
|
||||||
// Build a list of points connected to the net:
|
// Build a list of points connected to the net:
|
||||||
// list of coordinates of pads and vias on this layer and on this net.
|
// list of coordinates of pads and vias on this layer and on this net.
|
||||||
std::vector <wxPoint> ListPointsCandidates;
|
std::vector <wxPoint> listPointsCandidates;
|
||||||
|
|
||||||
for( MODULE* module = aPcb->m_Modules; module; module = module->Next() )
|
for( MODULE* module = aPcb->m_Modules; module; module = module->Next() )
|
||||||
{
|
{
|
||||||
|
@ -40,7 +40,7 @@ void ZONE_CONTAINER::Test_For_Copper_Island_And_Remove_Insulated_Islands( BOARD
|
||||||
if( pad->GetNet() != GetNet() )
|
if( pad->GetNet() != GetNet() )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ListPointsCandidates.push_back( pad->m_Pos );
|
listPointsCandidates.push_back( pad->GetPosition() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,10 +52,10 @@ void ZONE_CONTAINER::Test_For_Copper_Island_And_Remove_Insulated_Islands( BOARD
|
||||||
if( track->GetNet() != GetNet() )
|
if( track->GetNet() != GetNet() )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ListPointsCandidates.push_back( track->m_Start );
|
listPointsCandidates.push_back( track->m_Start );
|
||||||
|
|
||||||
if( track->Type() != PCB_VIA_T )
|
if( track->Type() != PCB_VIA_T )
|
||||||
ListPointsCandidates.push_back( track->m_End );
|
listPointsCandidates.push_back( track->m_End );
|
||||||
}
|
}
|
||||||
|
|
||||||
// test if a point is inside
|
// test if a point is inside
|
||||||
|
@ -68,10 +68,10 @@ void ZONE_CONTAINER::Test_For_Copper_Island_And_Remove_Insulated_Islands( BOARD
|
||||||
{
|
{
|
||||||
EDA_RECT bbox = CalculateSubAreaBoundaryBox( indexstart, indexend );
|
EDA_RECT bbox = CalculateSubAreaBoundaryBox( indexstart, indexend );
|
||||||
|
|
||||||
for( unsigned ic = 0; ic < ListPointsCandidates.size(); ic++ )
|
for( unsigned ic = 0; ic < listPointsCandidates.size(); ic++ )
|
||||||
{
|
{
|
||||||
// test if this area is connected to a board item:
|
// test if this area is connected to a board item:
|
||||||
wxPoint pos = ListPointsCandidates[ic];
|
wxPoint pos = listPointsCandidates[ic];
|
||||||
|
|
||||||
if( !bbox.Contains( pos ) )
|
if( !bbox.Contains( pos ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -142,7 +142,7 @@ void BOARD::Test_Connections_To_Copper_Areas( int aNetcode )
|
||||||
|
|
||||||
if( item->Type() == PCB_PAD_T )
|
if( item->Type() == PCB_PAD_T )
|
||||||
{
|
{
|
||||||
pos1 = pos2 = ( (D_PAD*) item )->m_Pos;
|
pos1 = pos2 = ( (D_PAD*) item )->GetPosition();
|
||||||
}
|
}
|
||||||
else if( item->Type() == PCB_VIA_T )
|
else if( item->Type() == PCB_VIA_T )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue