Fixed some issues about trapezoidal pads. Better pad editor dialog. fixed other (very) minor bugs. Code cleaning

This commit is contained in:
jean-pierre charras 2010-09-11 18:33:43 +02:00
parent 0c3541b7c1
commit 658ca2a21e
23 changed files with 1565 additions and 845 deletions

View File

@ -29,7 +29,6 @@
double s_HerscheyScaleFactor = HERSHEY_SCALE_FACTOR; double s_HerscheyScaleFactor = HERSHEY_SCALE_FACTOR;
/** Function GetPensizeForBold /** Function GetPensizeForBold
* @return the "best" value for a pen size to draw/plot a bold text * @return the "best" value for a pen size to draw/plot a bold text
* @param aTextSize = the char size (height or width) * @param aTextSize = the char size (height or width)
@ -62,14 +61,15 @@ int Clamp_Text_PenSize( int aPenSize, int aSize, bool aBold )
return penSize; return penSize;
} }
int Clamp_Text_PenSize( int aPenSize, wxSize aSize, bool aBold ) int Clamp_Text_PenSize( int aPenSize, wxSize aSize, bool aBold )
{ {
int size = MIN( ABS( aSize.x ), ABS( aSize.y ) ); 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. /* Functions to draw / plot a string.
* texts have only one line. * texts have only one line.
* They can be in italic. * They can be in italic.
@ -97,7 +97,6 @@ int NegableTextLength( const wxString& aText )
} }
/* Function GetHersheyShapeDescription() /* Function GetHersheyShapeDescription()
* return a pointer to the shape corresponding to unicode value AsciiCode * return a pointer to the shape corresponding to unicode value AsciiCode
* Note we use the same font for Bold and Normal texts * Note we use the same font for Bold and Normal texts
@ -108,6 +107,7 @@ static const char* GetHersheyShapeDescription( int AsciiCode )
{ {
/* calculate font length */ /* calculate font length */
int font_length_max = newstroke_font_bufsize; int font_length_max = newstroke_font_bufsize;
if( AsciiCode >= (32 + font_length_max) ) if( AsciiCode >= (32 + font_length_max) )
AsciiCode = '?'; AsciiCode = '?';
if( AsciiCode < 32 ) if( AsciiCode < 32 )
@ -150,7 +150,7 @@ int ReturnGraphicTextWidth( const wxString& aText, int aXSize, bool aItalic, boo
/* Helper function for drawing character polygons */ /* Helper function for drawing character polygons */
static void DrawGraphicTextPline( static void DrawGraphicTextPline(
WinEDA_DrawPanel* aPanel, EDA_Rect* aClipBox,
wxDC* aDC, wxDC* aDC,
EDA_Colors aColor, EDA_Colors aColor,
int aWidth, int aWidth,
@ -167,6 +167,7 @@ static void DrawGraphicTextPline(
{ {
plotter->line_to( coord[ik] ); plotter->line_to( coord[ik] );
} }
plotter->pen_finish(); plotter->pen_finish();
} }
else if( aCallback ) else if( aCallback )
@ -180,11 +181,11 @@ static void DrawGraphicTextPline(
else if( sketch_mode ) else if( sketch_mode )
{ {
for( int ik = 0; ik < (point_count - 1); ik++ ) 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 ); coord[ik + 1].x, coord[ik + 1].y, aWidth, aColor );
} }
else else
GRPoly( &aPanel->m_ClipBox, aDC, point_count, coord, 0, GRPoly( aClipBox, aDC, point_count, coord, 0,
aWidth, aColor, aColor ); aWidth, aColor, aColor );
} }
@ -240,8 +241,9 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
wxPoint overbar_pos; // Start point for the current overbar wxPoint overbar_pos; // Start point for the current overbar
int overbars; // Number of ~ seen int overbars; // Number of ~ seen
int overbar_italic_comp; // Italic compensation for overbar 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 #define BUF_SIZE 100
wxPoint coord[BUF_SIZE + 1]; // Buffer coordinate used to draw polylines (one char shape) wxPoint coord[BUF_SIZE + 1]; // Buffer coordinate used to draw polylines (one char shape)
bool sketch_mode = false; bool sketch_mode = false;
@ -347,7 +349,8 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
RotatePoint( &current_char_pos, aPos, aOrient ); RotatePoint( &current_char_pos, aPos, aOrient );
RotatePoint( &end, aPos, aOrient ); RotatePoint( &end, aPos, aOrient );
if( plotter ) { if( plotter )
{
plotter->move_to( current_char_pos ); plotter->move_to( current_char_pos );
plotter->finish_to( end ); plotter->finish_to( end );
} }
@ -402,7 +405,7 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
RotatePoint( &overbar_pos, aPos, aOrient ); RotatePoint( &overbar_pos, aPos, aOrient );
coord[1] = overbar_pos; coord[1] = overbar_pos;
/* Plot the overbar segment */ /* Plot the overbar segment */
DrawGraphicTextPline( aPanel, aDC, aColor, aWidth, DrawGraphicTextPline( clipBox, aDC, aColor, aWidth,
sketch_mode, 2, coord, aCallback, plotter ); sketch_mode, 2, coord, aCallback, plotter );
} }
continue; /* Skip ~ processing */ continue; /* Skip ~ processing */
@ -426,12 +429,13 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
} }
else else
{ {
/* End of character, insert a synthetic pen up */ // End of character, insert a synthetic pen up:
hc1 = ' '; hc1 = ' ';
hc2 = 'R'; hc2 = 'R';
endcar = true; 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 */ /* Pen up request */
if( hc1 == -50 && hc2 == 0 ) if( hc1 == -50 && hc2 == 0 )
@ -440,7 +444,7 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
{ {
if( aWidth <= 1 ) if( aWidth <= 1 )
aWidth = 0; aWidth = 0;
DrawGraphicTextPline( aPanel, aDC, aColor, aWidth, DrawGraphicTextPline( clipBox, aDC, aColor, aWidth,
sketch_mode, point_count, coord, sketch_mode, point_count, coord,
aCallback, plotter ); aCallback, plotter );
} }
@ -483,7 +487,7 @@ void DrawGraphicText( WinEDA_DrawPanel* aPanel,
RotatePoint( &overbar_pos, aPos, aOrient ); RotatePoint( &overbar_pos, aPos, aOrient );
coord[1] = overbar_pos; coord[1] = overbar_pos;
/* Plot the overbar segment */ /* Plot the overbar segment */
DrawGraphicTextPline( aPanel, aDC, aColor, aWidth, DrawGraphicTextPline( clipBox, aDC, aColor, aWidth,
sketch_mode, 2, coord, aCallback, plotter ); sketch_mode, 2, coord, aCallback, plotter );
} }
} }

View File

