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;
|
||||||
|
|
|
@ -11,511 +11,511 @@
|
||||||
|
|
||||||
DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
|
DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
|
||||||
{
|
{
|
||||||
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
|
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
|
||||||
|
|
||||||
wxBoxSizer* m_MainSizer;
|
wxBoxSizer* m_MainSizer;
|
||||||
m_MainSizer = new wxBoxSizer( wxVERTICAL );
|
m_MainSizer = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
wxBoxSizer* bGeneralSizer;
|
wxBoxSizer* bGeneralSizer;
|
||||||
bGeneralSizer = new wxBoxSizer( wxHORIZONTAL );
|
bGeneralSizer = new wxBoxSizer( wxHORIZONTAL );
|
||||||
|
|
||||||
wxBoxSizer* m_LeftBoxSizer;
|
wxBoxSizer* m_LeftBoxSizer;
|
||||||
m_LeftBoxSizer = new wxBoxSizer( wxVERTICAL );
|
m_LeftBoxSizer = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
m_PadNumText = new wxStaticText( this, wxID_ANY, _("Pad Num :"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadNumText = new wxStaticText( this, wxID_ANY, _("Pad Num :"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_PadNumText->Wrap( -1 );
|
m_PadNumText->Wrap( -1 );
|
||||||
m_LeftBoxSizer->Add( m_PadNumText, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
m_LeftBoxSizer->Add( m_PadNumText, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadNumCtrl = new wxTextCtrl( this, wxID_PADNUMCTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadNumCtrl = new wxTextCtrl( this, wxID_PADNUMCTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_LeftBoxSizer->Add( m_PadNumCtrl, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
|
m_LeftBoxSizer->Add( m_PadNumCtrl, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
|
||||||
|
|
||||||
m_PadNameText = new wxStaticText( this, wxID_ANY, _("Pad Net Name :"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadNameText = new wxStaticText( this, wxID_ANY, _("Pad Net Name :"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_PadNameText->Wrap( -1 );
|
m_PadNameText->Wrap( -1 );
|
||||||
m_LeftBoxSizer->Add( m_PadNameText, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
m_LeftBoxSizer->Add( m_PadNameText, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadNetNameCtrl = new wxTextCtrl( this, wxID_PADNETNAMECTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadNetNameCtrl = new wxTextCtrl( this, wxID_PADNETNAMECTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_LeftBoxSizer->Add( m_PadNetNameCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
m_LeftBoxSizer->Add( m_PadNetNameCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
wxStaticBoxSizer* sbSizer2;
|
wxStaticBoxSizer* sbSizer2;
|
||||||
sbSizer2 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Pad Geometry:") ), wxVERTICAL );
|
sbSizer2 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Pad Geometry:") ), wxVERTICAL );
|
||||||
|
|
||||||
wxFlexGridSizer* fgSizerGeometry;
|
wxFlexGridSizer* fgSizerGeometry;
|
||||||
fgSizerGeometry = new wxFlexGridSizer( 14, 3, 0, 0 );
|
fgSizerGeometry = new wxFlexGridSizer( 14, 3, 0, 0 );
|
||||||
fgSizerGeometry->SetFlexibleDirection( wxBOTH );
|
fgSizerGeometry->SetFlexibleDirection( wxBOTH );
|
||||||
fgSizerGeometry->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
fgSizerGeometry->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||||
|
|
||||||
m_staticText4 = new wxStaticText( this, wxID_ANY, _("Pad pos X"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticText4 = new wxStaticText( this, wxID_ANY, _("Pad pos X"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText4->Wrap( -1 );
|
m_staticText4->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_staticText4, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
|
fgSizerGeometry->Add( m_staticText4, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadPosition_X_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadPosition_X_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
fgSizerGeometry->Add( m_PadPosition_X_Ctrl, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
fgSizerGeometry->Add( m_PadPosition_X_Ctrl, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadPosX_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadPosX_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_PadPosX_Unit->Wrap( -1 );
|
m_PadPosX_Unit->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_PadPosX_Unit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
|
fgSizerGeometry->Add( m_PadPosX_Unit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
|
||||||
|
|
||||||
m_staticText41 = new wxStaticText( this, wxID_ANY, _("Pad pos Y"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticText41 = new wxStaticText( this, wxID_ANY, _("Pad pos Y"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText41->Wrap( -1 );
|
m_staticText41->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_staticText41, 0, wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
|
fgSizerGeometry->Add( m_staticText41, 0, wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
|
||||||
|
|
||||||
m_PadPosition_Y_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadPosition_Y_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
fgSizerGeometry->Add( m_PadPosition_Y_Ctrl, 0, wxALL, 5 );
|
fgSizerGeometry->Add( m_PadPosition_Y_Ctrl, 0, wxALL, 5 );
|
||||||
|
|
||||||
m_PadPosY_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadPosY_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_PadPosY_Unit->Wrap( -1 );
|
m_PadPosY_Unit->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_PadPosY_Unit, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
fgSizerGeometry->Add( m_PadPosY_Unit, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||||
|
|
||||||
m_staticline7 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
m_staticline7 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||||
fgSizerGeometry->Add( m_staticline7, 0, wxEXPAND | wxALL, 5 );
|
fgSizerGeometry->Add( m_staticline7, 0, wxEXPAND | wxALL, 5 );
|
||||||
|
|
||||||
m_staticline8 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
m_staticline8 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||||
fgSizerGeometry->Add( m_staticline8, 0, wxEXPAND | wxALL, 5 );
|
fgSizerGeometry->Add( m_staticline8, 0, wxEXPAND | wxALL, 5 );
|
||||||
|
|
||||||
m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||||
fgSizerGeometry->Add( m_staticline9, 0, wxEXPAND | wxALL, 5 );
|
fgSizerGeometry->Add( m_staticline9, 0, wxEXPAND | wxALL, 5 );
|
||||||
|
|
||||||
m_textPadDrillX = new wxStaticText( this, wxID_ANY, _("Pad drill X"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_textPadDrillX = new wxStaticText( this, wxID_ANY, _("Pad drill X"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_textPadDrillX->Wrap( -1 );
|
m_textPadDrillX->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_textPadDrillX, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxALIGN_RIGHT, 5 );
|
fgSizerGeometry->Add( m_textPadDrillX, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxALIGN_RIGHT, 5 );
|
||||||
|
|
||||||
m_PadDrill_X_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadDrill_X_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
fgSizerGeometry->Add( m_PadDrill_X_Ctrl, 0, wxALL, 5 );
|
fgSizerGeometry->Add( m_PadDrill_X_Ctrl, 0, wxALL, 5 );
|
||||||
|
|
||||||
m_PadDrill_X_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadDrill_X_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_PadDrill_X_Unit->Wrap( -1 );
|
m_PadDrill_X_Unit->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_PadDrill_X_Unit, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
fgSizerGeometry->Add( m_PadDrill_X_Unit, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||||
|
|
||||||
m_textPadDrillY = new wxStaticText( this, wxID_ANY, _("Pad drill Y"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_textPadDrillY = new wxStaticText( this, wxID_ANY, _("Pad drill Y"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_textPadDrillY->Wrap( -1 );
|
m_textPadDrillY->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_textPadDrillY, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
|
fgSizerGeometry->Add( m_textPadDrillY, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadDrill_Y_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadDrill_Y_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
fgSizerGeometry->Add( m_PadDrill_Y_Ctrl, 0, wxALL, 5 );
|
fgSizerGeometry->Add( m_PadDrill_Y_Ctrl, 0, wxALL, 5 );
|
||||||
|
|
||||||
m_PadDrill_Y_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadDrill_Y_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_PadDrill_Y_Unit->Wrap( -1 );
|
m_PadDrill_Y_Unit->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_PadDrill_Y_Unit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
|
fgSizerGeometry->Add( m_PadDrill_Y_Unit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
|
||||||
|
|
||||||
m_staticline4 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
m_staticline4 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||||
fgSizerGeometry->Add( m_staticline4, 0, wxEXPAND | wxALL, 5 );
|
fgSizerGeometry->Add( m_staticline4, 0, wxEXPAND | wxALL, 5 );
|
||||||
|
|
||||||
m_staticline5 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
m_staticline5 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||||
fgSizerGeometry->Add( m_staticline5, 0, wxEXPAND | wxALL, 5 );
|
fgSizerGeometry->Add( m_staticline5, 0, wxEXPAND | wxALL, 5 );
|
||||||
|
|
||||||
m_staticline6 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
m_staticline6 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||||
fgSizerGeometry->Add( m_staticline6, 0, wxEXPAND | wxALL, 5 );
|
fgSizerGeometry->Add( m_staticline6, 0, wxEXPAND | wxALL, 5 );
|
||||||
|
|
||||||
m_staticText12 = new wxStaticText( this, wxID_ANY, _("Shape size X"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticText12 = new wxStaticText( this, wxID_ANY, _("Shape size X"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText12->Wrap( -1 );
|
m_staticText12->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_staticText12, 0, wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
|
fgSizerGeometry->Add( m_staticText12, 0, wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
|
||||||
|
|
||||||
m_ShapeSize_X_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_ShapeSize_X_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
fgSizerGeometry->Add( m_ShapeSize_X_Ctrl, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
fgSizerGeometry->Add( m_ShapeSize_X_Ctrl, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadShapeSizeX_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadShapeSizeX_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_PadShapeSizeX_Unit->Wrap( -1 );
|
m_PadShapeSizeX_Unit->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_PadShapeSizeX_Unit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
|
fgSizerGeometry->Add( m_PadShapeSizeX_Unit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
|
||||||
|
|
||||||
m_staticText15 = new wxStaticText( this, wxID_ANY, _("Shape size Y"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticText15 = new wxStaticText( this, wxID_ANY, _("Shape size Y"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText15->Wrap( -1 );
|
m_staticText15->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_staticText15, 0, wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
|
fgSizerGeometry->Add( m_staticText15, 0, wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
|
||||||
|
|
||||||
m_ShapeSize_Y_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_ShapeSize_Y_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
fgSizerGeometry->Add( m_ShapeSize_Y_Ctrl, 0, wxALL, 5 );
|
fgSizerGeometry->Add( m_ShapeSize_Y_Ctrl, 0, wxALL, 5 );
|
||||||
|
|
||||||
m_PadShapeSizeY_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadShapeSizeY_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_PadShapeSizeY_Unit->Wrap( -1 );
|
m_PadShapeSizeY_Unit->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_PadShapeSizeY_Unit, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
fgSizerGeometry->Add( m_PadShapeSizeY_Unit, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||||
|
|
||||||
m_staticText17 = new wxStaticText( this, wxID_ANY, _("Shape offset X"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticText17 = new wxStaticText( this, wxID_ANY, _("Shape offset X"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText17->Wrap( -1 );
|
m_staticText17->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_staticText17, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
|
fgSizerGeometry->Add( m_staticText17, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
|
||||||
|
|
||||||
m_ShapeOffset_X_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_ShapeOffset_X_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
fgSizerGeometry->Add( m_ShapeOffset_X_Ctrl, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
fgSizerGeometry->Add( m_ShapeOffset_X_Ctrl, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadShapeOffsetX_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadShapeOffsetX_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_PadShapeOffsetX_Unit->Wrap( -1 );
|
m_PadShapeOffsetX_Unit->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_PadShapeOffsetX_Unit, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
fgSizerGeometry->Add( m_PadShapeOffsetX_Unit, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||||
|
|
||||||
m_staticText19 = new wxStaticText( this, wxID_ANY, _("Shape offset Y"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticText19 = new wxStaticText( this, wxID_ANY, _("Shape offset Y"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText19->Wrap( -1 );
|
m_staticText19->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_staticText19, 0, wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
|
fgSizerGeometry->Add( m_staticText19, 0, wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
|
||||||
|
|
||||||
m_ShapeOffset_Y_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_ShapeOffset_Y_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
fgSizerGeometry->Add( m_ShapeOffset_Y_Ctrl, 0, wxALL, 5 );
|
fgSizerGeometry->Add( m_ShapeOffset_Y_Ctrl, 0, wxALL, 5 );
|
||||||
|
|
||||||
m_PadShapeOffsetY_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadShapeOffsetY_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_PadShapeOffsetY_Unit->Wrap( -1 );
|
m_PadShapeOffsetY_Unit->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_PadShapeOffsetY_Unit, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
fgSizerGeometry->Add( m_PadShapeOffsetY_Unit, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||||
|
|
||||||
m_staticText21 = new wxStaticText( this, wxID_ANY, _("Shape delta dim"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticText21 = new wxStaticText( this, wxID_ANY, _("Shape delta dim"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText21->Wrap( -1 );
|
m_staticText21->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_staticText21, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxLEFT, 5 );
|
fgSizerGeometry->Add( m_staticText21, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_ShapeDelta_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_ShapeDelta_Ctrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
fgSizerGeometry->Add( m_ShapeDelta_Ctrl, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
fgSizerGeometry->Add( m_ShapeDelta_Ctrl, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadShapeDelta_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadShapeDelta_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_PadShapeDelta_Unit->Wrap( -1 );
|
m_PadShapeDelta_Unit->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_PadShapeDelta_Unit, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
fgSizerGeometry->Add( m_PadShapeDelta_Unit, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||||
|
|
||||||
m_staticText23 = new wxStaticText( this, wxID_ANY, _("Trap. direction"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticText23 = new wxStaticText( this, wxID_ANY, _("Trap. direction"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText23->Wrap( -1 );
|
m_staticText23->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_staticText23, 0, wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
|
fgSizerGeometry->Add( m_staticText23, 0, wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
|
||||||
|
|
||||||
wxBoxSizer* bSizerbdir;
|
wxBoxSizer* bSizerbdir;
|
||||||
bSizerbdir = new wxBoxSizer( wxHORIZONTAL );
|
bSizerbdir = new wxBoxSizer( wxHORIZONTAL );
|
||||||
|
|
||||||
m_radioBtnDeltaXdir = new wxRadioButton( this, wxID_DDIRX, _(">"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
|
m_radioBtnDeltaXdir = new wxRadioButton( this, wxID_DDIRX, _(">"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
|
||||||
m_radioBtnDeltaXdir->SetValue( true );
|
m_radioBtnDeltaXdir->SetValue( true );
|
||||||
bSizerbdir->Add( m_radioBtnDeltaXdir, 0, wxALL, 5 );
|
bSizerbdir->Add( m_radioBtnDeltaXdir, 0, wxALL, 5 );
|
||||||
|
|
||||||
m_radioBtnDeltaYdir = new wxRadioButton( this, wxID_DDIRY, _("^"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_radioBtnDeltaYdir = new wxRadioButton( this, wxID_DDIRY, _("^"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
bSizerbdir->Add( m_radioBtnDeltaYdir, 0, wxALL, 5 );
|
bSizerbdir->Add( m_radioBtnDeltaYdir, 0, wxALL, 5 );
|
||||||
|
|
||||||
fgSizerGeometry->Add( bSizerbdir, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
|
fgSizerGeometry->Add( bSizerbdir, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
|
||||||
|
|
||||||
m_staticTextDDirInfo = new wxStaticText( this, wxID_ANY, _("Rot 0"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticTextDDirInfo = new wxStaticText( this, wxID_ANY, _("Rot 0"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticTextDDirInfo->Wrap( -1 );
|
m_staticTextDDirInfo->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_staticTextDDirInfo, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
|
fgSizerGeometry->Add( m_staticTextDDirInfo, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
|
||||||
|
|
||||||
m_staticline10 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
m_staticline10 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||||
fgSizerGeometry->Add( m_staticline10, 0, wxEXPAND | wxALL, 5 );
|
fgSizerGeometry->Add( m_staticline10, 0, wxEXPAND | wxALL, 5 );
|
||||||
|
|
||||||
m_staticline101 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
m_staticline101 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||||
fgSizerGeometry->Add( m_staticline101, 0, wxEXPAND | wxALL, 5 );
|
fgSizerGeometry->Add( m_staticline101, 0, wxEXPAND | wxALL, 5 );
|
||||||
|
|
||||||
m_staticline1011 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
m_staticline1011 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||||
fgSizerGeometry->Add( m_staticline1011, 0, wxEXPAND | wxALL, 5 );
|
fgSizerGeometry->Add( m_staticline1011, 0, wxEXPAND | wxALL, 5 );
|
||||||
|
|
||||||
m_staticText38 = new wxStaticText( this, wxID_ANY, _("Length die"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticText38 = new wxStaticText( this, wxID_ANY, _("Length die"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText38->Wrap( -1 );
|
m_staticText38->Wrap( -1 );
|
||||||
m_staticText38->SetToolTip( _("Wire length from pad to die on chip ( used to calculate actual track length)") );
|
m_staticText38->SetToolTip( _("Wire length from pad to die on chip ( used to calculate actual track length)") );
|
||||||
|
|
||||||
fgSizerGeometry->Add( m_staticText38, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxLEFT, 5 );
|
fgSizerGeometry->Add( m_staticText38, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_LengthDieCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_LengthDieCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
fgSizerGeometry->Add( m_LengthDieCtrl, 0, wxALL, 5 );
|
fgSizerGeometry->Add( m_LengthDieCtrl, 0, wxALL, 5 );
|
||||||
|
|
||||||
m_PadLengthDie_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadLengthDie_Unit = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_PadLengthDie_Unit->Wrap( -1 );
|
m_PadLengthDie_Unit->Wrap( -1 );
|
||||||
fgSizerGeometry->Add( m_PadLengthDie_Unit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
|
fgSizerGeometry->Add( m_PadLengthDie_Unit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
|
||||||
|
|
||||||
sbSizer2->Add( fgSizerGeometry, 1, wxEXPAND, 5 );
|
sbSizer2->Add( fgSizerGeometry, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
m_LeftBoxSizer->Add( sbSizer2, 1, wxEXPAND, 5 );
|
m_LeftBoxSizer->Add( sbSizer2, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
bGeneralSizer->Add( m_LeftBoxSizer, 0, wxBOTTOM|wxLEFT|wxEXPAND, 5 );
|
bGeneralSizer->Add( m_LeftBoxSizer, 0, wxBOTTOM|wxLEFT|wxEXPAND, 5 );
|
||||||
|
|
||||||
wxBoxSizer* bMiddleSizer;
|
wxBoxSizer* bMiddleSizer;
|
||||||
bMiddleSizer = new wxBoxSizer( wxVERTICAL );
|
bMiddleSizer = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
wxBoxSizer* bMiddleUpperSizer;
|
wxBoxSizer* bMiddleUpperSizer;
|
||||||
bMiddleUpperSizer = new wxBoxSizer( wxHORIZONTAL );
|
bMiddleUpperSizer = new wxBoxSizer( wxHORIZONTAL );
|
||||||
|
|
||||||
m_DrillShapeBoxSizer = new wxBoxSizer( wxVERTICAL );
|
m_DrillShapeBoxSizer = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
wxString m_PadShapeChoices[] = { _("Circle"), _("Oval"), _("Rect"), _("Trapezoidal") };
|
wxString m_PadShapeChoices[] = { _("Circle"), _("Oval"), _("Rect"), _("Trapezoidal") };
|
||||||
int m_PadShapeNChoices = sizeof( m_PadShapeChoices ) / sizeof( wxString );
|
int m_PadShapeNChoices = sizeof( m_PadShapeChoices ) / sizeof( wxString );
|
||||||
m_PadShape = new wxRadioBox( this, ID_LISTBOX_SHAPE_PAD, _("Pad Shape:"), wxDefaultPosition, wxDefaultSize, m_PadShapeNChoices, m_PadShapeChoices, 1, wxRA_SPECIFY_COLS );
|
m_PadShape = new wxRadioBox( this, ID_LISTBOX_SHAPE_PAD, _("Pad Shape:"), wxDefaultPosition, wxDefaultSize, m_PadShapeNChoices, m_PadShapeChoices, 1, wxRA_SPECIFY_COLS );
|
||||||
m_PadShape->SetSelection( 0 );
|
m_PadShape->SetSelection( 0 );
|
||||||
m_DrillShapeBoxSizer->Add( m_PadShape, 0, wxALL|wxEXPAND, 5 );
|
m_DrillShapeBoxSizer->Add( m_PadShape, 0, wxALL|wxEXPAND, 5 );
|
||||||
|
|
||||||
wxString m_DrillShapeCtrlChoices[] = { _("Circle"), _("Oval") };
|
wxString m_DrillShapeCtrlChoices[] = { _("Circle"), _("Oval") };
|
||||||
int m_DrillShapeCtrlNChoices = sizeof( m_DrillShapeCtrlChoices ) / sizeof( wxString );
|
int m_DrillShapeCtrlNChoices = sizeof( m_DrillShapeCtrlChoices ) / sizeof( wxString );
|
||||||
m_DrillShapeCtrl = new wxRadioBox( this, ID_RADIOBOX_DRILL_SHAPE, _("Drill Shape:"), wxDefaultPosition, wxDefaultSize, m_DrillShapeCtrlNChoices, m_DrillShapeCtrlChoices, 1, wxRA_SPECIFY_COLS );
|
m_DrillShapeCtrl = new wxRadioBox( this, ID_RADIOBOX_DRILL_SHAPE, _("Drill Shape:"), wxDefaultPosition, wxDefaultSize, m_DrillShapeCtrlNChoices, m_DrillShapeCtrlChoices, 1, wxRA_SPECIFY_COLS );
|
||||||
m_DrillShapeCtrl->SetSelection( 0 );
|
m_DrillShapeCtrl->SetSelection( 0 );
|
||||||
m_DrillShapeBoxSizer->Add( m_DrillShapeCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
m_DrillShapeBoxSizer->Add( m_DrillShapeCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
bMiddleUpperSizer->Add( m_DrillShapeBoxSizer, 0, wxBOTTOM, 5 );
|
bMiddleUpperSizer->Add( m_DrillShapeBoxSizer, 0, wxBOTTOM, 5 );
|
||||||
|
|
||||||
wxBoxSizer* m_MiddleRightBoxSizer;
|
wxBoxSizer* m_MiddleRightBoxSizer;
|
||||||
m_MiddleRightBoxSizer = new wxBoxSizer( wxVERTICAL );
|
m_MiddleRightBoxSizer = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
wxString m_PadOrientChoices[] = { _("0"), _("90"), _("-90"), _("180"), _("Custom") };
|
wxString m_PadOrientChoices[] = { _("0"), _("90"), _("-90"), _("180"), _("Custom") };
|
||||||
int m_PadOrientNChoices = sizeof( m_PadOrientChoices ) / sizeof( wxString );
|
int m_PadOrientNChoices = sizeof( m_PadOrientChoices ) / sizeof( wxString );
|
||||||
m_PadOrient = new wxRadioBox( this, ID_LISTBOX_ORIENT_PAD, _("Pad Orient:"), wxDefaultPosition, wxDefaultSize, m_PadOrientNChoices, m_PadOrientChoices, 1, wxRA_SPECIFY_COLS );
|
m_PadOrient = new wxRadioBox( this, ID_LISTBOX_ORIENT_PAD, _("Pad Orient:"), wxDefaultPosition, wxDefaultSize, m_PadOrientNChoices, m_PadOrientChoices, 1, wxRA_SPECIFY_COLS );
|
||||||
m_PadOrient->SetSelection( 0 );
|
m_PadOrient->SetSelection( 0 );
|
||||||
m_MiddleRightBoxSizer->Add( m_PadOrient, 0, wxALL|wxEXPAND, 5 );
|
m_MiddleRightBoxSizer->Add( m_PadOrient, 0, wxALL|wxEXPAND, 5 );
|
||||||
|
|
||||||
m_PadOrientText = new wxStaticText( this, wxID_ANY, _("Pad Orient (0.1 deg)"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadOrientText = new wxStaticText( this, wxID_ANY, _("Pad Orient (0.1 deg)"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_PadOrientText->Wrap( -1 );
|
m_PadOrientText->Wrap( -1 );
|
||||||
m_MiddleRightBoxSizer->Add( m_PadOrientText, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
m_MiddleRightBoxSizer->Add( m_PadOrientText, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadOrientCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadOrientCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_MiddleRightBoxSizer->Add( m_PadOrientCtrl, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
m_MiddleRightBoxSizer->Add( m_PadOrientCtrl, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
bMiddleUpperSizer->Add( m_MiddleRightBoxSizer, 0, wxBOTTOM, 5 );
|
bMiddleUpperSizer->Add( m_MiddleRightBoxSizer, 0, wxBOTTOM, 5 );
|
||||||
|
|
||||||
m_panelShowPad = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE|wxSIMPLE_BORDER|wxTAB_TRAVERSAL );
|
m_panelShowPad = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE|wxSIMPLE_BORDER|wxTAB_TRAVERSAL );
|
||||||
m_panelShowPad->SetBackgroundColour( wxColour( 0, 0, 0 ) );
|
m_panelShowPad->SetBackgroundColour( wxColour( 0, 0, 0 ) );
|
||||||
|
|
||||||
bMiddleUpperSizer->Add( m_panelShowPad, 1, wxEXPAND, 5 );
|
bMiddleUpperSizer->Add( m_panelShowPad, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
bMiddleSizer->Add( bMiddleUpperSizer, 1, wxEXPAND, 5 );
|
bMiddleSizer->Add( bMiddleUpperSizer, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
wxStaticBoxSizer* sbSizeModuleInfo;
|
wxStaticBoxSizer* sbSizeModuleInfo;
|
||||||
sbSizeModuleInfo = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Footprint orientation") ), wxHORIZONTAL );
|
sbSizeModuleInfo = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Footprint orientation") ), wxHORIZONTAL );
|
||||||
|
|
||||||
wxFlexGridSizer* fgSizer4;
|
wxFlexGridSizer* fgSizer4;
|
||||||
fgSizer4 = new wxFlexGridSizer( 2, 2, 0, 0 );
|
fgSizer4 = new wxFlexGridSizer( 2, 2, 0, 0 );
|
||||||
fgSizer4->AddGrowableCol( 1 );
|
fgSizer4->AddGrowableCol( 1 );
|
||||||
fgSizer4->SetFlexibleDirection( wxBOTH );
|
fgSizer4->SetFlexibleDirection( wxBOTH );
|
||||||
fgSizer4->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
fgSizer4->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||||
|
|
||||||
m_staticTitleModuleRot = new wxStaticText( this, wxID_ANY, _("Rotation:"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticTitleModuleRot = new wxStaticText( this, wxID_ANY, _("Rotation:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticTitleModuleRot->Wrap( -1 );
|
m_staticTitleModuleRot->Wrap( -1 );
|
||||||
fgSizer4->Add( m_staticTitleModuleRot, 0, wxALIGN_RIGHT|wxTOP|wxRIGHT|wxLEFT, 5 );
|
fgSizer4->Add( m_staticTitleModuleRot, 0, wxALIGN_RIGHT|wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_staticModuleRotValue = new wxStaticText( this, wxID_ANY, _("0"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticModuleRotValue = new wxStaticText( this, wxID_ANY, _("0"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticModuleRotValue->Wrap( -1 );
|
m_staticModuleRotValue->Wrap( -1 );
|
||||||
fgSizer4->Add( m_staticModuleRotValue, 0, wxTOP|wxRIGHT|wxLEFT|wxEXPAND, 5 );
|
fgSizer4->Add( m_staticModuleRotValue, 0, wxTOP|wxRIGHT|wxLEFT|wxEXPAND, 5 );
|
||||||
|
|
||||||
m_staticTitleModuleSide = new wxStaticText( this, wxID_ANY, _("Board side:"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticTitleModuleSide = new wxStaticText( this, wxID_ANY, _("Board side:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticTitleModuleSide->Wrap( -1 );
|
m_staticTitleModuleSide->Wrap( -1 );
|
||||||
fgSizer4->Add( m_staticTitleModuleSide, 0, wxALL|wxALIGN_RIGHT, 5 );
|
fgSizer4->Add( m_staticTitleModuleSide, 0, wxALL|wxALIGN_RIGHT, 5 );
|
||||||
|
|
||||||
m_staticModuleSideValue = new wxStaticText( this, wxID_ANY, _("Front side"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticModuleSideValue = new wxStaticText( this, wxID_ANY, _("Front side"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticModuleSideValue->Wrap( -1 );
|
m_staticModuleSideValue->Wrap( -1 );
|
||||||
fgSizer4->Add( m_staticModuleSideValue, 0, wxALL|wxEXPAND, 5 );
|
fgSizer4->Add( m_staticModuleSideValue, 0, wxALL|wxEXPAND, 5 );
|
||||||
|
|
||||||
sbSizeModuleInfo->Add( fgSizer4, 1, wxEXPAND, 5 );
|
sbSizeModuleInfo->Add( fgSizer4, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
m_staticTextWarningPadFlipped = new wxStaticText( this, wxID_ANY, _("Warning:\nThis pad is flipped on board.\nBack and front layers will be swapped."), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticTextWarningPadFlipped = new wxStaticText( this, wxID_ANY, _("Warning:\nThis pad is flipped on board.\nBack and front layers will be swapped."), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticTextWarningPadFlipped->Wrap( -1 );
|
m_staticTextWarningPadFlipped->Wrap( -1 );
|
||||||
m_staticTextWarningPadFlipped->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
|
m_staticTextWarningPadFlipped->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
|
||||||
|
|
||||||
sbSizeModuleInfo->Add( m_staticTextWarningPadFlipped, 0, wxALIGN_CENTER_VERTICAL, 5 );
|
sbSizeModuleInfo->Add( m_staticTextWarningPadFlipped, 0, wxALIGN_CENTER_VERTICAL, 5 );
|
||||||
|
|
||||||
bMiddleSizer->Add( sbSizeModuleInfo, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
bMiddleSizer->Add( sbSizeModuleInfo, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
wxStaticBoxSizer* sbClearancesSizer;
|
wxStaticBoxSizer* sbClearancesSizer;
|
||||||
sbClearancesSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Clearances:") ), wxVERTICAL );
|
sbClearancesSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Clearances:") ), wxVERTICAL );
|
||||||
|
|
||||||
m_staticTextWarning = new wxStaticText( this, wxID_ANY, _("Set these values to 0\nto use Parent footprint or global values"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticTextWarning = new wxStaticText( this, wxID_ANY, _("Set these values to 0\nto use Parent footprint or global values"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticTextWarning->Wrap( -1 );
|
m_staticTextWarning->Wrap( -1 );
|
||||||
m_staticTextWarning->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
|
m_staticTextWarning->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
|
||||||
|
|
||||||
sbClearancesSizer->Add( m_staticTextWarning, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
sbClearancesSizer->Add( m_staticTextWarning, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
wxFlexGridSizer* fgClearancesGridSizer;
|
wxFlexGridSizer* fgClearancesGridSizer;
|
||||||
fgClearancesGridSizer = new wxFlexGridSizer( 5, 3, 0, 0 );
|
fgClearancesGridSizer = new wxFlexGridSizer( 5, 3, 0, 0 );
|
||||||
fgClearancesGridSizer->SetFlexibleDirection( wxBOTH );
|
fgClearancesGridSizer->SetFlexibleDirection( wxBOTH );
|
||||||
fgClearancesGridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
fgClearancesGridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||||
|
|
||||||
m_staticTextNetClearance = new wxStaticText( this, wxID_ANY, _("Net pad clearance"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticTextNetClearance = new wxStaticText( this, wxID_ANY, _("Net pad clearance"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticTextNetClearance->Wrap( -1 );
|
m_staticTextNetClearance->Wrap( -1 );
|
||||||
m_staticTextNetClearance->SetToolTip( _("This is the local net clearance for pad.\nIf 0, the footprint local value or the Netclass value is used") );
|
m_staticTextNetClearance->SetToolTip( _("This is the local net clearance for pad.\nIf 0, the footprint local value or the Netclass value is used") );
|
||||||
|
|
||||||
fgClearancesGridSizer->Add( m_staticTextNetClearance, 0, wxLEFT|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
fgClearancesGridSizer->Add( m_staticTextNetClearance, 0, wxLEFT|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||||
|
|
||||||
m_NetClearanceValueCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_NetClearanceValueCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
fgClearancesGridSizer->Add( m_NetClearanceValueCtrl, 0, wxALL, 5 );
|
fgClearancesGridSizer->Add( m_NetClearanceValueCtrl, 0, wxALL, 5 );
|
||||||
|
|
||||||
m_NetClearanceUnits = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_NetClearanceUnits = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_NetClearanceUnits->Wrap( -1 );
|
m_NetClearanceUnits->Wrap( -1 );
|
||||||
fgClearancesGridSizer->Add( m_NetClearanceUnits, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
fgClearancesGridSizer->Add( m_NetClearanceUnits, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||||
|
|
||||||
m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||||
fgClearancesGridSizer->Add( m_staticline1, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
|
fgClearancesGridSizer->Add( m_staticline1, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||||
fgClearancesGridSizer->Add( m_staticline2, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
|
fgClearancesGridSizer->Add( m_staticline2, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||||
fgClearancesGridSizer->Add( m_staticline3, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
|
fgClearancesGridSizer->Add( m_staticline3, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_MaskClearanceTitle = new wxStaticText( this, wxID_ANY, _("Solder mask clearance:"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_MaskClearanceTitle = new wxStaticText( this, wxID_ANY, _("Solder mask clearance:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_MaskClearanceTitle->Wrap( -1 );
|
m_MaskClearanceTitle->Wrap( -1 );
|
||||||
m_MaskClearanceTitle->SetToolTip( _("This is the local clearance between this pad and the solder mask\nIf 0, the footprint local value or the global value is used") );
|
m_MaskClearanceTitle->SetToolTip( _("This is the local clearance between this pad and the solder mask\nIf 0, the footprint local value or the global value is used") );
|
||||||
|
|
||||||
fgClearancesGridSizer->Add( m_MaskClearanceTitle, 0, wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
|
fgClearancesGridSizer->Add( m_MaskClearanceTitle, 0, wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
|
||||||
|
|
||||||
m_SolderMaskMarginCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_SolderMaskMarginCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
fgClearancesGridSizer->Add( m_SolderMaskMarginCtrl, 0, wxALL, 5 );
|
fgClearancesGridSizer->Add( m_SolderMaskMarginCtrl, 0, wxALL, 5 );
|
||||||
|
|
||||||
m_SolderMaskMarginUnits = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_SolderMaskMarginUnits = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_SolderMaskMarginUnits->Wrap( -1 );
|
m_SolderMaskMarginUnits->Wrap( -1 );
|
||||||
fgClearancesGridSizer->Add( m_SolderMaskMarginUnits, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
fgClearancesGridSizer->Add( m_SolderMaskMarginUnits, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||||
|
|
||||||
m_staticTextSolderPaste = new wxStaticText( this, wxID_ANY, _("Solder paste clearance:"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticTextSolderPaste = new wxStaticText( this, wxID_ANY, _("Solder paste clearance:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticTextSolderPaste->Wrap( -1 );
|
m_staticTextSolderPaste->Wrap( -1 );
|
||||||
m_staticTextSolderPaste->SetToolTip( _("This is the local clearance between this pad and the solder paste.\nIf 0 the footprint value or the global value is used..\nThe final clearance value is the sum of this value and the clearance value ratio\nA negative value means a smaller mask size than pad size") );
|
m_staticTextSolderPaste->SetToolTip( _("This is the local clearance between this pad and the solder paste.\nIf 0 the footprint value or the global value is used..\nThe final clearance value is the sum of this value and the clearance value ratio\nA negative value means a smaller mask size than pad size") );
|
||||||
|
|
||||||
fgClearancesGridSizer->Add( m_staticTextSolderPaste, 0, wxLEFT|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
fgClearancesGridSizer->Add( m_staticTextSolderPaste, 0, wxLEFT|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||||
|
|
||||||
m_SolderPasteMarginCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_SolderPasteMarginCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
fgClearancesGridSizer->Add( m_SolderPasteMarginCtrl, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
fgClearancesGridSizer->Add( m_SolderPasteMarginCtrl, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_SolderPasteMarginUnits = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_SolderPasteMarginUnits = new wxStaticText( this, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_SolderPasteMarginUnits->Wrap( -1 );
|
m_SolderPasteMarginUnits->Wrap( -1 );
|
||||||
fgClearancesGridSizer->Add( m_SolderPasteMarginUnits, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
fgClearancesGridSizer->Add( m_SolderPasteMarginUnits, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||||
|
|
||||||
m_staticTextRatio = new wxStaticText( this, wxID_ANY, _("Solder mask ratio clearance:"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticTextRatio = new wxStaticText( this, wxID_ANY, _("Solder mask ratio clearance:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticTextRatio->Wrap( -1 );
|
m_staticTextRatio->Wrap( -1 );
|
||||||
m_staticTextRatio->SetToolTip( _("This is the local clearance ratio in per cent between this pad and the solder paste.\nA value of 10 means the clearance value is 10 per cent of the pad size\nIf 0 the footprint value or the global value is used..\nThe final clearance value is the sum of this value and the clearance value\nA negative value means a smaller mask size than pad size.") );
|
m_staticTextRatio->SetToolTip( _("This is the local clearance ratio in per cent between this pad and the solder paste.\nA value of 10 means the clearance value is 10 per cent of the pad size\nIf 0 the footprint value or the global value is used..\nThe final clearance value is the sum of this value and the clearance value\nA negative value means a smaller mask size than pad size.") );
|
||||||
|
|
||||||
fgClearancesGridSizer->Add( m_staticTextRatio, 0, wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
|
fgClearancesGridSizer->Add( m_staticTextRatio, 0, wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
|
||||||
|
|
||||||
m_SolderPasteMarginRatioCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
m_SolderPasteMarginRatioCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
fgClearancesGridSizer->Add( m_SolderPasteMarginRatioCtrl, 0, wxALL, 5 );
|
fgClearancesGridSizer->Add( m_SolderPasteMarginRatioCtrl, 0, wxALL, 5 );
|
||||||
|
|
||||||
m_SolderPasteRatioMarginUnits = new wxStaticText( this, wxID_ANY, _("%"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_SolderPasteRatioMarginUnits = new wxStaticText( this, wxID_ANY, _("%"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_SolderPasteRatioMarginUnits->Wrap( -1 );
|
m_SolderPasteRatioMarginUnits->Wrap( -1 );
|
||||||
fgClearancesGridSizer->Add( m_SolderPasteRatioMarginUnits, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
fgClearancesGridSizer->Add( m_SolderPasteRatioMarginUnits, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||||
|
|
||||||
sbClearancesSizer->Add( fgClearancesGridSizer, 1, wxEXPAND, 5 );
|
sbClearancesSizer->Add( fgClearancesGridSizer, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
bMiddleSizer->Add( sbClearancesSizer, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
|
bMiddleSizer->Add( sbClearancesSizer, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
bGeneralSizer->Add( bMiddleSizer, 1, wxEXPAND, 5 );
|
bGeneralSizer->Add( bMiddleSizer, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
wxBoxSizer* m_RightBoxSizer;
|
wxBoxSizer* m_RightBoxSizer;
|
||||||
m_RightBoxSizer = new wxBoxSizer( wxVERTICAL );
|
m_RightBoxSizer = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
wxString m_PadTypeChoices[] = { _("Standard"), _("SMD"), _("Conn"), _("NPTH, Mechanical") };
|
wxString m_PadTypeChoices[] = { _("Standard"), _("SMD"), _("Conn"), _("NPTH, Mechanical") };
|
||||||
int m_PadTypeNChoices = sizeof( m_PadTypeChoices ) / sizeof( wxString );
|
int m_PadTypeNChoices = sizeof( m_PadTypeChoices ) / sizeof( wxString );
|
||||||
m_PadType = new wxRadioBox( this, ID_LISTBOX_TYPE_PAD, _("Pad Type:"), wxDefaultPosition, wxDefaultSize, m_PadTypeNChoices, m_PadTypeChoices, 1, wxRA_SPECIFY_COLS );
|
m_PadType = new wxRadioBox( this, ID_LISTBOX_TYPE_PAD, _("Pad Type:"), wxDefaultPosition, wxDefaultSize, m_PadTypeNChoices, m_PadTypeChoices, 1, wxRA_SPECIFY_COLS );
|
||||||
m_PadType->SetSelection( 0 );
|
m_PadType->SetSelection( 0 );
|
||||||
m_RightBoxSizer->Add( m_PadType, 0, wxALL|wxEXPAND, 5 );
|
m_RightBoxSizer->Add( m_PadType, 0, wxALL|wxEXPAND, 5 );
|
||||||
|
|
||||||
wxStaticBoxSizer* m_LayersSizer;
|
wxStaticBoxSizer* m_LayersSizer;
|
||||||
m_LayersSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Layers:") ), wxVERTICAL );
|
m_LayersSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Layers:") ), wxVERTICAL );
|
||||||
|
|
||||||
wxString m_rbCopperLayersSelChoices[] = { _("Front Layer"), _("Back Layer"), _("All Copper Layers"), _("No Copper Layers") };
|
wxString m_rbCopperLayersSelChoices[] = { _("Front Layer"), _("Back Layer"), _("All Copper Layers"), _("No Copper Layers") };
|
||||||
int m_rbCopperLayersSelNChoices = sizeof( m_rbCopperLayersSelChoices ) / sizeof( wxString );
|
int m_rbCopperLayersSelNChoices = sizeof( m_rbCopperLayersSelChoices ) / sizeof( wxString );
|
||||||
m_rbCopperLayersSel = new wxRadioBox( this, wxID_ANY, _("Copper Layers:"), wxDefaultPosition, wxDefaultSize, m_rbCopperLayersSelNChoices, m_rbCopperLayersSelChoices, 1, wxRA_SPECIFY_COLS );
|
m_rbCopperLayersSel = new wxRadioBox( this, wxID_ANY, _("Copper Layers:"), wxDefaultPosition, wxDefaultSize, m_rbCopperLayersSelNChoices, m_rbCopperLayersSelChoices, 1, wxRA_SPECIFY_COLS );
|
||||||
m_rbCopperLayersSel->SetSelection( 0 );
|
m_rbCopperLayersSel->SetSelection( 0 );
|
||||||
m_LayersSizer->Add( m_rbCopperLayersSel, 0, wxALL, 5 );
|
m_LayersSizer->Add( m_rbCopperLayersSel, 0, wxALL, 5 );
|
||||||
|
|
||||||
wxStaticBoxSizer* sbSizerTechlayers;
|
wxStaticBoxSizer* sbSizerTechlayers;
|
||||||
sbSizerTechlayers = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Technical Layers:") ), wxVERTICAL );
|
sbSizerTechlayers = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Technical Layers:") ), wxVERTICAL );
|
||||||
|
|
||||||
m_PadLayerAdhCmp = new wxCheckBox( this, wxID_ANY, _("Adhesive Cmp"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadLayerAdhCmp = new wxCheckBox( this, wxID_ANY, _("Adhesive Cmp"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
sbSizerTechlayers->Add( m_PadLayerAdhCmp, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
sbSizerTechlayers->Add( m_PadLayerAdhCmp, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadLayerAdhCu = new wxCheckBox( this, wxID_ANY, _("Adhesive Copper"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadLayerAdhCu = new wxCheckBox( this, wxID_ANY, _("Adhesive Copper"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
sbSizerTechlayers->Add( m_PadLayerAdhCu, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
sbSizerTechlayers->Add( m_PadLayerAdhCu, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadLayerPateCmp = new wxCheckBox( this, wxID_ANY, _("Solder paste Cmp"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadLayerPateCmp = new wxCheckBox( this, wxID_ANY, _("Solder paste Cmp"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
sbSizerTechlayers->Add( m_PadLayerPateCmp, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
sbSizerTechlayers->Add( m_PadLayerPateCmp, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadLayerPateCu = new wxCheckBox( this, wxID_ANY, _("Solder paste Copper"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadLayerPateCu = new wxCheckBox( this, wxID_ANY, _("Solder paste Copper"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
sbSizerTechlayers->Add( m_PadLayerPateCu, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
sbSizerTechlayers->Add( m_PadLayerPateCu, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadLayerSilkCmp = new wxCheckBox( this, wxID_ANY, _("Silkscreen Cmp"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadLayerSilkCmp = new wxCheckBox( this, wxID_ANY, _("Silkscreen Cmp"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
sbSizerTechlayers->Add( m_PadLayerSilkCmp, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
sbSizerTechlayers->Add( m_PadLayerSilkCmp, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadLayerSilkCu = new wxCheckBox( this, wxID_ANY, _("Silkscreen Copper"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadLayerSilkCu = new wxCheckBox( this, wxID_ANY, _("Silkscreen Copper"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
sbSizerTechlayers->Add( m_PadLayerSilkCu, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
sbSizerTechlayers->Add( m_PadLayerSilkCu, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadLayerMaskCmp = new wxCheckBox( this, wxID_ANY, _("Solder mask Cmp"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadLayerMaskCmp = new wxCheckBox( this, wxID_ANY, _("Solder mask Cmp"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
sbSizerTechlayers->Add( m_PadLayerMaskCmp, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
sbSizerTechlayers->Add( m_PadLayerMaskCmp, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadLayerMaskCu = new wxCheckBox( this, wxID_ANY, _("Solder mask Copper"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadLayerMaskCu = new wxCheckBox( this, wxID_ANY, _("Solder mask Copper"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
sbSizerTechlayers->Add( m_PadLayerMaskCu, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
sbSizerTechlayers->Add( m_PadLayerMaskCu, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadLayerDraft = new wxCheckBox( this, wxID_ANY, _("Draft layer"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadLayerDraft = new wxCheckBox( this, wxID_ANY, _("Draft layer"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
sbSizerTechlayers->Add( m_PadLayerDraft, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
sbSizerTechlayers->Add( m_PadLayerDraft, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadLayerECO1 = new wxCheckBox( this, wxID_ANY, _("E.C.O.1 layer"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadLayerECO1 = new wxCheckBox( this, wxID_ANY, _("E.C.O.1 layer"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
sbSizerTechlayers->Add( m_PadLayerECO1, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
sbSizerTechlayers->Add( m_PadLayerECO1, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_PadLayerECO2 = new wxCheckBox( this, wxID_ANY, _("E.C.O.2 layer"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_PadLayerECO2 = new wxCheckBox( this, wxID_ANY, _("E.C.O.2 layer"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
sbSizerTechlayers->Add( m_PadLayerECO2, 0, wxALL, 5 );
|
sbSizerTechlayers->Add( m_PadLayerECO2, 0, wxALL, 5 );
|
||||||
|
|
||||||
m_LayersSizer->Add( sbSizerTechlayers, 1, wxEXPAND, 5 );
|
m_LayersSizer->Add( sbSizerTechlayers, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
m_RightBoxSizer->Add( m_LayersSizer, 0, 0, 5 );
|
m_RightBoxSizer->Add( m_LayersSizer, 0, 0, 5 );
|
||||||
|
|
||||||
bGeneralSizer->Add( m_RightBoxSizer, 0, wxBOTTOM|wxRIGHT|wxEXPAND, 5 );
|
bGeneralSizer->Add( m_RightBoxSizer, 0, wxBOTTOM|wxRIGHT|wxEXPAND, 5 );
|
||||||
|
|
||||||
m_MainSizer->Add( bGeneralSizer, 1, wxEXPAND, 5 );
|
m_MainSizer->Add( bGeneralSizer, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
m_sdbSizer1 = new wxStdDialogButtonSizer();
|
m_sdbSizer1 = new wxStdDialogButtonSizer();
|
||||||
m_sdbSizer1OK = new wxButton( this, wxID_OK );
|
m_sdbSizer1OK = new wxButton( this, wxID_OK );
|
||||||
m_sdbSizer1->AddButton( m_sdbSizer1OK );
|
m_sdbSizer1->AddButton( m_sdbSizer1OK );
|
||||||
m_sdbSizer1Cancel = new wxButton( this, wxID_CANCEL );
|
m_sdbSizer1Cancel = new wxButton( this, wxID_CANCEL );
|
||||||
m_sdbSizer1->AddButton( m_sdbSizer1Cancel );
|
m_sdbSizer1->AddButton( m_sdbSizer1Cancel );
|
||||||
m_sdbSizer1->Realize();
|
m_sdbSizer1->Realize();
|
||||||
m_MainSizer->Add( m_sdbSizer1, 0, wxTOP|wxBOTTOM|wxEXPAND, 5 );
|
m_MainSizer->Add( m_sdbSizer1, 0, wxTOP|wxBOTTOM|wxEXPAND, 5 );
|
||||||
|
|
||||||
this->SetSizer( m_MainSizer );
|
this->SetSizer( m_MainSizer );
|
||||||
this->Layout();
|
this->Layout();
|
||||||
|
|
||||||
this->Centre( wxBOTH );
|
this->Centre( wxBOTH );
|
||||||
|
|
||||||
// Connect Events
|
// Connect Events
|
||||||
m_PadNumCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_PadNumCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_PadNetNameCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_PadNetNameCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_PadDrill_X_Ctrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_PadDrill_X_Ctrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_PadDrill_Y_Ctrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_PadDrill_Y_Ctrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_ShapeSize_X_Ctrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_ShapeSize_X_Ctrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_ShapeSize_Y_Ctrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_ShapeSize_Y_Ctrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_ShapeOffset_X_Ctrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_ShapeOffset_X_Ctrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_ShapeOffset_Y_Ctrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_ShapeOffset_Y_Ctrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_ShapeDelta_Ctrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_ShapeDelta_Ctrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_radioBtnDeltaXdir->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_radioBtnDeltaXdir->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_radioBtnDeltaYdir->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_radioBtnDeltaYdir->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_PadShape->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnPadShapeSelection ), NULL, this );
|
m_PadShape->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnPadShapeSelection ), NULL, this );
|
||||||
m_DrillShapeCtrl->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnDrillShapeSelected ), NULL, this );
|
m_DrillShapeCtrl->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnDrillShapeSelected ), NULL, this );
|
||||||
m_PadOrient->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadOrientEvent ), NULL, this );
|
m_PadOrient->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadOrientEvent ), NULL, this );
|
||||||
m_PadOrientCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_PadOrientCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_panelShowPad->Connect( wxEVT_PAINT, wxPaintEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnPaintShowPanel ), NULL, this );
|
m_panelShowPad->Connect( wxEVT_PAINT, wxPaintEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnPaintShowPanel ), NULL, this );
|
||||||
m_NetClearanceValueCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_NetClearanceValueCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_PadType->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadTypeSelected ), NULL, this );
|
m_PadType->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadTypeSelected ), NULL, this );
|
||||||
m_rbCopperLayersSel->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_rbCopperLayersSel->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerAdhCmp->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerAdhCmp->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerAdhCu->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerAdhCu->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerPateCmp->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerPateCmp->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerPateCu->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerPateCu->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerSilkCmp->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerSilkCmp->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerSilkCu->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerSilkCu->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerMaskCmp->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerMaskCmp->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerMaskCu->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerMaskCu->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerDraft->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerDraft->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerECO1->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerECO1->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerECO2->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerECO2->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_sdbSizer1Cancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnCancelButtonClick ), NULL, this );
|
m_sdbSizer1Cancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnCancelButtonClick ), NULL, this );
|
||||||
m_sdbSizer1OK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadPropertiesAccept ), NULL, this );
|
m_sdbSizer1OK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadPropertiesAccept ), NULL, this );
|
||||||
}
|
}
|
||||||
|
|
||||||
DIALOG_PAD_PROPERTIES_BASE::~DIALOG_PAD_PROPERTIES_BASE()
|
DIALOG_PAD_PROPERTIES_BASE::~DIALOG_PAD_PROPERTIES_BASE()
|
||||||
{
|
{
|
||||||
// Disconnect Events
|
// Disconnect Events
|
||||||
m_PadNumCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_PadNumCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_PadNetNameCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_PadNetNameCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_PadDrill_X_Ctrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_PadDrill_X_Ctrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_PadDrill_Y_Ctrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_PadDrill_Y_Ctrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_ShapeSize_X_Ctrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_ShapeSize_X_Ctrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_ShapeSize_Y_Ctrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_ShapeSize_Y_Ctrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_ShapeOffset_X_Ctrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_ShapeOffset_X_Ctrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_ShapeOffset_Y_Ctrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_ShapeOffset_Y_Ctrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_ShapeDelta_Ctrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_ShapeDelta_Ctrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_radioBtnDeltaXdir->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_radioBtnDeltaXdir->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_radioBtnDeltaYdir->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_radioBtnDeltaYdir->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_PadShape->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnPadShapeSelection ), NULL, this );
|
m_PadShape->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnPadShapeSelection ), NULL, this );
|
||||||
m_DrillShapeCtrl->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnDrillShapeSelected ), NULL, this );
|
m_DrillShapeCtrl->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnDrillShapeSelected ), NULL, this );
|
||||||
m_PadOrient->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadOrientEvent ), NULL, this );
|
m_PadOrient->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadOrientEvent ), NULL, this );
|
||||||
m_PadOrientCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_PadOrientCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_panelShowPad->Disconnect( wxEVT_PAINT, wxPaintEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnPaintShowPanel ), NULL, this );
|
m_panelShowPad->Disconnect( wxEVT_PAINT, wxPaintEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnPaintShowPanel ), NULL, this );
|
||||||
m_NetClearanceValueCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
m_NetClearanceValueCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||||
m_PadType->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadTypeSelected ), NULL, this );
|
m_PadType->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadTypeSelected ), NULL, this );
|
||||||
m_rbCopperLayersSel->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_rbCopperLayersSel->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerAdhCmp->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerAdhCmp->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerAdhCu->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerAdhCu->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerPateCmp->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerPateCmp->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerPateCu->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerPateCu->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerSilkCmp->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerSilkCmp->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerSilkCu->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerSilkCu->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerMaskCmp->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerMaskCmp->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerMaskCu->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerMaskCu->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerDraft->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerDraft->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerECO1->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerECO1->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_PadLayerECO2->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
m_PadLayerECO2->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this );
|
||||||
m_sdbSizer1Cancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnCancelButtonClick ), NULL, this );
|
m_sdbSizer1Cancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnCancelButtonClick ), NULL, this );
|
||||||
m_sdbSizer1OK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadPropertiesAccept ), NULL, this );
|
m_sdbSizer1OK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadPropertiesAccept ), NULL, this );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 )
|
||||||
|
@ -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