Fixed some issues about trapezoidal pads. Better pad editor dialog. fixed other (very) minor bugs. Code cleaning.
Plaese note plot functions are not yet updated, so minor differences can be seen between pads on screen and plot files.
This commit is contained in:
commit
a13ddf384c
|
@ -29,7 +29,6 @@
|
|||
double s_HerscheyScaleFactor = HERSHEY_SCALE_FACTOR;
|
||||
|
||||
|
||||
|
||||
/** Function GetPensizeForBold
|
||||
* @return the "best" value for a pen size to draw/plot a bold text
|
||||
* @param aTextSize = the char size (height or width)
|
||||
|
@ -62,12 +61,13 @@ int Clamp_Text_PenSize( int aPenSize, int aSize, bool aBold )
|
|||
return penSize;
|
||||
}
|
||||
|
||||
|
||||
int Clamp_Text_PenSize( int aPenSize, wxSize aSize, bool aBold )
|
||||
{
|
||||
int size = MIN( ABS( aSize.x ), ABS( aSize.y ) );
|
||||
return Clamp_Text_PenSize(aPenSize, size, aBold);;
|
||||
}
|
||||
|
||||
return Clamp_Text_PenSize( aPenSize, size, aBold );;
|
||||
}
|
||||
|
||||
|
||||
/* Functions to draw / plot a string.
|
||||
|
@ -97,7 +97,6 @@ int NegableTextLength( const wxString& aText )
|
|||
}
|
||||
|
||||
|
||||
|
||||
/* Function GetHersheyShapeDescription()
|
||||
* return a pointer to the shape corresponding to unicode value AsciiCode
|
||||
* Note we use the same font for Bold and Normal texts
|
||||
|
@ -108,7 +107,8 @@ static const char* GetHersheyShapeDescription( int AsciiCode )
|
|||
{
|
||||
/* calculate font length */
|
||||
int font_length_max = newstroke_font_bufsize;
|
||||
if ( AsciiCode >= (32 + font_length_max) )
|
||||
|
||||
if( AsciiCode >= (32 + font_length_max) )
|
||||
AsciiCode = '?';
|
||||
if( AsciiCode < 32 )
|
||||
AsciiCode = 32; /* Clamp control chars */
|
||||
|
@ -150,7 +150,7 @@ int ReturnGraphicTextWidth( const wxString& aText, int aXSize, bool aItalic, boo
|
|||
|
||||
/* Helper function for drawing character polygons */
|
||||
static void DrawGraphicTextPline(
|
||||
WinEDA_DrawPanel* aPanel,
|
||||
EDA_Rect* aClipBox,
|
||||
wxDC* aDC,
|
||||
EDA_Colors aColor,
|
||||
int aWidth,
|
||||
|
@ -158,18 +158,19 @@ static void DrawGraphicTextPline(
|
|||
int point_count,
|
||||
wxPoint* coord,
|
||||
void (* aCallback)(int x0, int y0, int xf, int yf ),
|
||||
PLOTTER *plotter )
|
||||
PLOTTER* plotter )
|
||||
{
|
||||
if( plotter )
|
||||
{
|
||||
plotter->move_to(coord[0]);
|
||||
plotter->move_to( coord[0] );
|
||||
for( int ik = 1; ik < point_count; ik++ )
|
||||
{
|
||||
plotter->line_to( coord[ik] );
|
||||
}
|
||||
|
||||
plotter->pen_finish();
|
||||
}
|
||||
else if (aCallback)
|
||||
else if( aCallback )
|
||||
{
|
||||
for( int ik = 0; ik < (point_count - 1); ik++ )
|
||||
{
|
||||
|
@ -180,11 +181,11 @@ static void DrawGraphicTextPline(
|
|||
else if( sketch_mode )
|
||||
{
|
||||
for( int ik = 0; ik < (point_count - 1); ik++ )
|
||||
GRCSegm( &aPanel->m_ClipBox, aDC, coord[ik].x, coord[ik].y,
|
||||
GRCSegm( aClipBox, aDC, coord[ik].x, coord[ik].y,
|
||||
coord[ik + 1].x, coord[ik + 1].y, aWidth, aColor );
|
||||
}
|
||||
else
|
||||
GRPoly( &aPanel->m_ClipBox, aDC, point_count, coord, 0,
|
||||
GRPoly( aClipBox, aDC, point_count, coord, 0,
|
||||
aWidth, aColor, aColor );
|
||||
}
|
||||
|
||||
|
@ -228,7 +229,7 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
|
|||
bool aItalic,
|
||||
bool aBold,
|
||||
void (* aCallback)( int x0, int y0, int xf, int yf ),
|
||||
PLOTTER *plotter )
|
||||
PLOTTER* plotter )
|
||||
/****************************************************************************************************/
|
||||
{
|
||||
int AsciiCode;
|
||||
|
@ -240,8 +241,9 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
|
|||
wxPoint overbar_pos; // Start point for the current overbar
|
||||
int overbars; // Number of ~ seen
|
||||
int overbar_italic_comp; // Italic compensation for overbar
|
||||
EDA_Rect* clipBox; // Clip box used in basic draw functions
|
||||
|
||||
|
||||
clipBox = aPanel ? &aPanel->m_ClipBox : NULL;
|
||||
#define BUF_SIZE 100
|
||||
wxPoint coord[BUF_SIZE + 1]; // Buffer coordinate used to draw polylines (one char shape)
|
||||
bool sketch_mode = false;
|
||||
|
@ -347,11 +349,12 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
|
|||
RotatePoint( ¤t_char_pos, aPos, aOrient );
|
||||
RotatePoint( &end, aPos, aOrient );
|
||||
|
||||
if( plotter ) {
|
||||
plotter->move_to(current_char_pos);
|
||||
if( plotter )
|
||||
{
|
||||
plotter->move_to( current_char_pos );
|
||||
plotter->finish_to( end );
|
||||
}
|
||||
else if (aCallback)
|
||||
else if( aCallback )
|
||||
{
|
||||
aCallback( current_char_pos.x, current_char_pos.y, end.x, end.y );
|
||||
}
|
||||
|
@ -402,7 +405,7 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
|
|||
RotatePoint( &overbar_pos, aPos, aOrient );
|
||||
coord[1] = overbar_pos;
|
||||
/* Plot the overbar segment */
|
||||
DrawGraphicTextPline( aPanel, aDC, aColor, aWidth,
|
||||
DrawGraphicTextPline( clipBox, aDC, aColor, aWidth,
|
||||
sketch_mode, 2, coord, aCallback, plotter );
|
||||
}
|
||||
continue; /* Skip ~ processing */
|
||||
|
@ -426,12 +429,13 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
|
|||
}
|
||||
else
|
||||
{
|
||||
/* End of character, insert a synthetic pen up */
|
||||
// End of character, insert a synthetic pen up:
|
||||
hc1 = ' ';
|
||||
hc2 = 'R';
|
||||
endcar = true;
|
||||
}
|
||||
hc1 -= 'R'; hc2 -= 'R'; /* Do the Hershey decode thing: coordinates values are coded as <value> + 'R' */
|
||||
// Do the Hershey decode thing: coordinates values are coded as <value> + 'R'
|
||||
hc1 -= 'R'; hc2 -= 'R';
|
||||
|
||||
/* Pen up request */
|
||||
if( hc1 == -50 && hc2 == 0 )
|
||||
|
@ -440,7 +444,7 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
|
|||
{
|
||||
if( aWidth <= 1 )
|
||||
aWidth = 0;
|
||||
DrawGraphicTextPline( aPanel, aDC, aColor, aWidth,
|
||||
DrawGraphicTextPline( clipBox, aDC, aColor, aWidth,
|
||||
sketch_mode, point_count, coord,
|
||||
aCallback, plotter );
|
||||
}
|
||||
|
@ -483,7 +487,7 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
|
|||
RotatePoint( &overbar_pos, aPos, aOrient );
|
||||
coord[1] = overbar_pos;
|
||||
/* Plot the overbar segment */
|
||||
DrawGraphicTextPline( aPanel, aDC, aColor, aWidth,
|
||||
DrawGraphicTextPline( clipBox, aDC, aColor, aWidth,
|
||||
sketch_mode, 2, coord, aCallback, plotter );
|
||||
}
|
||||
}
|
||||
|
@ -521,10 +525,10 @@ void PLOTTER::text( const wxPoint& aPos,
|
|||
if( aWidth == 0 && aBold ) // Use default values if aWidth == 0
|
||||
aWidth = GetPenSizeForBold( MIN( aSize.x, aSize.y ) );
|
||||
|
||||
if ( aWidth >= 0 )
|
||||
if( aWidth >= 0 )
|
||||
aWidth = Clamp_Text_PenSize( aWidth, aSize, aBold );
|
||||
else
|
||||
aWidth = - Clamp_Text_PenSize( -aWidth, aSize, aBold );
|
||||
aWidth = -Clamp_Text_PenSize( -aWidth, aSize, aBold );
|
||||
|
||||
set_current_line_width( aWidth );
|
||||
|
||||
|
|
|
@ -1138,6 +1138,9 @@ void GRSCSegm( EDA_Rect* ClipBox,
|
|||
|
||||
static bool IsGRSPolyDrawable( EDA_Rect* ClipBox, int n, wxPoint Points[] )
|
||||
{
|
||||
if( ! ClipBox )
|
||||
return true;
|
||||
|
||||
int Xmin, Xmax, Ymin, Ymax;
|
||||
|
||||
Xmin = Xmax = Points[0].x;
|
||||
|
|
|
@ -13,11 +13,6 @@
|
|||
#include "cvpcb.h"
|
||||
#include "protos.h"
|
||||
|
||||
#define MAX_LEN_NETNAME 16
|
||||
|
||||
|
||||
static void ChangePinNet( COMPONENT_LIST& list, wxString& PinNet,
|
||||
int* netNumber, bool rightJustify );
|
||||
static void WriteFootprintFilterInfos( FILE* dest, COMPONENT_LIST& list );
|
||||
|
||||
|
||||
|
@ -74,7 +69,6 @@ int GenNetlistPcbnew( FILE* file, COMPONENT_LIST& list, bool isEESchemaNetlist,
|
|||
{
|
||||
#define NETLIST_HEAD_STRING "EESchema Netlist Version 1.1"
|
||||
char Line[1024];
|
||||
int netNumber = 1;
|
||||
|
||||
DateAndTime( Line );
|
||||
|
||||
|
@ -103,9 +97,6 @@ int GenNetlistPcbnew( FILE* file, COMPONENT_LIST& list, bool isEESchemaNetlist,
|
|||
|
||||
BOOST_FOREACH( PIN& pin, component.m_Pins )
|
||||
{
|
||||
if( pin.m_Net.Len() > MAX_LEN_NETNAME )
|
||||
ChangePinNet( list, pin.m_Net, &netNumber, rightJustify );
|
||||
|
||||
if( !pin.m_Net.IsEmpty() )
|
||||
fprintf( file, " ( %s %s )\n",
|
||||
CONV_TO_UTF8( pin.m_Number ),
|
||||
|
@ -161,42 +152,3 @@ void WriteFootprintFilterInfos( FILE* file, COMPONENT_LIST& list )
|
|||
fprintf( file, "$endfootprintlist\n}\n" );
|
||||
}
|
||||
|
||||
|
||||
/* ???
|
||||
* Change le NetName PinNet par un nom compose des 8 derniers codes de PinNet
|
||||
* suivi de _Xnnnnn ou nnnnn est un nom de 0 a 99999
|
||||
*/
|
||||
static void ChangePinNet( COMPONENT_LIST& list, wxString& PinNet,
|
||||
int* netNumber, bool rightJustify )
|
||||
{
|
||||
wxASSERT( netNumber != NULL );
|
||||
|
||||
wxString OldName;
|
||||
wxString NewName;
|
||||
|
||||
OldName = PinNet;
|
||||
|
||||
if( rightJustify ) /* Retain the last 8 letters of the name. */
|
||||
{
|
||||
NewName = OldName.Right( 8 );
|
||||
NewName << *netNumber;
|
||||
}
|
||||
else /* Retain the first 8 letters of the name. */
|
||||
{
|
||||
NewName = OldName.Left( 8 );
|
||||
NewName << *netNumber;
|
||||
}
|
||||
|
||||
*netNumber = *netNumber + 1;
|
||||
|
||||
BOOST_FOREACH( COMPONENT& component, list )
|
||||
{
|
||||
BOOST_FOREACH( PIN& pin, component.m_Pins )
|
||||
{
|
||||
if( pin.m_Net != OldName )
|
||||
continue;
|
||||
|
||||
pin.m_Net = NewName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,11 +41,6 @@ private:
|
|||
* orientation.
|
||||
*/
|
||||
|
||||
public:
|
||||
|
||||
//int m_Shape;
|
||||
//bool m_IsDangling; // TRUE non connected
|
||||
|
||||
public:
|
||||
SCH_SHEET_PIN( SCH_SHEET* parent,
|
||||
const wxPoint& pos = wxPoint( 0, 0 ),
|
||||
|
@ -63,6 +58,19 @@ public:
|
|||
|
||||
SCH_SHEET_PIN* GenCopy();
|
||||
|
||||
virtual void Draw( WinEDA_DrawPanel* aPanel,
|
||||
wxDC* aDC,
|
||||
const wxPoint& aOffset,
|
||||
int aDraw_mode,
|
||||
int aColor = -1 );
|
||||
|
||||
/** function CreateGraphicShape (virual)
|
||||
* Calculates the graphic shape (a polygon) associated to the text
|
||||
* @param aCorner_list = a buffer to fill with polygon corners coordinates
|
||||
* @param Pos = Position of the shape
|
||||
*/
|
||||
virtual void CreateGraphicShape( std::vector <wxPoint>& aCorner_list,
|
||||
const wxPoint& Pos );
|
||||
SCH_SHEET_PIN* Next()
|
||||
{
|
||||
return (SCH_SHEET_PIN*) Pnext;
|
||||
|
|
|
@ -60,6 +60,22 @@ SCH_SHEET_PIN* SCH_SHEET_PIN::GenCopy()
|
|||
return newitem;
|
||||
}
|
||||
|
||||
/** SCH_SHEET_PIN::Draw is the same as SCH_HIERLABEL::Draw
|
||||
* but the graphic icon is slightly different
|
||||
* for INPUT type the icon is the OUTPUT shape of SCH_HIERLABEL
|
||||
* for OUTPUT type the icon is the INPUT shape of SCH_HIERLABEL
|
||||
*/
|
||||
void SCH_SHEET_PIN::Draw( WinEDA_DrawPanel* aPanel,
|
||||
wxDC* aDC,
|
||||
const wxPoint& aOffset,
|
||||
int aDraw_mode,
|
||||
int aColor )
|
||||
{
|
||||
// The icon selection is handle by the virtual method CreateGraphicShape
|
||||
// called by ::Draw
|
||||
SCH_HIERLABEL::Draw(aPanel, aDC, aOffset, aDraw_mode, aColor );
|
||||
}
|
||||
|
||||
|
||||
void SCH_SHEET_PIN::SwapData( SCH_SHEET_PIN* copyitem )
|
||||
{
|
||||
|
|
|
@ -1010,11 +1010,12 @@ bool SCH_HIERLABEL::HitTest( const wxPoint& aPosRef )
|
|||
}
|
||||
|
||||
|
||||
/*********************************************************************************************/
|
||||
/** Function SCH_LABEL::Draw
|
||||
* a label is drawn like a text. So just call SCH_TEXT::Draw
|
||||
*/
|
||||
void SCH_LABEL::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset,
|
||||
int DrawMode, int Color )
|
||||
{
|
||||
/*********************************************************************************************/
|
||||
SCH_TEXT::Draw( panel, DC, offset, DrawMode, Color );
|
||||
}
|
||||
|
||||
|
@ -1028,8 +1029,8 @@ void SCH_HIERLABEL::Draw( WinEDA_DrawPanel* panel,
|
|||
{
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Texts type Global Label have 4 directions, and the Text origin is the
|
||||
* graphic icon
|
||||
/* Hierarchical Label have a text and a graphic icon.
|
||||
* Texts type have 4 directions, and the text origin is the graphic icon
|
||||
*/
|
||||
static std::vector <wxPoint> Poly;
|
||||
EDA_Colors color;
|
||||
|
@ -1100,6 +1101,36 @@ void SCH_HIERLABEL::CreateGraphicShape( std::vector <wxPoint>& aCorner_list,
|
|||
}
|
||||
}
|
||||
|
||||
/** Virtual Function SCH_SHEET_PIN::CreateGraphicShape
|
||||
* calculates the graphic shape (a polygon) associated to the text
|
||||
* @param aCorner_list = a buffer to fill with polygon corners coordinates
|
||||
* @param aPos = Position of the shape
|
||||
*/
|
||||
void SCH_SHEET_PIN::CreateGraphicShape( std::vector <wxPoint>& aCorner_list,
|
||||
const wxPoint& aPos )
|
||||
{
|
||||
/* This is the same icon shapes as SCH_HIERLABEL
|
||||
* but the graphic icon is slightly different in 2 cases:
|
||||
* for INPUT type the icon is the OUTPUT shape of SCH_HIERLABEL
|
||||
* for OUTPUT type the icon is the INPUT shape of SCH_HIERLABEL
|
||||
*/
|
||||
int tmp = m_Shape;
|
||||
switch( m_Shape )
|
||||
{
|
||||
case NET_INPUT:
|
||||
m_Shape = NET_OUTPUT;
|
||||
break;
|
||||
|
||||
case NET_OUTPUT:
|
||||
m_Shape = NET_INPUT;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
SCH_HIERLABEL::CreateGraphicShape( aCorner_list, aPos );
|
||||
m_Shape = tmp;
|
||||
}
|
||||
|
||||
/****************************************/
|
||||
EDA_Rect SCH_HIERLABEL::GetBoundingBox()
|
||||
|
|
|
@ -93,6 +93,18 @@ public:
|
|||
int draw_mode,
|
||||
int Color = -1 );
|
||||
|
||||
/** function CreateGraphicShape
|
||||
* Calculates the graphic shape (a polygon) associated to the text
|
||||
* @param aCorner_list = a buffer to fill with polygon corners coordinates
|
||||
* @param Pos = Postion of the shape
|
||||
* for texts and labels: do nothing
|
||||
* Mainly for derived classes (SCH_SHEET_PIN and Hierarchical labels)
|
||||
*/
|
||||
virtual void CreateGraphicShape( std::vector <wxPoint>& aCorner_list,
|
||||
const wxPoint& Pos )
|
||||
{
|
||||
aCorner_list.clear();
|
||||
}
|
||||
void SwapData( SCH_TEXT* copyitem );
|
||||
|
||||
void Place( WinEDA_SchematicFrame* frame, wxDC* DC );
|
||||
|
@ -291,13 +303,13 @@ public:
|
|||
*/
|
||||
EDA_Rect GetBoundingBox();
|
||||
|
||||
/** function CreateGraphicShape
|
||||
/** function CreateGraphicShape (virual)
|
||||
* Calculates the graphic shape (a polygon) associated to the text
|
||||
* @param aCorner_list = a buffer to fill with polygon corners coordinates
|
||||
* @param Pos = Position of the shape
|
||||
* @param aPos = Position of the shape
|
||||
*/
|
||||
void CreateGraphicShape( std::vector <wxPoint>& aCorner_list,
|
||||
const wxPoint& Pos );
|
||||
virtual void CreateGraphicShape( std::vector <wxPoint>& aCorner_list,
|
||||
const wxPoint& aPos );
|
||||
|
||||
/** virtual function Mirror_Y
|
||||
* mirror item relative to an Y axis
|
||||
|
@ -355,7 +367,7 @@ public:
|
|||
* @param aCorner_list = a buffer to fill with polygon corners coordinates
|
||||
* @param Pos = Postion of the shape
|
||||
*/
|
||||
void CreateGraphicShape( std::vector <wxPoint>& aCorner_list,
|
||||
virtual void CreateGraphicShape( std::vector <wxPoint>& aCorner_list,
|
||||
const wxPoint& Pos );
|
||||
|
||||
/**
|
||||
|
|
|
@ -27,31 +27,30 @@ enum End_Type {
|
|||
SHEET_LABEL_END
|
||||
};
|
||||
|
||||
class DanglingEndHandle
|
||||
// A helper class to store a list of items that can be connected to something:
|
||||
class DANGLING_END_ITEM
|
||||
{
|
||||
public:
|
||||
const void* m_Item;
|
||||
wxPoint m_Pos;
|
||||
int m_Type;
|
||||
DanglingEndHandle* m_Pnext;
|
||||
const void* m_Item; // a pointer to the parent
|
||||
wxPoint m_Pos; // the position of the connecting point
|
||||
int m_Type; // type of parent
|
||||
|
||||
DanglingEndHandle( int type )
|
||||
DANGLING_END_ITEM( int type, const void* aItem )
|
||||
{
|
||||
m_Item = NULL;
|
||||
m_Item = aItem;
|
||||
m_Type = type;
|
||||
m_Pnext = NULL;
|
||||
}
|
||||
};
|
||||
|
||||
DanglingEndHandle* ItemList;
|
||||
|
||||
static void TestWireForDangling( SCH_LINE* DrawRef,
|
||||
static void TestWireForDangling( std::vector <DANGLING_END_ITEM>& aItemList,
|
||||
SCH_LINE* DrawRef,
|
||||
WinEDA_SchematicFrame* frame,
|
||||
wxDC* DC );
|
||||
void TestLabelForDangling( SCH_TEXT* label,
|
||||
WinEDA_SchematicFrame* frame,
|
||||
wxDC* DC );
|
||||
DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList );
|
||||
wxDC* aDC );
|
||||
void TestLabelForDangling( std::vector <DANGLING_END_ITEM>& aItemList,
|
||||
SCH_TEXT* aLabel,
|
||||
WinEDA_SchematicFrame* aFrame,
|
||||
wxDC* aDC );
|
||||
void RebuildEndPointsList( std::vector <DANGLING_END_ITEM>& aItemList, SCH_ITEM* aDrawList );
|
||||
|
||||
|
||||
/* Returns true if the point P is on the segment S. */
|
||||
|
@ -74,21 +73,10 @@ bool SegmentIntersect( wxPoint aSegStart, wxPoint aSegEnd, wxPoint aTestPoint )
|
|||
|
||||
void WinEDA_SchematicFrame::TestDanglingEnds( SCH_ITEM* DrawList, wxDC* DC )
|
||||
{
|
||||
if( ItemList )
|
||||
{
|
||||
const DanglingEndHandle* DanglingItem;
|
||||
const DanglingEndHandle* nextitem;
|
||||
// this list is static to avoid many useles memory allocation.
|
||||
std::vector <DANGLING_END_ITEM> itemList;
|
||||
|
||||
for( DanglingItem = ItemList;
|
||||
DanglingItem != NULL;
|
||||
DanglingItem = nextitem )
|
||||
{
|
||||
nextitem = DanglingItem->m_Pnext;
|
||||
SAFE_DELETE( DanglingItem );
|
||||
}
|
||||
}
|
||||
|
||||
ItemList = RebuildEndList( DrawList );
|
||||
RebuildEndPointsList( itemList, DrawList );
|
||||
|
||||
for( SCH_ITEM* item = DrawList; item; item = item->Next() )
|
||||
{
|
||||
|
@ -97,14 +85,17 @@ void WinEDA_SchematicFrame::TestDanglingEnds( SCH_ITEM* DrawList, wxDC* DC )
|
|||
case TYPE_SCH_GLOBALLABEL:
|
||||
case TYPE_SCH_HIERLABEL:
|
||||
case TYPE_SCH_LABEL:
|
||||
TestLabelForDangling( (SCH_LABEL*) item, this, DC );
|
||||
TestLabelForDangling( itemList, (SCH_LABEL*) item, this, DC );
|
||||
break;
|
||||
|
||||
case DRAW_SHEET_STRUCT_TYPE:
|
||||
|
||||
{
|
||||
SCH_SHEET* sheet = (SCH_SHEET*) item;
|
||||
// Read the hierarchical pins list and teast for dangling pins:
|
||||
BOOST_FOREACH( SCH_SHEET_PIN & sheetPin, ( (SCH_SHEET*) item )->GetSheetPins() ) {
|
||||
TestLabelForDangling( &sheetPin, this, DC );
|
||||
BOOST_FOREACH( SCH_SHEET_PIN & pinsheet, sheet->GetSheetPins() )
|
||||
{
|
||||
TestLabelForDangling( itemList, &pinsheet, this, DC );
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -113,7 +104,7 @@ void WinEDA_SchematicFrame::TestDanglingEnds( SCH_ITEM* DrawList, wxDC* DC )
|
|||
#define STRUCT ( (SCH_LINE*) item )
|
||||
if( STRUCT->GetLayer() == LAYER_WIRE )
|
||||
{
|
||||
TestWireForDangling( STRUCT, this, DC );
|
||||
TestWireForDangling( itemList, STRUCT, this, DC );
|
||||
break;
|
||||
}
|
||||
if( STRUCT->GetLayer() == LAYER_NOTES )
|
||||
|
@ -165,24 +156,22 @@ LIB_PIN* WinEDA_SchematicFrame::LocatePinEnd( SCH_ITEM* DrawList,
|
|||
}
|
||||
|
||||
|
||||
void TestWireForDangling( SCH_LINE* DrawRef, WinEDA_SchematicFrame* frame,
|
||||
void TestWireForDangling( std::vector <DANGLING_END_ITEM>& aItemList,
|
||||
SCH_LINE* DrawRef,
|
||||
WinEDA_SchematicFrame* frame,
|
||||
wxDC* DC )
|
||||
{
|
||||
DanglingEndHandle* terminal_item;
|
||||
bool Sdangstate = true, Edangstate = true;
|
||||
|
||||
for( terminal_item = ItemList; terminal_item != NULL;
|
||||
terminal_item = terminal_item->m_Pnext )
|
||||
BOOST_FOREACH( DANGLING_END_ITEM terminal_item, aItemList )
|
||||
{
|
||||
if( terminal_item->m_Item == DrawRef )
|
||||
if( terminal_item.m_Item == DrawRef )
|
||||
continue;
|
||||
|
||||
if( (DrawRef->m_Start.x == terminal_item->m_Pos.x)
|
||||
&& (DrawRef->m_Start.y == terminal_item->m_Pos.y) )
|
||||
if( DrawRef->m_Start == terminal_item.m_Pos )
|
||||
Sdangstate = false;
|
||||
|
||||
if( (DrawRef->m_End.x == terminal_item->m_Pos.x)
|
||||
&& (DrawRef->m_End.y == terminal_item->m_Pos.y) )
|
||||
if( DrawRef->m_End == terminal_item.m_Pos )
|
||||
Edangstate = false;
|
||||
|
||||
if( (Sdangstate == false) && (Edangstate == false) )
|
||||
|
@ -203,34 +192,40 @@ void TestWireForDangling( SCH_LINE* DrawRef, WinEDA_SchematicFrame* frame,
|
|||
}
|
||||
|
||||
|
||||
void TestLabelForDangling( SCH_TEXT* label, WinEDA_SchematicFrame* frame,
|
||||
wxDC* DC )
|
||||
void TestLabelForDangling( std::vector <DANGLING_END_ITEM>& aItemList,
|
||||
SCH_TEXT* aLabel,
|
||||
WinEDA_SchematicFrame* aFrame,
|
||||
wxDC* aDC )
|
||||
{
|
||||
DanglingEndHandle* terminal_item;
|
||||
bool dangstate = true;
|
||||
|
||||
for( terminal_item = ItemList; terminal_item != NULL;
|
||||
terminal_item = terminal_item->m_Pnext )
|
||||
for( unsigned ii = 0; ii < aItemList.size(); ii++ )
|
||||
{
|
||||
if( terminal_item->m_Item == label )
|
||||
DANGLING_END_ITEM & terminal_item = aItemList[ii];
|
||||
|
||||
if( terminal_item.m_Item == aLabel )
|
||||
continue;
|
||||
|
||||
switch( terminal_item->m_Type )
|
||||
switch( terminal_item.m_Type )
|
||||
{
|
||||
case PIN_END:
|
||||
case LABEL_END:
|
||||
case SHEET_LABEL_END:
|
||||
if( ( label->m_Pos.x == terminal_item->m_Pos.x )
|
||||
&& ( label->m_Pos.y == terminal_item->m_Pos.y ) )
|
||||
if( aLabel->m_Pos == terminal_item.m_Pos )
|
||||
dangstate = false;
|
||||
break;
|
||||
|
||||
case WIRE_START_END:
|
||||
case BUS_START_END:
|
||||
dangstate = !SegmentIntersect( terminal_item->m_Pos,
|
||||
terminal_item->m_Pnext->m_Pos,
|
||||
label->m_Pos );
|
||||
terminal_item = terminal_item->m_Pnext;
|
||||
{
|
||||
// these schematic items have created 2 DANGLING_END_ITEM
|
||||
// one per end.
|
||||
ii++;
|
||||
DANGLING_END_ITEM & next_terminal = aItemList[ii];
|
||||
dangstate = !SegmentIntersect( terminal_item.m_Pos,
|
||||
next_terminal.m_Pos,
|
||||
aLabel->m_Pos );
|
||||
}
|
||||
break;
|
||||
|
||||
case UNKNOWN:
|
||||
|
@ -245,13 +240,13 @@ void TestLabelForDangling( SCH_TEXT* label, WinEDA_SchematicFrame* frame,
|
|||
break;
|
||||
}
|
||||
|
||||
if( dangstate != label->m_IsDangling )
|
||||
if( dangstate != aLabel->m_IsDangling )
|
||||
{
|
||||
if( DC )
|
||||
RedrawOneStruct( frame->DrawPanel, DC, label, g_XorMode );
|
||||
label->m_IsDangling = dangstate;
|
||||
if( DC )
|
||||
RedrawOneStruct( frame->DrawPanel, DC, label, GR_DEFAULT_DRAWMODE );
|
||||
if( aDC )
|
||||
RedrawOneStruct( aFrame->DrawPanel, aDC, aLabel, g_XorMode );
|
||||
aLabel->m_IsDangling = dangstate;
|
||||
if( aDC )
|
||||
RedrawOneStruct( aFrame->DrawPanel, aDC, aLabel, GR_DEFAULT_DRAWMODE );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -273,99 +268,76 @@ wxPoint ReturnPinPhysicalPosition( LIB_PIN* Pin, SCH_COMPONENT* DrawLibItem )
|
|||
}
|
||||
|
||||
|
||||
DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList )
|
||||
void RebuildEndPointsList( std::vector <DANGLING_END_ITEM>& aItemList, SCH_ITEM* aDrawList )
|
||||
{
|
||||
DanglingEndHandle* StartList = NULL, * item, * lastitem = NULL;
|
||||
EDA_BaseStruct* DrawItem;
|
||||
SCH_ITEM* schItem;
|
||||
|
||||
for( DrawItem = DrawList; DrawItem != NULL; DrawItem = DrawItem->Next() )
|
||||
aItemList.clear();
|
||||
|
||||
for( schItem = aDrawList; schItem != NULL; schItem = schItem->Next() )
|
||||
{
|
||||
switch( DrawItem->Type() )
|
||||
switch( schItem->Type() )
|
||||
{
|
||||
case TYPE_SCH_LABEL:
|
||||
case TYPE_SCH_GLOBALLABEL:
|
||||
case TYPE_SCH_HIERLABEL:
|
||||
{
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (SCH_LABEL*) DrawItem )
|
||||
item = new DanglingEndHandle( LABEL_END );
|
||||
|
||||
item->m_Item = DrawItem;
|
||||
item->m_Pos = STRUCT->m_Pos;
|
||||
if( lastitem )
|
||||
lastitem->m_Pnext = item;
|
||||
else
|
||||
StartList = item;
|
||||
lastitem = item;
|
||||
#define STRUCT ( (SCH_LABEL*) schItem )
|
||||
DANGLING_END_ITEM item( LABEL_END, schItem );
|
||||
item.m_Pos = STRUCT->m_Pos;
|
||||
aItemList.push_back( item );
|
||||
}
|
||||
break;
|
||||
|
||||
case DRAW_SEGMENT_STRUCT_TYPE:
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (SCH_LINE*) DrawItem )
|
||||
#define STRUCT ( (SCH_LINE*) schItem )
|
||||
if( STRUCT->GetLayer() == LAYER_NOTES )
|
||||
break;
|
||||
if( ( STRUCT->GetLayer() == LAYER_BUS )
|
||||
|| (STRUCT->GetLayer() == LAYER_WIRE ) )
|
||||
{
|
||||
item = new DanglingEndHandle(
|
||||
(STRUCT->GetLayer() == LAYER_BUS) ?
|
||||
BUS_START_END : WIRE_START_END );
|
||||
DANGLING_END_ITEM item( (STRUCT->GetLayer() == LAYER_BUS) ?
|
||||
BUS_START_END : WIRE_START_END, schItem );
|
||||
item.m_Pos = STRUCT->m_Start;
|
||||
DANGLING_END_ITEM item1( (STRUCT->GetLayer() == LAYER_BUS) ?
|
||||
BUS_END_END : WIRE_END_END, schItem );
|
||||
item1.m_Pos = STRUCT->m_End;
|
||||
|
||||
item->m_Item = DrawItem;
|
||||
item->m_Pos = STRUCT->m_Start;
|
||||
if( lastitem )
|
||||
lastitem->m_Pnext = item;
|
||||
else
|
||||
StartList = item;
|
||||
lastitem = item;
|
||||
item =
|
||||
new DanglingEndHandle( (STRUCT->GetLayer() == LAYER_BUS) ?
|
||||
BUS_END_END : WIRE_END_END );
|
||||
|
||||
item->m_Item = DrawItem;
|
||||
item->m_Pos = STRUCT->m_End;
|
||||
lastitem->m_Pnext = item;
|
||||
lastitem = item;
|
||||
aItemList.push_back( item );
|
||||
aItemList.push_back( item1 );
|
||||
}
|
||||
break;
|
||||
|
||||
case DRAW_JUNCTION_STRUCT_TYPE:
|
||||
{
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (SCH_JUNCTION*) DrawItem )
|
||||
item = new DanglingEndHandle( JUNCTION_END );
|
||||
|
||||
item->m_Item = DrawItem;
|
||||
item->m_Pos = STRUCT->m_Pos;
|
||||
if( lastitem )
|
||||
lastitem->m_Pnext = item;
|
||||
else
|
||||
StartList = item;
|
||||
lastitem = item;
|
||||
#define STRUCT ( (SCH_JUNCTION*) schItem )
|
||||
DANGLING_END_ITEM item( JUNCTION_END, schItem );
|
||||
item.m_Pos = STRUCT->m_Pos;
|
||||
aItemList.push_back( item );
|
||||
}
|
||||
break;
|
||||
|
||||
case DRAW_BUSENTRY_STRUCT_TYPE:
|
||||
{
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (SCH_BUS_ENTRY*) DrawItem )
|
||||
item = new DanglingEndHandle( ENTRY_END );
|
||||
#define STRUCT ( (SCH_BUS_ENTRY*) schItem )
|
||||
DANGLING_END_ITEM item( ENTRY_END, schItem );
|
||||
item.m_Pos = STRUCT->m_Pos;
|
||||
|
||||
item->m_Item = DrawItem;
|
||||
item->m_Pos = STRUCT->m_Pos;
|
||||
if( lastitem )
|
||||
lastitem->m_Pnext = item;
|
||||
else
|
||||
StartList = item;
|
||||
lastitem = item;
|
||||
item = new DanglingEndHandle( ENTRY_END );
|
||||
|
||||
item->m_Item = DrawItem;
|
||||
item->m_Pos = STRUCT->m_End();
|
||||
lastitem->m_Pnext = item;
|
||||
lastitem = item;
|
||||
DANGLING_END_ITEM item1( ENTRY_END, schItem );
|
||||
item1.m_Pos = STRUCT->m_End();
|
||||
aItemList.push_back( item );
|
||||
aItemList.push_back( item1 );
|
||||
}
|
||||
break;
|
||||
|
||||
case TYPE_SCH_COMPONENT:
|
||||
{
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (SCH_COMPONENT*) DrawItem )
|
||||
#define STRUCT ( (SCH_COMPONENT*) schItem )
|
||||
LIB_COMPONENT* Entry;
|
||||
Entry = CMP_LIBRARY::FindLibraryComponent( STRUCT->m_ChipName );
|
||||
if( Entry == NULL )
|
||||
|
@ -384,15 +356,9 @@ DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList )
|
|||
&& ( STRUCT->m_Convert != Pin->m_Convert ) )
|
||||
continue;
|
||||
|
||||
item = new DanglingEndHandle( PIN_END );
|
||||
|
||||
item->m_Item = Pin;
|
||||
item->m_Pos = ReturnPinPhysicalPosition( Pin, STRUCT );
|
||||
if( lastitem )
|
||||
lastitem->m_Pnext = item;
|
||||
else
|
||||
StartList = item;
|
||||
lastitem = item;
|
||||
DANGLING_END_ITEM item( PIN_END, Pin );
|
||||
item.m_Pos = ReturnPinPhysicalPosition( Pin, STRUCT );
|
||||
aItemList.push_back( item );
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -400,21 +366,18 @@ DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList )
|
|||
|
||||
case DRAW_SHEET_STRUCT_TYPE:
|
||||
{
|
||||
SCH_SHEET* sheet = (SCH_SHEET*) DrawItem;
|
||||
SCH_SHEET* sheet = (SCH_SHEET*) schItem;
|
||||
|
||||
BOOST_FOREACH( SCH_SHEET_PIN pinsheet, sheet->GetSheetPins() ) {
|
||||
// Using BOOST_FOREACH here creates problems (bad pointer value to pinsheet).
|
||||
// I do not know why.
|
||||
for( unsigned ii = 0; ii < sheet->GetSheetPins().size(); ii++ )
|
||||
{
|
||||
SCH_SHEET_PIN &pinsheet = sheet->GetSheetPins()[ii];
|
||||
wxASSERT( pinsheet.Type() == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE );
|
||||
|
||||
item = new DanglingEndHandle( SHEET_LABEL_END );
|
||||
item->m_Item = &pinsheet;
|
||||
item->m_Pos = pinsheet.m_Pos;
|
||||
|
||||
if( lastitem )
|
||||
lastitem->m_Pnext = item;
|
||||
else
|
||||
StartList = item;
|
||||
|
||||
lastitem = item;
|
||||
DANGLING_END_ITEM item( SHEET_LABEL_END, &pinsheet );
|
||||
item.m_Pos = pinsheet.m_Pos;
|
||||
aItemList.push_back( item );
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -423,6 +386,4 @@ DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList )
|
|||
;
|
||||
}
|
||||
}
|
||||
|
||||
return StartList;
|
||||
}
|
||||
|
|
|
@ -107,7 +107,7 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE( wx
|
|||
m_PanelBasic->SetSizer( bSizerBasicPanel );
|
||||
m_PanelBasic->Layout();
|
||||
bSizerBasicPanel->Fit( m_PanelBasic );
|
||||
m_NoteBook->AddPage( m_PanelBasic, _("Options"), false );
|
||||
m_NoteBook->AddPage( m_PanelBasic, _("Options"), true );
|
||||
m_PanelDoc = new wxPanel( m_NoteBook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* m_PanelDocBoxSizer;
|
||||
m_PanelDocBoxSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
@ -123,7 +123,7 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE( wx
|
|||
|
||||
m_staticTextKeywords = new wxStaticText( m_PanelDoc, wxID_ANY, _("Keywords:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextKeywords->Wrap( -1 );
|
||||
m_staticTextKeywords->SetToolTip( _("Enter keys words that can be used to select this composant.\nKey words cannot have spaces and are separated by a space.") );
|
||||
m_staticTextKeywords->SetToolTip( _("Enter key words that can be used to select this composant.\nKey words cannot have spaces and are separated by a space.") );
|
||||
|
||||
m_PanelDocBoxSizer->Add( m_staticTextKeywords, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
@ -153,7 +153,7 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE( wx
|
|||
m_PanelDoc->SetSizer( m_PanelDocBoxSizer );
|
||||
m_PanelDoc->Layout();
|
||||
m_PanelDocBoxSizer->Fit( m_PanelDoc );
|
||||
m_NoteBook->AddPage( m_PanelDoc, _("Description"), true );
|
||||
m_NoteBook->AddPage( m_PanelDoc, _("Description"), false );
|
||||
m_PanelAlias = new wxPanel( m_NoteBook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizerMainPanelAlias;
|
||||
bSizerMainPanelAlias = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
|
|
@ -128,7 +128,7 @@
|
|||
<object class="notebookpage" expanded="1">
|
||||
<property name="bitmap"></property>
|
||||
<property name="label">Options</property>
|
||||
<property name="select">0</property>
|
||||
<property name="select">1</property>
|
||||
<object class="wxPanel" expanded="1">
|
||||
<property name="bg"></property>
|
||||
<property name="context_help"></property>
|
||||
|
@ -851,7 +851,7 @@
|
|||
<object class="notebookpage" expanded="1">
|
||||
<property name="bitmap"></property>
|
||||
<property name="label">Description</property>
|
||||
<property name="select">1</property>
|
||||
<property name="select">0</property>
|
||||
<object class="wxPanel" expanded="1">
|
||||
<property name="bg"></property>
|
||||
<property name="context_help"></property>
|
||||
|
@ -1026,7 +1026,7 @@
|
|||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="tooltip">Enter keys words that can be used to select this composant.
Key words cannot have spaces and are separated by a space.</property>
|
||||
<property name="tooltip">Enter key words that can be used to select this composant.
Key words cannot have spaces and are separated by a space.</property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
|
|
|
@ -288,19 +288,9 @@ static void PlotTextStruct( PLOTTER* plotter, SCH_TEXT* aSchText )
|
|||
aSchText->m_Bold );
|
||||
|
||||
/* Draw graphic symbol for global or hierarchical labels */
|
||||
if( aSchText->Type() == TYPE_SCH_GLOBALLABEL )
|
||||
{
|
||||
( (SCH_GLOBALLABEL*) aSchText )->CreateGraphicShape( Poly,
|
||||
aSchText->m_Pos );
|
||||
aSchText->CreateGraphicShape( Poly, aSchText->m_Pos );
|
||||
if( Poly.size() )
|
||||
plotter->poly( Poly.size(), &Poly[0].x, NO_FILL );
|
||||
}
|
||||
if( ( aSchText->Type() == TYPE_SCH_HIERLABEL )
|
||||
|| ( aSchText->Type() == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE) )
|
||||
{
|
||||
( (SCH_HIERLABEL*) aSchText )->CreateGraphicShape( Poly,
|
||||
aSchText->m_Pos );
|
||||
plotter->poly( Poly.size(), &Poly[0].x, NO_FILL );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -392,7 +392,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
|
|||
return;
|
||||
}
|
||||
|
||||
if( !IsOK( this, _( "Do you wish to cleanup this sheet" ) ) )
|
||||
if( !IsOK( this, _( "Do you wish to cleanup this sheet?" ) ) )
|
||||
return;
|
||||
|
||||
/* Save sheet in undo list before cleaning up unreferenced hierarchical labels. */
|
||||
|
|
|
@ -71,11 +71,10 @@ int ChangeSideNumLayer( int oldlayer )
|
|||
}
|
||||
|
||||
|
||||
/* Change the mask layer during routing cu / cmp layers for
|
||||
* Cu / CMP..
|
||||
* (Copper, mask, paste, solder)
|
||||
/* Calculate the mask layer when flipping a footprint
|
||||
* BACK and FRONT copper layers , mask, paste, solder layers are swapped
|
||||
*/
|
||||
static int ChangeSideMaskLayer( int masque )
|
||||
int ChangeSideMaskLayer( int masque )
|
||||
{
|
||||
int newmasque;
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
/***********************************************/
|
||||
|
||||
#include "fctsys.h"
|
||||
#include "PolyLine.h"
|
||||
#include "common.h"
|
||||
#include "confirm.h"
|
||||
#include "kicad_string.h"
|
||||
|
@ -176,7 +177,7 @@ void D_PAD::Copy( D_PAD* source )
|
|||
m_Pos = source->m_Pos;
|
||||
m_Masque_Layer = source->m_Masque_Layer;
|
||||
|
||||
memcpy( m_Padname, source->m_Padname, sizeof(m_Padname) );
|
||||
m_NumPadName = source->m_NumPadName;
|
||||
SetNet( source->GetNet() );
|
||||
m_Drill = source->m_Drill;
|
||||
m_DrillShape = source->m_DrillShape;
|
||||
|
@ -779,6 +780,23 @@ bool D_PAD::HitTest( const wxPoint& ref_pos )
|
|||
return true;
|
||||
break;
|
||||
|
||||
case PAD_TRAPEZOID:
|
||||
{
|
||||
wxPoint poly[4];
|
||||
BuildPadPolygon( poly, wxSize(0,0), 0 );
|
||||
// Build the same polygon with CPolyPt corners,
|
||||
// to use TestPointInsidePolygon
|
||||
static std::vector <CPolyPt> polysList; // Is static to avoid memory reallocation
|
||||
polysList.clear();
|
||||
for(int ii= 0; ii < 4; ii++ )
|
||||
{
|
||||
CPolyPt corner(poly[ii].x, poly[ii].y);
|
||||
polysList.push_back(corner);
|
||||
}
|
||||
RotatePoint( &deltaX, &deltaY, -m_Orient );
|
||||
return TestPointInsidePolygon( polysList, 0, 3, deltaX, deltaY );
|
||||
}
|
||||
|
||||
default:
|
||||
RotatePoint( &deltaX, &deltaY, -m_Orient );
|
||||
if( (abs( deltaX ) <= dx ) && (abs( deltaY ) <= dy) )
|
||||
|
|
|
@ -25,6 +25,28 @@ class Pcb3D_GLCanvas;
|
|||
#define PAD_HOLE_NOT_PLATED_DEFAULT_LAYERS LAYER_BACK | SILKSCREEN_LAYER_FRONT | \
|
||||
SOLDERMASK_LAYER_BACK | SOLDERMASK_LAYER_FRONT
|
||||
|
||||
// Helper class to staore parameters used to draw a pad
|
||||
class PAD_DRAWINFO
|
||||
{
|
||||
public:
|
||||
WinEDA_DrawPanel * m_DrawPanel; // the WinEDA_DrawPanel used to draw a PAD ; can be null
|
||||
int m_DrawMode; // the draw mode
|
||||
int m_Color; // color used to draw the pad shape , from pad layers and visible layers
|
||||
int m_HoleColor; // color used to draw the pad hole
|
||||
int m_PadClearance; // clearance value, used to draw the pad area outlines
|
||||
wxSize m_Mask_margin; // margin, used to draw solder paste when only one layer is shown
|
||||
bool m_Display_padnum; // true to show pad number
|
||||
bool m_Display_netname; // true to show net name
|
||||
bool m_ShowPadFilled; // true to show pad as solid area, false to show pas in sketch mode
|
||||
bool m_ShowNCMark; // true to show pad not connected mark
|
||||
bool m_IsPrinting; // true to print, false to display on screen.
|
||||
wxPoint m_Offset; // general draw offset
|
||||
#ifndef USE_WX_ZOOM
|
||||
double m_Scale; // Draw scaling factor
|
||||
#endif
|
||||
PAD_DRAWINFO( );
|
||||
};
|
||||
|
||||
|
||||
class D_PAD : public BOARD_CONNECTED_ITEM
|
||||
{
|
||||
|
@ -210,6 +232,22 @@ public:
|
|||
|
||||
void Draw3D( Pcb3D_GLCanvas* glcanvas );
|
||||
|
||||
/** function DrawShape
|
||||
* basic function to draw a pad.
|
||||
* used by Draw after calculation of parameters (color, ) final orientation ...
|
||||
*/
|
||||
void DrawShape( EDA_Rect* aClipBox, wxDC* aDC, PAD_DRAWINFO& aDrawInfo );
|
||||
|
||||
/** function BuildPadPolygon
|
||||
* Has meaning only for polygonal pads (trapeziod and rectangular)
|
||||
* Build the Corner list of the polygonal shape,
|
||||
* depending on shape, extra size (clearance ...) and orientation
|
||||
* @param aCoord[4] = a buffer to fill.
|
||||
* @param aInflateValue = wxSize: the clearance or margin value. value > 0: inflate, < 0 deflate
|
||||
* @param aRotation = full rotation of the polygon
|
||||
*/
|
||||
void BuildPadPolygon( wxPoint aCoord[4], wxSize aInflateValue, int aRotation );
|
||||
|
||||
// others
|
||||
void SetPadName( const wxString& name ); // Change pad name
|
||||
wxString ReturnStringPadName(); // Return pad name as string in a wxString
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
/*******************************/
|
||||
|
||||
#include "fctsys.h"
|
||||
|
||||
#include "gr_basic.h"
|
||||
#include "common.h"
|
||||
#include "trigo.h"
|
||||
|
@ -20,27 +21,38 @@
|
|||
* After testing this feature,I am not sure this is a good idea
|
||||
* but the code is left here.
|
||||
*/
|
||||
|
||||
//#define SHOW_PADMASK_REAL_SIZE_AND_COLOR
|
||||
|
||||
/** Draw a pad:
|
||||
* @param DC = device context
|
||||
* @param offset = draw offset
|
||||
* @param draw_mode = mode: GR_OR, GR_XOR, GR_AND...
|
||||
*/
|
||||
void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
|
||||
const wxPoint& offset )
|
||||
|
||||
// Helper class to store parameters used to draw a pad
|
||||
PAD_DRAWINFO::PAD_DRAWINFO()
|
||||
{
|
||||
m_DrawPanel = NULL;
|
||||
m_DrawMode = 0;
|
||||
m_Color = BLACK;
|
||||
m_HoleColor = BLACK; // could be DARKGRAY;
|
||||
m_PadClearance = 0;
|
||||
m_Display_padnum = true;
|
||||
m_Display_netname = true;
|
||||
m_ShowPadFilled = true;
|
||||
m_ShowNCMark = true;
|
||||
#ifndef USE_WX_ZOOM
|
||||
m_Scale = 1.0;
|
||||
#endif
|
||||
m_IsPrinting = false;
|
||||
}
|
||||
|
||||
|
||||
/** Draw a pad:
|
||||
* @param aDC = device context
|
||||
* @param aDraw_mode = mode: GR_OR, GR_XOR, GR_AND...
|
||||
* @param aOffset = draw offset
|
||||
*/
|
||||
void D_PAD::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, int aDraw_mode,
|
||||
const wxPoint& aOffset )
|
||||
{
|
||||
int ii;
|
||||
int color = 0;
|
||||
int ux0, uy0,
|
||||
dx, dx0, dy, dy0,
|
||||
rotdx,
|
||||
delta_cx, delta_cy,
|
||||
xc, yc;
|
||||
int angle;
|
||||
wxPoint coord[4];
|
||||
int fillpad = 0;
|
||||
wxPoint shape_pos;
|
||||
wxSize mask_margin; // margin (clearance) used for some non copper layers
|
||||
int showActualMaskSize = 0; /* == layer number if the actual pad size on mask layer can be displayed
|
||||
* i.e. if only one layer is shown for this pad
|
||||
|
@ -50,6 +62,10 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
|
|||
if( m_Flags & DO_NOT_DRAW )
|
||||
return;
|
||||
|
||||
PAD_DRAWINFO drawInfo;
|
||||
|
||||
drawInfo.m_Offset = aOffset;
|
||||
|
||||
/* We can show/hide pads from the layer manager.
|
||||
* options are show/hide pads on front and/or back side of the board
|
||||
* For through pads, we hide them only if both sides are hidden.
|
||||
|
@ -62,17 +78,17 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
|
|||
|
||||
// Mask layers for Back side of board
|
||||
#define BACK_SIDE_LAYERS \
|
||||
(LAYER_BACK | ADHESIVE_LAYER_BACK | SOLDERPASTE_LAYER_BACK\
|
||||
(LAYER_BACK | ADHESIVE_LAYER_BACK | SOLDERPASTE_LAYER_BACK \
|
||||
| SILKSCREEN_LAYER_BACK | SOLDERMASK_LAYER_BACK)
|
||||
|
||||
// Mask layers for Front side of board
|
||||
#define FRONT_SIDE_LAYERS \
|
||||
(LAYER_FRONT | ADHESIVE_LAYER_FRONT | SOLDERPASTE_LAYER_FRONT\
|
||||
(LAYER_FRONT | ADHESIVE_LAYER_FRONT | SOLDERPASTE_LAYER_FRONT \
|
||||
| SILKSCREEN_LAYER_FRONT | SOLDERMASK_LAYER_FRONT)
|
||||
|
||||
BOARD * brd = GetBoard( );
|
||||
bool frontVisible = brd->IsElementVisible( PCB_VISIBLE(PAD_FR_VISIBLE) );
|
||||
bool backVisible = brd->IsElementVisible( PCB_VISIBLE(PAD_BK_VISIBLE) );
|
||||
BOARD* brd = GetBoard();
|
||||
bool frontVisible = brd->IsElementVisible( PCB_VISIBLE( PAD_FR_VISIBLE ) );
|
||||
bool backVisible = brd->IsElementVisible( PCB_VISIBLE( PAD_BK_VISIBLE ) );
|
||||
|
||||
if( !frontVisible && !backVisible )
|
||||
return;
|
||||
|
@ -90,24 +106,26 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
|
|||
return;
|
||||
|
||||
|
||||
WinEDA_BasePcbFrame* frame = (WinEDA_BasePcbFrame*) panel->GetParent();
|
||||
WinEDA_BasePcbFrame* frame = (WinEDA_BasePcbFrame*) aPanel->GetParent();
|
||||
PCB_SCREEN* screen = frame->GetScreen();
|
||||
if( frame->m_DisplayPadFill == FILLED )
|
||||
fillpad = 1;
|
||||
drawInfo.m_ShowPadFilled = true;
|
||||
else
|
||||
drawInfo.m_ShowPadFilled = false;
|
||||
|
||||
#if defined(PCBNEW) || defined(__WXMAC__)
|
||||
if( m_Flags & IS_MOVED || !DisplayOpt.DisplayPadFill )
|
||||
fillpad = 0;
|
||||
drawInfo.m_ShowPadFilled = false;
|
||||
#endif
|
||||
|
||||
if( m_Masque_Layer & LAYER_FRONT )
|
||||
{
|
||||
color = brd->GetVisibleElementColor(PAD_FR_VISIBLE);
|
||||
color = brd->GetVisibleElementColor( PAD_FR_VISIBLE );
|
||||
}
|
||||
|
||||
if( m_Masque_Layer & LAYER_BACK )
|
||||
{
|
||||
color |= brd->GetVisibleElementColor(PAD_BK_VISIBLE);
|
||||
color |= brd->GetVisibleElementColor( PAD_BK_VISIBLE );
|
||||
}
|
||||
|
||||
if( color == 0 ) /* Not on copper layer */
|
||||
|
@ -124,59 +142,59 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
|
|||
break;
|
||||
|
||||
case ADHESIVE_LAYER_BACK:
|
||||
color = brd->GetLayerColor(ADHESIVE_N_BACK);
|
||||
color = brd->GetLayerColor( ADHESIVE_N_BACK );
|
||||
break;
|
||||
|
||||
case ADHESIVE_LAYER_FRONT:
|
||||
color = brd->GetLayerColor(ADHESIVE_N_FRONT);
|
||||
color = brd->GetLayerColor( ADHESIVE_N_FRONT );
|
||||
break;
|
||||
|
||||
case SOLDERPASTE_LAYER_BACK:
|
||||
color = brd->GetLayerColor(SOLDERPASTE_N_BACK);
|
||||
color = brd->GetLayerColor( SOLDERPASTE_N_BACK );
|
||||
showActualMaskSize = SOLDERPASTE_N_BACK;
|
||||
break;
|
||||
|
||||
case SOLDERPASTE_LAYER_FRONT:
|
||||
color = brd->GetLayerColor(SOLDERPASTE_N_FRONT);
|
||||
color = brd->GetLayerColor( SOLDERPASTE_N_FRONT );
|
||||
showActualMaskSize = SOLDERPASTE_N_FRONT;
|
||||
break;
|
||||
|
||||
case SILKSCREEN_LAYER_BACK:
|
||||
color = brd->GetLayerColor(SILKSCREEN_N_BACK);
|
||||
color = brd->GetLayerColor( SILKSCREEN_N_BACK );
|
||||
break;
|
||||
|
||||
case SILKSCREEN_LAYER_FRONT:
|
||||
color = brd->GetLayerColor(SILKSCREEN_N_FRONT);
|
||||
color = brd->GetLayerColor( SILKSCREEN_N_FRONT );
|
||||
break;
|
||||
|
||||
case SOLDERMASK_LAYER_BACK:
|
||||
color = brd->GetLayerColor(SOLDERMASK_N_BACK);
|
||||
color = brd->GetLayerColor( SOLDERMASK_N_BACK );
|
||||
showActualMaskSize = SOLDERMASK_N_BACK;
|
||||
break;
|
||||
|
||||
case SOLDERMASK_LAYER_FRONT:
|
||||
color = brd->GetLayerColor(SOLDERMASK_N_FRONT);
|
||||
color = brd->GetLayerColor( SOLDERMASK_N_FRONT );
|
||||
showActualMaskSize = SOLDERMASK_N_FRONT;
|
||||
break;
|
||||
|
||||
case DRAW_LAYER:
|
||||
color = brd->GetLayerColor(DRAW_N);
|
||||
color = brd->GetLayerColor( DRAW_N );
|
||||
break;
|
||||
|
||||
case COMMENT_LAYER:
|
||||
color = brd->GetLayerColor(COMMENT_N);
|
||||
color = brd->GetLayerColor( COMMENT_N );
|
||||
break;
|
||||
|
||||
case ECO1_LAYER:
|
||||
color = brd->GetLayerColor(ECO1_N);
|
||||
color = brd->GetLayerColor( ECO1_N );
|
||||
break;
|
||||
|
||||
case ECO2_LAYER:
|
||||
color = brd->GetLayerColor(ECO2_N);
|
||||
color = brd->GetLayerColor( ECO2_N );
|
||||
break;
|
||||
|
||||
case EDGE_LAYER:
|
||||
color = brd->GetLayerColor(EDGE_N);
|
||||
color = brd->GetLayerColor( EDGE_N );
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -260,7 +278,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
|
|||
{
|
||||
if( IsOnLayer( screen->m_Active_Layer ) )
|
||||
{
|
||||
color = brd->GetLayerColor(screen->m_Active_Layer);
|
||||
color = brd->GetLayerColor( screen->m_Active_Layer );
|
||||
|
||||
// In hight contrast mode, and if the active layer is the mask
|
||||
// layer shows the pad size with the mask clearance
|
||||
|
@ -285,9 +303,9 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
|
|||
}
|
||||
|
||||
|
||||
if( draw_mode & GR_SURBRILL )
|
||||
if( aDraw_mode & GR_SURBRILL )
|
||||
{
|
||||
if( draw_mode & GR_AND )
|
||||
if( aDraw_mode & GR_AND )
|
||||
color &= ~HIGHT_LIGHT_FLAG;
|
||||
else
|
||||
color |= HIGHT_LIGHT_FLAG;
|
||||
|
@ -296,24 +314,20 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
|
|||
if( color & HIGHT_LIGHT_FLAG )
|
||||
color = ColorRefs[color & MASKCOLOR].m_LightColor;
|
||||
|
||||
GRSetDrawMode( DC, draw_mode ); /* mode de trace */
|
||||
|
||||
/* calcul du centre des pads en coordonnees Ecran : */
|
||||
shape_pos = ReturnShapePos();
|
||||
ux0 = shape_pos.x - offset.x;
|
||||
uy0 = shape_pos.y - offset.y;
|
||||
xc = ux0;
|
||||
yc = uy0;
|
||||
|
||||
dx = dx0 = m_Size.x >> 1;
|
||||
dy = dy0 = m_Size.y >> 1; /* demi dim dx et dy */
|
||||
|
||||
angle = m_Orient;
|
||||
|
||||
bool DisplayIsol = DisplayOpt.DisplayPadIsol;
|
||||
if( ( m_Masque_Layer & ALL_CU_LAYERS ) == 0 )
|
||||
DisplayIsol = FALSE;
|
||||
|
||||
|
||||
drawInfo.m_DrawMode = aDraw_mode;
|
||||
drawInfo.m_Color = color;
|
||||
drawInfo.m_DrawPanel = aPanel;
|
||||
drawInfo.m_Mask_margin = mask_margin;
|
||||
drawInfo.m_ShowNCMark = brd->IsElementVisible( PCB_VISIBLE( NO_CONNECTS_VISIBLE ) );
|
||||
drawInfo.m_IsPrinting = screen->m_IsPrinting;
|
||||
#ifndef USE_WX_ZOOM
|
||||
drawInfo.m_Scale = (double) screen->Scale( 1000 ) / 1000;
|
||||
#endif
|
||||
SetAlpha( &color, 170 );
|
||||
|
||||
/* Get the pad clearance. This has a meaning only for Pcbnew.
|
||||
|
@ -321,126 +335,126 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
|
|||
* there is no net classes so a call to GetClearance() is made only when
|
||||
* needed (never needed in Cvpcb nor in Gerbview)
|
||||
*/
|
||||
int padClearance = DisplayIsol ? GetClearance() : 0;
|
||||
drawInfo.m_PadClearance = DisplayIsol ? GetClearance() : 0;
|
||||
/* Draw the pad number */
|
||||
if( frame && !frame->m_DisplayPadNum )
|
||||
drawInfo.m_Display_padnum = false;
|
||||
|
||||
if( ( DisplayOpt.DisplayNetNamesMode == 0 )
|
||||
|| ( DisplayOpt.DisplayNetNamesMode == 2 ) )
|
||||
drawInfo.m_Display_netname = false;
|
||||
|
||||
// Display net names is restricted to pads that are on the active layer
|
||||
// in cotranst mode displae
|
||||
if( !IsOnLayer( screen->m_Active_Layer ) && DisplayOpt.ContrastModeDisplay )
|
||||
drawInfo.m_Display_netname = false;
|
||||
|
||||
DrawShape( &aPanel->m_ClipBox, aDC, drawInfo );
|
||||
}
|
||||
|
||||
|
||||
/** function DrawShape
|
||||
* basic function to draw a pad.
|
||||
* used by D_PAD::Draw after calculation of parameters (color, final orientation ...)
|
||||
* this function can be called to draw a pad on a panel
|
||||
* even if this panel is not a WinEDA_DrawPanel (for instance on a wxPanel inside the pad editor)
|
||||
*/
|
||||
void D_PAD::DrawShape( EDA_Rect* aClipBox, wxDC* aDC, PAD_DRAWINFO& aDrawInfo )
|
||||
{
|
||||
wxPoint coord[4];
|
||||
int rotdx,
|
||||
delta_cx, delta_cy;
|
||||
int angle = m_Orient;
|
||||
|
||||
GRSetDrawMode( aDC, aDrawInfo.m_DrawMode );
|
||||
|
||||
// calculate pad shape position :
|
||||
wxPoint shape_pos = ReturnShapePos() - aDrawInfo.m_Offset;
|
||||
|
||||
wxSize halfsize = m_Size;
|
||||
halfsize.x >>= 1;
|
||||
halfsize.y >>= 1;
|
||||
switch( GetShape() )
|
||||
{
|
||||
case PAD_CIRCLE:
|
||||
if( fillpad )
|
||||
GRFilledCircle( &panel->m_ClipBox, DC, xc, yc,
|
||||
dx + mask_margin.x, 0, color, color );
|
||||
if( aDrawInfo.m_ShowPadFilled )
|
||||
GRFilledCircle( aClipBox, aDC, shape_pos.x, shape_pos.y,
|
||||
halfsize.x + aDrawInfo.m_Mask_margin.x, 0,
|
||||
aDrawInfo.m_Color, aDrawInfo.m_Color );
|
||||
else
|
||||
GRCircle( &panel->m_ClipBox, DC, xc, yc, dx + mask_margin.x,
|
||||
m_PadSketchModePenSize, color );
|
||||
GRCircle( aClipBox, aDC, shape_pos.x, shape_pos.y,
|
||||
halfsize.x + aDrawInfo.m_Mask_margin.x,
|
||||
m_PadSketchModePenSize, aDrawInfo.m_Color );
|
||||
|
||||
if( DisplayIsol )
|
||||
if( aDrawInfo.m_PadClearance )
|
||||
{
|
||||
GRCircle( &panel->m_ClipBox,
|
||||
DC,
|
||||
xc,
|
||||
yc,
|
||||
dx + padClearance,
|
||||
GRCircle( aClipBox,
|
||||
aDC, shape_pos.x, shape_pos.y,
|
||||
halfsize.x + aDrawInfo.m_PadClearance,
|
||||
0,
|
||||
color );
|
||||
aDrawInfo.m_Color );
|
||||
}
|
||||
break;
|
||||
|
||||
case PAD_OVAL:
|
||||
if( dx > dy ) /* horizontal */
|
||||
if( halfsize.x > halfsize.y ) /* horizontal */
|
||||
{
|
||||
delta_cx = dx - dy;
|
||||
delta_cx = halfsize.x - halfsize.y;
|
||||
delta_cy = 0;
|
||||
rotdx = m_Size.y + ( mask_margin.y * 2 );
|
||||
rotdx = m_Size.y + ( aDrawInfo.m_Mask_margin.y * 2 );
|
||||
}
|
||||
else /* vertical */
|
||||
{
|
||||
delta_cx = 0;
|
||||
delta_cy = dy - dx;
|
||||
rotdx = m_Size.x + ( mask_margin.x * 2 );
|
||||
delta_cy = halfsize.y - halfsize.x;
|
||||
rotdx = m_Size.x + ( aDrawInfo.m_Mask_margin.x * 2 );
|
||||
}
|
||||
RotatePoint( &delta_cx, &delta_cy, angle );
|
||||
|
||||
if( fillpad )
|
||||
if( aDrawInfo.m_ShowPadFilled )
|
||||
{
|
||||
GRFillCSegm( &panel->m_ClipBox, DC,
|
||||
ux0 + delta_cx, uy0 + delta_cy,
|
||||
ux0 - delta_cx, uy0 - delta_cy,
|
||||
rotdx, color );
|
||||
GRFillCSegm( aClipBox, aDC,
|
||||
shape_pos.x + delta_cx, shape_pos.y + delta_cy,
|
||||
shape_pos.x - delta_cx, shape_pos.y - delta_cy,
|
||||
rotdx, aDrawInfo.m_Color );
|
||||
}
|
||||
else
|
||||
{
|
||||
GRCSegm( &panel->m_ClipBox, DC,
|
||||
ux0 + delta_cx, uy0 + delta_cy,
|
||||
ux0 - delta_cx, uy0 - delta_cy,
|
||||
rotdx, m_PadSketchModePenSize, color );
|
||||
GRCSegm( aClipBox, aDC,
|
||||
shape_pos.x + delta_cx, shape_pos.y + delta_cy,
|
||||
shape_pos.x - delta_cx, shape_pos.y - delta_cy,
|
||||
rotdx, m_PadSketchModePenSize, aDrawInfo.m_Color );
|
||||
}
|
||||
|
||||
/* Draw the isolation line. */
|
||||
if( DisplayIsol )
|
||||
if( aDrawInfo.m_PadClearance )
|
||||
{
|
||||
rotdx = rotdx + 2 * padClearance;
|
||||
rotdx = rotdx + 2 * aDrawInfo.m_PadClearance;
|
||||
|
||||
GRCSegm( &panel->m_ClipBox, DC, ux0 + delta_cx, uy0 + delta_cy,
|
||||
ux0 - delta_cx, uy0 - delta_cy,
|
||||
rotdx, color );
|
||||
GRCSegm( aClipBox, aDC, shape_pos.x + delta_cx, shape_pos.y + delta_cy,
|
||||
shape_pos.x - delta_cx, shape_pos.y - delta_cy,
|
||||
rotdx, aDrawInfo.m_Color );
|
||||
}
|
||||
break;
|
||||
|
||||
case PAD_RECT:
|
||||
case PAD_TRAPEZOID:
|
||||
BuildPadPolygon( coord, aDrawInfo.m_Mask_margin, angle );
|
||||
for( int ii = 0; ii < 4; ii++ )
|
||||
coord[ii] += shape_pos;
|
||||
|
||||
GRClosedPoly( aClipBox, aDC, 4, coord, aDrawInfo.m_ShowPadFilled,
|
||||
aDrawInfo.m_ShowPadFilled ? 0 : m_PadSketchModePenSize,
|
||||
aDrawInfo.m_Color, aDrawInfo.m_Color );
|
||||
|
||||
if( aDrawInfo.m_PadClearance )
|
||||
{
|
||||
int ddx, ddy;
|
||||
ddx = ( m_DeltaSize.x >> 1 );
|
||||
ddy = ( m_DeltaSize.y >> 1 );
|
||||
BuildPadPolygon( coord, wxSize( aDrawInfo.m_PadClearance,
|
||||
aDrawInfo.m_PadClearance ), angle );
|
||||
for( int ii = 0; ii < 4; ii++ )
|
||||
coord[ii] += shape_pos;
|
||||
|
||||
coord[0].x = -dx - ddy - mask_margin.x; // lower left
|
||||
coord[0].y = +dy + ddx + mask_margin.y;
|
||||
|
||||
coord[1].x = -dx + ddy - mask_margin.x; // upper left
|
||||
coord[1].y = -dy - ddx - mask_margin.y;
|
||||
|
||||
coord[2].x = +dx - ddy + mask_margin.x; // upper right
|
||||
coord[2].y = -dy + ddx - mask_margin.y;
|
||||
|
||||
coord[3].x = +dx + ddy + mask_margin.x; // lower right
|
||||
coord[3].y = +dy - ddx + mask_margin.y;
|
||||
|
||||
for( ii = 0; ii < 4; ii++ )
|
||||
{
|
||||
RotatePoint( &coord[ii].x, &coord[ii].y, angle );
|
||||
coord[ii].x = coord[ii].x + ux0;
|
||||
coord[ii].y = coord[ii].y + uy0;
|
||||
}
|
||||
|
||||
GRClosedPoly( &panel->m_ClipBox, DC, 4, coord, fillpad,
|
||||
fillpad ? 0 : m_PadSketchModePenSize, color, color );
|
||||
|
||||
if( DisplayIsol )
|
||||
{
|
||||
dx += padClearance;
|
||||
dy += padClearance;
|
||||
|
||||
coord[0].x = -dx - ddy;
|
||||
coord[0].y = dy + ddx;
|
||||
|
||||
coord[1].x = -dx + ddy;
|
||||
coord[1].y = -dy - ddx;
|
||||
|
||||
coord[2].x = dx - ddy;
|
||||
coord[2].y = -dy + ddx;
|
||||
|
||||
coord[3].x = dx + ddy;
|
||||
coord[3].y = dy - ddx;
|
||||
|
||||
for( ii = 0; ii < 4; ii++ )
|
||||
{
|
||||
RotatePoint( &coord[ii].x, &coord[ii].y, angle );
|
||||
coord[ii].x = coord[ii].x + ux0;
|
||||
coord[ii].y = coord[ii].y + uy0;
|
||||
}
|
||||
|
||||
GRClosedPoly( &panel->m_ClipBox, DC, 4, coord, 0, color, color );
|
||||
}
|
||||
GRClosedPoly( aClipBox, aDC, 4, coord, 0, aDrawInfo.m_Color, aDrawInfo.m_Color );
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -450,26 +464,23 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
|
|||
}
|
||||
|
||||
/* Draw the pad hole */
|
||||
int cx0 = m_Pos.x - offset.x;
|
||||
int cy0 = m_Pos.y - offset.y;
|
||||
wxPoint holepos = m_Pos - aDrawInfo.m_Offset;
|
||||
int hole = m_Drill.x >> 1;
|
||||
|
||||
if( fillpad && hole )
|
||||
if( aDrawInfo.m_ShowPadFilled && hole )
|
||||
{
|
||||
bool blackpenstate = false;
|
||||
if( screen->m_IsPrinting )
|
||||
if( aDrawInfo.m_IsPrinting )
|
||||
{
|
||||
blackpenstate = GetGRForceBlackPenState();
|
||||
GRForceBlackPen( false );
|
||||
color = g_DrawBgColor;
|
||||
aDrawInfo.m_HoleColor = g_DrawBgColor;
|
||||
}
|
||||
else
|
||||
color = BLACK; // or DARKGRAY;
|
||||
|
||||
if( draw_mode != GR_XOR )
|
||||
GRSetDrawMode( DC, GR_COPY );
|
||||
if( aDrawInfo.m_DrawMode != GR_XOR )
|
||||
GRSetDrawMode( aDC, GR_COPY );
|
||||
else
|
||||
GRSetDrawMode( DC, GR_XOR );
|
||||
GRSetDrawMode( aDC, GR_XOR );
|
||||
|
||||
switch( m_DrillShape )
|
||||
{
|
||||
|
@ -478,78 +489,73 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
|
|||
#ifdef USE_WX_ZOOM
|
||||
if( DC->LogicalToDeviceXRel( hole ) > 1 )
|
||||
#else
|
||||
if( screen->Scale( hole ) > 1 ) /* draw hole if its size is enough */
|
||||
if( aDrawInfo.m_Scale * hole > 1 ) /* draw hole if its size is enough */
|
||||
#endif
|
||||
GRFilledCircle( &panel->m_ClipBox, DC, cx0, cy0, hole, 0,
|
||||
color, color );
|
||||
|
||||
|
||||
|
||||
GRFilledCircle( aClipBox, aDC, holepos.x, holepos.y, hole, 0,
|
||||
aDrawInfo.m_Color, aDrawInfo.m_HoleColor );
|
||||
break;
|
||||
|
||||
case PAD_OVAL:
|
||||
dx = m_Drill.x >> 1;
|
||||
dy = m_Drill.y >> 1;
|
||||
halfsize.x = m_Drill.x >> 1;
|
||||
halfsize.y = m_Drill.y >> 1;
|
||||
|
||||
if( m_Drill.x > m_Drill.y ) /* horizontal */
|
||||
{
|
||||
delta_cx = dx - dy;
|
||||
delta_cx = halfsize.x - halfsize.y;
|
||||
delta_cy = 0;
|
||||
rotdx = m_Drill.y;
|
||||
}
|
||||
else /* vertical */
|
||||
{
|
||||
delta_cx = 0;
|
||||
delta_cy = dy - dx;
|
||||
delta_cy = halfsize.y - halfsize.x;
|
||||
rotdx = m_Drill.x;
|
||||
}
|
||||
RotatePoint( &delta_cx, &delta_cy, angle );
|
||||
|
||||
GRFillCSegm( &panel->m_ClipBox, DC, cx0 + delta_cx, cy0 + delta_cy,
|
||||
cx0 - delta_cx, cy0 - delta_cy, rotdx, color );
|
||||
GRFillCSegm( aClipBox, aDC, holepos.x + delta_cx, holepos.y + delta_cy,
|
||||
holepos.x - delta_cx, holepos.y - delta_cy, rotdx,
|
||||
aDrawInfo.m_HoleColor );
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if( screen->m_IsPrinting )
|
||||
if( aDrawInfo.m_IsPrinting )
|
||||
GRForceBlackPen( blackpenstate );
|
||||
}
|
||||
|
||||
GRSetDrawMode( DC, draw_mode );
|
||||
GRSetDrawMode( aDC, aDrawInfo.m_DrawMode );
|
||||
|
||||
/* Draw "No connect" ( / or \ or cross X ) if necessary. : */
|
||||
if( m_Netname.IsEmpty() && brd->IsElementVisible( PCB_VISIBLE(NO_CONNECTS_VISIBLE) ) )
|
||||
if( m_Netname.IsEmpty() && aDrawInfo.m_ShowNCMark )
|
||||
{
|
||||
dx0 = MIN( dx0, dy0 );
|
||||
int dx0 = MIN( halfsize.x, halfsize.y );
|
||||
int nc_color = BLUE;
|
||||
|
||||
if( m_Masque_Layer & LAYER_FRONT ) /* Draw \ */
|
||||
GRLine( &panel->m_ClipBox, DC, cx0 - dx0, cy0 - dx0,
|
||||
cx0 + dx0, cy0 + dx0, 0, nc_color );
|
||||
GRLine( aClipBox, aDC, holepos.x - dx0, holepos.y - dx0,
|
||||
holepos.x + dx0, holepos.y + dx0, 0, nc_color );
|
||||
|
||||
if( m_Masque_Layer & LAYER_BACK ) /* Draw / */
|
||||
GRLine( &panel->m_ClipBox, DC, cx0 + dx0, cy0 - dx0,
|
||||
cx0 - dx0, cy0 + dx0, 0, nc_color );
|
||||
GRLine( aClipBox, aDC, holepos.x + dx0, holepos.y - dx0,
|
||||
holepos.x - dx0, holepos.y + dx0, 0, nc_color );
|
||||
}
|
||||
|
||||
/* Draw the pad number */
|
||||
bool display_padnum = true;
|
||||
if( frame && !frame->m_DisplayPadNum )
|
||||
display_padnum = false;
|
||||
|
||||
bool display_netname = true;
|
||||
if( ( DisplayOpt.DisplayNetNamesMode == 0 )
|
||||
|| ( DisplayOpt.DisplayNetNamesMode == 2 ) )
|
||||
display_netname = false;
|
||||
|
||||
if( !display_padnum && !display_netname )
|
||||
if( !aDrawInfo.m_Display_padnum && !aDrawInfo.m_Display_netname )
|
||||
return;
|
||||
|
||||
wxPoint tpos0 = wxPoint( ux0, uy0 ); // Position of the centre of text
|
||||
wxPoint tpos0 = shape_pos; // Position of the centre of text
|
||||
wxPoint tpos = tpos0;
|
||||
wxSize AreaSize; // size of text area, normalized to
|
||||
// AreaSize.y < AreaSize.x
|
||||
int shortname_len = m_ShortNetname.Len();
|
||||
if( !display_netname )
|
||||
if( !aDrawInfo.m_Display_netname )
|
||||
shortname_len = 0;
|
||||
if( GetShape() == PAD_CIRCLE )
|
||||
angle = 0;
|
||||
|
@ -572,7 +578,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
|
|||
|
||||
// Calculate the position of text, that is the middle point of the upper
|
||||
// area of the pad
|
||||
RotatePoint( &tpos, wxPoint( ux0, uy0 ), angle );
|
||||
RotatePoint( &tpos, shape_pos, angle );
|
||||
|
||||
/* Draw text with an angle between -90 deg and + 90 deg */
|
||||
int t_angle = angle;
|
||||
|
@ -586,7 +592,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
|
|||
wxString buffer;
|
||||
|
||||
int tsize;
|
||||
if( display_padnum )
|
||||
if( aDrawInfo.m_Display_padnum )
|
||||
{
|
||||
ReturnStringPadName( buffer );
|
||||
int numpad_len = buffer.Len();
|
||||
|
@ -598,14 +604,12 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
|
|||
#ifdef USE_WX_ZOOM
|
||||
if( DC->LogicalToDeviceXRel( tsize ) >= CHAR_SIZE_MIN ) // Not drawable when size too small.
|
||||
#else
|
||||
if( screen->Scale( tsize ) >= CHAR_SIZE_MIN ) // Not drawable when size too small.
|
||||
if( aDrawInfo.m_Scale * tsize >= CHAR_SIZE_MIN ) // Not drawable when size too small.
|
||||
#endif
|
||||
{
|
||||
tsize = (int) ( tsize * 0.8 ); // reserve room for
|
||||
// marges and segments
|
||||
// thickness
|
||||
|
||||
DrawGraphicText( panel, DC, tpos, WHITE, buffer, t_angle,
|
||||
// tsize reserve room for marges and segments thickness
|
||||
tsize = (int) ( tsize * 0.8 );
|
||||
DrawGraphicText( aDrawInfo.m_DrawPanel, aDC, tpos, WHITE, buffer, t_angle,
|
||||
wxSize( tsize, tsize ), GR_TEXT_HJUSTIFY_CENTER,
|
||||
GR_TEXT_VJUSTIFY_CENTER, tsize / 7, false, false,
|
||||
false );
|
||||
|
@ -622,22 +626,159 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
|
|||
#ifdef USE_WX_ZOOM
|
||||
if( DC->LogicalToDeviceXRel( tsize ) >= CHAR_SIZE_MIN ) // Not drawable in size too small.
|
||||
#else
|
||||
if( screen->Scale( tsize ) >= CHAR_SIZE_MIN ) // Not drawable in size too small.
|
||||
if( aDrawInfo.m_Scale * tsize >= CHAR_SIZE_MIN ) // Not drawable in size too small.
|
||||
#endif
|
||||
{
|
||||
if( !( !IsOnLayer( screen->m_Active_Layer )
|
||||
&& DisplayOpt.ContrastModeDisplay ) )
|
||||
{
|
||||
tpos = tpos0;
|
||||
if( display_padnum )
|
||||
if( aDrawInfo.m_Display_padnum )
|
||||
tpos.y += AreaSize.y / 2;
|
||||
RotatePoint( &tpos, wxPoint( ux0, uy0 ), angle );
|
||||
RotatePoint( &tpos, shape_pos, angle );
|
||||
|
||||
tsize = (int) ( tsize * 0.8 ); // reserve room for marges and
|
||||
// segments thickness
|
||||
DrawGraphicText( panel, DC, tpos, WHITE, m_ShortNetname, t_angle,
|
||||
// tsize reserve room for marges and segments thickness
|
||||
tsize = (int) ( tsize * 0.8 );
|
||||
DrawGraphicText( aDrawInfo.m_DrawPanel, aDC, tpos, WHITE, m_ShortNetname, t_angle,
|
||||
wxSize( tsize, tsize ), GR_TEXT_HJUSTIFY_CENTER,
|
||||
GR_TEXT_VJUSTIFY_CENTER, tsize / 7, false, false );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** function BuildPadPolygon
|
||||
* Has meaning only for polygonal pads (trapeziod and rectangular)
|
||||
* Build the Corner list of the polygonal shape,
|
||||
* depending on shape, extra size (clearance ...) and orientation
|
||||
* @param aCoord[4] = a buffer to fill.
|
||||
* @param aInflateValue = wxSize: the clearance or margin value. value > 0: inflate, < 0 deflate
|
||||
* @param aRotation = full rotation of the polygon, usually m_Orient
|
||||
*/
|
||||
void D_PAD::BuildPadPolygon( wxPoint aCoord[4], wxSize aInflateValue, int aRotation )
|
||||
{
|
||||
if( (GetShape() != PAD_RECT) && (GetShape() != PAD_TRAPEZOID) )
|
||||
return;
|
||||
|
||||
wxSize delta;
|
||||
wxSize halfsize;
|
||||
|
||||
halfsize.x = m_Size.x >> 1;
|
||||
halfsize.y = m_Size.y >> 1;
|
||||
|
||||
/* For rectangular shapes, inflate is easy
|
||||
*/
|
||||
if( GetShape() == PAD_RECT )
|
||||
{
|
||||
halfsize += aInflateValue;
|
||||
|
||||
// Verify if do not deflate more than than size
|
||||
// Only possible for inflate negative values.
|
||||
if( halfsize.x < 0 )
|
||||
halfsize.x = 0;
|
||||
if( halfsize.y < 0 )
|
||||
halfsize.y = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Trapezoidal pad: verify delta values
|
||||
delta.x = ( m_DeltaSize.x >> 1 );
|
||||
delta.y = ( m_DeltaSize.y >> 1 );
|
||||
|
||||
// be sure delta values are not to large
|
||||
if( (delta.x < 0) && (delta.x <= -halfsize.y) )
|
||||
delta.x = -halfsize.y + 1;
|
||||
if( (delta.x > 0) && (delta.x >= halfsize.y) )
|
||||
delta.x = halfsize.y - 1;
|
||||
if( (delta.y < 0) && (delta.y <= -halfsize.x) )
|
||||
delta.y = -halfsize.x + 1;
|
||||
if( (delta.y > 0) && (delta.y >= halfsize.x) )
|
||||
delta.y = halfsize.x - 1;
|
||||
}
|
||||
|
||||
// Build the basic rectangular or trapezoid shape
|
||||
// delta is null for rectangular shapes
|
||||
aCoord[0].x = -halfsize.x - delta.y; // lower left
|
||||
aCoord[0].y = +halfsize.y + delta.x;
|
||||
|
||||
aCoord[1].x = -halfsize.x + delta.y; // upper left
|
||||
aCoord[1].y = -halfsize.y - delta.x;
|
||||
|
||||
aCoord[2].x = +halfsize.x - delta.y; // upper right
|
||||
aCoord[2].y = -halfsize.y + delta.x;
|
||||
|
||||
aCoord[3].x = +halfsize.x + delta.y; // lower right
|
||||
aCoord[3].y = +halfsize.y - delta.x;
|
||||
|
||||
// Offsetting the trapezoid shape id needed
|
||||
// It is assumed delta.x or/and delta.y == 0
|
||||
if( GetShape() == PAD_TRAPEZOID && (aInflateValue.x != 0 || aInflateValue.y != 0) )
|
||||
{
|
||||
double angle;
|
||||
wxSize corr;
|
||||
if( delta.y ) // lower and upper segment is horizontal
|
||||
{
|
||||
// Calculate angle of left (or right) segment with vertical axis
|
||||
angle = atan2( m_DeltaSize.y, m_Size.y );
|
||||
|
||||
// left and right sides are moved by aInflateValue.x in their perpendicular direction
|
||||
// We must calculate the corresponding displacement on the horizontal axis
|
||||
// that is delta.x +- corr.x depending on the corner
|
||||
corr.x = wxRound( tan( angle ) * aInflateValue.x );
|
||||
delta.x = wxRound( aInflateValue.x / cos( angle ) );
|
||||
|
||||
// Horizontal sides are moved up and down by aInflateValue.y
|
||||
delta.y = aInflateValue.y;
|
||||
|
||||
// corr.y = 0 by the constructor
|
||||
}
|
||||
else if( delta.x ) // left and right segment is vertical
|
||||
{
|
||||
// Calculate angle of lower (or upper) segment with horizontal axis
|
||||
angle = atan2( m_DeltaSize.x, m_Size.x );
|
||||
|
||||
// lower and upper sides are moved by aInflateValue.x in their perpendicular direction
|
||||
// We must calculate the corresponding displacement on the vertical axis
|
||||
// that is delta.y +- corr.y depending on the corner
|
||||
corr.y = wxRound( tan( angle ) * aInflateValue.y );
|
||||
delta.y = wxRound( aInflateValue.y / cos( angle ) );
|
||||
|
||||
// Vertical sides are moved left and right by aInflateValue.x
|
||||
delta.x = aInflateValue.x;
|
||||
|
||||
// corr.x = 0 by the constructor
|
||||
}
|
||||
else // the trapezoid is a rectangle
|
||||
{
|
||||
delta = aInflateValue; // this pad is rectangular (delta null).
|
||||
}
|
||||
aCoord[0].x += -delta.x - corr.x; // lower left
|
||||
aCoord[0].y += delta.y + corr.y;
|
||||
|
||||
aCoord[1].x += -delta.x + corr.x; // upper left
|
||||
aCoord[1].y += -delta.y - corr.y;
|
||||
|
||||
aCoord[2].x += delta.x - corr.x; // upper right
|
||||
aCoord[2].y += -delta.y + corr.y;
|
||||
|
||||
aCoord[3].x += delta.x + corr.x; // lower right
|
||||
aCoord[3].y += delta.y - corr.y;
|
||||
|
||||
/* test coordinates and clamp them if the offset correction is too large:
|
||||
* Note: if a coordinate is bad, the other "symmetric" coordinate is bad
|
||||
* So when a bad coordinate is found, the 2 symmetric coordinates
|
||||
* are set to the minimun value (0)
|
||||
*/
|
||||
|
||||
if( aCoord[0].x > 0 ) // lower left x coordinate must be <= 0
|
||||
aCoord[0].x = aCoord[3].x = 0;
|
||||
if( aCoord[1].x > 0 ) // upper left x coordinate must be <= 0
|
||||
aCoord[1].x = aCoord[2].x = 0;
|
||||
if( aCoord[0].y < 0 ) // lower left y coordinate must be >= 0
|
||||
aCoord[0].y = aCoord[1].y = 0;
|
||||
if( aCoord[3].y < 0 ) // lower right y coordinate must be >= 0
|
||||
aCoord[3].y = aCoord[2].y = 0;
|
||||
}
|
||||
|
||||
if( aRotation )
|
||||
{
|
||||
for( int ii = 0; ii < 4; ii++ )
|
||||
RotatePoint( &aCoord[ii], aRotation );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -58,7 +58,7 @@ DIALOG_GENDRILL_BASE::DIALOG_GENDRILL_BASE( wxWindow* parent, wxWindowID id, con
|
|||
int m_Choice_Drill_MapNChoices = sizeof( m_Choice_Drill_MapChoices ) / sizeof( wxString );
|
||||
m_Choice_Drill_Map = new wxRadioBox( this, wxID_ANY, _("Drill Sheet:"), wxDefaultPosition, wxDefaultSize, m_Choice_Drill_MapNChoices, m_Choice_Drill_MapChoices, 1, wxRA_SPECIFY_COLS );
|
||||
m_Choice_Drill_Map->SetSelection( 0 );
|
||||
m_Choice_Drill_Map->SetToolTip( _("Creates a drill map in PS, HPGL or others formats") );
|
||||
m_Choice_Drill_Map->SetToolTip( _("Creates a drill map in PS, HPGL or other formats") );
|
||||
|
||||
bMiddleBoxSizer->Add( m_Choice_Drill_Map, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
|
|
@ -335,7 +335,7 @@
|
|||
<property name="size"></property>
|
||||
<property name="style">wxRA_SPECIFY_COLS</property>
|
||||
<property name="subclass"></property>
|
||||
<property name="tooltip">Creates a drill map in PS, HPGL or others formats</property>
|
||||
<property name="tooltip">Creates a drill map in PS, HPGL or other formats</property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
|
|
|
@ -9,13 +9,10 @@
|
|||
#include "confirm.h"
|
||||
#include "pcbnew.h"
|
||||
#include "trigo.h"
|
||||
|
||||
/* Local variables */
|
||||
static wxString Current_PadNetName;
|
||||
|
||||
#include <wx/dcbuffer.h>
|
||||
|
||||
#define NBSHAPES 4
|
||||
int CodeShape[NBSHAPES] = /* Pad shapes. */
|
||||
int CodeShape[NBSHAPES] = // list of pad shapes.
|
||||
{
|
||||
PAD_CIRCLE, PAD_OVAL, PAD_RECT, PAD_TRAPEZOID
|
||||
};
|
||||
|
@ -27,7 +24,7 @@ int CodeType[NBTYPES] =
|
|||
PAD_STANDARD, PAD_SMD, PAD_CONN, PAD_HOLE_NOT_PLATED
|
||||
};
|
||||
|
||||
// Default mask layers for pads according to the pad type
|
||||
// Default mask layers setup for pads according to the pad type
|
||||
static long Std_Pad_Layers[NBTYPES] =
|
||||
{
|
||||
// PAD_STANDARD:
|
||||
|
@ -46,54 +43,141 @@ static long Std_Pad_Layers[NBTYPES] =
|
|||
|
||||
#include "dialog_pad_properties_base.h"
|
||||
|
||||
extern int ChangeSideMaskLayer( int masque );
|
||||
|
||||
/********************************************************************/
|
||||
/* class DIALOG_PAD_PROPERTIES, derived from DIALOG_PAD_PROPERTIES_BASE, */
|
||||
/* created by wxFormBuilder */
|
||||
/********************************************************************/
|
||||
|
||||
/**
|
||||
* class DIALOG_PAD_PROPERTIES, derived from DIALOG_PAD_PROPERTIES_BASE,
|
||||
* created by wxFormBuilder
|
||||
*/
|
||||
class DIALOG_PAD_PROPERTIES : public DIALOG_PAD_PROPERTIES_BASE
|
||||
{
|
||||
private:
|
||||
WinEDA_BasePcbFrame* m_Parent;
|
||||
D_PAD* m_CurrentPad;
|
||||
BOARD * m_Board;
|
||||
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:
|
||||
DIALOG_PAD_PROPERTIES( WinEDA_BasePcbFrame* parent, D_PAD* Pad );
|
||||
~DIALOG_PAD_PROPERTIES()
|
||||
{
|
||||
delete m_dummyPad;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
void InitDialog( );
|
||||
void initValues();
|
||||
void OnPadShapeSelection( wxCommandEvent& event );
|
||||
void OnDrillShapeSelected( wxCommandEvent& event );
|
||||
void PadOrientEvent( wxCommandEvent& event );
|
||||
void PadTypeSelected( wxCommandEvent& event );
|
||||
void PadPropertiesAccept( wxCommandEvent& event );
|
||||
void SetPadLayersList( long layer_mask );
|
||||
void OnSetLayer( wxCommandEvent& event );
|
||||
void OnCancelButtonClick( wxCommandEvent& event );
|
||||
void OnPaintShowPanel( wxPaintEvent& event );
|
||||
bool TransfertDataToPad( D_PAD* aPad, bool aPromptOnError = false );
|
||||
void OnValuesChanged( wxCommandEvent& event );
|
||||
};
|
||||
|
||||
|
||||
void DIALOG_PAD_PROPERTIES::OnPaintShowPanel( wxPaintEvent& event )
|
||||
{
|
||||
wxPaintDC dc( m_panelShowPad );
|
||||
PAD_DRAWINFO drawInfo;
|
||||
|
||||
int color = 0;
|
||||
|
||||
if( m_dummyPad->m_Masque_Layer & LAYER_FRONT )
|
||||
{
|
||||
color = m_Board->GetVisibleElementColor( PAD_FR_VISIBLE );
|
||||
}
|
||||
|
||||
if( m_dummyPad->m_Masque_Layer & LAYER_BACK )
|
||||
{
|
||||
color |= m_Board->GetVisibleElementColor( PAD_BK_VISIBLE );
|
||||
}
|
||||
|
||||
if( color == 0 )
|
||||
color = LIGHTGRAY;
|
||||
|
||||
drawInfo.m_Color = color;
|
||||
drawInfo.m_HoleColor = DARKGRAY;
|
||||
drawInfo.m_Offset = m_dummyPad->m_Pos;
|
||||
drawInfo.m_Display_padnum = true;
|
||||
drawInfo.m_Display_netname = true;
|
||||
|
||||
// Shows the local pad clearance
|
||||
drawInfo.m_PadClearance = m_dummyPad->m_LocalClearance;
|
||||
|
||||
wxSize dc_size = dc.GetSize();
|
||||
dc.SetDeviceOrigin( dc_size.x / 2, dc_size.y / 2 );
|
||||
|
||||
// Calculate a suitable scale to fit the available draw area
|
||||
int dim = m_dummyPad->m_Size.x + ABS( m_dummyPad->m_DeltaSize.y);
|
||||
if( m_dummyPad->m_LocalClearance > 0 )
|
||||
dim += m_dummyPad->m_LocalClearance * 2;
|
||||
double scale = (double) dc_size.x / dim;
|
||||
dim = m_dummyPad->m_Size.y + ABS( m_dummyPad->m_DeltaSize.x);
|
||||
if( m_dummyPad->m_LocalClearance > 0 )
|
||||
dim += m_dummyPad->m_LocalClearance * 2;
|
||||
double altscale = (double) dc_size.y / dim;
|
||||
scale = MIN( scale, altscale );
|
||||
|
||||
// Give a margin
|
||||
scale *= 0.7;
|
||||
dc.SetUserScale( scale, scale );
|
||||
drawInfo.m_Scale = scale;
|
||||
|
||||
#ifndef USE_WX_ZOOM
|
||||
wxPoint org = ActiveScreen->m_DrawOrg;
|
||||
wxPoint strt = ActiveScreen->m_StartVisu;
|
||||
int pzoom = ActiveScreen->GetZoom();
|
||||
ActiveScreen->m_DrawOrg = wxPoint( 0, 0 );
|
||||
ActiveScreen->m_StartVisu = wxPoint( 0, 0 );
|
||||
|
||||
// Actual scaling factor is 10/Zoom
|
||||
// We need a scale 1 , and therefore zoom = 10
|
||||
ActiveScreen->SetZoom( 10 );
|
||||
#endif
|
||||
|
||||
m_dummyPad->DrawShape( NULL, &dc, drawInfo );
|
||||
|
||||
#ifndef USE_WX_ZOOM
|
||||
ActiveScreen->m_DrawOrg = org;
|
||||
ActiveScreen->m_StartVisu = strt;
|
||||
ActiveScreen->SetZoom( pzoom );
|
||||
#endif
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************************/
|
||||
DIALOG_PAD_PROPERTIES::DIALOG_PAD_PROPERTIES( WinEDA_BasePcbFrame* 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 )
|
||||
{
|
||||
Current_PadNetName = m_CurrentPad->GetNetname();
|
||||
g_Current_PadName = m_CurrentPad->ReturnStringPadName();
|
||||
}
|
||||
m_dummyPad->Copy( m_CurrentPad );
|
||||
else
|
||||
m_dummyPad->Copy( &g_Pad_Master );
|
||||
|
||||
initValues();
|
||||
|
||||
InitDialog( );
|
||||
if( GetSizer() )
|
||||
{
|
||||
GetSizer()->SetSizeHints( this );
|
||||
}
|
||||
|
||||
Center();
|
||||
m_canUpdate = true;
|
||||
}
|
||||
|
||||
|
||||
|
@ -105,22 +189,39 @@ void WinEDA_BasePcbFrame::InstallPadOptionsFrame( D_PAD* Pad )
|
|||
}
|
||||
|
||||
|
||||
/**************************************************************/
|
||||
void DIALOG_PAD_PROPERTIES::InitDialog( )
|
||||
/**************************************************************/
|
||||
/***************************************/
|
||||
void DIALOG_PAD_PROPERTIES::initValues()
|
||||
/***************************************/
|
||||
{
|
||||
int tmp;
|
||||
wxCommandEvent cmd_event;
|
||||
int internalUnits = m_Parent->m_InternalUnits;
|
||||
wxString msg;
|
||||
|
||||
SetFocus(); // Required under wxGTK if we want to demiss the dialog with the ESC key
|
||||
|
||||
m_PadNumCtrl->SetValue( g_Current_PadName );
|
||||
m_PadNetNameCtrl->SetValue( Current_PadNetName );
|
||||
D_PAD* pad = m_CurrentPad;
|
||||
if( pad == NULL )
|
||||
pad = &g_Pad_Master;
|
||||
int tmp;
|
||||
int internalUnits = m_Parent->m_InternalUnits;
|
||||
wxString msg;
|
||||
m_isFlipped = false;
|
||||
if( m_CurrentPad )
|
||||
{
|
||||
MODULE* Module = (MODULE*) m_CurrentPad->GetParent();
|
||||
if( Module->GetLayer() == LAYER_N_BACK )
|
||||
{
|
||||
m_isFlipped = true;
|
||||
m_staticModuleSideValue->SetLabel( _( "Back side (footprint is mirrored)" ) );
|
||||
}
|
||||
msg.Printf( wxT( "%.1f" ), (double) Module->m_Orient / 10 );
|
||||
m_staticModuleRotValue->SetLabel( msg );
|
||||
}
|
||||
|
||||
if( m_isFlipped )
|
||||
{
|
||||
NEGATE( m_dummyPad->m_Offset.y );
|
||||
NEGATE( m_dummyPad->m_DeltaSize.y );
|
||||
/* flip pads layers*/
|
||||
m_dummyPad->m_Masque_Layer = ChangeSideMaskLayer( m_dummyPad->m_Masque_Layer );
|
||||
}
|
||||
m_staticTextWarningPadFlipped->Show(m_isFlipped);
|
||||
|
||||
m_PadNumCtrl->SetValue( m_dummyPad->ReturnStringPadName() );
|
||||
m_PadNetNameCtrl->SetValue( m_dummyPad->GetNetname() );
|
||||
|
||||
// Display current unit name in dialog:
|
||||
m_PadPosX_Unit->SetLabel( GetUnitsLabel( g_UserUnit ) );
|
||||
|
@ -134,76 +235,83 @@ void DIALOG_PAD_PROPERTIES::InitDialog( )
|
|||
m_PadShapeDeltaX_Unit->SetLabel( GetUnitsLabel( g_UserUnit ) );
|
||||
m_PadShapeDeltaY_Unit->SetLabel( GetUnitsLabel( g_UserUnit ) );
|
||||
m_NetClearanceUnits->SetLabel( GetUnitsLabel( g_UserUnit ) );
|
||||
|
||||
// Display current pad masks clearances units
|
||||
m_NetClearanceUnits->SetLabel( GetUnitsLabel( g_UserUnit ) );
|
||||
m_SolderMaskMarginUnits->SetLabel( GetUnitsLabel( g_UserUnit ) );
|
||||
m_SolderPasteMarginUnits->SetLabel( GetUnitsLabel( g_UserUnit ) );
|
||||
|
||||
// Display current pad parameters units:
|
||||
PutValueInLocalUnits( *m_PadPosition_X_Ctrl, pad->m_Pos.x, internalUnits );
|
||||
PutValueInLocalUnits( *m_PadPosition_Y_Ctrl, pad->m_Pos.y, internalUnits );
|
||||
PutValueInLocalUnits( *m_PadPosition_X_Ctrl, m_dummyPad->m_Pos.x, internalUnits );
|
||||
PutValueInLocalUnits( *m_PadPosition_Y_Ctrl, m_dummyPad->m_Pos.y, internalUnits );
|
||||
|
||||
PutValueInLocalUnits( *m_PadDrill_X_Ctrl, pad->m_Drill.x, internalUnits );
|
||||
PutValueInLocalUnits( *m_PadDrill_Y_Ctrl, pad->m_Drill.y, internalUnits );
|
||||
PutValueInLocalUnits( *m_PadDrill_X_Ctrl, m_dummyPad->m_Drill.x, internalUnits );
|
||||
PutValueInLocalUnits( *m_PadDrill_Y_Ctrl, m_dummyPad->m_Drill.y, internalUnits );
|
||||
|
||||
PutValueInLocalUnits( *m_ShapeSize_X_Ctrl, pad->m_Size.x, internalUnits );
|
||||
PutValueInLocalUnits( *m_ShapeSize_Y_Ctrl, pad->m_Size.y, internalUnits );
|
||||
PutValueInLocalUnits( *m_ShapeSize_X_Ctrl, m_dummyPad->m_Size.x, internalUnits );
|
||||
PutValueInLocalUnits( *m_ShapeSize_Y_Ctrl, m_dummyPad->m_Size.y, internalUnits );
|
||||
|
||||
PutValueInLocalUnits( *m_ShapeOffset_X_Ctrl, pad->m_Offset.x, internalUnits );
|
||||
PutValueInLocalUnits( *m_ShapeOffset_Y_Ctrl, pad->m_Offset.y, internalUnits );
|
||||
PutValueInLocalUnits( *m_ShapeOffset_X_Ctrl, m_dummyPad->m_Offset.x, internalUnits );
|
||||
PutValueInLocalUnits( *m_ShapeOffset_Y_Ctrl, m_dummyPad->m_Offset.y, internalUnits );
|
||||
|
||||
PutValueInLocalUnits( *m_ShapeDelta_X_Ctrl, pad->m_DeltaSize.x, internalUnits );
|
||||
PutValueInLocalUnits( *m_ShapeDelta_Y_Ctrl, pad->m_DeltaSize.y, internalUnits );
|
||||
PutValueInLocalUnits( *m_ShapeDelta_X_Ctrl, m_dummyPad->m_DeltaSize.x, internalUnits );
|
||||
PutValueInLocalUnits( *m_ShapeDelta_Y_Ctrl, m_dummyPad->m_DeltaSize.y, internalUnits );
|
||||
|
||||
PutValueInLocalUnits( *m_NetClearanceValueCtrl, m_dummyPad->m_LocalClearance, internalUnits );
|
||||
PutValueInLocalUnits( *m_SolderMaskMarginCtrl,
|
||||
m_dummyPad->m_LocalSolderMaskMargin,
|
||||
internalUnits );
|
||||
|
||||
PutValueInLocalUnits( *m_NetClearanceValueCtrl, pad->m_LocalClearance, internalUnits );
|
||||
PutValueInLocalUnits( *m_SolderMaskMarginCtrl, pad->m_LocalSolderMaskMargin, internalUnits );
|
||||
// These 2 parameters are usually < 0, so prepare entering a negative value, if current is 0
|
||||
PutValueInLocalUnits( *m_SolderPasteMarginCtrl, pad->m_LocalSolderPasteMargin, internalUnits );
|
||||
if( pad->m_LocalSolderPasteMargin == 0 )
|
||||
m_SolderPasteMarginCtrl->SetValue( wxT("-") + m_SolderPasteMarginCtrl->GetValue() );
|
||||
msg.Printf( wxT( "%.1f" ), pad->m_LocalSolderPasteMarginRatio * 100.0 );
|
||||
if( pad->m_LocalSolderPasteMarginRatio == 0.0 &&
|
||||
msg[0] == '0') // Sometimes Printf add a sign if the value is small
|
||||
m_SolderPasteMarginRatioCtrl->SetValue( wxT("-") + msg );
|
||||
PutValueInLocalUnits( *m_SolderPasteMarginCtrl,
|
||||
m_dummyPad->m_LocalSolderPasteMargin,
|
||||
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
|
||||
&& msg[0] == '0' ) // Sometimes Printf add a sign if the value is small
|
||||
m_SolderPasteMarginRatioCtrl->SetValue( wxT( "-" ) + msg );
|
||||
else
|
||||
m_SolderPasteMarginRatioCtrl->SetValue( msg );
|
||||
|
||||
if( m_CurrentPad )
|
||||
{
|
||||
MODULE* Module = (MODULE*) m_CurrentPad->GetParent();
|
||||
tmp = m_CurrentPad->m_Orient - Module->m_Orient;
|
||||
m_dummyPad->m_Orient = m_CurrentPad->m_Orient - Module->m_Orient;
|
||||
if( m_isFlipped )
|
||||
NEGATE( m_dummyPad->m_Orient );
|
||||
}
|
||||
else
|
||||
tmp = g_Pad_Master.m_Orient;
|
||||
|
||||
// adjust rotation agngle to -1800 to 1800 in internal units (0.1 deg)
|
||||
NORMALIZE_ANGLE_180( m_dummyPad->m_Orient );
|
||||
|
||||
// Set layers used by this pad: :
|
||||
SetPadLayersList( m_dummyPad->m_Masque_Layer );
|
||||
|
||||
msg.Clear();
|
||||
msg << tmp;
|
||||
m_PadOrientCtrl->SetValue( msg );
|
||||
|
||||
|
||||
// Pad Orient
|
||||
switch( tmp )
|
||||
switch( m_dummyPad->m_Orient )
|
||||
{
|
||||
case 0:
|
||||
m_PadOrient->SetSelection( 0 );
|
||||
m_PadOrientCtrl->Enable( false );
|
||||
break;
|
||||
|
||||
case - 2700:
|
||||
case 900:
|
||||
m_PadOrient->SetSelection( 1 );
|
||||
m_PadOrientCtrl->Enable( false );
|
||||
break;
|
||||
|
||||
case - 900:
|
||||
case 2700:
|
||||
m_PadOrient->SetSelection( 2 );
|
||||
m_PadOrientCtrl->Enable( false );
|
||||
break;
|
||||
|
||||
case 1800:
|
||||
case - 1800:
|
||||
m_PadOrient->SetSelection( 3 );
|
||||
m_PadOrientCtrl->Enable( false );
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -211,7 +319,7 @@ void DIALOG_PAD_PROPERTIES::InitDialog( )
|
|||
break;
|
||||
}
|
||||
|
||||
switch( pad->m_PadShape )
|
||||
switch( m_dummyPad->m_PadShape )
|
||||
{
|
||||
default:
|
||||
case PAD_CIRCLE:
|
||||
|
@ -231,51 +339,48 @@ void DIALOG_PAD_PROPERTIES::InitDialog( )
|
|||
break;
|
||||
}
|
||||
|
||||
cmd_event.SetId( m_PadShape->GetSelection() );
|
||||
OnPadShapeSelection( cmd_event );
|
||||
msg.Printf( wxT( "%d" ), m_dummyPad->m_Orient );
|
||||
m_PadOrientCtrl->SetValue( msg );
|
||||
|
||||
// Selection du type
|
||||
tmp = pad->m_Attribut;
|
||||
tmp = m_dummyPad->m_Attribut;
|
||||
m_PadType->SetSelection( 0 );
|
||||
for( int ii = 0; ii < NBTYPES; ii++ )
|
||||
{
|
||||
if( CodeType[ii] == tmp )
|
||||
{
|
||||
m_PadType->SetSelection( ii ); break;
|
||||
m_PadType->SetSelection( ii );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( pad->m_DrillShape != PAD_OVAL )
|
||||
if( m_dummyPad->m_DrillShape != PAD_OVAL )
|
||||
m_DrillShapeCtrl->SetSelection( 0 );
|
||||
else
|
||||
m_DrillShapeCtrl->SetSelection( 1 );
|
||||
cmd_event.SetId( m_DrillShapeCtrl->GetSelection() );
|
||||
OnDrillShapeSelected( cmd_event );
|
||||
|
||||
// Set layers used by this pad: :
|
||||
if( m_CurrentPad )
|
||||
SetPadLayersList( m_CurrentPad->m_Masque_Layer );
|
||||
else
|
||||
{
|
||||
cmd_event.SetId( m_PadType->GetSelection() );
|
||||
PadTypeSelected( cmd_event );
|
||||
}
|
||||
|
||||
// Setup layers names from board
|
||||
m_PadLayerCu->SetLabel(m_Board->GetLayerName(LAYER_N_BACK));
|
||||
m_PadLayerCmp->SetLabel(m_Board->GetLayerName(LAYER_N_FRONT));
|
||||
m_PadLayerCu->SetLabel( m_Board->GetLayerName( LAYER_N_BACK ) );
|
||||
m_PadLayerCmp->SetLabel( m_Board->GetLayerName( LAYER_N_FRONT ) );
|
||||
|
||||
m_PadLayerAdhCmp->SetLabel(m_Board->GetLayerName( ADHESIVE_N_FRONT ));
|
||||
m_PadLayerAdhCu->SetLabel(m_Board->GetLayerName( ADHESIVE_N_BACK ));
|
||||
m_PadLayerPateCmp->SetLabel(m_Board->GetLayerName( SOLDERPASTE_N_FRONT ));
|
||||
m_PadLayerPateCu->SetLabel(m_Board->GetLayerName(SOLDERPASTE_N_BACK ));
|
||||
m_PadLayerSilkCmp->SetLabel(m_Board->GetLayerName( SILKSCREEN_N_FRONT ));
|
||||
m_PadLayerSilkCu->SetLabel(m_Board->GetLayerName( SILKSCREEN_N_BACK ));
|
||||
m_PadLayerMaskCmp->SetLabel(m_Board->GetLayerName( SOLDERMASK_N_FRONT ));
|
||||
m_PadLayerMaskCu->SetLabel(m_Board->GetLayerName( SOLDERMASK_N_BACK ));
|
||||
m_PadLayerECO1->SetLabel(m_Board->GetLayerName( ECO1_N ));
|
||||
m_PadLayerECO2->SetLabel(m_Board->GetLayerName( ECO2_N));
|
||||
m_PadLayerDraft->SetLabel(m_Board->GetLayerName( DRAW_N ));
|
||||
m_PadLayerAdhCmp->SetLabel( m_Board->GetLayerName( ADHESIVE_N_FRONT ) );
|
||||
m_PadLayerAdhCu->SetLabel( m_Board->GetLayerName( ADHESIVE_N_BACK ) );
|
||||
m_PadLayerPateCmp->SetLabel( m_Board->GetLayerName( SOLDERPASTE_N_FRONT ) );
|
||||
m_PadLayerPateCu->SetLabel( m_Board->GetLayerName( SOLDERPASTE_N_BACK ) );
|
||||
m_PadLayerSilkCmp->SetLabel( m_Board->GetLayerName( SILKSCREEN_N_FRONT ) );
|
||||
m_PadLayerSilkCu->SetLabel( m_Board->GetLayerName( SILKSCREEN_N_BACK ) );
|
||||
m_PadLayerMaskCmp->SetLabel( m_Board->GetLayerName( SOLDERMASK_N_FRONT ) );
|
||||
m_PadLayerMaskCu->SetLabel( m_Board->GetLayerName( SOLDERMASK_N_BACK ) );
|
||||
m_PadLayerECO1->SetLabel( m_Board->GetLayerName( ECO1_N ) );
|
||||
m_PadLayerECO2->SetLabel( m_Board->GetLayerName( ECO2_N ) );
|
||||
m_PadLayerDraft->SetLabel( m_Board->GetLayerName( DRAW_N ) );
|
||||
|
||||
/* All init are done,
|
||||
* Update some dialog widgets state (Enable/disable options):
|
||||
*/
|
||||
wxCommandEvent cmd_event;
|
||||
OnPadShapeSelection( cmd_event );
|
||||
OnDrillShapeSelected( cmd_event );
|
||||
}
|
||||
|
||||
|
||||
|
@ -309,6 +414,9 @@ void DIALOG_PAD_PROPERTIES::OnPadShapeSelection( wxCommandEvent& event )
|
|||
m_ShapeSize_Y_Ctrl->Enable( true );
|
||||
break;
|
||||
}
|
||||
|
||||
TransfertDataToPad( m_dummyPad );
|
||||
m_panelShowPad->Refresh();
|
||||
}
|
||||
|
||||
|
||||
|
@ -316,12 +424,14 @@ void DIALOG_PAD_PROPERTIES::OnPadShapeSelection( wxCommandEvent& event )
|
|||
void DIALOG_PAD_PROPERTIES::OnDrillShapeSelected( wxCommandEvent& event )
|
||||
/**********************************************************************/
|
||||
{
|
||||
if ( (m_PadType->GetSelection() == 1) || (m_PadType->GetSelection() == 2) )
|
||||
{ // pad type = SMD or CONN: no hole allowed
|
||||
if( (m_PadType->GetSelection() == 1) || (m_PadType->GetSelection() == 2) )
|
||||
{
|
||||
// pad type = SMD or CONN: no hole allowed
|
||||
m_PadDrill_X_Ctrl->Enable( false );
|
||||
m_PadDrill_Y_Ctrl->Enable( false );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch( m_DrillShapeCtrl->GetSelection() )
|
||||
{
|
||||
case 0: //CIRCLE:
|
||||
|
@ -334,6 +444,10 @@ void DIALOG_PAD_PROPERTIES::OnDrillShapeSelected( wxCommandEvent& event )
|
|||
m_PadDrill_Y_Ctrl->Enable( true );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
TransfertDataToPad( m_dummyPad );
|
||||
m_panelShowPad->Refresh();
|
||||
}
|
||||
|
||||
|
||||
|
@ -344,29 +458,31 @@ void DIALOG_PAD_PROPERTIES::PadOrientEvent( wxCommandEvent& event )
|
|||
switch( m_PadOrient->GetSelection() )
|
||||
{
|
||||
case 0:
|
||||
m_PadOrientCtrl->SetValue( wxT( "0" ) );
|
||||
m_PadOrientCtrl->Enable( false );
|
||||
m_dummyPad->m_Orient = 0;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
m_PadOrientCtrl->SetValue( wxT( "900" ) );
|
||||
m_PadOrientCtrl->Enable( false );
|
||||
m_dummyPad->m_Orient = 900;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
m_PadOrientCtrl->SetValue( wxT( "2700" ) );
|
||||
m_PadOrientCtrl->Enable( false );
|
||||
m_dummyPad->m_Orient = -900;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
m_PadOrientCtrl->SetValue( wxT( "1800" ) );
|
||||
m_PadOrientCtrl->Enable( false );
|
||||
m_dummyPad->m_Orient = 1800;
|
||||
break;
|
||||
|
||||
default:
|
||||
m_PadOrientCtrl->Enable( true );
|
||||
break;
|
||||
}
|
||||
|
||||
wxString msg;
|
||||
msg.Printf( wxT( "%d" ), m_dummyPad->m_Orient );
|
||||
m_PadOrientCtrl->SetValue( msg );
|
||||
|
||||
TransfertDataToPad( m_dummyPad );
|
||||
m_panelShowPad->Refresh();
|
||||
}
|
||||
|
||||
|
||||
|
@ -388,7 +504,7 @@ void DIALOG_PAD_PROPERTIES::PadTypeSelected( wxCommandEvent& event )
|
|||
SetPadLayersList( layer_mask );
|
||||
|
||||
// Enable/disable drill dialog items:
|
||||
event.SetId(m_DrillShapeCtrl->GetSelection());
|
||||
event.SetId( m_DrillShapeCtrl->GetSelection() );
|
||||
OnDrillShapeSelected( event );
|
||||
}
|
||||
|
||||
|
@ -424,106 +540,240 @@ void DIALOG_PAD_PROPERTIES::SetPadLayersList( long layer_mask )
|
|||
}
|
||||
|
||||
|
||||
// Called when select/deselect a layer.
|
||||
void DIALOG_PAD_PROPERTIES::OnSetLayer( wxCommandEvent& event )
|
||||
{
|
||||
TransfertDataToPad( m_dummyPad );
|
||||
m_panelShowPad->Refresh();
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
void DIALOG_PAD_PROPERTIES::PadPropertiesAccept( wxCommandEvent& event )
|
||||
/*************************************************************************/
|
||||
|
||||
/* Updates the different parameters for the component being edited.
|
||||
*/
|
||||
{
|
||||
bool rastnestIsChanged = false;
|
||||
int isign = m_isFlipped ? -1 : 1;
|
||||
|
||||
bool success = TransfertDataToPad( m_dummyPad, true );
|
||||
if( !success ) // An error on parameters has occured
|
||||
return;
|
||||
|
||||
TransfertDataToPad( &g_Pad_Master, false );
|
||||
g_Current_PadName = g_Pad_Master.ReturnStringPadName();
|
||||
|
||||
if( m_CurrentPad ) // Set current Pad parameters
|
||||
{
|
||||
MODULE* Module = (MODULE*) m_CurrentPad->GetParent();
|
||||
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)
|
||||
m_CurrentPad->m_Flags |= DO_NOT_DRAW;
|
||||
m_Parent->DrawPanel->PostDirtyRect( m_CurrentPad->GetBoundingBox() );
|
||||
m_CurrentPad->m_Flags &= ~DO_NOT_DRAW;
|
||||
|
||||
// Update values
|
||||
m_CurrentPad->m_PadShape = g_Pad_Master.m_PadShape;
|
||||
m_CurrentPad->m_Attribut = g_Pad_Master.m_Attribut;
|
||||
if( m_CurrentPad->m_Pos != g_Pad_Master.m_Pos )
|
||||
{
|
||||
m_CurrentPad->m_Pos = g_Pad_Master.m_Pos;
|
||||
rastnestIsChanged = true;
|
||||
}
|
||||
|
||||
/* compute the pos 0 value, i.e. pad position for module orient = 0 i.e.
|
||||
* refer to module origin (module position) */
|
||||
m_CurrentPad->m_Pos0 = m_CurrentPad->m_Pos;
|
||||
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;
|
||||
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;
|
||||
if( m_CurrentPad->m_Masque_Layer != g_Pad_Master.m_Masque_Layer )
|
||||
{
|
||||
rastnestIsChanged = true;
|
||||
m_CurrentPad->m_Masque_Layer = g_Pad_Master.m_Masque_Layer;
|
||||
}
|
||||
if( m_isFlipped )
|
||||
m_CurrentPad->m_Masque_Layer = ChangeSideMaskLayer( m_CurrentPad->m_Masque_Layer );
|
||||
|
||||
m_CurrentPad->SetPadName( g_Pad_Master.ReturnStringPadName() );
|
||||
|
||||
if( m_CurrentPad->GetNetname() != g_Pad_Master.GetNetname() )
|
||||
{
|
||||
if( g_Pad_Master.GetNetname().IsEmpty() )
|
||||
{
|
||||
rastnestIsChanged = true;
|
||||
m_CurrentPad->SetNet( 0 );
|
||||
m_CurrentPad->SetNetname( wxEmptyString );
|
||||
}
|
||||
else
|
||||
{
|
||||
const NETINFO_ITEM* net = m_Parent->GetBoard()->FindNet( g_Pad_Master.GetNetname() );
|
||||
if( net )
|
||||
{
|
||||
rastnestIsChanged = true;
|
||||
m_CurrentPad->SetNetname( g_Pad_Master.GetNetname() );
|
||||
m_CurrentPad->SetNet( net->GetNet() );
|
||||
}
|
||||
else
|
||||
DisplayError( NULL, _( "Unknown netname, netname not changed" ) );
|
||||
}
|
||||
}
|
||||
|
||||
m_CurrentPad->m_LocalClearance = g_Pad_Master.m_LocalClearance;
|
||||
m_CurrentPad->m_LocalSolderMaskMargin = g_Pad_Master.m_LocalSolderMaskMargin;
|
||||
m_CurrentPad->m_LocalSolderPasteMargin = g_Pad_Master.m_LocalSolderPasteMargin;
|
||||
m_CurrentPad->m_LocalSolderPasteMarginRatio = g_Pad_Master.m_LocalSolderPasteMarginRatio;
|
||||
|
||||
m_CurrentPad->ComputeRayon();
|
||||
|
||||
Module->Set_Rectangle_Encadrement();
|
||||
m_CurrentPad->DisplayInfo( m_Parent );
|
||||
|
||||
// redraw the area where the pad was
|
||||
m_Parent->DrawPanel->PostDirtyRect( m_CurrentPad->GetBoundingBox() );
|
||||
m_Parent->OnModify();
|
||||
}
|
||||
|
||||
EndModal( wxID_OK );
|
||||
|
||||
if( rastnestIsChanged ) // The net ratsnest must be recalculated
|
||||
m_Parent->GetBoard()->m_Status_Pcb = 0;
|
||||
}
|
||||
|
||||
|
||||
bool DIALOG_PAD_PROPERTIES::TransfertDataToPad( D_PAD* aPad, bool aPromptOnError )
|
||||
{
|
||||
long PadLayerMask;
|
||||
bool RastnestIsChanged = false;
|
||||
int internalUnits = m_Parent->m_InternalUnits;
|
||||
wxString msg;
|
||||
|
||||
g_Pad_Master.m_Attribut = CodeType[m_PadType->GetSelection()];
|
||||
g_Pad_Master.m_PadShape = CodeShape[m_PadShape->GetSelection()];
|
||||
aPad->m_Attribut = CodeType[m_PadType->GetSelection()];
|
||||
aPad->m_PadShape = CodeShape[m_PadShape->GetSelection()];
|
||||
|
||||
// Read pad clearances values:
|
||||
g_Pad_Master.m_LocalClearance = ReturnValueFromTextCtrl( *m_NetClearanceValueCtrl,
|
||||
aPad->m_LocalClearance = ReturnValueFromTextCtrl( *m_NetClearanceValueCtrl,
|
||||
internalUnits );
|
||||
g_Pad_Master.m_LocalSolderMaskMargin = ReturnValueFromTextCtrl( *m_SolderMaskMarginCtrl,
|
||||
aPad->m_LocalSolderMaskMargin = ReturnValueFromTextCtrl( *m_SolderMaskMarginCtrl,
|
||||
internalUnits );
|
||||
g_Pad_Master.m_LocalSolderPasteMargin = ReturnValueFromTextCtrl( *m_SolderPasteMarginCtrl,
|
||||
aPad->m_LocalSolderPasteMargin = ReturnValueFromTextCtrl( *m_SolderPasteMarginCtrl,
|
||||
internalUnits );
|
||||
double dtmp = 0.0;
|
||||
msg = m_SolderPasteMarginRatioCtrl->GetValue();
|
||||
msg.ToDouble( &dtmp );
|
||||
|
||||
// A margin ratio de -50% means no paste on a pad, the ratio must be >= 50 %
|
||||
if( dtmp < -50 )
|
||||
dtmp = -50;
|
||||
if( dtmp > +100 )
|
||||
dtmp = +100;
|
||||
g_Pad_Master.m_LocalSolderPasteMarginRatio = dtmp / 100;
|
||||
aPad->m_LocalSolderPasteMarginRatio = dtmp / 100;
|
||||
|
||||
// Read pad position:
|
||||
g_Pad_Master.m_Pos.x = ReturnValueFromTextCtrl( *m_PadPosition_X_Ctrl, internalUnits );
|
||||
g_Pad_Master.m_Pos.y = ReturnValueFromTextCtrl( *m_PadPosition_Y_Ctrl, internalUnits );
|
||||
g_Pad_Master.m_Pos0 = g_Pad_Master.m_Pos;
|
||||
aPad->m_Pos.x = ReturnValueFromTextCtrl( *m_PadPosition_X_Ctrl, internalUnits );
|
||||
aPad->m_Pos.y = ReturnValueFromTextCtrl( *m_PadPosition_Y_Ctrl, internalUnits );
|
||||
aPad->m_Pos0 = aPad->m_Pos;
|
||||
|
||||
// Read pad drill:
|
||||
g_Pad_Master.m_Drill.x = ReturnValueFromTextCtrl( *m_PadDrill_X_Ctrl, internalUnits );
|
||||
g_Pad_Master.m_Drill.y = ReturnValueFromTextCtrl( *m_PadDrill_Y_Ctrl, internalUnits );
|
||||
aPad->m_Drill.x = ReturnValueFromTextCtrl( *m_PadDrill_X_Ctrl, internalUnits );
|
||||
aPad->m_Drill.y = ReturnValueFromTextCtrl( *m_PadDrill_Y_Ctrl, internalUnits );
|
||||
if( m_DrillShapeCtrl->GetSelection() == 0 )
|
||||
{
|
||||
g_Pad_Master.m_DrillShape = PAD_CIRCLE;
|
||||
g_Pad_Master.m_Drill.y = g_Pad_Master.m_Drill.x;
|
||||
aPad->m_DrillShape = PAD_CIRCLE;
|
||||
aPad->m_Drill.y = aPad->m_Drill.x;
|
||||
}
|
||||
else
|
||||
g_Pad_Master.m_DrillShape = PAD_OVAL;
|
||||
aPad->m_DrillShape = PAD_OVAL;
|
||||
|
||||
// Read pad shape size:
|
||||
g_Pad_Master.m_Size.x = ReturnValueFromTextCtrl( *m_ShapeSize_X_Ctrl, internalUnits );
|
||||
g_Pad_Master.m_Size.y = ReturnValueFromTextCtrl( *m_ShapeSize_Y_Ctrl, internalUnits );
|
||||
if( g_Pad_Master.m_PadShape == PAD_CIRCLE )
|
||||
g_Pad_Master.m_Size.y = g_Pad_Master.m_Size.x;
|
||||
aPad->m_Size.x = ReturnValueFromTextCtrl( *m_ShapeSize_X_Ctrl, internalUnits );
|
||||
aPad->m_Size.y = ReturnValueFromTextCtrl( *m_ShapeSize_Y_Ctrl, internalUnits );
|
||||
if( aPad->m_PadShape == PAD_CIRCLE )
|
||||
aPad->m_Size.y = aPad->m_Size.x;
|
||||
|
||||
// Read pad shape delta size:
|
||||
g_Pad_Master.m_DeltaSize.x = ReturnValueFromTextCtrl( *m_ShapeDelta_X_Ctrl, internalUnits );
|
||||
g_Pad_Master.m_DeltaSize.y = ReturnValueFromTextCtrl( *m_ShapeDelta_Y_Ctrl, internalUnits );
|
||||
// m_DeltaSize.x or m_DeltaSize.y must be NULL. for a trapezoid.
|
||||
aPad->m_DeltaSize.x = ReturnValueFromTextCtrl( *m_ShapeDelta_X_Ctrl, internalUnits );
|
||||
aPad->m_DeltaSize.y = ReturnValueFromTextCtrl( *m_ShapeDelta_Y_Ctrl, internalUnits );
|
||||
|
||||
// Test bad values (be sure delta values are not to large)
|
||||
// rememver DeltaSize.x is the Y size variation
|
||||
bool error = false;
|
||||
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.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;
|
||||
}
|
||||
|
||||
// Read pad shape offset:
|
||||
g_Pad_Master.m_Offset.x = ReturnValueFromTextCtrl( *m_ShapeOffset_X_Ctrl, internalUnits );
|
||||
g_Pad_Master.m_Offset.y = ReturnValueFromTextCtrl( *m_ShapeOffset_Y_Ctrl, internalUnits );
|
||||
aPad->m_Offset.x = ReturnValueFromTextCtrl( *m_ShapeOffset_X_Ctrl, internalUnits );
|
||||
aPad->m_Offset.y = ReturnValueFromTextCtrl( *m_ShapeOffset_Y_Ctrl, internalUnits );
|
||||
|
||||
long orient_value = 0;
|
||||
msg = m_PadOrientCtrl->GetValue();
|
||||
msg.ToLong( &orient_value );
|
||||
g_Pad_Master.m_Orient = orient_value;
|
||||
aPad->m_Orient = orient_value;
|
||||
|
||||
g_Current_PadName = m_PadNumCtrl->GetValue().Left( 4 );
|
||||
Current_PadNetName = m_PadNetNameCtrl->GetValue();
|
||||
msg = m_PadNumCtrl->GetValue().Left( 4 );
|
||||
aPad->SetPadName( msg );
|
||||
aPad->SetNetname( m_PadNetNameCtrl->GetValue() );
|
||||
|
||||
// Clear some values, according to the pad type and shape
|
||||
switch( g_Pad_Master.m_PadShape )
|
||||
switch( aPad->m_PadShape )
|
||||
{
|
||||
case PAD_CIRCLE:
|
||||
g_Pad_Master.m_Offset = wxSize( 0, 0 );
|
||||
g_Pad_Master.m_DeltaSize = wxSize( 0, 0 );
|
||||
g_Pad_Master.m_Size.y = g_Pad_Master.m_Size.x;
|
||||
aPad->m_Offset = wxSize( 0, 0 );
|
||||
aPad->m_DeltaSize = wxSize( 0, 0 );
|
||||
aPad->m_Size.y = aPad->m_Size.x;
|
||||
break;
|
||||
|
||||
case PAD_RECT:
|
||||
g_Pad_Master.m_DeltaSize = wxSize( 0, 0 );
|
||||
aPad->m_DeltaSize = wxSize( 0, 0 );
|
||||
break;
|
||||
|
||||
case PAD_OVAL:
|
||||
g_Pad_Master.m_DeltaSize = wxSize( 0, 0 );
|
||||
aPad->m_DeltaSize = wxSize( 0, 0 );
|
||||
break;
|
||||
|
||||
case PAD_TRAPEZOID:
|
||||
break;
|
||||
}
|
||||
|
||||
switch( g_Pad_Master.m_Attribut )
|
||||
switch( aPad->m_Attribut )
|
||||
{
|
||||
case PAD_STANDARD:
|
||||
break;
|
||||
|
||||
case PAD_CONN:
|
||||
case PAD_SMD:
|
||||
g_Pad_Master.m_Offset = wxSize( 0, 0 );
|
||||
g_Pad_Master.m_Drill = wxSize( 0, 0 );
|
||||
aPad->m_Offset = wxSize( 0, 0 );
|
||||
aPad->m_Drill = wxSize( 0, 0 );
|
||||
break;
|
||||
|
||||
case PAD_HOLE_NOT_PLATED:
|
||||
|
@ -564,118 +814,67 @@ void DIALOG_PAD_PROPERTIES::PadPropertiesAccept( wxCommandEvent& event )
|
|||
if( m_PadLayerDraft->GetValue() )
|
||||
PadLayerMask |= DRAW_LAYER;
|
||||
|
||||
aPad->m_Masque_Layer = PadLayerMask;
|
||||
|
||||
/* Test for incorrect values */
|
||||
if( (g_Pad_Master.m_Size.x < g_Pad_Master.m_Drill.x)
|
||||
|| (g_Pad_Master.m_Size.y < g_Pad_Master.m_Drill.y) )
|
||||
if( aPromptOnError )
|
||||
{
|
||||
if( (aPad->m_Size.x < aPad->m_Drill.x)
|
||||
|| (aPad->m_Size.y < aPad->m_Drill.y) )
|
||||
{
|
||||
DisplayError( this, _( "Incorrect value for pad drill: pad drill bigger than pad size" ) );
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
int padlayers_mask = PadLayerMask & (LAYER_BACK | LAYER_FRONT);
|
||||
if( padlayers_mask == 0 )
|
||||
{
|
||||
if( g_Pad_Master.m_Drill.x || g_Pad_Master.m_Drill.y )
|
||||
if( aPad->m_Drill.x || aPad->m_Drill.y )
|
||||
{
|
||||
DisplayError( this, _( "Error: pad is not on a copper layer and has a hole" ) );
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if( ( g_Pad_Master.m_Size.x / 2 <= ABS( g_Pad_Master.m_Offset.x ) )
|
||||
|| ( g_Pad_Master.m_Size.y / 2 <= ABS( g_Pad_Master.m_Offset.y ) ) )
|
||||
if( ( aPad->m_Size.x / 2 <= ABS( aPad->m_Offset.x ) )
|
||||
|| ( aPad->m_Size.y / 2 <= ABS( aPad->m_Offset.y ) ) )
|
||||
{
|
||||
DisplayError( this, _( "Incorrect value for pad offset" ) );
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
g_Pad_Master.m_Masque_Layer = PadLayerMask;
|
||||
|
||||
if( m_CurrentPad ) // Set current Pad parameters
|
||||
if( error )
|
||||
{
|
||||
MODULE* Module = (MODULE*) m_CurrentPad->GetParent();
|
||||
m_Parent->SaveCopyInUndoList( Module, UR_CHANGED );
|
||||
Module->m_LastEdit_Time = time( NULL );
|
||||
DisplayError( this, _( "Too large value for pad delta size" ) );
|
||||
return false;
|
||||
}
|
||||
|
||||
// redraw the area where the pad was, without pad (delete pad on screen)
|
||||
m_CurrentPad->m_Flags |= DO_NOT_DRAW;
|
||||
m_Parent->DrawPanel->PostDirtyRect( m_CurrentPad->GetBoundingBox() );
|
||||
m_CurrentPad->m_Flags &= ~DO_NOT_DRAW;
|
||||
|
||||
// Update values
|
||||
m_CurrentPad->m_PadShape = g_Pad_Master.m_PadShape;
|
||||
m_CurrentPad->m_Attribut = g_Pad_Master.m_Attribut;
|
||||
if( m_CurrentPad->m_Pos != g_Pad_Master.m_Pos )
|
||||
if( aPad->m_DeltaSize.x && aPad->m_DeltaSize.y )
|
||||
{
|
||||
m_CurrentPad->m_Pos = g_Pad_Master.m_Pos;
|
||||
RastnestIsChanged = true;
|
||||
}
|
||||
|
||||
/* compute the pos 0 value, i.e. pad position for module orient = 0 i.e.
|
||||
* refer to module origin (module position) */
|
||||
m_CurrentPad->m_Pos0 = m_CurrentPad->m_Pos;
|
||||
m_CurrentPad->m_Pos0 -= Module->m_Pos;
|
||||
m_CurrentPad->m_Orient = g_Pad_Master.m_Orient + 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;
|
||||
m_CurrentPad->m_DeltaSize = g_Pad_Master.m_DeltaSize;
|
||||
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;
|
||||
if( m_CurrentPad->m_Masque_Layer != g_Pad_Master.m_Masque_Layer )
|
||||
{
|
||||
RastnestIsChanged = true;
|
||||
m_CurrentPad->m_Masque_Layer = g_Pad_Master.m_Masque_Layer;
|
||||
}
|
||||
m_CurrentPad->SetPadName( g_Current_PadName );
|
||||
|
||||
if( m_CurrentPad->GetNetname() != Current_PadNetName )
|
||||
{
|
||||
if( Current_PadNetName.IsEmpty() )
|
||||
{
|
||||
m_CurrentPad->SetNet( 0 );
|
||||
m_CurrentPad->SetNetname( Current_PadNetName );
|
||||
}
|
||||
else
|
||||
{
|
||||
const NETINFO_ITEM* net = m_Parent->GetBoard()->FindNet( Current_PadNetName );
|
||||
if( net )
|
||||
{
|
||||
RastnestIsChanged = true;
|
||||
m_CurrentPad->SetNetname( Current_PadNetName );
|
||||
m_CurrentPad->SetNet( net->GetNet() );
|
||||
}
|
||||
else
|
||||
DisplayError( NULL, _( "Unknown netname, no change" ) );
|
||||
DisplayError( this, _( "Incorrect value for pad delta size: X or Y value must be NULL" ) );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
m_CurrentPad->m_LocalClearance = g_Pad_Master.m_LocalClearance;
|
||||
m_CurrentPad->m_LocalSolderMaskMargin = g_Pad_Master.m_LocalSolderMaskMargin;
|
||||
m_CurrentPad->m_LocalSolderPasteMargin = g_Pad_Master.m_LocalSolderPasteMargin;
|
||||
m_CurrentPad->m_LocalSolderPasteMarginRatio = g_Pad_Master.m_LocalSolderPasteMarginRatio;
|
||||
|
||||
m_CurrentPad->ComputeRayon();
|
||||
|
||||
Module->Set_Rectangle_Encadrement();
|
||||
m_CurrentPad->DisplayInfo( m_Parent );
|
||||
// redraw the area where the pad was
|
||||
m_Parent->DrawPanel->PostDirtyRect( m_CurrentPad->GetBoundingBox() );
|
||||
m_Parent->OnModify();
|
||||
}
|
||||
|
||||
EndModal( wxID_OK );
|
||||
|
||||
if( RastnestIsChanged ) // The net ratsnest must be recalculated
|
||||
m_Parent->GetBoard()->m_Status_Pcb = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Called when a dimension has change.
|
||||
// Update the pad dimensions shown in the panel.
|
||||
void DIALOG_PAD_PROPERTIES::OnValuesChanged( wxCommandEvent& event )
|
||||
{
|
||||
if( m_canUpdate )
|
||||
{
|
||||
TransfertDataToPad( m_dummyPad );
|
||||
m_panelShowPad->Refresh();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************************/
|
||||
void DIALOG_PAD_PROPERTIES::OnCancelButtonClick( wxCommandEvent& event )
|
||||
/*********************************************************************/
|
||||
{
|
||||
EndModal( wxID_CANCEL );
|
||||
}
|
||||
|
||||
|
|
|
@ -176,7 +176,7 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
|
|||
|
||||
m_LeftBoxSizer->Add( sbSizer2, 1, wxEXPAND, 5 );
|
||||
|
||||
bGeneralSizer->Add( m_LeftBoxSizer, 0, wxBOTTOM|wxLEFT, 5 );
|
||||
bGeneralSizer->Add( m_LeftBoxSizer, 0, wxBOTTOM|wxLEFT|wxEXPAND, 5 );
|
||||
|
||||
wxBoxSizer* bMiddleSizer;
|
||||
bMiddleSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
@ -196,14 +196,14 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
|
|||
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->SetSelection( 0 );
|
||||
m_DrillShapeBoxSizer->Add( m_DrillShapeCtrl, 0, wxALL|wxEXPAND, 5 );
|
||||
m_DrillShapeBoxSizer->Add( m_DrillShapeCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
bMiddleUpperSizer->Add( m_DrillShapeBoxSizer, 1, wxBOTTOM, 5 );
|
||||
bMiddleUpperSizer->Add( m_DrillShapeBoxSizer, 0, wxBOTTOM, 5 );
|
||||
|
||||
wxBoxSizer* m_MiddleRightBoxSizer;
|
||||
m_MiddleRightBoxSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxString m_PadOrientChoices[] = { _("0"), _("90"), _("-90"), _("180"), _("User") };
|
||||
wxString m_PadOrientChoices[] = { _("0"), _("90"), _("-90"), _("180"), _("Custom") };
|
||||
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->SetSelection( 0 );
|
||||
|
@ -216,18 +216,58 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
|
|||
m_PadOrientCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_MiddleRightBoxSizer->Add( m_PadOrientCtrl, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
bMiddleUpperSizer->Add( m_MiddleRightBoxSizer, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
bMiddleUpperSizer->Add( m_MiddleRightBoxSizer, 0, wxBOTTOM, 5 );
|
||||
|
||||
bMiddleSizer->Add( bMiddleUpperSizer, 0, wxEXPAND, 5 );
|
||||
m_panelShowPad = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE|wxSIMPLE_BORDER|wxTAB_TRAVERSAL );
|
||||
m_panelShowPad->SetBackgroundColour( wxColour( 0, 0, 0 ) );
|
||||
|
||||
bMiddleUpperSizer->Add( m_panelShowPad, 1, wxEXPAND, 5 );
|
||||
|
||||
bMiddleSizer->Add( bMiddleUpperSizer, 1, wxEXPAND, 5 );
|
||||
|
||||
wxStaticBoxSizer* sbSizeModuleInfo;
|
||||
sbSizeModuleInfo = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Footprint orientation") ), wxHORIZONTAL );
|
||||
|
||||
wxFlexGridSizer* fgSizer4;
|
||||
fgSizer4 = new wxFlexGridSizer( 2, 2, 0, 0 );
|
||||
fgSizer4->AddGrowableCol( 1 );
|
||||
fgSizer4->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer4->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_staticTitleModuleRot = new wxStaticText( this, wxID_ANY, _("Rotation:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTitleModuleRot->Wrap( -1 );
|
||||
fgSizer4->Add( m_staticTitleModuleRot, 0, wxALIGN_RIGHT|wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_staticModuleRotValue = new wxStaticText( this, wxID_ANY, _("0"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticModuleRotValue->Wrap( -1 );
|
||||
fgSizer4->Add( m_staticModuleRotValue, 0, wxTOP|wxRIGHT|wxLEFT|wxEXPAND, 5 );
|
||||
|
||||
m_staticTitleModuleSide = new wxStaticText( this, wxID_ANY, _("Board side:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTitleModuleSide->Wrap( -1 );
|
||||
fgSizer4->Add( m_staticTitleModuleSide, 0, wxALL|wxALIGN_RIGHT, 5 );
|
||||
|
||||
m_staticModuleSideValue = new wxStaticText( this, wxID_ANY, _("Front side"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticModuleSideValue->Wrap( -1 );
|
||||
fgSizer4->Add( m_staticModuleSideValue, 0, wxALL|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->Wrap( -1 );
|
||||
m_staticTextWarningPadFlipped->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
|
||||
|
||||
sbSizeModuleInfo->Add( m_staticTextWarningPadFlipped, 0, wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
bMiddleSizer->Add( sbSizeModuleInfo, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
wxStaticBoxSizer* sbClearancesSizer;
|
||||
sbClearancesSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Clearances:") ), wxVERTICAL );
|
||||
|
||||
m_staticText20 = new wxStaticText( this, wxID_ANY, _("Set these values to 0\nto use Parent footprint or global values"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText20->Wrap( -1 );
|
||||
m_staticText20->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
|
||||
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->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
|
||||
|
||||
sbClearancesSizer->Add( m_staticText20, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
sbClearancesSizer->Add( m_staticTextWarning, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
wxFlexGridSizer* fgClearancesGridSizer;
|
||||
fgClearancesGridSizer = new wxFlexGridSizer( 5, 3, 0, 0 );
|
||||
|
@ -248,13 +288,13 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
|
|||
fgClearancesGridSizer->Add( m_NetClearanceUnits, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||
fgClearancesGridSizer->Add( m_staticline1, 0, wxEXPAND|wxALL, 5 );
|
||||
fgClearancesGridSizer->Add( m_staticline1, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||
fgClearancesGridSizer->Add( m_staticline2, 0, wxEXPAND | wxALL, 5 );
|
||||
fgClearancesGridSizer->Add( m_staticline2, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||
fgClearancesGridSizer->Add( m_staticline3, 0, wxEXPAND | wxALL, 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->Wrap( -1 );
|
||||
|
@ -297,7 +337,7 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
|
|||
|
||||
sbClearancesSizer->Add( fgClearancesGridSizer, 1, wxEXPAND, 5 );
|
||||
|
||||
bMiddleSizer->Add( sbClearancesSizer, 0, wxEXPAND, 5 );
|
||||
bMiddleSizer->Add( sbClearancesSizer, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
bGeneralSizer->Add( bMiddleSizer, 1, wxEXPAND, 5 );
|
||||
|
||||
|
@ -370,7 +410,7 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
|
|||
|
||||
m_RightBoxSizer->Add( m_LayersSizer, 0, 0, 5 );
|
||||
|
||||
bGeneralSizer->Add( m_RightBoxSizer, 0, wxBOTTOM|wxRIGHT, 5 );
|
||||
bGeneralSizer->Add( m_RightBoxSizer, 0, wxBOTTOM|wxRIGHT|wxEXPAND, 5 );
|
||||
|
||||
m_MainSizer->Add( bGeneralSizer, 1, wxEXPAND, 5 );
|
||||
|
||||
|
@ -380,7 +420,7 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
|
|||
m_sdbSizer1Cancel = new wxButton( this, wxID_CANCEL );
|
||||
m_sdbSizer1->AddButton( m_sdbSizer1Cancel );
|
||||
m_sdbSizer1->Realize();
|
||||
m_MainSizer->Add( m_sdbSizer1, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 );
|
||||
m_MainSizer->Add( m_sdbSizer1, 0, wxTOP|wxBOTTOM|wxEXPAND, 5 );
|
||||
|
||||
this->SetSizer( m_MainSizer );
|
||||
this->Layout();
|
||||
|
@ -388,10 +428,36 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
|
|||
this->Centre( wxBOTH );
|
||||
|
||||
// Connect Events
|
||||
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_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_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_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_ShapeDelta_X_Ctrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||
m_ShapeDelta_Y_Ctrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), 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_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_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_PadType->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadTypeSelected ), NULL, this );
|
||||
m_PadLayerCmp->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerCu->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerAdhCmp->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerAdhCu->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerPateCmp->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerPateCu->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerSilkCmp->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerSilkCu->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerMaskCmp->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerMaskCu->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerDraft->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerECO1->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerECO2->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), 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 );
|
||||
}
|
||||
|
@ -399,10 +465,36 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
|
|||
DIALOG_PAD_PROPERTIES_BASE::~DIALOG_PAD_PROPERTIES_BASE()
|
||||
{
|
||||
// Disconnect Events
|
||||
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_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_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_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_ShapeDelta_X_Ctrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
|
||||
m_ShapeDelta_Y_Ctrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), 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_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_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_PadType->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadTypeSelected ), NULL, this );
|
||||
m_PadLayerCmp->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerCu->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerAdhCmp->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerAdhCu->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerPateCmp->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerPateCu->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerSilkCmp->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerSilkCu->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerMaskCmp->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerMaskCu->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerDraft->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerECO1->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), NULL, this );
|
||||
m_PadLayerECO2->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayer ), 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 );
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
<property name="minimum_size"></property>
|
||||
<property name="name">DIALOG_PAD_PROPERTIES_BASE</property>
|
||||
<property name="pos"></property>
|
||||
<property name="size">673,488</property>
|
||||
<property name="size">733,486</property>
|
||||
<property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
|
||||
<property name="subclass"></property>
|
||||
<property name="title">Pad Properties</property>
|
||||
|
@ -86,7 +86,7 @@
|
|||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM|wxLEFT</property>
|
||||
<property name="flag">wxBOTTOM|wxLEFT|wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<property name="minimum_size"></property>
|
||||
|
@ -192,7 +192,7 @@
|
|||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnText">OnValuesChanged</event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
|
@ -298,7 +298,7 @@
|
|||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnText">OnValuesChanged</event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
|
@ -321,7 +321,7 @@
|
|||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxFlexGridSizer" expanded="1">
|
||||
<object class="wxFlexGridSizer" expanded="0">
|
||||
<property name="cols">3</property>
|
||||
<property name="flexible_direction">wxBOTH</property>
|
||||
<property name="growablecols"></property>
|
||||
|
@ -893,7 +893,7 @@
|
|||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnText">OnValuesChanged</event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
|
@ -1050,7 +1050,7 @@
|
|||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnText">OnValuesChanged</event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
|
@ -1354,7 +1354,7 @@
|
|||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnText">OnValuesChanged</event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
|
@ -1511,7 +1511,7 @@
|
|||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnText">OnValuesChanged</event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
|
@ -1668,7 +1668,7 @@
|
|||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnText">OnValuesChanged</event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
|
@ -1825,7 +1825,7 @@
|
|||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnText">OnValuesChanged</event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
|
@ -1982,7 +1982,7 @@
|
|||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnText">OnValuesChanged</event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
|
@ -2139,7 +2139,7 @@
|
|||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnText">OnValuesChanged</event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
|
@ -2215,7 +2215,7 @@
|
|||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bMiddleUpperSizer</property>
|
||||
|
@ -2224,7 +2224,7 @@
|
|||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM</property>
|
||||
<property name="proportion">1</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">m_DrillShapeBoxSizer</property>
|
||||
|
@ -2286,7 +2286,7 @@
|
|||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
<property name="flag">wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxRadioBox" expanded="1">
|
||||
<property name="bg"></property>
|
||||
|
@ -2342,7 +2342,7 @@
|
|||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
|
||||
<property name="flag">wxBOTTOM</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<property name="minimum_size"></property>
|
||||
|
@ -2355,7 +2355,7 @@
|
|||
<property name="proportion">0</property>
|
||||
<object class="wxRadioBox" expanded="1">
|
||||
<property name="bg"></property>
|
||||
<property name="choices">"0" "90" "-90" "180" "User"</property>
|
||||
<property name="choices">"0" "90" "-90" "180" "Custom"</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
|
@ -2502,7 +2502,7 @@
|
|||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnText">OnValuesChanged</event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
|
@ -2511,11 +2511,346 @@
|
|||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxPanel" expanded="1">
|
||||
<property name="bg">0,0,0</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="font"></property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">m_panelShowPad</property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pos"></property>
|
||||
<property name="size"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style">wxFULL_REPAINT_ON_RESIZE|wxSIMPLE_BORDER|wxTAB_TRAVERSAL</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint">OnPaintShowPanel</event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticBoxSizer" expanded="1">
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Footprint orientation</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">sbSizeModuleInfo</property>
|
||||
<property name="orient">wxHORIZONTAL</property>
|
||||
<property name="permission">none</property>
|
||||
<event name="OnUpdateUI"></event>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxFlexGridSizer" expanded="1">
|
||||
<property name="cols">2</property>
|
||||
<property name="flexible_direction">wxBOTH</property>
|
||||
<property name="growablecols">1</property>
|
||||
<property name="growablerows"></property>
|
||||
<property name="hgap">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">fgSizer4</property>
|
||||
<property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
|
||||
<property name="permission">none</property>
|
||||
<property name="rows">2</property>
|
||||
<property name="vgap">0</property>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_RIGHT|wxTOP|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="bg"></property>
|
||||
<property name="context_help"></property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="font"></property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Rotation:</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">m_staticTitleModuleRot</property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pos"></property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxTOP|wxRIGHT|wxLEFT|wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="bg"></property>
|
||||
<property name="context_help"></property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="font"></property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">m_staticModuleRotValue</property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pos"></property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxALIGN_RIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="bg"></property>
|
||||
<property name="context_help"></property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="font"></property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Board side:</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">m_staticTitleModuleSide</property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pos"></property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="bg"></property>
|
||||
<property name="context_help"></property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="font"></property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Front side</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">m_staticModuleSideValue</property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pos"></property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="bg"></property>
|
||||
<property name="context_help"></property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="font">,90,92,-1,70,0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Warning:
This pad is flipped on board.
Back and front layers will be swapped.</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">m_staticTextWarningPadFlipped</property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pos"></property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticBoxSizer" expanded="1">
|
||||
<property name="id">wxID_ANY</property>
|
||||
|
@ -2540,7 +2875,7 @@
|
|||
<property name="label">Set these values to 0
to use Parent footprint or global values</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">m_staticText20</property>
|
||||
<property name="name">m_staticTextWarning</property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pos"></property>
|
||||
<property name="size"></property>
|
||||
|
@ -2691,7 +3026,7 @@
|
|||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnText">OnValuesChanged</event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
|
@ -2751,7 +3086,7 @@
|
|||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxALL</property>
|
||||
<property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticLine" expanded="1">
|
||||
<property name="bg"></property>
|
||||
|
@ -2800,7 +3135,7 @@
|
|||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND | wxALL</property>
|
||||
<property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticLine" expanded="1">
|
||||
<property name="bg"></property>
|
||||
|
@ -2849,7 +3184,7 @@
|
|||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND | wxALL</property>
|
||||
<property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticLine" expanded="1">
|
||||
<property name="bg"></property>
|
||||
|
@ -3375,7 +3710,7 @@
|
|||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM|wxRIGHT</property>
|
||||
<property name="flag">wxBOTTOM|wxRIGHT|wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxBoxSizer" expanded="0">
|
||||
<property name="minimum_size"></property>
|
||||
|
@ -3475,7 +3810,7 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnCheckBox"></event>
|
||||
<event name="OnCheckBox">OnSetLayer</event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
|
@ -3527,7 +3862,7 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnCheckBox"></event>
|
||||
<event name="OnCheckBox">OnSetLayer</event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
|
@ -3589,7 +3924,7 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnCheckBox"></event>
|
||||
<event name="OnCheckBox">OnSetLayer</event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
|
@ -3641,7 +3976,7 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnCheckBox"></event>
|
||||
<event name="OnCheckBox">OnSetLayer</event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
|
@ -3693,7 +4028,7 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnCheckBox"></event>
|
||||
<event name="OnCheckBox">OnSetLayer</event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
|
@ -3745,7 +4080,7 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnCheckBox"></event>
|
||||
<event name="OnCheckBox">OnSetLayer</event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
|
@ -3797,7 +4132,7 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnCheckBox"></event>
|
||||
<event name="OnCheckBox">OnSetLayer</event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
|
@ -3849,7 +4184,7 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnCheckBox"></event>
|
||||
<event name="OnCheckBox">OnSetLayer</event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
|
@ -3901,7 +4236,7 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnCheckBox"></event>
|
||||
<event name="OnCheckBox">OnSetLayer</event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
|
@ -3953,7 +4288,7 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnCheckBox"></event>
|
||||
<event name="OnCheckBox">OnSetLayer</event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
|
@ -4005,7 +4340,7 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnCheckBox"></event>
|
||||
<event name="OnCheckBox">OnSetLayer</event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
|
@ -4057,7 +4392,7 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnCheckBox"></event>
|
||||
<event name="OnCheckBox">OnSetLayer</event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
|
@ -4109,7 +4444,7 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnCheckBox"></event>
|
||||
<event name="OnCheckBox">OnSetLayer</event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
|
@ -4142,7 +4477,7 @@
|
|||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxTOP|wxBOTTOM</property>
|
||||
<property name="flag">wxTOP|wxBOTTOM|wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStdDialogButtonSizer" expanded="1">
|
||||
<property name="Apply">0</property>
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <wx/sizer.h>
|
||||
#include <wx/statbox.h>
|
||||
#include <wx/radiobox.h>
|
||||
#include <wx/panel.h>
|
||||
#include <wx/checkbox.h>
|
||||
#include <wx/button.h>
|
||||
#include <wx/dialog.h>
|
||||
|
@ -92,7 +93,13 @@ class DIALOG_PAD_PROPERTIES_BASE : public wxDialog
|
|||
wxRadioBox* m_PadOrient;
|
||||
wxStaticText* m_PadOrientText;
|
||||
wxTextCtrl* m_PadOrientCtrl;
|
||||
wxStaticText* m_staticText20;
|
||||
wxPanel* m_panelShowPad;
|
||||
wxStaticText* m_staticTitleModuleRot;
|
||||
wxStaticText* m_staticModuleRotValue;
|
||||
wxStaticText* m_staticTitleModuleSide;
|
||||
wxStaticText* m_staticModuleSideValue;
|
||||
wxStaticText* m_staticTextWarningPadFlipped;
|
||||
wxStaticText* m_staticTextWarning;
|
||||
wxStaticText* m_staticTextNetClearance;
|
||||
wxTextCtrl* m_NetClearanceValueCtrl;
|
||||
wxStaticText* m_NetClearanceUnits;
|
||||
|
@ -128,16 +135,19 @@ class DIALOG_PAD_PROPERTIES_BASE : public wxDialog
|
|||
wxButton* m_sdbSizer1Cancel;
|
||||
|
||||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void OnValuesChanged( wxCommandEvent& event ){ event.Skip(); }
|
||||
virtual void OnPadShapeSelection( wxCommandEvent& event ){ event.Skip(); }
|
||||
virtual void OnDrillShapeSelected( wxCommandEvent& event ){ event.Skip(); }
|
||||
virtual void PadOrientEvent( wxCommandEvent& event ){ event.Skip(); }
|
||||
virtual void OnPaintShowPanel( wxPaintEvent& event ){ event.Skip(); }
|
||||
virtual void PadTypeSelected( wxCommandEvent& event ){ event.Skip(); }
|
||||
virtual void OnSetLayer( wxCommandEvent& event ){ event.Skip(); }
|
||||
virtual void OnCancelButtonClick( wxCommandEvent& event ){ event.Skip(); }
|
||||
virtual void PadPropertiesAccept( wxCommandEvent& event ){ event.Skip(); }
|
||||
|
||||
|
||||
public:
|
||||
DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWindowID id = wxID_DIALOG_EDIT_PAD, const wxString& title = _("Pad Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 673,488 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxSUNKEN_BORDER );
|
||||
DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWindowID id = wxID_DIALOG_EDIT_PAD, const wxString& title = _("Pad Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 733,486 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxSUNKEN_BORDER );
|
||||
~DIALOG_PAD_PROPERTIES_BASE();
|
||||
|
||||
};
|
||||
|
|
|
@ -291,7 +291,7 @@ void WinEDA_PcbFrame::ReCreateMenuBar()
|
|||
/* Swap Layers */
|
||||
item = new wxMenuItem( editMenu, ID_MENU_PCB_SWAP_LAYERS,
|
||||
_( "&Swap Layers" ),
|
||||
_( "Swap tracks on copper layers or drawings on others layers" ) );
|
||||
_( "Swap tracks on copper layers or drawings on other layers" ) );
|
||||
item->SetBitmap( swap_layer_xpm );
|
||||
editMenu->Append( item );
|
||||
|
||||
|
@ -309,7 +309,7 @@ void WinEDA_PcbFrame::ReCreateMenuBar()
|
|||
* From hotkeys, zooming is made around the mouse cursor position
|
||||
* (obviously not possible from the toolbar or menubar command)
|
||||
*
|
||||
* in others words HK_ZOOM_IN and HK_ZOOM_OUT *are NOT* accelerators
|
||||
* in other words HK_ZOOM_IN and HK_ZOOM_OUT *are NOT* accelerators
|
||||
* for Zoom in and Zoom out sub menus
|
||||
*/
|
||||
/* Zoom in */
|
||||
|
|
Loading…
Reference in New Issue