@ -1138,6 +1138,9 @@ void GRSCSegm( EDA_Rect* ClipBox,
static bool IsGRSPolyDrawable( EDA_Rect* ClipBox, int n, wxPoint Points[] ) static bool IsGRSPolyDrawable( EDA_Rect* ClipBox, int n, wxPoint Points[] )
{ {
if( ! ClipBox )
return true;
int Xmin, Xmax, Ymin, Ymax; int Xmin, Xmax, Ymin, Ymax;
Xmin = Xmax = Points[0].x; Xmin = Xmax = Points[0].x;

View File

@ -13,11 +13,6 @@
#include "cvpcb.h" #include "cvpcb.h"
#include "protos.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 ); 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" #define NETLIST_HEAD_STRING "EESchema Netlist Version 1.1"
char Line[1024]; char Line[1024];
int netNumber = 1;
DateAndTime( Line ); DateAndTime( Line );
@ -103,9 +97,6 @@ int GenNetlistPcbnew( FILE* file, COMPONENT_LIST& list, bool isEESchemaNetlist,
BOOST_FOREACH( PIN& pin, component.m_Pins ) 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() ) if( !pin.m_Net.IsEmpty() )
fprintf( file, " ( %s %s )\n", fprintf( file, " ( %s %s )\n",
CONV_TO_UTF8( pin.m_Number ), CONV_TO_UTF8( pin.m_Number ),
@ -161,42 +152,3 @@ void WriteFootprintFilterInfos( FILE* file, COMPONENT_LIST& list )
fprintf( file, "$endfootprintlist\n}\n" ); 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;
}
}
}

View File

@ -41,11 +41,6 @@ private:
* orientation. * orientation.
*/ */
public:
//int m_Shape;
//bool m_IsDangling; // TRUE non connected
public: public:
SCH_SHEET_PIN( SCH_SHEET* parent, SCH_SHEET_PIN( SCH_SHEET* parent,
const wxPoint& pos = wxPoint( 0, 0 ), const wxPoint& pos = wxPoint( 0, 0 ),
@ -63,6 +58,19 @@ public:
SCH_SHEET_PIN* GenCopy(); 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() SCH_SHEET_PIN* Next()
{ {
return (SCH_SHEET_PIN*) Pnext; return (SCH_SHEET_PIN*) Pnext;

View File

@ -60,6 +60,22 @@ SCH_SHEET_PIN* SCH_SHEET_PIN::GenCopy()
return newitem; 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 ) void SCH_SHEET_PIN::SwapData( SCH_SHEET_PIN* copyitem )
{ {

View File

@ -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, void SCH_LABEL::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset,
int DrawMode, int Color ) int DrawMode, int Color )
{ {
/*********************************************************************************************/
SCH_TEXT::Draw( panel, DC, offset, DrawMode, 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 /* Hierarchical Label have a text and a graphic icon.
* graphic icon * Texts type have 4 directions, and the text origin is the graphic icon
*/ */
static std::vector <wxPoint> Poly; static std::vector <wxPoint> Poly;
EDA_Colors color; 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() EDA_Rect SCH_HIERLABEL::GetBoundingBox()

View File

@ -93,6 +93,18 @@ public:
int draw_mode, int draw_mode,
int Color = -1 ); 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 SwapData( SCH_TEXT* copyitem );
void Place( WinEDA_SchematicFrame* frame, wxDC* DC ); void Place( WinEDA_SchematicFrame* frame, wxDC* DC );
@ -291,13 +303,13 @@ public:
*/ */
EDA_Rect GetBoundingBox(); EDA_Rect GetBoundingBox();
/** function CreateGraphicShape /** function CreateGraphicShape (virual)
* Calculates the graphic shape (a polygon) associated to the text * Calculates the graphic shape (a polygon) associated to the text
* @param aCorner_list = a buffer to fill with polygon corners coordinates * @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, virtual void CreateGraphicShape( std::vector <wxPoint>& aCorner_list,
const wxPoint& Pos ); const wxPoint& aPos );
/** virtual function Mirror_Y /** virtual function Mirror_Y
* mirror item relative to an Y axis * mirror item relative to an Y axis
@ -355,7 +367,7 @@ public:
* @param aCorner_list = a buffer to fill with polygon corners coordinates * @param aCorner_list = a buffer to fill with polygon corners coordinates
* @param Pos = Postion of the shape * @param Pos = Postion of the shape
*/ */
void CreateGraphicShape( std::vector <wxPoint>& aCorner_list, virtual void CreateGraphicShape( std::vector <wxPoint>& aCorner_list,
const wxPoint& Pos ); const wxPoint& Pos );
/** /**

View File

@ -27,31 +27,30 @@ enum End_Type {
SHEET_LABEL_END 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: public:
const void* m_Item; const void* m_Item; // a pointer to the parent
wxPoint m_Pos; wxPoint m_Pos; // the position of the connecting point
int m_Type; int m_Type; // type of parent
DanglingEndHandle* m_Pnext;
DanglingEndHandle( int type ) DANGLING_END_ITEM( int type, const void* aItem )
{ {
m_Item = NULL; m_Item = aItem;
m_Type = type; m_Type = type;
m_Pnext = NULL;
} }
}; };
DanglingEndHandle* ItemList; static void TestWireForDangling( std::vector <DANGLING_END_ITEM>& aItemList,
SCH_LINE* DrawRef,
static void TestWireForDangling( SCH_LINE* DrawRef,
WinEDA_SchematicFrame* frame, WinEDA_SchematicFrame* frame,
wxDC* DC ); wxDC* aDC );
void TestLabelForDangling( SCH_TEXT* label, void TestLabelForDangling( std::vector <DANGLING_END_ITEM>& aItemList,
WinEDA_SchematicFrame* frame, SCH_TEXT* aLabel,
wxDC* DC ); WinEDA_SchematicFrame* aFrame,
DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList ); wxDC* aDC );
void RebuildEndPointsList( std::vector <DANGLING_END_ITEM>& aItemList, SCH_ITEM* aDrawList );
/* Returns true if the point P is on the segment S. */ /* 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 ) void WinEDA_SchematicFrame::TestDanglingEnds( SCH_ITEM* DrawList, wxDC* DC )
{ {
if( ItemList ) // this list is static to avoid many useles memory allocation.
{ std::vector <DANGLING_END_ITEM> itemList;
const DanglingEndHandle* DanglingItem;
const DanglingEndHandle* nextitem;
for( DanglingItem = ItemList; RebuildEndPointsList( itemList, DrawList );
DanglingItem != NULL;
DanglingItem = nextitem )
{
nextitem = DanglingItem->m_Pnext;
SAFE_DELETE( DanglingItem );
}
}
ItemList = RebuildEndList( DrawList );
for( SCH_ITEM* item = DrawList; item; item = item->Next() ) 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_GLOBALLABEL:
case TYPE_SCH_HIERLABEL: case TYPE_SCH_HIERLABEL:
case TYPE_SCH_LABEL: case TYPE_SCH_LABEL:
TestLabelForDangling( (SCH_LABEL*) item, this, DC ); TestLabelForDangling( itemList, (SCH_LABEL*) item, this, DC );
break; break;
case DRAW_SHEET_STRUCT_TYPE: case DRAW_SHEET_STRUCT_TYPE:
{
SCH_SHEET* sheet = (SCH_SHEET*) item;
// Read the hierarchical pins list and teast for dangling pins: // Read the hierarchical pins list and teast for dangling pins:
BOOST_FOREACH( SCH_SHEET_PIN & sheetPin, ( (SCH_SHEET*) item )->GetSheetPins() ) { BOOST_FOREACH( SCH_SHEET_PIN & pinsheet, sheet->GetSheetPins() )
TestLabelForDangling( &sheetPin, this, DC ); {
TestLabelForDangling( itemList, &pinsheet, this, DC );
}
} }
break; break;
@ -113,7 +104,7 @@ void WinEDA_SchematicFrame::TestDanglingEnds( SCH_ITEM* DrawList, wxDC* DC )
#define STRUCT ( (SCH_LINE*) item ) #define STRUCT ( (SCH_LINE*) item )
if( STRUCT->GetLayer() == LAYER_WIRE ) if( STRUCT->GetLayer() == LAYER_WIRE )
{ {
TestWireForDangling( STRUCT, this, DC ); TestWireForDangling( itemList, STRUCT, this, DC );
break; break;
} }
if( STRUCT->GetLayer() == LAYER_NOTES ) 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 ) wxDC* DC )
{ {
DanglingEndHandle* terminal_item;
bool Sdangstate = true, Edangstate = true; bool Sdangstate = true, Edangstate = true;
for( terminal_item = ItemList; terminal_item != NULL; BOOST_FOREACH( DANGLING_END_ITEM terminal_item, aItemList )
terminal_item = terminal_item->m_Pnext )
{ {
if( terminal_item->m_Item == DrawRef ) if( terminal_item.m_Item == DrawRef )
continue; continue;
if( (DrawRef->m_Start.x == terminal_item->m_Pos.x) if( DrawRef->m_Start == terminal_item.m_Pos )
&& (DrawRef->m_Start.y == terminal_item->m_Pos.y) )
Sdangstate = false; Sdangstate = false;
if( (DrawRef->m_End.x == terminal_item->m_Pos.x) if( DrawRef->m_End == terminal_item.m_Pos )
&& (DrawRef->m_End.y == terminal_item->m_Pos.y) )
Edangstate = false; Edangstate = false;
if( (Sdangstate == false) && (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, void TestLabelForDangling( std::vector <DANGLING_END_ITEM>& aItemList,
wxDC* DC ) SCH_TEXT* aLabel,
WinEDA_SchematicFrame* aFrame,
wxDC* aDC )
{ {
DanglingEndHandle* terminal_item;
bool dangstate = true; bool dangstate = true;
for( terminal_item = ItemList; terminal_item != NULL; for( unsigned ii = 0; ii < aItemList.size(); ii++ )
terminal_item = terminal_item->m_Pnext )
{ {
if( terminal_item->m_Item == label ) DANGLING_END_ITEM & terminal_item = aItemList[ii];
if( terminal_item.m_Item == aLabel )
continue; continue;
switch( terminal_item->m_Type ) switch( terminal_item.m_Type )
{ {
case PIN_END: case PIN_END:
case LABEL_END: case LABEL_END:
case SHEET_LABEL_END: case SHEET_LABEL_END:
if( ( label->m_Pos.x == terminal_item->m_Pos.x ) if( aLabel->m_Pos == terminal_item.m_Pos )
&& ( label->m_Pos.y == terminal_item->m_Pos.y ) )
dangstate = false; dangstate = false;
break; break;
case WIRE_START_END: case WIRE_START_END:
case BUS_START_END: case BUS_START_END:
dangstate = !SegmentIntersect( terminal_item->m_Pos, {
terminal_item->m_Pnext->m_Pos, // these schematic items have created 2 DANGLING_END_ITEM
label->m_Pos ); // one per end.
terminal_item = terminal_item->m_Pnext; ii++;
DANGLING_END_ITEM & next_terminal = aItemList[ii];
dangstate = !SegmentIntersect( terminal_item.m_Pos,
next_terminal.m_Pos,
aLabel->m_Pos );
}
break; break;
case UNKNOWN: case UNKNOWN:
@ -245,13 +240,13 @@ void TestLabelForDangling( SCH_TEXT* label, WinEDA_SchematicFrame* frame,
break; break;
} }
if( dangstate != label->m_IsDangling ) if( dangstate != aLabel->m_IsDangling )
{ {
if( DC ) if( aDC )
RedrawOneStruct( frame->DrawPanel, DC, label, g_XorMode ); RedrawOneStruct( aFrame->DrawPanel, aDC, aLabel, g_XorMode );
label->m_IsDangling = dangstate; aLabel->m_IsDangling = dangstate;
if( DC ) if( aDC )
RedrawOneStruct( frame->DrawPanel, DC, label, GR_DEFAULT_DRAWMODE ); 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; SCH_ITEM* schItem;
EDA_BaseStruct* DrawItem;
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_LABEL:
case TYPE_SCH_GLOBALLABEL: case TYPE_SCH_GLOBALLABEL:
case TYPE_SCH_HIERLABEL: case TYPE_SCH_HIERLABEL:
{
#undef STRUCT #undef STRUCT
#define STRUCT ( (SCH_LABEL*) DrawItem ) #define STRUCT ( (SCH_LABEL*) schItem )
item = new DanglingEndHandle( LABEL_END ); DANGLING_END_ITEM item( LABEL_END, schItem );
item.m_Pos = STRUCT->m_Pos;
item->m_Item = DrawItem; aItemList.push_back( item );
item->m_Pos = STRUCT->m_Pos; }
if( lastitem )
lastitem->m_Pnext = item;
else
StartList = item;
lastitem = item;
break; break;
case DRAW_SEGMENT_STRUCT_TYPE: case DRAW_SEGMENT_STRUCT_TYPE:
#undef STRUCT #undef STRUCT
#define STRUCT ( (SCH_LINE*) DrawItem ) #define STRUCT ( (SCH_LINE*) schItem )
if( STRUCT->GetLayer() == LAYER_NOTES ) if( STRUCT->GetLayer() == LAYER_NOTES )
break; break;
if( ( STRUCT->GetLayer() == LAYER_BUS ) if( ( STRUCT->GetLayer() == LAYER_BUS )
|| (STRUCT->GetLayer() == LAYER_WIRE ) ) || (STRUCT->GetLayer() == LAYER_WIRE ) )
{ {
item = new DanglingEndHandle( DANGLING_END_ITEM item( (STRUCT->GetLayer() == LAYER_BUS) ?
(STRUCT->GetLayer() == LAYER_BUS) ? BUS_START_END : WIRE_START_END, schItem );
BUS_START_END : WIRE_START_END ); 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; aItemList.push_back( item );
item->m_Pos = STRUCT->m_Start; aItemList.push_back( item1 );
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;
} }
break; break;
case DRAW_JUNCTION_STRUCT_TYPE: case DRAW_JUNCTION_STRUCT_TYPE:
{
#undef STRUCT #undef STRUCT
#define STRUCT ( (SCH_JUNCTION*) DrawItem ) #define STRUCT ( (SCH_JUNCTION*) schItem )
item = new DanglingEndHandle( JUNCTION_END ); DANGLING_END_ITEM item( JUNCTION_END, schItem );
item.m_Pos = STRUCT->m_Pos;
item->m_Item = DrawItem; aItemList.push_back( item );
item->m_Pos = STRUCT->m_Pos; }
if( lastitem )
lastitem->m_Pnext = item;
else
StartList = item;
lastitem = item;
break; break;
case DRAW_BUSENTRY_STRUCT_TYPE: case DRAW_BUSENTRY_STRUCT_TYPE:
{
#undef STRUCT #undef STRUCT
#define STRUCT ( (SCH_BUS_ENTRY*) DrawItem ) #define STRUCT ( (SCH_BUS_ENTRY*) schItem )
item = new DanglingEndHandle( ENTRY_END ); DANGLING_END_ITEM item( ENTRY_END, schItem );
item.m_Pos = STRUCT->m_Pos;
item->m_Item = DrawItem; DANGLING_END_ITEM item1( ENTRY_END, schItem );
item->m_Pos = STRUCT->m_Pos; item1.m_Pos = STRUCT->m_End();
if( lastitem ) aItemList.push_back( item );
lastitem->m_Pnext = item; aItemList.push_back( item1 );
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;
break; break;
case TYPE_SCH_COMPONENT: case TYPE_SCH_COMPONENT:
{ {
#undef STRUCT #undef STRUCT
#define STRUCT ( (SCH_COMPONENT*) DrawItem ) #define STRUCT ( (SCH_COMPONENT*) schItem )
LIB_COMPONENT* Entry; LIB_COMPONENT* Entry;
Entry = CMP_LIBRARY::FindLibraryComponent( STRUCT->m_ChipName ); Entry = CMP_LIBRARY::FindLibraryComponent( STRUCT->m_ChipName );
if( Entry == NULL ) if( Entry == NULL )
@ -384,15 +356,9 @@ DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList )
&& ( STRUCT->m_Convert != Pin->m_Convert ) ) && ( STRUCT->m_Convert != Pin->m_Convert ) )
continue; continue;
item = new DanglingEndHandle( PIN_END ); DANGLING_END_ITEM item( PIN_END, Pin );
item.m_Pos = ReturnPinPhysicalPosition( Pin, STRUCT );
item->m_Item = Pin; aItemList.push_back( item );
item->m_Pos = ReturnPinPhysicalPosition( Pin, STRUCT );
if( lastitem )
lastitem->m_Pnext = item;
else
StartList = item;
lastitem = item;
} }
break; break;
@ -400,21 +366,18 @@ DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList )
case DRAW_SHEET_STRUCT_TYPE: 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 ); wxASSERT( pinsheet.Type() == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE );
item = new DanglingEndHandle( SHEET_LABEL_END ); DANGLING_END_ITEM item( SHEET_LABEL_END, &pinsheet );
item->m_Item = &pinsheet; item.m_Pos = pinsheet.m_Pos;
item->m_Pos = pinsheet.m_Pos; aItemList.push_back( item );
if( lastitem )
lastitem->m_Pnext = item;
else
StartList = item;
lastitem = item;
} }
} }
break; break;
@ -423,6 +386,4 @@ DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList )
; ;
} }
} }
return StartList;
} }

View File

@ -107,7 +107,7 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE( wx
m_PanelBasic->SetSizer( bSizerBasicPanel ); m_PanelBasic->SetSizer( bSizerBasicPanel );
m_PanelBasic->Layout(); m_PanelBasic->Layout();
bSizerBasicPanel->Fit( m_PanelBasic ); 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 ); m_PanelDoc = new wxPanel( m_NoteBook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
wxBoxSizer* m_PanelDocBoxSizer; wxBoxSizer* m_PanelDocBoxSizer;
m_PanelDocBoxSizer = new wxBoxSizer( wxVERTICAL ); 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 = new wxStaticText( m_PanelDoc, wxID_ANY, _("Keywords:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextKeywords->Wrap( -1 ); 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 ); 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->SetSizer( m_PanelDocBoxSizer );
m_PanelDoc->Layout(); m_PanelDoc->Layout();
m_PanelDocBoxSizer->Fit( m_PanelDoc ); 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 ); m_PanelAlias = new wxPanel( m_NoteBook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
wxBoxSizer* bSizerMainPanelAlias; wxBoxSizer* bSizerMainPanelAlias;
bSizerMainPanelAlias = new wxBoxSizer( wxHORIZONTAL ); bSizerMainPanelAlias = new wxBoxSizer( wxHORIZONTAL );

View File

@ -128,7 +128,7 @@
<object class="notebookpage" expanded="1"> <object class="notebookpage" expanded="1">
<property name="bitmap"></property> <property name="bitmap"></property>
<property name="label">Options</property> <property name="label">Options</property>
<property name="select">0</property> <property name="select">1</property>
<object class="wxPanel" expanded="1"> <object class="wxPanel" expanded="1">
<property name="bg"></property> <property name="bg"></property>
<property name="context_help"></property> <property name="context_help"></property>
@ -851,7 +851,7 @@
<object class="notebookpage" expanded="1"> <object class="notebookpage" expanded="1">
<property name="bitmap"></property> <property name="bitmap"></property>
<property name="label">Description</property> <property name="label">Description</property>
<property name="select">1</property> <property name="select">0</property>
<object class="wxPanel" expanded="1"> <object class="wxPanel" expanded="1">
<property name="bg"></property> <property name="bg"></property>
<property name="context_help"></property> <property name="context_help"></property>
@ -1026,7 +1026,7 @@
<property name="size"></property> <property name="size"></property>
<property name="style"></property> <property name="style"></property>
<property name="subclass"></property> <property name="subclass"></property>
<property name="tooltip">Enter keys words that can be used to select this composant.&#x0A;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.&#x0A;Key words cannot have spaces and are separated by a space.</property>
<property name="window_extra_style"></property> <property name="window_extra_style"></property>
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style"></property> <property name="window_style"></property>

View File

@ -288,20 +288,10 @@ static void PlotTextStruct( PLOTTER* plotter, SCH_TEXT* aSchText )
aSchText->m_Bold ); aSchText->m_Bold );
/* Draw graphic symbol for global or hierarchical labels */ /* Draw graphic symbol for global or hierarchical labels */
if( aSchText->Type() == TYPE_SCH_GLOBALLABEL ) aSchText->CreateGraphicShape( Poly, aSchText->m_Pos );
{ if( Poly.size() )
( (SCH_GLOBALLABEL*) aSchText )->CreateGraphicShape( Poly,
aSchText->m_Pos );
plotter->poly( Poly.size(), &Poly[0].x, NO_FILL ); 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 );
}
}
static void PlotSheetStruct( PLOTTER* plotter, SCH_SHEET* Struct ) static void PlotSheetStruct( PLOTTER* plotter, SCH_SHEET* Struct )

View File

@ -392,7 +392,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
return; return;
} }
if( !IsOK( this, _( "Do you wish to cleanup this sheet" ) ) ) if( !IsOK( this, _( "Do you wish to cleanup this sheet?" ) ) )
return; return;
/* Save sheet in undo list before cleaning up unreferenced hierarchical labels. */ /* Save sheet in undo list before cleaning up unreferenced hierarchical labels. */

View File

@ -71,11 +71,10 @@ int ChangeSideNumLayer( int oldlayer )
} }
/* Change the mask layer during routing cu / cmp layers for /* Calculate the mask layer when flipping a footprint
* Cu / CMP.. * BACK and FRONT copper layers , mask, paste, solder layers are swapped
* (Copper, mask, paste, solder)
*/ */
static int ChangeSideMaskLayer( int masque ) int ChangeSideMaskLayer( int masque )
{ {
int newmasque; int newmasque;

View File

@ -3,6 +3,7 @@
/***********************************************/ /***********************************************/
#include "fctsys.h" #include "fctsys.h"
#include "PolyLine.h"
#include "common.h" #include "common.h"
#include "confirm.h" #include "confirm.h"
#include "kicad_string.h" #include "kicad_string.h"
@ -176,7 +177,7 @@ void D_PAD::Copy( D_PAD* source )
m_Pos = source->m_Pos; m_Pos = source->m_Pos;
m_Masque_Layer = source->m_Masque_Layer; m_Masque_Layer = source->m_Masque_Layer;
memcpy( m_Padname, source->m_Padname, sizeof(m_Padname) ); m_NumPadName = source->m_NumPadName;
SetNet( source->GetNet() ); SetNet( source->GetNet() );
m_Drill = source->m_Drill; m_Drill = source->m_Drill;
m_DrillShape = source->m_DrillShape; m_DrillShape = source->m_DrillShape;
@ -779,6 +780,23 @@ bool D_PAD::HitTest( const wxPoint& ref_pos )
return true; return true;
break; 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: default:
RotatePoint( &deltaX, &deltaY, -m_Orient ); RotatePoint( &deltaX, &deltaY, -m_Orient );
if( (abs( deltaX ) <= dx ) && (abs( deltaY ) <= dy) ) if( (abs( deltaX ) <= dx ) && (abs( deltaY ) <= dy) )

View File

@ -25,6 +25,28 @@ class Pcb3D_GLCanvas;
#define PAD_HOLE_NOT_PLATED_DEFAULT_LAYERS LAYER_BACK | SILKSCREEN_LAYER_FRONT | \ #define PAD_HOLE_NOT_PLATED_DEFAULT_LAYERS LAYER_BACK | SILKSCREEN_LAYER_FRONT | \
SOLDERMASK_LAYER_BACK | SOLDERMASK_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 class D_PAD : public BOARD_CONNECTED_ITEM
{ {
@ -210,6 +232,22 @@ public:
void Draw3D( Pcb3D_GLCanvas* glcanvas ); 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 // others
void SetPadName( const wxString& name ); // Change pad name void SetPadName( const wxString& name ); // Change pad name
wxString ReturnStringPadName(); // Return pad name as string in a wxString wxString ReturnStringPadName(); // Return pad name as string in a wxString

View File

@ -3,6 +3,7 @@
/*******************************/ /*******************************/
#include "fctsys.h" #include "fctsys.h"
#include "gr_basic.h" #include "gr_basic.h"
#include "common.h" #include "common.h"
#include "trigo.h" #include "trigo.h"
@ -20,27 +21,38 @@
* After testing this feature,I am not sure this is a good idea * After testing this feature,I am not sure this is a good idea
* but the code is left here. * but the code is left here.
*/ */
//#define SHOW_PADMASK_REAL_SIZE_AND_COLOR //#define SHOW_PADMASK_REAL_SIZE_AND_COLOR
/** Draw a pad:
* @param DC = device context // Helper class to store parameters used to draw a pad
* @param offset = draw offset PAD_DRAWINFO::PAD_DRAWINFO( )
* @param draw_mode = mode: GR_OR, GR_XOR, GR_AND... {
*/ m_DrawPanel = NULL;
void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode, m_DrawMode = 0;
const wxPoint& offset ) 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 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 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 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 * 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 ) if( m_Flags & DO_NOT_DRAW )
return; return;
PAD_DRAWINFO drawInfo;
drawInfo.m_Offset = aOffset;
/* We can show/hide pads from the layer manager. /* We can show/hide pads from the layer manager.
* options are show/hide pads on front and/or back side of the board * 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. * For through pads, we hide them only if both sides are hidden.
@ -90,14 +106,16 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
return; return;
WinEDA_BasePcbFrame* frame = (WinEDA_BasePcbFrame*) panel->GetParent(); WinEDA_BasePcbFrame* frame = (WinEDA_BasePcbFrame*) aPanel->GetParent();
PCB_SCREEN* screen = frame->GetScreen(); PCB_SCREEN* screen = frame->GetScreen();
if( frame->m_DisplayPadFill == FILLED ) if( frame->m_DisplayPadFill == FILLED )
fillpad = 1; drawInfo.m_ShowPadFilled = true;
else
drawInfo.m_ShowPadFilled = false;
#if defined(PCBNEW) || defined(__WXMAC__) #if defined(PCBNEW) || defined(__WXMAC__)
if( m_Flags & IS_MOVED || !DisplayOpt.DisplayPadFill ) if( m_Flags & IS_MOVED || !DisplayOpt.DisplayPadFill )
fillpad = 0; drawInfo.m_ShowPadFilled = false;
#endif #endif
if( m_Masque_Layer & LAYER_FRONT ) if( m_Masque_Layer & LAYER_FRONT )
@ -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; color &= ~HIGHT_LIGHT_FLAG;
else else
color |= HIGHT_LIGHT_FLAG; 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 ) if( color & HIGHT_LIGHT_FLAG )
color = ColorRefs[color & MASKCOLOR].m_LightColor; 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; bool DisplayIsol = DisplayOpt.DisplayPadIsol;
if( ( m_Masque_Layer & ALL_CU_LAYERS ) == 0 ) if( ( m_Masque_Layer & ALL_CU_LAYERS ) == 0 )
DisplayIsol = FALSE; 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 ); SetAlpha( &color, 170 );
/* Get the pad clearance. This has a meaning only for Pcbnew. /* Get the pad clearance. This has a meaning only for Pcbnew.
@ -321,126 +335,125 @@ 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 * there is no net classes so a call to GetClearance() is made only when
* needed (never needed in Cvpcb nor in Gerbview) * 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() ) switch( GetShape() )
{ {
case PAD_CIRCLE: case PAD_CIRCLE:
if( fillpad ) if( aDrawInfo.m_ShowPadFilled )
GRFilledCircle( &panel->m_ClipBox, DC, xc, yc, GRFilledCircle( aClipBox, aDC, shape_pos.x, shape_pos.y,
dx + mask_margin.x, 0, color, color ); halfsize.x + aDrawInfo.m_Mask_margin.x, 0,
aDrawInfo.m_Color, aDrawInfo.m_Color );
else else
GRCircle( &panel->m_ClipBox, DC, xc, yc, dx + mask_margin.x, GRCircle( aClipBox, aDC, shape_pos.x, shape_pos.y,
m_PadSketchModePenSize, color ); halfsize.x + aDrawInfo.m_Mask_margin.x,
m_PadSketchModePenSize, aDrawInfo.m_Color );
if( DisplayIsol ) if( aDrawInfo.m_PadClearance )
{ {
GRCircle( &panel->m_ClipBox, GRCircle( aClipBox,
DC, aDC, shape_pos.x, shape_pos.y,
xc, halfsize.x + aDrawInfo.m_PadClearance,
yc,
dx + padClearance,
0, 0,
color ); aDrawInfo.m_Color );
} }
break; break;
case PAD_OVAL: 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; delta_cy = 0;
rotdx = m_Size.y + ( mask_margin.y * 2 ); rotdx = m_Size.y + ( aDrawInfo.m_Mask_margin.y * 2 );
} }
else /* vertical */ else /* vertical */
{ {
delta_cx = 0; delta_cx = 0;
delta_cy = dy - dx; delta_cy = halfsize.y - halfsize.x;
rotdx = m_Size.x + ( mask_margin.x * 2 ); rotdx = m_Size.x + ( aDrawInfo.m_Mask_margin.x * 2 );
} }
RotatePoint( &delta_cx, &delta_cy, angle ); RotatePoint( &delta_cx, &delta_cy, angle );
if( fillpad ) if( aDrawInfo.m_ShowPadFilled )
{ {
GRFillCSegm( &panel->m_ClipBox, DC, GRFillCSegm( aClipBox, aDC,
ux0 + delta_cx, uy0 + delta_cy, shape_pos.x + delta_cx, shape_pos.y + delta_cy,
ux0 - delta_cx, uy0 - delta_cy, shape_pos.x - delta_cx, shape_pos.y - delta_cy,
rotdx, color ); rotdx, aDrawInfo.m_Color );
} }
else else
{ {
GRCSegm( &panel->m_ClipBox, DC, GRCSegm( aClipBox, aDC,
ux0 + delta_cx, uy0 + delta_cy, shape_pos.x + delta_cx, shape_pos.y + delta_cy,
ux0 - delta_cx, uy0 - delta_cy, shape_pos.x - delta_cx, shape_pos.y - delta_cy,
rotdx, m_PadSketchModePenSize, color ); rotdx, m_PadSketchModePenSize, aDrawInfo.m_Color );
} }
/* Draw the isolation line. */ /* 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, GRCSegm( aClipBox, aDC, shape_pos.x + delta_cx, shape_pos.y + delta_cy,
ux0 - delta_cx, uy0 - delta_cy, shape_pos.x - delta_cx, shape_pos.y - delta_cy,
rotdx, color ); rotdx, aDrawInfo.m_Color );
} }
break; break;
case PAD_RECT: case PAD_RECT:
case PAD_TRAPEZOID: 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; BuildPadPolygon( coord, wxSize(aDrawInfo.m_PadClearance,aDrawInfo.m_PadClearance), angle );
ddx = ( m_DeltaSize.x >> 1 ); for( int ii = 0; ii < 4; ii++ )
ddy = ( m_DeltaSize.y >> 1 ); coord[ii] += shape_pos;
coord[0].x = -dx - ddy - mask_margin.x; // lower left GRClosedPoly( aClipBox, aDC, 4, coord, 0, aDrawInfo.m_Color, aDrawInfo.m_Color );
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 );
}
} }
break; break;
@ -450,26 +463,23 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
} }
/* Draw the pad hole */ /* Draw the pad hole */
int cx0 = m_Pos.x - offset.x; wxPoint holepos = m_Pos - aDrawInfo.m_Offset;
int cy0 = m_Pos.y - offset.y;
int hole = m_Drill.x >> 1; int hole = m_Drill.x >> 1;
if( fillpad && hole ) if( aDrawInfo.m_ShowPadFilled && hole )
{ {
bool blackpenstate = false; bool blackpenstate = false;
if( screen->m_IsPrinting ) if( aDrawInfo.m_IsPrinting )
{ {
blackpenstate = GetGRForceBlackPenState(); blackpenstate = GetGRForceBlackPenState();
GRForceBlackPen( false ); GRForceBlackPen( false );
color = g_DrawBgColor; aDrawInfo.m_HoleColor = g_DrawBgColor;
} }
else
color = BLACK; // or DARKGRAY;
if( draw_mode != GR_XOR ) if( aDrawInfo.m_DrawMode != GR_XOR )
GRSetDrawMode( DC, GR_COPY ); GRSetDrawMode( aDC, GR_COPY );
else else
GRSetDrawMode( DC, GR_XOR ); GRSetDrawMode( aDC, GR_XOR );
switch( m_DrillShape ) switch( m_DrillShape )
{ {
@ -478,78 +488,71 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
#ifdef USE_WX_ZOOM #ifdef USE_WX_ZOOM
if( DC->LogicalToDeviceXRel( hole ) > 1 ) if( DC->LogicalToDeviceXRel( hole ) > 1 )
#else #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 #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; break;
case PAD_OVAL: case PAD_OVAL:
dx = m_Drill.x >> 1; halfsize.x = m_Drill.x >> 1;
dy = m_Drill.y >> 1; halfsize.y = m_Drill.y >> 1;
if( m_Drill.x > m_Drill.y ) /* horizontal */ if( m_Drill.x > m_Drill.y ) /* horizontal */
{ {
delta_cx = dx - dy; delta_cx = halfsize.x - halfsize.y;
delta_cy = 0; delta_cy = 0;
rotdx = m_Drill.y; rotdx = m_Drill.y;
} }
else /* vertical */ else /* vertical */
{ {
delta_cx = 0; delta_cx = 0;
delta_cy = dy - dx; delta_cy = halfsize.y - halfsize.x;
rotdx = m_Drill.x; rotdx = m_Drill.x;
} }
RotatePoint( &delta_cx, &delta_cy, angle ); RotatePoint( &delta_cx, &delta_cy, angle );
GRFillCSegm( &panel->m_ClipBox, DC, cx0 + delta_cx, cy0 + delta_cy, GRFillCSegm( aClipBox, aDC, holepos.x + delta_cx, holepos.y + delta_cy,
cx0 - delta_cx, cy0 - delta_cy, rotdx, color ); holepos.x - delta_cx, holepos.y - delta_cy, rotdx,
aDrawInfo.m_HoleColor );
break; break;
default: default:
break; break;
} }
if( screen->m_IsPrinting ) if( aDrawInfo.m_IsPrinting )
GRForceBlackPen( blackpenstate ); GRForceBlackPen( blackpenstate );
} }
GRSetDrawMode( DC, draw_mode ); GRSetDrawMode( aDC, aDrawInfo.m_DrawMode );
/* Draw "No connect" ( / or \ or cross X ) if necessary. : */ /* 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; int nc_color = BLUE;
if( m_Masque_Layer & LAYER_FRONT ) /* Draw \ */ if( m_Masque_Layer & LAYER_FRONT ) /* Draw \ */
GRLine( &panel->m_ClipBox, DC, cx0 - dx0, cy0 - dx0, GRLine( aClipBox, aDC, holepos.x - dx0, holepos.y - dx0,
cx0 + dx0, cy0 + dx0, 0, nc_color ); holepos.x + dx0, holepos.y + dx0, 0, nc_color );
if( m_Masque_Layer & LAYER_BACK ) /* Draw / */ if( m_Masque_Layer & LAYER_BACK ) /* Draw / */
GRLine( &panel->m_ClipBox, DC, cx0 + dx0, cy0 - dx0, GRLine( aClipBox, aDC, holepos.x + dx0, holepos.y - dx0,
cx0 - dx0, cy0 + dx0, 0, nc_color ); holepos.x - dx0, holepos.y + dx0, 0, nc_color );
} }
/* Draw the pad number */ /* Draw the pad number */
bool display_padnum = true; if( !aDrawInfo.m_Display_padnum && !aDrawInfo.m_Display_netname )
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 )
return; 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; wxPoint tpos = tpos0;
wxSize AreaSize; // size of text area, normalized to wxSize AreaSize; // size of text area, normalized to
// AreaSize.y < AreaSize.x // AreaSize.y < AreaSize.x
int shortname_len = m_ShortNetname.Len(); int shortname_len = m_ShortNetname.Len();
if( !display_netname ) if( !aDrawInfo.m_Display_netname )
shortname_len = 0; shortname_len = 0;
if( GetShape() == PAD_CIRCLE ) if( GetShape() == PAD_CIRCLE )
angle = 0; angle = 0;
@ -572,7 +575,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 // Calculate the position of text, that is the middle point of the upper
// area of the pad // 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 */ /* Draw text with an angle between -90 deg and + 90 deg */
int t_angle = angle; int t_angle = angle;
@ -586,7 +589,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
wxString buffer; wxString buffer;
int tsize; int tsize;
if( display_padnum ) if( aDrawInfo.m_Display_padnum )
{ {
ReturnStringPadName( buffer ); ReturnStringPadName( buffer );
int numpad_len = buffer.Len(); int numpad_len = buffer.Len();
@ -598,14 +601,12 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
#ifdef USE_WX_ZOOM #ifdef USE_WX_ZOOM
if( DC->LogicalToDeviceXRel( tsize ) >= CHAR_SIZE_MIN ) // Not drawable when size too small. if( DC->LogicalToDeviceXRel( tsize ) >= CHAR_SIZE_MIN ) // Not drawable when size too small.
#else #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 #endif
{ {
tsize = (int) ( tsize * 0.8 ); // reserve room for // tsize reserve room for marges and segments thickness
// marges and segments tsize = (int) ( tsize * 0.8 );
// thickness DrawGraphicText( aDrawInfo.m_DrawPanel, aDC, tpos, WHITE, buffer, t_angle,
DrawGraphicText( panel, DC, tpos, WHITE, buffer, t_angle,
wxSize( tsize, tsize ), GR_TEXT_HJUSTIFY_CENTER, wxSize( tsize, tsize ), GR_TEXT_HJUSTIFY_CENTER,
GR_TEXT_VJUSTIFY_CENTER, tsize / 7, false, false, GR_TEXT_VJUSTIFY_CENTER, tsize / 7, false, false,
false ); false );
@ -622,22 +623,138 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
#ifdef USE_WX_ZOOM #ifdef USE_WX_ZOOM
if( DC->LogicalToDeviceXRel( tsize ) >= CHAR_SIZE_MIN ) // Not drawable in size too small. if( DC->LogicalToDeviceXRel( tsize ) >= CHAR_SIZE_MIN ) // Not drawable in size too small.
#else #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 #endif
{
if( !( !IsOnLayer( screen->m_Active_Layer )
&& DisplayOpt.ContrastModeDisplay ) )
{ {
tpos = tpos0; tpos = tpos0;
if( display_padnum ) if( aDrawInfo.m_Display_padnum )
tpos.y += AreaSize.y / 2; 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 // tsize reserve room for marges and segments thickness
// segments thickness tsize = (int) ( tsize * 0.8 );
DrawGraphicText( panel, DC, tpos, WHITE, m_ShortNetname, t_angle, DrawGraphicText( aDrawInfo.m_DrawPanel, aDC, tpos, WHITE, m_ShortNetname, t_angle,
wxSize( tsize, tsize ), GR_TEXT_HJUSTIFY_CENTER, wxSize( tsize, tsize ), GR_TEXT_HJUSTIFY_CENTER,
GR_TEXT_VJUSTIFY_CENTER, tsize / 7, false, false ); 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
* Also if inflate values for X and Y directions are different
* the simplified inflate calculation is used for PAD_TRAPEZOID
* due to the complexity of offsetting a polygon with different values in X and Y
* (I even no be sure this has meaning)
*/
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
{
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
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( delta.y, halfsize.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( delta.x, halfsize.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; // Do nothing.
}
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;
}
if( aRotation )
{
for( int ii = 0; ii < 4; ii++ )
RotatePoint( &aCoord[ii], aRotation );
}
} }

View File

@ -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 ); 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 = 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->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 ); bMiddleBoxSizer->Add( m_Choice_Drill_Map, 0, wxALL|wxEXPAND, 5 );

View File

@ -335,7 +335,7 @@
<property name="size"></property> <property name="size"></property>
<property name="style">wxRA_SPECIFY_COLS</property> <property name="style">wxRA_SPECIFY_COLS</property>
<property name="subclass"></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_extra_style"></property>
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style"></property> <property name="window_style"></property>

View File

@ -9,13 +9,10 @@
#include "confirm.h" #include "confirm.h"
#include "pcbnew.h" #include "pcbnew.h"
#include "trigo.h" #include "trigo.h"
#include <wx/dcbuffer.h>
/* Local variables */
static wxString Current_PadNetName;
#define NBSHAPES 4 #define NBSHAPES 4
int CodeShape[NBSHAPES] = /* Pad shapes. */ int CodeShape[NBSHAPES] = // list of pad shapes.
{ {
PAD_CIRCLE, PAD_OVAL, PAD_RECT, PAD_TRAPEZOID 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 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] = static long Std_Pad_Layers[NBTYPES] =
{ {
// PAD_STANDARD: // PAD_STANDARD:
@ -46,54 +43,135 @@ static long Std_Pad_Layers[NBTYPES] =
#include "dialog_pad_properties_base.h" #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 class DIALOG_PAD_PROPERTIES : public DIALOG_PAD_PROPERTIES_BASE
{ {
private: private:
WinEDA_BasePcbFrame* m_Parent; WinEDA_BasePcbFrame* m_Parent;
D_PAD* m_CurrentPad; D_PAD* m_CurrentPad; // Pad currently edited
D_PAD* m_dummyPad; // a working copy used to show changes
BOARD* m_Board; BOARD* m_Board;
bool m_isFlipped; /* true if the parent footprint (therefore pads) is flipped (mirrored)
* in this case, some Y coordinates values must be negated
*/
bool m_canUpdate;
public: public:
DIALOG_PAD_PROPERTIES( WinEDA_BasePcbFrame* parent, D_PAD* Pad ); DIALOG_PAD_PROPERTIES( WinEDA_BasePcbFrame* parent, D_PAD* Pad );
~DIALOG_PAD_PROPERTIES()
{
delete m_dummyPad;
}
private: private:
void InitDialog( ); void initValues();
void OnPadShapeSelection( wxCommandEvent& event ); void OnPadShapeSelection( wxCommandEvent& event );
void OnDrillShapeSelected( wxCommandEvent& event ); void OnDrillShapeSelected( wxCommandEvent& event );
void PadOrientEvent( wxCommandEvent& event ); void PadOrientEvent( wxCommandEvent& event );
void PadTypeSelected( wxCommandEvent& event ); void PadTypeSelected( wxCommandEvent& event );
void PadPropertiesAccept( wxCommandEvent& event ); void PadPropertiesAccept( wxCommandEvent& event );
void SetPadLayersList( long layer_mask ); void SetPadLayersList( long layer_mask );
void OnSetLayer( wxCommandEvent& event );
void OnCancelButtonClick( 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
double scale = (double) dc_size.x / (m_dummyPad->m_Size.x + m_dummyPad->m_LocalClearance);
double altscale = (double) dc_size.y / (m_dummyPad->m_Size.y + m_dummyPad->m_LocalClearance);
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::DIALOG_PAD_PROPERTIES( WinEDA_BasePcbFrame* parent, D_PAD* Pad ) :
DIALOG_PAD_PROPERTIES_BASE( parent ) DIALOG_PAD_PROPERTIES_BASE( parent )
/*******************************************************************************************/ /*******************************************************************************************/
{ {
m_canUpdate = false;
m_Parent = parent; m_Parent = parent;
m_CurrentPad = Pad; m_CurrentPad = Pad;
m_Board = m_Parent->GetBoard(); m_Board = m_Parent->GetBoard();
m_dummyPad = new D_PAD( (MODULE*) NULL );
if( m_CurrentPad ) if( m_CurrentPad )
{ m_dummyPad->Copy( m_CurrentPad );
Current_PadNetName = m_CurrentPad->GetNetname(); else
g_Current_PadName = m_CurrentPad->ReturnStringPadName(); m_dummyPad->Copy( &g_Pad_Master );
}
initValues();
InitDialog( );
if( GetSizer() )
{
GetSizer()->SetSizeHints( this ); GetSizer()->SetSizeHints( this );
}
Center(); Center();
m_canUpdate = true;
} }
@ -105,22 +183,38 @@ 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 SetFocus(); // Required under wxGTK if we want to demiss the dialog with the ESC key
m_PadNumCtrl->SetValue( g_Current_PadName ); int tmp;
m_PadNetNameCtrl->SetValue( Current_PadNetName ); int internalUnits = m_Parent->m_InternalUnits;
D_PAD* pad = m_CurrentPad; wxString msg;
if( pad == NULL ) m_isFlipped = false;
pad = &g_Pad_Master; 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_PadNumCtrl->SetValue( m_dummyPad->ReturnStringPadName() );
m_PadNetNameCtrl->SetValue( m_dummyPad->GetNetname() );
// Display current unit name in dialog: // Display current unit name in dialog:
m_PadPosX_Unit->SetLabel( GetUnitsLabel( g_UserUnit ) ); m_PadPosX_Unit->SetLabel( GetUnitsLabel( g_UserUnit ) );
@ -134,36 +228,43 @@ void DIALOG_PAD_PROPERTIES::InitDialog( )
m_PadShapeDeltaX_Unit->SetLabel( GetUnitsLabel( g_UserUnit ) ); m_PadShapeDeltaX_Unit->SetLabel( GetUnitsLabel( g_UserUnit ) );
m_PadShapeDeltaY_Unit->SetLabel( GetUnitsLabel( g_UserUnit ) ); m_PadShapeDeltaY_Unit->SetLabel( GetUnitsLabel( g_UserUnit ) );
m_NetClearanceUnits->SetLabel( GetUnitsLabel( g_UserUnit ) ); m_NetClearanceUnits->SetLabel( GetUnitsLabel( g_UserUnit ) );
// Display current pad masks clearances units // Display current pad masks clearances units
m_NetClearanceUnits->SetLabel( GetUnitsLabel( g_UserUnit ) ); m_NetClearanceUnits->SetLabel( GetUnitsLabel( g_UserUnit ) );
m_SolderMaskMarginUnits->SetLabel( GetUnitsLabel( g_UserUnit ) ); m_SolderMaskMarginUnits->SetLabel( GetUnitsLabel( g_UserUnit ) );
m_SolderPasteMarginUnits->SetLabel( GetUnitsLabel( g_UserUnit ) ); m_SolderPasteMarginUnits->SetLabel( GetUnitsLabel( g_UserUnit ) );
// Display current pad parameters units: // Display current pad parameters units:
PutValueInLocalUnits( *m_PadPosition_X_Ctrl, pad->m_Pos.x, internalUnits ); PutValueInLocalUnits( *m_PadPosition_X_Ctrl, m_dummyPad->m_Pos.x, internalUnits );
PutValueInLocalUnits( *m_PadPosition_Y_Ctrl, pad->m_Pos.y, 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_X_Ctrl, m_dummyPad->m_Drill.x, internalUnits );
PutValueInLocalUnits( *m_PadDrill_Y_Ctrl, pad->m_Drill.y, 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_X_Ctrl, m_dummyPad->m_Size.x, internalUnits );
PutValueInLocalUnits( *m_ShapeSize_Y_Ctrl, pad->m_Size.y, 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_X_Ctrl, m_dummyPad->m_Offset.x, internalUnits );
PutValueInLocalUnits( *m_ShapeOffset_Y_Ctrl, pad->m_Offset.y, 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_X_Ctrl, m_dummyPad->m_DeltaSize.x, internalUnits );
PutValueInLocalUnits( *m_ShapeDelta_Y_Ctrl, pad->m_DeltaSize.y, 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 // These 2 parameters are usually < 0, so prepare entering a negative value, if current is 0
PutValueInLocalUnits( *m_SolderPasteMarginCtrl, pad->m_LocalSolderPasteMargin, internalUnits ); PutValueInLocalUnits( *m_SolderPasteMarginCtrl,
if( pad->m_LocalSolderPasteMargin == 0 ) m_dummyPad->m_LocalSolderPasteMargin,
internalUnits );
if( m_dummyPad->m_LocalSolderPasteMargin == 0 )
m_SolderPasteMarginCtrl->SetValue( wxT( "-" ) + m_SolderPasteMarginCtrl->GetValue() ); m_SolderPasteMarginCtrl->SetValue( wxT( "-" ) + m_SolderPasteMarginCtrl->GetValue() );
msg.Printf( wxT( "%.1f" ), pad->m_LocalSolderPasteMarginRatio * 100.0 ); msg.Printf( wxT( "%.1f" ), m_dummyPad->m_LocalSolderPasteMarginRatio * 100.0 );
if( pad->m_LocalSolderPasteMarginRatio == 0.0 &&
msg[0] == '0') // Sometimes Printf add a sign if the value is small 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 ); m_SolderPasteMarginRatioCtrl->SetValue( wxT( "-" ) + msg );
else else
m_SolderPasteMarginRatioCtrl->SetValue( msg ); m_SolderPasteMarginRatioCtrl->SetValue( msg );
@ -171,39 +272,39 @@ void DIALOG_PAD_PROPERTIES::InitDialog( )
if( m_CurrentPad ) if( m_CurrentPad )
{ {
MODULE* Module = (MODULE*) m_CurrentPad->GetParent(); 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.Clear();
msg << tmp; msg << tmp;
m_PadOrientCtrl->SetValue( msg ); m_PadOrientCtrl->SetValue( msg );
// Pad Orient // Pad Orient
switch( tmp ) switch( m_dummyPad->m_Orient )
{ {
case 0: case 0:
m_PadOrient->SetSelection( 0 ); m_PadOrient->SetSelection( 0 );
m_PadOrientCtrl->Enable( false );
break; break;
case - 2700:
case 900: case 900:
m_PadOrient->SetSelection( 1 ); m_PadOrient->SetSelection( 1 );
m_PadOrientCtrl->Enable( false );
break; break;
case - 900: case - 900:
case 2700:
m_PadOrient->SetSelection( 2 ); m_PadOrient->SetSelection( 2 );
m_PadOrientCtrl->Enable( false );
break; break;
case 1800: case 1800:
case - 1800: case - 1800:
m_PadOrient->SetSelection( 3 ); m_PadOrient->SetSelection( 3 );
m_PadOrientCtrl->Enable( false );
break; break;
default: default:
@ -211,7 +312,7 @@ void DIALOG_PAD_PROPERTIES::InitDialog( )
break; break;
} }
switch( pad->m_PadShape ) switch( m_dummyPad->m_PadShape )
{ {
default: default:
case PAD_CIRCLE: case PAD_CIRCLE:
@ -231,35 +332,25 @@ void DIALOG_PAD_PROPERTIES::InitDialog( )
break; break;
} }
cmd_event.SetId( m_PadShape->GetSelection() ); msg.Printf( wxT( "%d" ), m_dummyPad->m_Orient );
OnPadShapeSelection( cmd_event ); m_PadOrientCtrl->SetValue( msg );
// Selection du type // Selection du type
tmp = pad->m_Attribut; tmp = m_dummyPad->m_Attribut;
m_PadType->SetSelection( 0 ); m_PadType->SetSelection( 0 );
for( int ii = 0; ii < NBTYPES; ii++ ) for( int ii = 0; ii < NBTYPES; ii++ )
{ {
if( CodeType[ii] == tmp ) 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 ); m_DrillShapeCtrl->SetSelection( 0 );
else else
m_DrillShapeCtrl->SetSelection( 1 ); 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 // Setup layers names from board
m_PadLayerCu->SetLabel( m_Board->GetLayerName( LAYER_N_BACK ) ); m_PadLayerCu->SetLabel( m_Board->GetLayerName( LAYER_N_BACK ) );
@ -276,6 +367,13 @@ void DIALOG_PAD_PROPERTIES::InitDialog( )
m_PadLayerECO1->SetLabel( m_Board->GetLayerName( ECO1_N ) ); m_PadLayerECO1->SetLabel( m_Board->GetLayerName( ECO1_N ) );
m_PadLayerECO2->SetLabel( m_Board->GetLayerName( ECO2_N ) ); m_PadLayerECO2->SetLabel( m_Board->GetLayerName( ECO2_N ) );
m_PadLayerDraft->SetLabel( m_Board->GetLayerName( DRAW_N ) ); m_PadLayerDraft->SetLabel( m_Board->GetLayerName( DRAW_N ) );
/* All init are done,
* Update some dialog widgets state (Enable/disable options):
*/
wxCommandEvent cmd_event;
OnPadShapeSelection( cmd_event );
OnDrillShapeSelected( cmd_event );
} }
@ -309,6 +407,9 @@ void DIALOG_PAD_PROPERTIES::OnPadShapeSelection( wxCommandEvent& event )
m_ShapeSize_Y_Ctrl->Enable( true ); m_ShapeSize_Y_Ctrl->Enable( true );
break; break;
} }
TransfertDataToPad( m_dummyPad );
m_panelShowPad->Refresh();
} }
@ -317,11 +418,13 @@ void DIALOG_PAD_PROPERTIES::OnDrillShapeSelected( wxCommandEvent& event )
/**********************************************************************/ /**********************************************************************/
{ {
if( (m_PadType->GetSelection() == 1) || (m_PadType->GetSelection() == 2) ) if( (m_PadType->GetSelection() == 1) || (m_PadType->GetSelection() == 2) )
{ // pad type = SMD or CONN: no hole allowed {
// pad type = SMD or CONN: no hole allowed
m_PadDrill_X_Ctrl->Enable( false ); m_PadDrill_X_Ctrl->Enable( false );
m_PadDrill_Y_Ctrl->Enable( false ); m_PadDrill_Y_Ctrl->Enable( false );
return;
} }
else
{
switch( m_DrillShapeCtrl->GetSelection() ) switch( m_DrillShapeCtrl->GetSelection() )
{ {
case 0: //CIRCLE: case 0: //CIRCLE:
@ -336,6 +439,10 @@ void DIALOG_PAD_PROPERTIES::OnDrillShapeSelected( wxCommandEvent& event )
} }
} }
TransfertDataToPad( m_dummyPad );
m_panelShowPad->Refresh();
}
/*******************************************************************/ /*******************************************************************/
void DIALOG_PAD_PROPERTIES::PadOrientEvent( wxCommandEvent& event ) void DIALOG_PAD_PROPERTIES::PadOrientEvent( wxCommandEvent& event )
@ -344,29 +451,31 @@ void DIALOG_PAD_PROPERTIES::PadOrientEvent( wxCommandEvent& event )
switch( m_PadOrient->GetSelection() ) switch( m_PadOrient->GetSelection() )
{ {
case 0: case 0:
m_PadOrientCtrl->SetValue( wxT( "0" ) ); m_dummyPad->m_Orient = 0;
m_PadOrientCtrl->Enable( false );
break; break;
case 1: case 1:
m_PadOrientCtrl->SetValue( wxT( "900" ) ); m_dummyPad->m_Orient = 900;
m_PadOrientCtrl->Enable( false );
break; break;
case 2: case 2:
m_PadOrientCtrl->SetValue( wxT( "2700" ) ); m_dummyPad->m_Orient = -900;
m_PadOrientCtrl->Enable( false );
break; break;
case 3: case 3:
m_PadOrientCtrl->SetValue( wxT( "1800" ) ); m_dummyPad->m_Orient = 1800;
m_PadOrientCtrl->Enable( false );
break; break;
default: default:
m_PadOrientCtrl->Enable( true );
break; break;
} }
wxString msg;
msg.Printf( wxT( "%d" ), m_dummyPad->m_Orient );
m_PadOrientCtrl->SetValue( msg );
TransfertDataToPad( m_dummyPad );
m_panelShowPad->Refresh();
} }
@ -424,106 +533,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 ) void DIALOG_PAD_PROPERTIES::PadPropertiesAccept( wxCommandEvent& event )
/*************************************************************************/ /*************************************************************************/
/* Updates the different parameters for the component being edited. /* 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; long PadLayerMask;
bool RastnestIsChanged = false;
int internalUnits = m_Parent->m_InternalUnits; int internalUnits = m_Parent->m_InternalUnits;
wxString msg; wxString msg;
g_Pad_Master.m_Attribut = CodeType[m_PadType->GetSelection()]; aPad->m_Attribut = CodeType[m_PadType->GetSelection()];
g_Pad_Master.m_PadShape = CodeShape[m_PadShape->GetSelection()]; aPad->m_PadShape = CodeShape[m_PadShape->GetSelection()];
// Read pad clearances values: // Read pad clearances values:
g_Pad_Master.m_LocalClearance = ReturnValueFromTextCtrl( *m_NetClearanceValueCtrl, aPad->m_LocalClearance = ReturnValueFromTextCtrl( *m_NetClearanceValueCtrl,
internalUnits ); internalUnits );
g_Pad_Master.m_LocalSolderMaskMargin = ReturnValueFromTextCtrl( *m_SolderMaskMarginCtrl, aPad->m_LocalSolderMaskMargin = ReturnValueFromTextCtrl( *m_SolderMaskMarginCtrl,
internalUnits ); internalUnits );
g_Pad_Master.m_LocalSolderPasteMargin = ReturnValueFromTextCtrl( *m_SolderPasteMarginCtrl, aPad->m_LocalSolderPasteMargin = ReturnValueFromTextCtrl( *m_SolderPasteMarginCtrl,
internalUnits ); internalUnits );
double dtmp = 0.0; double dtmp = 0.0;
msg = m_SolderPasteMarginRatioCtrl->GetValue(); msg = m_SolderPasteMarginRatioCtrl->GetValue();
msg.ToDouble( &dtmp ); msg.ToDouble( &dtmp );
// A margin ratio de -50% means no paste on a pad, the ratio must be >= 50 % // A margin ratio de -50% means no paste on a pad, the ratio must be >= 50 %
if( dtmp < -50 ) if( dtmp < -50 )
dtmp = -50; dtmp = -50;
if( dtmp > +100 ) if( dtmp > +100 )
dtmp = +100; dtmp = +100;
g_Pad_Master.m_LocalSolderPasteMarginRatio = dtmp / 100; aPad->m_LocalSolderPasteMarginRatio = dtmp / 100;
// Read pad position: // Read pad position:
g_Pad_Master.m_Pos.x = ReturnValueFromTextCtrl( *m_PadPosition_X_Ctrl, internalUnits ); aPad->m_Pos.x = ReturnValueFromTextCtrl( *m_PadPosition_X_Ctrl, internalUnits );
g_Pad_Master.m_Pos.y = ReturnValueFromTextCtrl( *m_PadPosition_Y_Ctrl, internalUnits ); aPad->m_Pos.y = ReturnValueFromTextCtrl( *m_PadPosition_Y_Ctrl, internalUnits );
g_Pad_Master.m_Pos0 = g_Pad_Master.m_Pos; aPad->m_Pos0 = aPad->m_Pos;
// Read pad drill: // Read pad drill:
g_Pad_Master.m_Drill.x = ReturnValueFromTextCtrl( *m_PadDrill_X_Ctrl, internalUnits ); aPad->m_Drill.x = ReturnValueFromTextCtrl( *m_PadDrill_X_Ctrl, internalUnits );
g_Pad_Master.m_Drill.y = ReturnValueFromTextCtrl( *m_PadDrill_Y_Ctrl, internalUnits ); aPad->m_Drill.y = ReturnValueFromTextCtrl( *m_PadDrill_Y_Ctrl, internalUnits );
if( m_DrillShapeCtrl->GetSelection() == 0 ) if( m_DrillShapeCtrl->GetSelection() == 0 )
{ {
g_Pad_Master.m_DrillShape = PAD_CIRCLE; aPad->m_DrillShape = PAD_CIRCLE;
g_Pad_Master.m_Drill.y = g_Pad_Master.m_Drill.x; aPad->m_Drill.y = aPad->m_Drill.x;
} }
else else
g_Pad_Master.m_DrillShape = PAD_OVAL; aPad->m_DrillShape = PAD_OVAL;
// Read pad shape size: // Read pad shape size:
g_Pad_Master.m_Size.x = ReturnValueFromTextCtrl( *m_ShapeSize_X_Ctrl, internalUnits ); aPad->m_Size.x = ReturnValueFromTextCtrl( *m_ShapeSize_X_Ctrl, internalUnits );
g_Pad_Master.m_Size.y = ReturnValueFromTextCtrl( *m_ShapeSize_Y_Ctrl, internalUnits ); aPad->m_Size.y = ReturnValueFromTextCtrl( *m_ShapeSize_Y_Ctrl, internalUnits );
if( g_Pad_Master.m_PadShape == PAD_CIRCLE ) if( aPad->m_PadShape == PAD_CIRCLE )
g_Pad_Master.m_Size.y = g_Pad_Master.m_Size.x; aPad->m_Size.y = aPad->m_Size.x;
// Read pad shape delta size: // Read pad shape delta size:
g_Pad_Master.m_DeltaSize.x = ReturnValueFromTextCtrl( *m_ShapeDelta_X_Ctrl, internalUnits ); // m_DeltaSize.x or m_DeltaSize.y must be NULL. for a trapezoid.
g_Pad_Master.m_DeltaSize.y = ReturnValueFromTextCtrl( *m_ShapeDelta_Y_Ctrl, internalUnits ); 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: // Read pad shape offset:
g_Pad_Master.m_Offset.x = ReturnValueFromTextCtrl( *m_ShapeOffset_X_Ctrl, internalUnits ); aPad->m_Offset.x = ReturnValueFromTextCtrl( *m_ShapeOffset_X_Ctrl, internalUnits );
g_Pad_Master.m_Offset.y = ReturnValueFromTextCtrl( *m_ShapeOffset_Y_Ctrl, internalUnits ); aPad->m_Offset.y = ReturnValueFromTextCtrl( *m_ShapeOffset_Y_Ctrl, internalUnits );
long orient_value = 0; long orient_value = 0;
msg = m_PadOrientCtrl->GetValue(); msg = m_PadOrientCtrl->GetValue();
msg.ToLong( &orient_value ); msg.ToLong( &orient_value );
g_Pad_Master.m_Orient = orient_value; aPad->m_Orient = orient_value;
g_Current_PadName = m_PadNumCtrl->GetValue().Left( 4 ); msg = m_PadNumCtrl->GetValue().Left( 4 );
Current_PadNetName = m_PadNetNameCtrl->GetValue(); aPad->SetPadName( msg );
aPad->SetNetname( m_PadNetNameCtrl->GetValue() );
// Clear some values, according to the pad type and shape // Clear some values, according to the pad type and shape
switch( g_Pad_Master.m_PadShape ) switch( aPad->m_PadShape )
{ {
case PAD_CIRCLE: case PAD_CIRCLE:
g_Pad_Master.m_Offset = wxSize( 0, 0 ); aPad->m_Offset = wxSize( 0, 0 );
g_Pad_Master.m_DeltaSize = wxSize( 0, 0 ); aPad->m_DeltaSize = wxSize( 0, 0 );
g_Pad_Master.m_Size.y = g_Pad_Master.m_Size.x; aPad->m_Size.y = aPad->m_Size.x;
break; break;
case PAD_RECT: case PAD_RECT:
g_Pad_Master.m_DeltaSize = wxSize( 0, 0 ); aPad->m_DeltaSize = wxSize( 0, 0 );
break; break;
case PAD_OVAL: case PAD_OVAL:
g_Pad_Master.m_DeltaSize = wxSize( 0, 0 ); aPad->m_DeltaSize = wxSize( 0, 0 );
break; break;
case PAD_TRAPEZOID: case PAD_TRAPEZOID:
break; break;
} }
switch( g_Pad_Master.m_Attribut ) switch( aPad->m_Attribut )
{ {
case PAD_STANDARD: case PAD_STANDARD:
break; break;
case PAD_CONN: case PAD_CONN:
case PAD_SMD: case PAD_SMD:
g_Pad_Master.m_Offset = wxSize( 0, 0 ); aPad->m_Offset = wxSize( 0, 0 );
g_Pad_Master.m_Drill = wxSize( 0, 0 ); aPad->m_Drill = wxSize( 0, 0 );
break; break;
case PAD_HOLE_NOT_PLATED: case PAD_HOLE_NOT_PLATED:
@ -564,113 +807,63 @@ void DIALOG_PAD_PROPERTIES::PadPropertiesAccept( wxCommandEvent& event )
if( m_PadLayerDraft->GetValue() ) if( m_PadLayerDraft->GetValue() )
PadLayerMask |= DRAW_LAYER; PadLayerMask |= DRAW_LAYER;
aPad->m_Masque_Layer = PadLayerMask;
/* Test for incorrect values */ /* Test for incorrect values */
if( (g_Pad_Master.m_Size.x < g_Pad_Master.m_Drill.x) if( aPromptOnError )
|| (g_Pad_Master.m_Size.y < g_Pad_Master.m_Drill.y) ) {
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" ) ); DisplayError( this, _( "Incorrect value for pad drill: pad drill bigger than pad size" ) );
return; return false;
} }
int padlayers_mask = PadLayerMask & (LAYER_BACK | LAYER_FRONT); int padlayers_mask = PadLayerMask & (LAYER_BACK | LAYER_FRONT);
if( padlayers_mask == 0 ) if( padlayers_mask == 0 )
{ {
if( 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" ) ); 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 ) ) if( ( aPad->m_Size.x / 2 <= ABS( aPad->m_Offset.x ) )
|| ( g_Pad_Master.m_Size.y / 2 <= ABS( g_Pad_Master.m_Offset.y ) ) ) || ( aPad->m_Size.y / 2 <= ABS( aPad->m_Offset.y ) ) )
{ {
DisplayError( this, _( "Incorrect value for pad offset" ) ); DisplayError( this, _( "Incorrect value for pad offset" ) );
return; return false;
} }
if( error )
g_Pad_Master.m_Masque_Layer = PadLayerMask;
if( m_CurrentPad ) // Set current Pad parameters
{ {
MODULE* Module = (MODULE*) m_CurrentPad->GetParent(); DisplayError( this, _( "Too large value for pad delta size" ) );
m_Parent->SaveCopyInUndoList( Module, UR_CHANGED ); return false;
Module->m_LastEdit_Time = time( NULL ); }
// redraw the area where the pad was, without pad (delete pad on screen) if( aPad->m_DeltaSize.x && aPad->m_DeltaSize.y )
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; DisplayError( this, _( "Incorrect value for pad delta size: X or Y value must be NULL" ) );
RastnestIsChanged = true; return false;
}
} }
/* compute the pos 0 value, i.e. pad position for module orient = 0 i.e. return true;
* 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; // Called when a dimension has change.
m_CurrentPad->m_Drill = g_Pad_Master.m_Drill; // Update the pad dimensions shown in the panel.
m_CurrentPad->m_DrillShape = g_Pad_Master.m_DrillShape; void DIALOG_PAD_PROPERTIES::OnValuesChanged( wxCommandEvent& event )
m_CurrentPad->m_Offset = g_Pad_Master.m_Offset;
if( m_CurrentPad->m_Masque_Layer != g_Pad_Master.m_Masque_Layer )
{ {
RastnestIsChanged = true; if( m_canUpdate )
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() ) TransfertDataToPad( m_dummyPad );
{ m_panelShowPad->Refresh();
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" ) );
} }
} }
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;
}
/*********************************************************************/ /*********************************************************************/
void DIALOG_PAD_PROPERTIES::OnCancelButtonClick( wxCommandEvent& event ) void DIALOG_PAD_PROPERTIES::OnCancelButtonClick( wxCommandEvent& event )
@ -678,4 +871,3 @@ void DIALOG_PAD_PROPERTIES::OnCancelButtonClick( wxCommandEvent& event )
{ {
EndModal( wxID_CANCEL ); EndModal( wxID_CANCEL );
} }

View File

@ -176,7 +176,7 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
m_LeftBoxSizer->Add( sbSizer2, 1, wxEXPAND, 5 ); 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; wxBoxSizer* bMiddleSizer;
bMiddleSizer = new wxBoxSizer( wxVERTICAL ); 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 ); int m_DrillShapeCtrlNChoices = sizeof( m_DrillShapeCtrlChoices ) / sizeof( wxString );
m_DrillShapeCtrl = new wxRadioBox( this, ID_RADIOBOX_DRILL_SHAPE, _("Drill Shape:"), wxDefaultPosition, wxDefaultSize, m_DrillShapeCtrlNChoices, m_DrillShapeCtrlChoices, 1, wxRA_SPECIFY_COLS ); m_DrillShapeCtrl = new wxRadioBox( this, ID_RADIOBOX_DRILL_SHAPE, _("Drill Shape:"), wxDefaultPosition, wxDefaultSize, m_DrillShapeCtrlNChoices, m_DrillShapeCtrlChoices, 1, wxRA_SPECIFY_COLS );
m_DrillShapeCtrl->SetSelection( 0 ); m_DrillShapeCtrl->SetSelection( 0 );
m_DrillShapeBoxSizer->Add( m_DrillShapeCtrl, 0, 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; wxBoxSizer* m_MiddleRightBoxSizer;
m_MiddleRightBoxSizer = new wxBoxSizer( wxVERTICAL ); 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 ); int m_PadOrientNChoices = sizeof( m_PadOrientChoices ) / sizeof( wxString );
m_PadOrient = new wxRadioBox( this, ID_LISTBOX_ORIENT_PAD, _("Pad Orient:"), wxDefaultPosition, wxDefaultSize, m_PadOrientNChoices, m_PadOrientChoices, 1, wxRA_SPECIFY_COLS ); m_PadOrient = new wxRadioBox( this, ID_LISTBOX_ORIENT_PAD, _("Pad Orient:"), wxDefaultPosition, wxDefaultSize, m_PadOrientNChoices, m_PadOrientChoices, 1, wxRA_SPECIFY_COLS );
m_PadOrient->SetSelection( 0 ); m_PadOrient->SetSelection( 0 );
@ -216,18 +216,52 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
m_PadOrientCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_PadOrientCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_MiddleRightBoxSizer->Add( m_PadOrientCtrl, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); m_MiddleRightBoxSizer->Add( m_PadOrientCtrl, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
bMiddleUpperSizer->Add( m_MiddleRightBoxSizer, 0, wxBOTTOM|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 | wxALL, 5 );
bMiddleSizer->Add( bMiddleUpperSizer, 1, wxEXPAND, 5 );
wxStaticBoxSizer* sbSizeModuleInfo;
sbSizeModuleInfo = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Footprint orientation") ), wxVERTICAL );
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, 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, 5 );
sbSizeModuleInfo->Add( fgSizer4, 0, wxEXPAND, 5 );
bMiddleSizer->Add( sbSizeModuleInfo, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
wxStaticBoxSizer* sbClearancesSizer; wxStaticBoxSizer* sbClearancesSizer;
sbClearancesSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Clearances:") ), wxVERTICAL ); sbClearancesSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Clearances:") ), wxVERTICAL );
m_staticText20 = new wxStaticText( this, wxID_ANY, _("Set these values to 0\nto use Parent footprint or global values"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextWarning = new wxStaticText( this, wxID_ANY, _("Set these values to 0\nto use Parent footprint or global values"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText20->Wrap( -1 ); m_staticTextWarning->Wrap( -1 );
m_staticText20->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); m_staticTextWarning->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
sbClearancesSizer->Add( m_staticText20, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); sbClearancesSizer->Add( m_staticTextWarning, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
wxFlexGridSizer* fgClearancesGridSizer; wxFlexGridSizer* fgClearancesGridSizer;
fgClearancesGridSizer = new wxFlexGridSizer( 5, 3, 0, 0 ); fgClearancesGridSizer = new wxFlexGridSizer( 5, 3, 0, 0 );
@ -248,13 +282,13 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
fgClearancesGridSizer->Add( m_NetClearanceUnits, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); fgClearancesGridSizer->Add( m_NetClearanceUnits, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
fgClearancesGridSizer->Add( m_staticline1, 0, wxEXPAND|wxALL, 5 ); fgClearancesGridSizer->Add( m_staticline1, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
fgClearancesGridSizer->Add( m_staticline2, 0, wxEXPAND | wxALL, 5 ); fgClearancesGridSizer->Add( m_staticline2, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
fgClearancesGridSizer->Add( m_staticline3, 0, wxEXPAND | 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 = new wxStaticText( this, wxID_ANY, _("Solder mask clearance:"), wxDefaultPosition, wxDefaultSize, 0 );
m_MaskClearanceTitle->Wrap( -1 ); m_MaskClearanceTitle->Wrap( -1 );
@ -297,7 +331,7 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
sbClearancesSizer->Add( fgClearancesGridSizer, 1, wxEXPAND, 5 ); 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 ); bGeneralSizer->Add( bMiddleSizer, 1, wxEXPAND, 5 );
@ -370,7 +404,7 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
m_RightBoxSizer->Add( m_LayersSizer, 0, 0, 5 ); 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 ); m_MainSizer->Add( bGeneralSizer, 1, wxEXPAND, 5 );
@ -380,7 +414,7 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
m_sdbSizer1Cancel = new wxButton( this, wxID_CANCEL ); m_sdbSizer1Cancel = new wxButton( this, wxID_CANCEL );
m_sdbSizer1->AddButton( m_sdbSizer1Cancel ); m_sdbSizer1->AddButton( m_sdbSizer1Cancel );
m_sdbSizer1->Realize(); m_sdbSizer1->Realize();
m_MainSizer->Add( m_sdbSizer1, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); m_MainSizer->Add( m_sdbSizer1, 0, wxTOP|wxBOTTOM|wxEXPAND, 5 );
this->SetSizer( m_MainSizer ); this->SetSizer( m_MainSizer );
this->Layout(); this->Layout();
@ -388,10 +422,36 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
this->Centre( wxBOTH ); this->Centre( wxBOTH );
// Connect Events // Connect Events
m_PadNumCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
m_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_PadShape->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnPadShapeSelection ), NULL, this );
m_DrillShapeCtrl->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnDrillShapeSelected ), NULL, this ); m_DrillShapeCtrl->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnDrillShapeSelected ), NULL, this );
m_PadOrient->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadOrientEvent ), NULL, this ); m_PadOrient->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadOrientEvent ), NULL, this );
m_PadOrientCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
m_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_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_sdbSizer1Cancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnCancelButtonClick ), NULL, this );
m_sdbSizer1OK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadPropertiesAccept ), NULL, this ); m_sdbSizer1OK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadPropertiesAccept ), NULL, this );
} }
@ -399,10 +459,36 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind
DIALOG_PAD_PROPERTIES_BASE::~DIALOG_PAD_PROPERTIES_BASE() DIALOG_PAD_PROPERTIES_BASE::~DIALOG_PAD_PROPERTIES_BASE()
{ {
// Disconnect Events // Disconnect Events
m_PadNumCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
m_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_PadShape->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnPadShapeSelection ), NULL, this );
m_DrillShapeCtrl->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnDrillShapeSelected ), NULL, this ); m_DrillShapeCtrl->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnDrillShapeSelected ), NULL, this );
m_PadOrient->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadOrientEvent ), NULL, this ); m_PadOrient->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadOrientEvent ), NULL, this );
m_PadOrientCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this );
m_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_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_sdbSizer1Cancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnCancelButtonClick ), NULL, this );
m_sdbSizer1OK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadPropertiesAccept ), NULL, this ); m_sdbSizer1OK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadPropertiesAccept ), NULL, this );
} }

View File

@ -32,7 +32,7 @@
<property name="minimum_size"></property> <property name="minimum_size"></property>
<property name="name">DIALOG_PAD_PROPERTIES_BASE</property> <property name="name">DIALOG_PAD_PROPERTIES_BASE</property>
<property name="pos"></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="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
<property name="subclass"></property> <property name="subclass"></property>
<property name="title">Pad Properties</property> <property name="title">Pad Properties</property>
@ -86,7 +86,7 @@
<property name="permission">none</property> <property name="permission">none</property>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxBOTTOM|wxLEFT</property> <property name="flag">wxBOTTOM|wxLEFT|wxEXPAND</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxBoxSizer" expanded="1"> <object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property> <property name="minimum_size"></property>
@ -192,7 +192,7 @@
<event name="OnRightUp"></event> <event name="OnRightUp"></event>
<event name="OnSetFocus"></event> <event name="OnSetFocus"></event>
<event name="OnSize"></event> <event name="OnSize"></event>
<event name="OnText"></event> <event name="OnText">OnValuesChanged</event>
<event name="OnTextEnter"></event> <event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event> <event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event> <event name="OnTextURL"></event>
@ -298,7 +298,7 @@
<event name="OnRightUp"></event> <event name="OnRightUp"></event>
<event name="OnSetFocus"></event> <event name="OnSetFocus"></event>
<event name="OnSize"></event> <event name="OnSize"></event>
<event name="OnText"></event> <event name="OnText">OnValuesChanged</event>
<event name="OnTextEnter"></event> <event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event> <event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event> <event name="OnTextURL"></event>
@ -321,7 +321,7 @@
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxEXPAND</property> <property name="flag">wxEXPAND</property>
<property name="proportion">1</property> <property name="proportion">1</property>
<object class="wxFlexGridSizer" expanded="1"> <object class="wxFlexGridSizer" expanded="0">
<property name="cols">3</property> <property name="cols">3</property>
<property name="flexible_direction">wxBOTH</property> <property name="flexible_direction">wxBOTH</property>
<property name="growablecols"></property> <property name="growablecols"></property>
@ -893,7 +893,7 @@
<event name="OnRightUp"></event> <event name="OnRightUp"></event>
<event name="OnSetFocus"></event> <event name="OnSetFocus"></event>
<event name="OnSize"></event> <event name="OnSize"></event>
<event name="OnText"></event> <event name="OnText">OnValuesChanged</event>
<event name="OnTextEnter"></event> <event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event> <event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event> <event name="OnTextURL"></event>
@ -1050,7 +1050,7 @@
<event name="OnRightUp"></event> <event name="OnRightUp"></event>
<event name="OnSetFocus"></event> <event name="OnSetFocus"></event>
<event name="OnSize"></event> <event name="OnSize"></event>
<event name="OnText"></event> <event name="OnText">OnValuesChanged</event>
<event name="OnTextEnter"></event> <event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event> <event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event> <event name="OnTextURL"></event>
@ -1354,7 +1354,7 @@
<event name="OnRightUp"></event> <event name="OnRightUp"></event>
<event name="OnSetFocus"></event> <event name="OnSetFocus"></event>
<event name="OnSize"></event> <event name="OnSize"></event>
<event name="OnText"></event> <event name="OnText">OnValuesChanged</event>
<event name="OnTextEnter"></event> <event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event> <event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event> <event name="OnTextURL"></event>
@ -1511,7 +1511,7 @@
<event name="OnRightUp"></event> <event name="OnRightUp"></event>
<event name="OnSetFocus"></event> <event name="OnSetFocus"></event>
<event name="OnSize"></event> <event name="OnSize"></event>
<event name="OnText"></event> <event name="OnText">OnValuesChanged</event>
<event name="OnTextEnter"></event> <event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event> <event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event> <event name="OnTextURL"></event>
@ -1668,7 +1668,7 @@
<event name="OnRightUp"></event> <event name="OnRightUp"></event>
<event name="OnSetFocus"></event> <event name="OnSetFocus"></event>
<event name="OnSize"></event> <event name="OnSize"></event>
<event name="OnText"></event> <event name="OnText">OnValuesChanged</event>
<event name="OnTextEnter"></event> <event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event> <event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event> <event name="OnTextURL"></event>
@ -1825,7 +1825,7 @@
<event name="OnRightUp"></event> <event name="OnRightUp"></event>
<event name="OnSetFocus"></event> <event name="OnSetFocus"></event>
<event name="OnSize"></event> <event name="OnSize"></event>
<event name="OnText"></event> <event name="OnText">OnValuesChanged</event>
<event name="OnTextEnter"></event> <event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event> <event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event> <event name="OnTextURL"></event>
@ -1982,7 +1982,7 @@
<event name="OnRightUp"></event> <event name="OnRightUp"></event>
<event name="OnSetFocus"></event> <event name="OnSetFocus"></event>
<event name="OnSize"></event> <event name="OnSize"></event>
<event name="OnText"></event> <event name="OnText">OnValuesChanged</event>
<event name="OnTextEnter"></event> <event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event> <event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event> <event name="OnTextURL"></event>
@ -2139,7 +2139,7 @@
<event name="OnRightUp"></event> <event name="OnRightUp"></event>
<event name="OnSetFocus"></event> <event name="OnSetFocus"></event>
<event name="OnSize"></event> <event name="OnSize"></event>
<event name="OnText"></event> <event name="OnText">OnValuesChanged</event>
<event name="OnTextEnter"></event> <event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event> <event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event> <event name="OnTextURL"></event>
@ -2215,7 +2215,7 @@
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxEXPAND</property> <property name="flag">wxEXPAND</property>
<property name="proportion">0</property> <property name="proportion">1</property>
<object class="wxBoxSizer" expanded="1"> <object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property> <property name="minimum_size"></property>
<property name="name">bMiddleUpperSizer</property> <property name="name">bMiddleUpperSizer</property>
@ -2224,7 +2224,7 @@
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxBOTTOM</property> <property name="flag">wxBOTTOM</property>
<property name="proportion">1</property> <property name="proportion">0</property>
<object class="wxBoxSizer" expanded="1"> <object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property> <property name="minimum_size"></property>
<property name="name">m_DrillShapeBoxSizer</property> <property name="name">m_DrillShapeBoxSizer</property>
@ -2286,7 +2286,7 @@
</object> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property> <property name="flag">wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxRadioBox" expanded="1"> <object class="wxRadioBox" expanded="1">
<property name="bg"></property> <property name="bg"></property>
@ -2342,7 +2342,7 @@
</object> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property> <property name="flag">wxBOTTOM</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxBoxSizer" expanded="1"> <object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property> <property name="minimum_size"></property>
@ -2355,7 +2355,7 @@
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxRadioBox" expanded="1"> <object class="wxRadioBox" expanded="1">
<property name="bg"></property> <property name="bg"></property>
<property name="choices">&quot;0&quot; &quot;90&quot; &quot;-90&quot; &quot;180&quot; &quot;User&quot;</property> <property name="choices">&quot;0&quot; &quot;90&quot; &quot;-90&quot; &quot;180&quot; &quot;Custom&quot;</property>
<property name="context_help"></property> <property name="context_help"></property>
<property name="enabled">1</property> <property name="enabled">1</property>
<property name="fg"></property> <property name="fg"></property>
@ -2502,7 +2502,7 @@
<event name="OnRightUp"></event> <event name="OnRightUp"></event>
<event name="OnSetFocus"></event> <event name="OnSetFocus"></event>
<event name="OnSize"></event> <event name="OnSize"></event>
<event name="OnText"></event> <event name="OnText">OnValuesChanged</event>
<event name="OnTextEnter"></event> <event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event> <event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event> <event name="OnTextURL"></event>
@ -2511,11 +2511,295 @@
</object> </object>
</object> </object>
</object> </object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND | wxALL</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">wxVERTICAL</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">0</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</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</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> </object>
</object> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxEXPAND</property> <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxStaticBoxSizer" expanded="1"> <object class="wxStaticBoxSizer" expanded="1">
<property name="id">wxID_ANY</property> <property name="id">wxID_ANY</property>
@ -2540,7 +2824,7 @@
<property name="label">Set these values to 0&#x0A;to use Parent footprint or global values</property> <property name="label">Set these values to 0&#x0A;to use Parent footprint or global values</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_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="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
<property name="size"></property> <property name="size"></property>
@ -2691,7 +2975,7 @@
<event name="OnRightUp"></event> <event name="OnRightUp"></event>
<event name="OnSetFocus"></event> <event name="OnSetFocus"></event>
<event name="OnSize"></event> <event name="OnSize"></event>
<event name="OnText"></event> <event name="OnText">OnValuesChanged</event>
<event name="OnTextEnter"></event> <event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event> <event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event> <event name="OnTextURL"></event>
@ -2751,7 +3035,7 @@
</object> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxEXPAND|wxALL</property> <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxStaticLine" expanded="1"> <object class="wxStaticLine" expanded="1">
<property name="bg"></property> <property name="bg"></property>
@ -2800,7 +3084,7 @@
</object> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxEXPAND | wxALL</property> <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxStaticLine" expanded="1"> <object class="wxStaticLine" expanded="1">
<property name="bg"></property> <property name="bg"></property>
@ -2849,7 +3133,7 @@
</object> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxEXPAND | wxALL</property> <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxStaticLine" expanded="1"> <object class="wxStaticLine" expanded="1">
<property name="bg"></property> <property name="bg"></property>
@ -3375,7 +3659,7 @@
</object> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT</property> <property name="flag">wxBOTTOM|wxRIGHT|wxEXPAND</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxBoxSizer" expanded="0"> <object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property> <property name="minimum_size"></property>
@ -3475,7 +3759,7 @@
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style"></property> <property name="window_style"></property>
<event name="OnChar"></event> <event name="OnChar"></event>
<event name="OnCheckBox"></event> <event name="OnCheckBox">OnSetLayer</event>
<event name="OnEnterWindow"></event> <event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event> <event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event> <event name="OnKeyDown"></event>
@ -3527,7 +3811,7 @@
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style"></property> <property name="window_style"></property>
<event name="OnChar"></event> <event name="OnChar"></event>
<event name="OnCheckBox"></event> <event name="OnCheckBox">OnSetLayer</event>
<event name="OnEnterWindow"></event> <event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event> <event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event> <event name="OnKeyDown"></event>
@ -3589,7 +3873,7 @@
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style"></property> <property name="window_style"></property>
<event name="OnChar"></event> <event name="OnChar"></event>
<event name="OnCheckBox"></event> <event name="OnCheckBox">OnSetLayer</event>
<event name="OnEnterWindow"></event> <event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event> <event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event> <event name="OnKeyDown"></event>
@ -3641,7 +3925,7 @@
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style"></property> <property name="window_style"></property>
<event name="OnChar"></event> <event name="OnChar"></event>
<event name="OnCheckBox"></event> <event name="OnCheckBox">OnSetLayer</event>
<event name="OnEnterWindow"></event> <event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event> <event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event> <event name="OnKeyDown"></event>
@ -3693,7 +3977,7 @@
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style"></property> <property name="window_style"></property>
<event name="OnChar"></event> <event name="OnChar"></event>
<event name="OnCheckBox"></event> <event name="OnCheckBox">OnSetLayer</event>
<event name="OnEnterWindow"></event> <event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event> <event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event> <event name="OnKeyDown"></event>
@ -3745,7 +4029,7 @@
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style"></property> <property name="window_style"></property>
<event name="OnChar"></event> <event name="OnChar"></event>
<event name="OnCheckBox"></event> <event name="OnCheckBox">OnSetLayer</event>
<event name="OnEnterWindow"></event> <event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event> <event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event> <event name="OnKeyDown"></event>
@ -3797,7 +4081,7 @@
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style"></property> <property name="window_style"></property>
<event name="OnChar"></event> <event name="OnChar"></event>
<event name="OnCheckBox"></event> <event name="OnCheckBox">OnSetLayer</event>
<event name="OnEnterWindow"></event> <event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event> <event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event> <event name="OnKeyDown"></event>
@ -3849,7 +4133,7 @@
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style"></property> <property name="window_style"></property>
<event name="OnChar"></event> <event name="OnChar"></event>
<event name="OnCheckBox"></event> <event name="OnCheckBox">OnSetLayer</event>
<event name="OnEnterWindow"></event> <event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event> <event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event> <event name="OnKeyDown"></event>
@ -3901,7 +4185,7 @@
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style"></property> <property name="window_style"></property>
<event name="OnChar"></event> <event name="OnChar"></event>
<event name="OnCheckBox"></event> <event name="OnCheckBox">OnSetLayer</event>
<event name="OnEnterWindow"></event> <event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event> <event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event> <event name="OnKeyDown"></event>
@ -3953,7 +4237,7 @@
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style"></property> <property name="window_style"></property>
<event name="OnChar"></event> <event name="OnChar"></event>
<event name="OnCheckBox"></event> <event name="OnCheckBox">OnSetLayer</event>
<event name="OnEnterWindow"></event> <event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event> <event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event> <event name="OnKeyDown"></event>
@ -4005,7 +4289,7 @@
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style"></property> <property name="window_style"></property>
<event name="OnChar"></event> <event name="OnChar"></event>
<event name="OnCheckBox"></event> <event name="OnCheckBox">OnSetLayer</event>
<event name="OnEnterWindow"></event> <event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event> <event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event> <event name="OnKeyDown"></event>
@ -4057,7 +4341,7 @@
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style"></property> <property name="window_style"></property>
<event name="OnChar"></event> <event name="OnChar"></event>
<event name="OnCheckBox"></event> <event name="OnCheckBox">OnSetLayer</event>
<event name="OnEnterWindow"></event> <event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event> <event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event> <event name="OnKeyDown"></event>
@ -4109,7 +4393,7 @@
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style"></property> <property name="window_style"></property>
<event name="OnChar"></event> <event name="OnChar"></event>
<event name="OnCheckBox"></event> <event name="OnCheckBox">OnSetLayer</event>
<event name="OnEnterWindow"></event> <event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event> <event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event> <event name="OnKeyDown"></event>
@ -4142,7 +4426,7 @@
</object> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxEXPAND|wxTOP|wxBOTTOM</property> <property name="flag">wxTOP|wxBOTTOM|wxEXPAND</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxStdDialogButtonSizer" expanded="1"> <object class="wxStdDialogButtonSizer" expanded="1">
<property name="Apply">0</property> <property name="Apply">0</property>

View File

@ -21,6 +21,7 @@
#include <wx/sizer.h> #include <wx/sizer.h>
#include <wx/statbox.h> #include <wx/statbox.h>
#include <wx/radiobox.h> #include <wx/radiobox.h>
#include <wx/panel.h>
#include <wx/checkbox.h> #include <wx/checkbox.h>
#include <wx/button.h> #include <wx/button.h>
#include <wx/dialog.h> #include <wx/dialog.h>
@ -92,7 +93,12 @@ class DIALOG_PAD_PROPERTIES_BASE : public wxDialog
wxRadioBox* m_PadOrient; wxRadioBox* m_PadOrient;
wxStaticText* m_PadOrientText; wxStaticText* m_PadOrientText;
wxTextCtrl* m_PadOrientCtrl; wxTextCtrl* m_PadOrientCtrl;
wxStaticText* m_staticText20; wxPanel* m_panelShowPad;
wxStaticText* m_staticTitleModuleRot;
wxStaticText* m_staticModuleRotValue;
wxStaticText* m_staticTitleModuleSide;
wxStaticText* m_staticModuleSideValue;
wxStaticText* m_staticTextWarning;
wxStaticText* m_staticTextNetClearance; wxStaticText* m_staticTextNetClearance;
wxTextCtrl* m_NetClearanceValueCtrl; wxTextCtrl* m_NetClearanceValueCtrl;
wxStaticText* m_NetClearanceUnits; wxStaticText* m_NetClearanceUnits;
@ -128,16 +134,19 @@ class DIALOG_PAD_PROPERTIES_BASE : public wxDialog
wxButton* m_sdbSizer1Cancel; wxButton* m_sdbSizer1Cancel;
// Virtual event handlers, overide them in your derived class // 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 OnPadShapeSelection( wxCommandEvent& event ){ event.Skip(); }
virtual void OnDrillShapeSelected( wxCommandEvent& event ){ event.Skip(); } virtual void OnDrillShapeSelected( wxCommandEvent& event ){ event.Skip(); }
virtual void PadOrientEvent( 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 PadTypeSelected( wxCommandEvent& event ){ event.Skip(); }
virtual void OnSetLayer( wxCommandEvent& event ){ event.Skip(); }
virtual void OnCancelButtonClick( wxCommandEvent& event ){ event.Skip(); } virtual void OnCancelButtonClick( wxCommandEvent& event ){ event.Skip(); }
virtual void PadPropertiesAccept( wxCommandEvent& event ){ event.Skip(); } virtual void PadPropertiesAccept( wxCommandEvent& event ){ event.Skip(); }
public: 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(); ~DIALOG_PAD_PROPERTIES_BASE();
}; };

View File

@ -291,7 +291,7 @@ void WinEDA_PcbFrame::ReCreateMenuBar()
/* Swap Layers */ /* Swap Layers */
item = new wxMenuItem( editMenu, ID_MENU_PCB_SWAP_LAYERS, item = new wxMenuItem( editMenu, ID_MENU_PCB_SWAP_LAYERS,
_( "&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 ); item->SetBitmap( swap_layer_xpm );
editMenu->Append( item ); editMenu->Append( item );
@ -309,7 +309,7 @@ void WinEDA_PcbFrame::ReCreateMenuBar()
* From hotkeys, zooming is made around the mouse cursor position * From hotkeys, zooming is made around the mouse cursor position
* (obviously not possible from the toolbar or menubar command) * (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 * for Zoom in and Zoom out sub menus
*/ */
/* Zoom in */ /* Zoom in */