see change_log.txt for 2007-Aug-22

This commit is contained in:
dickelbeck 2007-08-23 04:28:46 +00:00
parent 4da2971dcc
commit cc62305777
88 changed files with 9860 additions and 8580 deletions

View File

@ -202,13 +202,14 @@ void Pcb3D_GLCanvas::Draw3D_Track(TRACK * track)
/************************************************/ /************************************************/
{ {
double zpos; double zpos;
int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[track->m_Layer]; int layer = track->GetLayer();
int layer = track->m_Layer; int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[layer];
double ox, oy, fx, fy; double ox, oy, fx, fy;
double w; double w;
if ( color & ITEM_NOT_SHOW ) return; if ( color & ITEM_NOT_SHOW ) return;
if ( track->m_Layer == CMP_N ) layer = g_Parm_3D_Visu.m_Layers -1; if ( layer == CMP_N )
layer = g_Parm_3D_Visu.m_Layers -1;
zpos = g_Parm_3D_Visu.m_LayerZcoord[layer]; zpos = g_Parm_3D_Visu.m_LayerZcoord[layer];
SetGLColor(color); SetGLColor(color);
@ -268,7 +269,7 @@ void Pcb3D_GLCanvas::Draw3D_DrawSegment(DRAWSEGMENT * segment)
int layer; int layer;
double x, y, xf, yf; double x, y, xf, yf;
double zpos, w; double zpos, w;
int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[segment->m_Layer]; int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[segment->GetLayer()];
if ( color & ITEM_NOT_SHOW ) return; if ( color & ITEM_NOT_SHOW ) return;
@ -279,7 +280,7 @@ int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[segment->m_Layer];
xf = segment->m_End.x * g_Parm_3D_Visu.m_BoardScale; xf = segment->m_End.x * g_Parm_3D_Visu.m_BoardScale;
yf = segment->m_End.y * g_Parm_3D_Visu.m_BoardScale; yf = segment->m_End.y * g_Parm_3D_Visu.m_BoardScale;
if ( segment->m_Layer == EDGE_N) if ( segment->GetLayer() == EDGE_N)
{ {
for ( layer = 0; layer < g_Parm_3D_Visu.m_Layers; layer++ ) for ( layer = 0; layer < g_Parm_3D_Visu.m_Layers; layer++ )
{ {
@ -291,7 +292,7 @@ int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[segment->m_Layer];
else else
{ {
zpos = g_Parm_3D_Visu.m_LayerZcoord[segment->m_Layer]; zpos = g_Parm_3D_Visu.m_LayerZcoord[segment->GetLayer()];
Draw3D_FilledSegment( x, -y, xf, -yf, w, zpos); Draw3D_FilledSegment( x, -y, xf, -yf, w, zpos);
} }
} }

View File

@ -5,16 +5,36 @@ Please add newer entries at the top, list the date and your name with
email address. email address.
2007-Aug-23 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
@todo add constructor initializers for classes that were derived from
EDA_BaseLineStruct but are now not. Its late, will do tomorrow.
@todo test yesterday's changes, it builds, may not run right yet.
2007-Aug-22 UPDATE Dick Hollenbeck <dick@softplc.com> 2007-Aug-22 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================ ================================================================================
+ eeschema & pcbnew + eeschema & pcbnew
Things are still pretty transient, should be stable a day or two:
* Fixed a filename case sensitivity problem that would show up on Linux * Fixed a filename case sensitivity problem that would show up on Linux
but probably not on Windows: bitmap/Reload.xpm needed uppercase R. but probably not on Windows: bitmap/Reload.xpm needed uppercase R.
* Since so many classes introduced m_Layer, I moved m_Layer into * Wedged a new class BOARD_ITEM underneath all PCB drawable classes, this is
EDA_BaseStruct so all classes can inherit it and that way we can test a big change and may introduce a bug or two, but it is worth it for the
layer using a general, polymorphic test, i.e. don't have to cast a future, because we can introduce virtual functions there that do not impact
EDA_BaseStruct* to a class specific pointer to test layer. Could also have the entire project (since everything is derived from EDA_BaseStruct).
used a virtual function but too many places use m_Layer directly. The corresponding class in EESCHEMA seems to be DrawPartStruct, so we had
nothing in PCBNEW like that.
BOARD_ITEM::GetLayer() and SetLayer() introduced, more functions to come.
Much of this work is geared towards making collectors.cpp's ARROWCOLLECTOR::Inspect()
very very simple, and that can be model for future work.
* Changed min() and max() macros to MIN() and MAX() because min() and max()
are actually reserved according to the C++ standard! (and their usage prevented
the use of #include <vector>).
* Added files class_collector.h, collectors.h, and collectors.cpp.
File collectors.cpp is still unfinished.
* Started using a function and class comment style that will make sense to the
Doxygen source code documenter program.
* Beautified more un-beautified files.
2007-aug-21 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr> 2007-aug-21 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>

View File

@ -106,7 +106,6 @@ void EDA_BaseStruct::InitVars( void )
m_TimeStamp = 0; // Time stamp used for logical links m_TimeStamp = 0; // Time stamp used for logical links
m_Status = 0; m_Status = 0;
m_Selected = 0; /* Used by block commands, and selective editing */ m_Selected = 0; /* Used by block commands, and selective editing */
m_Layer = 0;
} }
@ -283,6 +282,7 @@ std::ostream& EDA_BaseStruct::NestedSpace( int nestLevel, std::ostream& os )
#endif #endif
/**********************************************************************************************/ /**********************************************************************************************/
EDA_BaseLineStruct::EDA_BaseLineStruct( EDA_BaseStruct* StructFather, DrawStructureType idtype ) : EDA_BaseLineStruct::EDA_BaseLineStruct( EDA_BaseStruct* StructFather, DrawStructureType idtype ) :
EDA_BaseStruct( StructFather, idtype ) EDA_BaseStruct( StructFather, idtype )

View File

@ -1,4 +1,5 @@
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Name: sheet.cpp // Name: sheet.cpp
// Purpose: // Purpose:
// Author: jean-pierre Charras // Author: jean-pierre Charras
@ -45,8 +46,9 @@ DrawSheetStruct::DrawSheetStruct(const wxPoint & pos) :
m_StructType = DRAW_SHEET_STRUCT_TYPE; m_StructType = DRAW_SHEET_STRUCT_TYPE;
} }
/**************************************/ /**************************************/
DrawSheetStruct::~DrawSheetStruct(void) DrawSheetStruct::~DrawSheetStruct()
/**************************************/ /**************************************/
{ {
DrawSheetLabelStruct* label = m_Label, * next_label; DrawSheetLabelStruct* label = m_Label, * next_label;
@ -63,11 +65,13 @@ DrawSheetLabelStruct * label = m_Label, * next_label;
/***********************************************/ /***********************************************/
DrawSheetStruct* DrawSheetStruct::GenCopy( void ) DrawSheetStruct* DrawSheetStruct::GenCopy( void )
/***********************************************/ /***********************************************/
/* creates a copy of a sheet /* creates a copy of a sheet
The linked data itself (EEDrawList) is not duplicated * The linked data itself (EEDrawList) is not duplicated
*/ */
{ {
DrawSheetStruct* newitem = new DrawSheetStruct( m_Pos ); DrawSheetStruct* newitem = new DrawSheetStruct( m_Pos );
DrawSheetLabelStruct* Slabel = NULL, * label = m_Label; DrawSheetLabelStruct* Slabel = NULL, * label = m_Label;
newitem->m_Size = m_Size; newitem->m_Size = m_Size;
@ -129,8 +133,9 @@ DrawSheetLabelStruct * Slabel = NULL, * label = m_Label;
/**********************************************************/ /**********************************************************/
void DrawSheetStruct::SwapData( DrawSheetStruct* copyitem ) void DrawSheetStruct::SwapData( DrawSheetStruct* copyitem )
/**********************************************************/ /**********************************************************/
/* Used if undo / redo command: /* Used if undo / redo command:
swap data between this and copyitem * swap data between this and copyitem
*/ */
{ {
EXCHG( m_Pos, copyitem->m_Pos ); EXCHG( m_Pos, copyitem->m_Pos );
@ -142,6 +147,7 @@ void DrawSheetStruct::SwapData(DrawSheetStruct * copyitem)
EXCHG( m_NbLabel, copyitem->m_NbLabel ); EXCHG( m_NbLabel, copyitem->m_NbLabel );
} }
/**************************************************************************************/ /**************************************************************************************/
void DrawSheetStruct::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, void DrawSheetStruct::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset,
int DrawMode, int Color ) int DrawMode, int Color )
@ -155,16 +161,20 @@ int color;
wxPoint pos = m_Pos + offset; wxPoint pos = m_Pos + offset;
int LineWidth = g_DrawMinimunLineWidth; int LineWidth = g_DrawMinimunLineWidth;
if( Color >= 0 ) color = Color; if( Color >= 0 )
else color = ReturnLayerColor(m_Layer); color = Color;
else
color = ReturnLayerColor( m_Layer );
GRSetDrawMode( DC, DrawMode ); GRSetDrawMode( DC, DrawMode );
GRRect( &panel->m_ClipBox, DC, pos.x, pos.y, GRRect( &panel->m_ClipBox, DC, pos.x, pos.y,
pos.x + m_Size.x, pos.y + m_Size.y, LineWidth, color ); pos.x + m_Size.x, pos.y + m_Size.y, LineWidth, color );
/* Draw text : SheetName */ /* Draw text : SheetName */
if( Color > 0 ) txtcolor = Color; if( Color > 0 )
else txtcolor = ReturnLayerColor(LAYER_SHEETNAME); txtcolor = Color;
else
txtcolor = ReturnLayerColor( LAYER_SHEETNAME );
Text = wxT( "Sheet: " ) + m_SheetName; Text = wxT( "Sheet: " ) + m_SheetName;
DrawGraphicText( panel, DC, DrawGraphicText( panel, DC,
@ -173,8 +183,10 @@ int LineWidth = g_DrawMinimunLineWidth;
GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_BOTTOM, LineWidth ); GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_BOTTOM, LineWidth );
/* Draw text : FileName */ /* Draw text : FileName */
if( Color >= 0 ) txtcolor = Color; if( Color >= 0 )
else txtcolor = ReturnLayerColor(LAYER_SHEETFILENAME); txtcolor = Color;
else
txtcolor = ReturnLayerColor( LAYER_SHEETFILENAME );
Text = wxT( "File: " ) + m_FileName; Text = wxT( "File: " ) + m_FileName;
DrawGraphicText( panel, DC, DrawGraphicText( panel, DC,
wxPoint( pos.x, pos.y + m_Size.y + 4 ), wxPoint( pos.x, pos.y + m_Size.y + 4 ),
@ -212,6 +224,7 @@ DrawSheetLabelStruct::DrawSheetLabelStruct(DrawSheetStruct * parent,
m_IsDangling = TRUE; m_IsDangling = TRUE;
} }
/***********************************************************/ /***********************************************************/
DrawSheetLabelStruct* DrawSheetLabelStruct::GenCopy( void ) DrawSheetLabelStruct* DrawSheetLabelStruct::GenCopy( void )
/***********************************************************/ /***********************************************************/
@ -226,7 +239,6 @@ DrawSheetLabelStruct * newitem =
} }
/********************************************************************************************/ /********************************************************************************************/
void DrawSheetLabelStruct::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, void DrawSheetLabelStruct::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset,
int DrawMode, int Color ) int DrawMode, int Color )
@ -239,8 +251,10 @@ wxSize size;
int NbSegm, coord[20]; int NbSegm, coord[20];
int LineWidth = g_DrawMinimunLineWidth; int LineWidth = g_DrawMinimunLineWidth;
if( Color >= 0 ) txtcolor = Color; if( Color >= 0 )
else txtcolor = ReturnLayerColor(m_Layer); txtcolor = Color;
else
txtcolor = ReturnLayerColor( m_Layer );
GRSetDrawMode( DC, DrawMode ); GRSetDrawMode( DC, DrawMode );
posx = m_Pos.x + offset.x; posy = m_Pos.y + offset.y; size = m_Size; posx = m_Pos.x + offset.x; posy = m_Pos.y + offset.y; size = m_Size;
@ -270,6 +284,7 @@ int LineWidth = g_DrawMinimunLineWidth;
coord[0] = posx; coord[1] = posy; size2 = size.x / 2; coord[0] = posx; coord[1] = posy; size2 = size.x / 2;
NbSegm = 0; NbSegm = 0;
switch( m_Shape ) switch( m_Shape )
{ {
case 0: /* input |> */ case 0: /* input |> */
@ -309,8 +324,7 @@ int LineWidth = g_DrawMinimunLineWidth;
NbSegm = 6; NbSegm = 6;
break; break;
} }
int FillShape = FALSE; int FillShape = FALSE;
GRPoly( &panel->m_ClipBox, DC, NbSegm, coord, FillShape, LineWidth, txtcolor, txtcolor ); /* Poly Non rempli */ GRPoly( &panel->m_ClipBox, DC, NbSegm, coord, FillShape, LineWidth, txtcolor, txtcolor ); /* Poly Non rempli */
} }

View File

@ -107,10 +107,10 @@ public:
}; };
class DrawSheetLabelStruct : public EDA_BaseStruct class DrawSheetLabelStruct : public EDA_BaseStruct, public EDA_TextStruct
, public EDA_TextStruct
{ {
public: public:
int m_Layer;
int m_Edge, m_Shape; int m_Edge, m_Shape;
bool m_IsDangling; // TRUE si non connecté bool m_IsDangling; // TRUE si non connecté
@ -141,6 +141,7 @@ public:
int m_FileNameSize; int m_FileNameSize;
wxPoint m_Pos; wxPoint m_Pos;
wxSize m_Size; /* Position and Size of sheet symbol */ wxSize m_Size; /* Position and Size of sheet symbol */
int m_Layer;
DrawSheetLabelStruct* m_Label; /* Points de connection */ DrawSheetLabelStruct* m_Label; /* Points de connection */
int m_NbLabel; /* Nombre de points de connexion */ int m_NbLabel; /* Nombre de points de connexion */

View File

@ -14,13 +14,11 @@
#include "protos.h" #include "protos.h"
/*******************************************************************/ /*******************************************************************/
DrawBusEntryStruct::DrawBusEntryStruct( const wxPoint& pos, int shape, int id ) : DrawBusEntryStruct::DrawBusEntryStruct( const wxPoint& pos, int shape, int id ) :
EDA_BaseStruct( DRAW_BUSENTRY_STRUCT_TYPE ) EDA_BaseStruct( DRAW_BUSENTRY_STRUCT_TYPE )
/*******************************************************************/ /*******************************************************************/
{ {
m_Pos = pos; m_Pos = pos;
m_Size.x = 100; m_Size.x = 100;
m_Size.y = 100; m_Size.y = 100;
@ -33,19 +31,21 @@ DrawBusEntryStruct::DrawBusEntryStruct(const wxPoint & pos, int shape, int id) :
m_Width = 1; m_Width = 1;
} }
if(shape == '/' ) m_Size.y = - 100; if( shape == '/' )
m_Size.y = -100;
} }
/*************************************/ /*************************************/
wxPoint DrawBusEntryStruct::m_End( void ) wxPoint DrawBusEntryStruct::m_End( void )
/*************************************/ /*************************************/
// retourne la coord de fin du raccord // retourne la coord de fin du raccord
{ {
return ( wxPoint(m_Pos.x + m_Size.x, m_Pos.y + m_Size.y) ); return wxPoint( m_Pos.x + m_Size.x, m_Pos.y + m_Size.y );
} }
/***************************************************/ /***************************************************/
DrawBusEntryStruct* DrawBusEntryStruct::GenCopy( void ) DrawBusEntryStruct* DrawBusEntryStruct::GenCopy( void )
/***************************************************/ /***************************************************/
@ -74,6 +74,7 @@ DrawJunctionStruct::DrawJunctionStruct(const wxPoint & pos) :
m_Layer = LAYER_JUNCTION; m_Layer = LAYER_JUNCTION;
} }
DrawJunctionStruct* DrawJunctionStruct::GenCopy( void ) DrawJunctionStruct* DrawJunctionStruct::GenCopy( void )
{ {
DrawJunctionStruct* newitem = new DrawJunctionStruct( m_Pos ); DrawJunctionStruct* newitem = new DrawJunctionStruct( m_Pos );
@ -95,6 +96,7 @@ DrawNoConnectStruct::DrawNoConnectStruct(const wxPoint & pos) :
m_Pos = pos; m_Pos = pos;
} }
DrawNoConnectStruct* DrawNoConnectStruct::GenCopy( void ) DrawNoConnectStruct* DrawNoConnectStruct::GenCopy( void )
{ {
DrawNoConnectStruct* newitem = new DrawNoConnectStruct( m_Pos ); DrawNoConnectStruct* newitem = new DrawNoConnectStruct( m_Pos );
@ -118,13 +120,16 @@ DrawMarkerStruct::DrawMarkerStruct( const wxPoint & pos, const wxString & text):
m_Comment = text; m_Comment = text;
} }
DrawMarkerStruct::~DrawMarkerStruct( void ) DrawMarkerStruct::~DrawMarkerStruct( void )
{ {
} }
DrawMarkerStruct* DrawMarkerStruct::GenCopy( void ) DrawMarkerStruct* DrawMarkerStruct::GenCopy( void )
{ {
DrawMarkerStruct* newitem = new DrawMarkerStruct( m_Pos, m_Comment ); DrawMarkerStruct* newitem = new DrawMarkerStruct( m_Pos, m_Comment );
newitem->m_Type = m_Type; newitem->m_Type = m_Type;
newitem->m_MarkFlags = m_MarkFlags; newitem->m_MarkFlags = m_MarkFlags;
@ -160,6 +165,7 @@ EDA_DrawLineStruct::EDA_DrawLineStruct(const wxPoint & pos, int layer ):
m_Layer = LAYER_WIRE; m_Layer = LAYER_WIRE;
m_Width = GR_NORM_WIDTH; m_Width = GR_NORM_WIDTH;
break; break;
case LAYER_BUS: case LAYER_BUS:
m_Layer = LAYER_BUS; m_Layer = LAYER_BUS;
m_Width = GR_THICK_WIDTH; m_Width = GR_THICK_WIDTH;
@ -167,6 +173,7 @@ EDA_DrawLineStruct::EDA_DrawLineStruct(const wxPoint & pos, int layer ):
} }
} }
/***************************************************/ /***************************************************/
EDA_DrawLineStruct* EDA_DrawLineStruct::GenCopy( void ) EDA_DrawLineStruct* EDA_DrawLineStruct::GenCopy( void )
/***************************************************/ /***************************************************/
@ -178,17 +185,22 @@ EDA_DrawLineStruct * newitem = new EDA_DrawLineStruct(m_Start, m_Layer);
return newitem; return newitem;
} }
/************************************************************/ /************************************************************/
bool EDA_DrawLineStruct::IsOneEndPointAt( const wxPoint& pos ) bool EDA_DrawLineStruct::IsOneEndPointAt( const wxPoint& pos )
/************************************************************/ /************************************************************/
/* Return TRUE if the start or the end point is in position pos /* Return TRUE if the start or the end point is in position pos
*/ */
{ {
if ( (pos.x == m_Start.x) && (pos.y == m_Start.y) ) return TRUE; if( (pos.x == m_Start.x) && (pos.y == m_Start.y) )
if ( (pos.x == m_End.x) && (pos.y == m_End.y) ) return TRUE; return TRUE;
if( (pos.x == m_End.x) && (pos.y == m_End.y) )
return TRUE;
return FALSE; return FALSE;
} }
/****************************/ /****************************/
/* Class DrawPolylineStruct */ /* Class DrawPolylineStruct */
/****************************/ /****************************/
@ -225,9 +237,11 @@ DrawPolylineStruct::DrawPolylineStruct(int layer):
DrawPolylineStruct::~DrawPolylineStruct( void ) DrawPolylineStruct::~DrawPolylineStruct( void )
/*********************************************/ /*********************************************/
{ {
if ( m_Points ) free ( m_Points ); if( m_Points )
free( m_Points );
} }
/*****************************************************/ /*****************************************************/
DrawPolylineStruct* DrawPolylineStruct::GenCopy( void ) DrawPolylineStruct* DrawPolylineStruct::GenCopy( void )
/*****************************************************/ /*****************************************************/
@ -244,6 +258,3 @@ DrawPolylineStruct * newitem =
return newitem; return newitem;
} }

View File

@ -39,6 +39,7 @@ typedef enum
class PartTextStruct: public EDA_BaseStruct, public EDA_TextStruct class PartTextStruct: public EDA_BaseStruct, public EDA_TextStruct
{ {
public: public:
int m_Layer;
int m_FieldId; int m_FieldId;
wxString m_Name; /* Field name (ref, value,pcb, sheet, filed 1.. wxString m_Name; /* Field name (ref, value,pcb, sheet, filed 1..
and for fields 1 to 8 the name is editable */ and for fields 1 to 8 the name is editable */
@ -54,6 +55,7 @@ public:
void SwapData(PartTextStruct * copyitem); void SwapData(PartTextStruct * copyitem);
}; };
/* the class DrawPartStruct describes a basic virtual component /* the class DrawPartStruct describes a basic virtual component
Not used directly: Not used directly:
used classes are EDA_SchComponentStruct (the "classic" schematic component used classes are EDA_SchComponentStruct (the "classic" schematic component
@ -62,6 +64,7 @@ public:
class DrawPartStruct: public EDA_BaseStruct class DrawPartStruct: public EDA_BaseStruct
{ {
public: public:
int m_Layer;
wxString m_ChipName; /* Key to look for in the library, i.e. "74LS00". */ wxString m_ChipName; /* Key to look for in the library, i.e. "74LS00". */
PartTextStruct m_Field[NUMBER_OF_FIELDS]; PartTextStruct m_Field[NUMBER_OF_FIELDS];
wxPoint m_Pos; /* Exact position of part. */ wxPoint m_Pos; /* Exact position of part. */

View File

@ -106,6 +106,7 @@ class DrawBusEntryStruct: public EDA_BaseStruct /* Struct de descr 1 raccord
a 45 degres de BUS ou WIRE */ a 45 degres de BUS ou WIRE */
{ {
public: public:
int m_Layer;
int m_Width; int m_Width;
wxPoint m_Pos; wxPoint m_Pos;
wxSize m_Size; wxSize m_Size;
@ -121,6 +122,7 @@ public:
class DrawPolylineStruct: public EDA_BaseStruct /* Polyligne (serie de segments) */ class DrawPolylineStruct: public EDA_BaseStruct /* Polyligne (serie de segments) */
{ {
public: public:
int m_Layer;
int m_Width; int m_Width;
int m_NumOfPoints; /* Number of XY pairs in Points array. */ int m_NumOfPoints; /* Number of XY pairs in Points array. */
int *m_Points; /* XY pairs that forms the polyline. */ int *m_Points; /* XY pairs that forms the polyline. */
@ -135,6 +137,7 @@ public:
class DrawJunctionStruct: public EDA_BaseStruct class DrawJunctionStruct: public EDA_BaseStruct
{ {
public: public:
int m_Layer;
wxPoint m_Pos; /* XY coordinates of connection. */ wxPoint m_Pos; /* XY coordinates of connection. */
public: public:
@ -147,6 +150,7 @@ public:
class DrawTextStruct: public EDA_BaseStruct, public EDA_TextStruct class DrawTextStruct: public EDA_BaseStruct, public EDA_TextStruct
{ {
public: public:
int m_Layer;
int m_Shape; int m_Shape;
bool m_IsDangling; // TRUE si non connecté bool m_IsDangling; // TRUE si non connecté
@ -163,6 +167,7 @@ private:
void DrawAsGlobalLabel(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & offset, int draw_mode, int Color); void DrawAsGlobalLabel(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & offset, int draw_mode, int Color);
}; };
class DrawLabelStruct: public DrawTextStruct class DrawLabelStruct: public DrawTextStruct
{ {
public: public:
@ -170,6 +175,7 @@ public:
~DrawLabelStruct(void) {} ~DrawLabelStruct(void) {}
}; };
class DrawGlobalLabelStruct: public DrawTextStruct class DrawGlobalLabelStruct: public DrawTextStruct
{ {
public: public:

View File

@ -15,9 +15,10 @@
/****************************************************************************/ /****************************************************************************/
void Affiche_Infos_PCB_Texte( WinEDA_BasePcbFrame* frame, TEXTE_PCB* pt_texte ) void Affiche_Infos_PCB_Texte( WinEDA_BasePcbFrame* frame, TEXTE_PCB* pt_texte )
/****************************************************************************/ /****************************************************************************/
/* Affiche en bas d'ecran les caract du texte sur PCB /* Affiche en bas d'ecran les caract du texte sur PCB
Entree : * Entree :
pointeur de la description du texte * pointeur de la description du texte
*/ */
{ {
wxString Line; wxString Line;
@ -30,13 +31,18 @@ wxString Line;
else else
Affiche_1_Parametre( frame, 1, _( "PCB Text" ), pt_texte->m_Text, DARKGREEN ); Affiche_1_Parametre( frame, 1, _( "PCB Text" ), pt_texte->m_Text, DARKGREEN );
Line = _("Layer "); Line << pt_texte->m_Layer + 1; Line = _( "Layer " );
Affiche_1_Parametre(frame, 28, _("Layer:"), Line, g_DesignSettings.m_LayerColor[pt_texte->m_Layer] ); Line << pt_texte->GetLayer() + 1;
Affiche_1_Parametre( frame, 28, _( "Layer:" ), Line,
g_DesignSettings.m_LayerColor[pt_texte->GetLayer()] );
Affiche_1_Parametre( frame, 36, _( "Mirror" ), wxEmptyString, GREEN ); Affiche_1_Parametre( frame, 36, _( "Mirror" ), wxEmptyString, GREEN );
if( (pt_texte->m_Miroir & 1) ) if( (pt_texte->m_Miroir & 1) )
Affiche_1_Parametre( frame, -1, wxEmptyString, _( "No" ), DARKGREEN ); Affiche_1_Parametre( frame, -1, wxEmptyString, _( "No" ), DARKGREEN );
else Affiche_1_Parametre(frame, -1,wxEmptyString, _("Yes"), DARKGREEN) ; else
Affiche_1_Parametre( frame, -1, wxEmptyString, _( "Yes" ), DARKGREEN );
Line.Printf( wxT( "%.1f" ), (float) pt_texte->m_Orient / 10 ); Line.Printf( wxT( "%.1f" ), (float) pt_texte->m_Orient / 10 );
@ -50,11 +56,9 @@ wxString Line;
valeur_param( pt_texte->m_Size.y, Line ); valeur_param( pt_texte->m_Size.y, Line );
Affiche_1_Parametre( frame, 70, _( "V Size" ), Line, RED ); Affiche_1_Parametre( frame, 70, _( "V Size" ), Line, RED );
} }
/*********************************************************************/ /*********************************************************************/
void Affiche_Infos_Piste( WinEDA_BasePcbFrame* frame, TRACK* pt_piste ) void Affiche_Infos_Piste( WinEDA_BasePcbFrame* frame, TRACK* pt_piste )
/*********************************************************************/ /*********************************************************************/
@ -73,8 +77,10 @@ wxString msg;
switch( pt_piste->m_StructType ) switch( pt_piste->m_StructType )
{ {
case TYPETRACK: case TYPETRACK:
if ( pt_piste->m_Shape < S_SPOT_CIRCLE ) msg = wxT("LINE"); if( pt_piste->m_Shape < S_SPOT_CIRCLE )
else msg = wxT("FLASH"); msg = wxT( "LINE" );
else
msg = wxT( "FLASH" );
break; break;
case TYPEZONE: case TYPEZONE:
@ -83,6 +89,7 @@ wxString msg;
default: default:
msg = wxT( "????" ); break; msg = wxT( "????" ); break;
} }
Affiche_1_Parametre( frame, 1, _( "Type" ), msg, DARKCYAN ); Affiche_1_Parametre( frame, 1, _( "Type" ), msg, DARKCYAN );
msg.Printf( wxT( "%d" ), ii + 1 ); msg.Printf( wxT( "%d" ), ii + 1 );
@ -98,11 +105,10 @@ wxString msg;
BLUE ); BLUE );
} }
msg.Printf( wxT("%d"),pt_piste->m_Layer + 1); msg.Printf( wxT( "%d" ), pt_piste->GetLayer() + 1 );
Affiche_1_Parametre( frame, 40, _( "Layer" ), msg, BROWN ); Affiche_1_Parametre( frame, 40, _( "Layer" ), msg, BROWN );
/* Affiche Epaisseur */ /* Affiche Epaisseur */
valeur_param( (unsigned) (pt_piste->m_Width), msg ); valeur_param( (unsigned) (pt_piste->m_Width), msg );
Affiche_1_Parametre( frame, 50, _( "Width" ), msg, DARKCYAN ); Affiche_1_Parametre( frame, 50, _( "Width" ), msg, DARKCYAN );
} }

View File

@ -340,7 +340,7 @@ D_CODE * pt_Dcode; /* Pointeur sur le D code*/
track = m_Pcb->m_Track; track = m_Pcb->m_Track;
for ( ; track != NULL ; track = (TRACK*) track->Pnext ) for ( ; track != NULL ; track = (TRACK*) track->Pnext )
{ {
pt_Dcode = ReturnToolDescr(track->m_Layer, track->m_NetCode); pt_Dcode = ReturnToolDescr(track->GetLayer(), track->m_NetCode);
pt_Dcode->m_InUse = TRUE; pt_Dcode->m_InUse = TRUE;
if ( // Line Item if ( // Line Item
@ -359,8 +359,8 @@ D_CODE * pt_Dcode; /* Pointeur sur le D code*/
int width, len; int width, len;
wxSize size = pt_Dcode->m_Size; wxSize size = pt_Dcode->m_Size;
width = min( size.x, size.y ); width = MIN( size.x, size.y );
len = max( size.x, size.y ) - width; len = MAX( size.x, size.y ) - width;
track->m_Width = width; track->m_Width = width;

View File

@ -30,7 +30,7 @@ void WinEDA_GerberFrame::Delete_DCode_Items( wxDC* DC, int dcode_value, int laye
next_track = track->Next(); next_track = track->Next();
if( dcode_value != track->m_NetCode ) if( dcode_value != track->m_NetCode )
continue; continue;
if( layer_number >= 0 && layer_number != track->m_Layer ) if( layer_number >= 0 && layer_number != track->GetLayer() )
continue; continue;
Delete_Segment( DC, track ); Delete_Segment( DC, track );
} }

View File

@ -1,6 +1,7 @@
/* export_to_pcbnew.cpp */ /* export_to_pcbnew.cpp */
/* /*
Export des couches vers pcbnew * Export des couches vers pcbnew
*/ */
#include "fctsys.h" #include "fctsys.h"
@ -20,11 +21,14 @@ static int SavePcbFormatAscii(WinEDA_GerberFrame * frame,
/************************************************************************/ /************************************************************************/
void WinEDA_GerberFrame::ExportDataInPcbnewFormat( wxCommandEvent& event ) void WinEDA_GerberFrame::ExportDataInPcbnewFormat( wxCommandEvent& event )
/************************************************************************/ /************************************************************************/
/* Export data in pcbnew format /* Export data in pcbnew format
*/ */
{ {
wxString FullFileName, msg; wxString FullFileName, msg;
wxString PcbExt( wxT( ".brd" ) ); wxString PcbExt( wxT( ".brd" ) );
FILE* dest; FILE* dest;
msg = wxT( "*" ) + PcbExt; msg = wxT( "*" ) + PcbExt;
@ -37,7 +41,8 @@ FILE * dest;
wxFD_SAVE, wxFD_SAVE,
FALSE FALSE
); );
if ( FullFileName == wxEmptyString ) return; if( FullFileName == wxEmptyString )
return;
int* LayerLookUpTable; int* LayerLookUpTable;
if( ( LayerLookUpTable = InstallDialogLayerPairChoice( this ) ) != NULL ) if( ( LayerLookUpTable = InstallDialogLayerPairChoice( this ) ) != NULL )
@ -75,9 +80,10 @@ char text[1024];
fprintf( File, "Layers %d\n", g_DesignSettings.m_CopperLayerCount ); fprintf( File, "Layers %d\n", g_DesignSettings.m_CopperLayerCount );
fprintf( File, "$EndSETUP\n\n" ); fprintf( File, "$EndSETUP\n\n" );
return(1); return 1;
} }
/******************************************************/ /******************************************************/
static bool WriteGeneralDescrPcb( BOARD* Pcb, FILE* File ) static bool WriteGeneralDescrPcb( BOARD* Pcb, FILE* File )
/******************************************************/ /******************************************************/
@ -105,15 +111,17 @@ int NbLayers;
static int SavePcbFormatAscii( WinEDA_GerberFrame* frame, FILE* File, static int SavePcbFormatAscii( WinEDA_GerberFrame* frame, FILE* File,
int* LayerLookUpTable ) int* LayerLookUpTable )
/*******************************************************************/ /*******************************************************************/
/* Routine de sauvegarde du PCB courant sous format ASCII /* Routine de sauvegarde du PCB courant sous format ASCII
retourne * retourne
1 si OK * 1 si OK
0 si sauvegarde non faite * 0 si sauvegarde non faite
*/ */
{ {
char Line[256]; char Line[256];
TRACK* track, * next_track; TRACK* track, * next_track;
EDA_BaseStruct * PtStruct, *NextStruct; BOARD_ITEM* PtStruct;
BOARD_ITEM* NextStruct;
BOARD* GerberPcb = frame->m_Pcb; BOARD* GerberPcb = frame->m_Pcb;
BOARD* Pcb; BOARD* Pcb;
@ -121,15 +129,18 @@ BOARD * Pcb;
/* Create an image of gerber data */ /* Create an image of gerber data */
Pcb = new BOARD( NULL, frame ); Pcb = new BOARD( NULL, frame );
for( track = GerberPcb->m_Track; track != NULL; track = (TRACK*) track->Pnext ) for( track = GerberPcb->m_Track; track != NULL; track = (TRACK*) track->Pnext )
{ {
int layer = track->m_Layer; int layer = track->GetLayer();
int pcb_layer_number = LayerLookUpTable[layer]; int pcb_layer_number = LayerLookUpTable[layer];
if ( pcb_layer_number < 0 ) continue; if( pcb_layer_number < 0 )
continue;
if( pcb_layer_number > CMP_N ) if( pcb_layer_number > CMP_N )
{ {
DRAWSEGMENT* drawitem = new DRAWSEGMENT( NULL, TYPEDRAWSEGMENT ); DRAWSEGMENT* drawitem = new DRAWSEGMENT( NULL, TYPEDRAWSEGMENT );
drawitem->m_Layer = pcb_layer_number;
drawitem->SetLayer( pcb_layer_number );
drawitem->m_Start = track->m_Start; drawitem->m_Start = track->m_Start;
drawitem->m_End = track->m_End; drawitem->m_End = track->m_End;
drawitem->m_Width = track->m_Width; drawitem->m_Width = track->m_Width;
@ -139,7 +150,8 @@ BOARD * Pcb;
else else
{ {
TRACK* newtrack = new TRACK( * track ); TRACK* newtrack = new TRACK( * track );
newtrack->m_Layer = pcb_layer_number;
newtrack->SetLayer( pcb_layer_number );
newtrack->Insert( Pcb, NULL ); newtrack->Insert( Pcb, NULL );
} }
} }
@ -147,37 +159,42 @@ BOARD * Pcb;
/* replace spots by vias when possible */ /* replace spots by vias when possible */
for( track = Pcb->m_Track; track != NULL; track = (TRACK*) track->Pnext ) for( track = Pcb->m_Track; track != NULL; track = (TRACK*) track->Pnext )
{ {
if( (track->m_Shape != S_SPOT_CIRCLE) && (track->m_Shape != S_SPOT_RECT) && (track->m_Shape != S_SPOT_OVALE) ) if( (track->m_Shape != S_SPOT_CIRCLE) && (track->m_Shape != S_SPOT_RECT) &&
(track->m_Shape != S_SPOT_OVALE) )
continue; continue;
/* A spot is found, and can be a via: change it for via, and delete others /* A spot is found, and can be a via: change it for via, and delete others
spots at same location */ * spots at same location */
track->m_Shape = VIA_NORMALE; track->m_Shape = VIA_NORMALE;
track->m_StructType = TYPEVIA; track->m_StructType = TYPEVIA;
track->m_Layer = 0x0F; // Layers are 0 to 15 (Cu/Cmp) track->SetLayer( 0x0F ); // Layers are 0 to 15 (Cu/Cmp)
track->m_Drill = -1; track->m_Drill = -1;
/* Compute the via position from track position ( Via position is the position of the middle of the track segment */ /* Compute the via position from track position ( Via position is the position of the middle of the track segment */
track->m_Start.x = (track->m_Start.x + track->m_End.x) / 2; track->m_Start.x = (track->m_Start.x + track->m_End.x) / 2;
track->m_Start.y = (track->m_Start.y + track->m_End.y) / 2; track->m_Start.y = (track->m_Start.y + track->m_End.y) / 2;
track->m_End = track->m_Start; track->m_End = track->m_Start;
} }
/* delete redundant vias */ /* delete redundant vias */
for( track = Pcb->m_Track; track != NULL; track = track->Next() ) for( track = Pcb->m_Track; track != NULL; track = track->Next() )
{ {
if( track->m_Shape != VIA_NORMALE ) continue; if( track->m_Shape != VIA_NORMALE )
continue;
/* Search and delete others vias*/ /* Search and delete others vias*/
TRACK* alt_track = track->Next(); TRACK* alt_track = track->Next();
for( ; alt_track != NULL; alt_track = next_track ) for( ; alt_track != NULL; alt_track = next_track )
{ {
next_track = (TRACK*) alt_track->Pnext; next_track = (TRACK*) alt_track->Pnext;
if( alt_track->m_Shape != VIA_NORMALE ) continue; if( alt_track->m_Shape != VIA_NORMALE )
if ( alt_track->m_Start != track->m_Start ) continue; continue;
if( alt_track->m_Start != track->m_Start )
continue;
/* delete track */ /* delete track */
alt_track->UnLink(); alt_track->UnLink();
delete alt_track; delete alt_track;
} }
} }
// Switch the locale to standard C (needed to print floating point numbers like 1.3) // Switch the locale to standard C (needed to print floating point numbers like 1.3)
setlocale( LC_NUMERIC, "C" ); setlocale( LC_NUMERIC, "C" );
/* Ecriture de l'entete PCB : */ /* Ecriture de l'entete PCB : */
@ -188,7 +205,7 @@ BOARD * Pcb;
/* Ecriture des donnes utiles du pcb */ /* Ecriture des donnes utiles du pcb */
PtStruct = Pcb->m_Drawings; PtStruct = Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext ) for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
{ {
switch( PtStruct->m_StructType ) switch( PtStruct->m_StructType )
{ {
@ -218,14 +235,16 @@ BOARD * Pcb;
/* Delete the copy */ /* Delete the copy */
for( PtStruct = Pcb->m_Drawings; PtStruct != NULL; PtStruct = NextStruct ) for( PtStruct = Pcb->m_Drawings; PtStruct != NULL; PtStruct = NextStruct )
{ {
NextStruct = PtStruct->Pnext; NextStruct = PtStruct->Next();
delete PtStruct; delete PtStruct;
} }
for( track = Pcb->m_Track; track != NULL; track = next_track ) for( track = Pcb->m_Track; track != NULL; track = next_track )
{ {
next_track = (TRACK*) track->Pnext; next_track = (TRACK*) track->Pnext;
delete track; delete track;
} }
delete Pcb; delete Pcb;
setlocale( LC_NUMERIC, "" ); // revert to the current locale setlocale( LC_NUMERIC, "" ); // revert to the current locale

View File

@ -14,23 +14,25 @@
/* Routines Locales */ /* Routines Locales */
/********************************************************/ /********************************************************/
bool WinEDA_GerberFrame::Clear_Pcb( wxDC* DC, bool query ) bool WinEDA_GerberFrame::Clear_Pcb( wxDC* DC, bool query )
/********************************************************/ /********************************************************/
/* Realise les init des pointeurs et variables /* Realise les init des pointeurs et variables
Si Item == NULL, il n'y aura pas de confirmation * Si Item == NULL, il n'y aura pas de confirmation
*/ */
{ {
int layer; int layer;
if( m_Pcb == NULL ) return FALSE; if( m_Pcb == NULL )
return FALSE;
if( query ) if( query )
{ {
if( m_Pcb->m_Drawings || m_Pcb->m_Track || m_Pcb->m_Zone ) if( m_Pcb->m_Drawings || m_Pcb->m_Track || m_Pcb->m_Zone )
{ {
if( ! IsOK(this, _("Current Data will be lost ?")) ) return FALSE; if( !IsOK( this, _( "Current Data will be lost ?" ) ) )
return FALSE;
} }
} }
@ -78,12 +80,13 @@ int layer;
return TRUE; return TRUE;
} }
/*********************************************************/ /*********************************************************/
void WinEDA_GerberFrame::Erase_Zones( wxDC* DC, bool query ) void WinEDA_GerberFrame::Erase_Zones( wxDC* DC, bool query )
/*********************************************************/ /*********************************************************/
{ {
if( query && !IsOK( this, _( "Delete zones ?" ) ) )
if( query && !IsOK(this, _("Delete zones ?") ) ) return ; return;
if( m_Pcb->m_Zone ) if( m_Pcb->m_Zone )
{ {
@ -100,38 +103,25 @@ void WinEDA_GerberFrame::Erase_Segments_Pcb(wxDC * DC,
bool all_layers, bool query ) bool all_layers, bool query )
/*****************************************************/ /*****************************************************/
{ {
EDA_BaseStruct * PtStruct, *PtNext; BOARD_ITEM* PtStruct;
BOARD_ITEM* PtNext;
int layer = GetScreen()->m_Active_Layer; int layer = GetScreen()->m_Active_Layer;
if ( all_layers ) layer = -1; if( all_layers )
layer = -1;
PtStruct = (EDA_BaseStruct *) m_Pcb->m_Drawings; PtStruct = m_Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtNext ) for( ; PtStruct != NULL; PtStruct = PtNext )
{ {
PtNext = PtStruct->Pnext; PtNext = PtStruct->Next();
switch( PtStruct->m_StructType ) switch( PtStruct->m_StructType )
{ {
case TYPEDRAWSEGMENT: case TYPEDRAWSEGMENT:
if( (((DRAWSEGMENT*)PtStruct)->m_Layer == layer)
|| layer < 0)
DeleteStructure(PtStruct);
break;
case TYPETEXTE: case TYPETEXTE:
if( (((TEXTE_PCB*)PtStruct)->m_Layer == layer)
|| layer < 0)
DeleteStructure(PtStruct);
break;
case TYPECOTATION: case TYPECOTATION:
if( (((COTATION*)PtStruct)->m_Layer == layer)
|| layer < 0)
DeleteStructure(PtStruct);
break;
case TYPEMIRE: case TYPEMIRE:
if( (((MIREPCB*)PtStruct)->m_Layer == layer) if( PtStruct->GetLayer() == layer || layer < 0 )
|| layer < 0)
DeleteStructure( PtStruct ); DeleteStructure( PtStruct );
break; break;
@ -149,22 +139,25 @@ int layer = GetScreen()->m_Active_Layer;
void WinEDA_GerberFrame::Erase_Pistes( wxDC* DC, int masque_type, void WinEDA_GerberFrame::Erase_Pistes( wxDC* DC, int masque_type,
bool query ) bool query )
/****************************************************************/ /****************************************************************/
/* Efface les segments de piste, selon les autorisations affichees /* Efface les segments de piste, selon les autorisations affichees
masque_type = masque des options de selection: * masque_type = masque des options de selection:
SEGM_FIXE, SEGM_AR * SEGM_FIXE, SEGM_AR
Si un des bits est a 1, il n'y a pas effacement du segment de meme bit a 1 * Si un des bits est a 1, il n'y a pas effacement du segment de meme bit a 1
*/ */
{ {
TRACK* pt_segm; TRACK* pt_segm;
EDA_BaseStruct * PtNext; BOARD_ITEM* PtNext;
if( query && ! IsOK(this, _("Delete Tracks?")) ) return; if( query && !IsOK( this, _( "Delete Tracks?" ) ) )
return;
/* Marquage des pistes a effacer */ /* Marquage des pistes a effacer */
for( pt_segm = m_Pcb->m_Track; pt_segm != NULL; pt_segm = (TRACK*) PtNext ) for( pt_segm = m_Pcb->m_Track; pt_segm != NULL; pt_segm = (TRACK*) PtNext )
{ {
PtNext = pt_segm->Pnext; PtNext = pt_segm->Next();
if( pt_segm->GetState(SEGM_FIXE|SEGM_AR) & masque_type) continue; if( pt_segm->GetState( SEGM_FIXE | SEGM_AR ) & masque_type )
continue;
DeleteStructure( pt_segm ); DeleteStructure( pt_segm );
} }
@ -176,43 +169,46 @@ EDA_BaseStruct * PtNext;
void WinEDA_GerberFrame::Erase_Textes_Pcb( wxDC* DC, bool query ) void WinEDA_GerberFrame::Erase_Textes_Pcb( wxDC* DC, bool query )
/*****************************************************************/ /*****************************************************************/
{ {
EDA_BaseStruct * PtStruct, *PtNext; BOARD_ITEM* PtStruct;
BOARD_ITEM* PtNext;
if( query && ! IsOK(this, _("Delete Pcb Texts") ) ) return; if( query && !IsOK( this, _( "Delete Pcb Texts" ) ) )
return;
PtStruct = (EDA_BaseStruct*) m_Pcb->m_Drawings; PtStruct = m_Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtNext ) for( ; PtStruct != NULL; PtStruct = PtNext )
{ {
PtNext = PtStruct->Pnext; PtNext = PtStruct->Next();
if(PtStruct->m_StructType == TYPETEXTE ) DeleteStructure(PtStruct); if( PtStruct->m_StructType == TYPETEXTE )
DeleteStructure( PtStruct );
} }
ScreenPcb->SetModify(); ScreenPcb->SetModify();
} }
/*******************************************************************/ /*******************************************************************/
void WinEDA_GerberFrame::Erase_Current_Layer( wxDC* DC, bool query ) void WinEDA_GerberFrame::Erase_Current_Layer( wxDC* DC, bool query )
/*******************************************************************/ /*******************************************************************/
{ {
TRACK* pt_segm; TRACK* pt_segm;
EDA_BaseStruct * PtNext; BOARD_ITEM* PtNext;
int layer = GetScreen()->m_Active_Layer; int layer = GetScreen()->m_Active_Layer;
wxString msg; wxString msg;
msg.Printf( _( "Delete Layer %d" ), layer + 1 ); msg.Printf( _( "Delete Layer %d" ), layer + 1 );
if( query && ! IsOK(this, msg) ) return; if( query && !IsOK( this, msg ) )
return;
/* Marquage des pistes a effacer */ /* Marquage des pistes a effacer */
for( pt_segm = m_Pcb->m_Track; pt_segm != NULL; pt_segm = (TRACK*) PtNext ) for( pt_segm = m_Pcb->m_Track; pt_segm != NULL; pt_segm = (TRACK*) PtNext )
{ {
PtNext = pt_segm->Pnext; PtNext = pt_segm->Next();
if( pt_segm->m_Layer != layer) continue; if( pt_segm->GetLayer() != layer )
continue;
DeleteStructure( pt_segm ); DeleteStructure( pt_segm );
} }
ScreenPcb->SetModify(); ScreenPcb->SetModify();
ScreenPcb->SetRefreshReq(); ScreenPcb->SetRefreshReq();
} }

View File

@ -102,7 +102,7 @@ DRAWSEGMENT* Locate_Segment_Pcb( BOARD* Pcb, int typeloc )
* NULL si rien trouve * NULL si rien trouve
*/ */
{ {
EDA_BaseStruct* PtStruct; BOARD_ITEM* PtStruct;
DRAWSEGMENT* pts; DRAWSEGMENT* pts;
wxPoint ref; wxPoint ref;
PCB_SCREEN* screen = (PCB_SCREEN*) ActiveScreen; PCB_SCREEN* screen = (PCB_SCREEN*) ActiveScreen;
@ -110,7 +110,7 @@ DRAWSEGMENT* Locate_Segment_Pcb( BOARD* Pcb, int typeloc )
SET_REF_POS( ref ); SET_REF_POS( ref );
PtStruct = Pcb->m_Drawings; PtStruct = Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext ) for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
{ {
if( PtStruct->m_StructType != TYPEDRAWSEGMENT ) if( PtStruct->m_StructType != TYPEDRAWSEGMENT )
continue; continue;
@ -121,7 +121,7 @@ DRAWSEGMENT* Locate_Segment_Pcb( BOARD* Pcb, int typeloc )
spot_cX = ref.x - ux0; spot_cY = ref.y - uy0; spot_cX = ref.x - ux0; spot_cY = ref.y - uy0;
/* detection : */ /* detection : */
if( pts->m_Layer != screen->m_Active_Layer ) if( pts->GetLayer() != screen->m_Active_Layer )
continue; continue;
if( (pts->m_Shape == S_CIRCLE) || (pts->m_Shape == S_ARC) ) if( (pts->m_Shape == S_CIRCLE) || (pts->m_Shape == S_ARC) )
@ -208,7 +208,7 @@ TRACK* Locate_Pistes( TRACK* start_adresse, wxPoint ref, int Layer )
} }
if( Layer >= 0 ) if( Layer >= 0 )
if( Track->m_Layer != Layer ) if( Track->GetLayer() != Layer )
continue;/* Segments sur couches differentes */ continue;/* Segments sur couches differentes */
if( distance( l_piste ) ) if( distance( l_piste ) )
return Track; return Track;
@ -260,7 +260,7 @@ TRACK* Locate_Zone( TRACK* start_adresse, wxPoint ref, int layer )
dx -= ux0; dy -= uy0; dx -= ux0; dy -= uy0;
spot_cX = ref.x - ux0; spot_cY = ref.y - uy0; spot_cX = ref.x - ux0; spot_cY = ref.y - uy0;
if( (layer != -1) && (Zone->m_Layer != layer) ) if( (layer != -1) && (Zone->GetLayer() != layer) )
continue; continue;
if( distance( l_segm ) ) if( distance( l_segm ) )
return Zone; return Zone;

View File

@ -105,7 +105,7 @@ TRACK * track;
track = new TRACK(frame->m_Pcb); track = new TRACK(frame->m_Pcb);
track->Insert(frame->m_Pcb, NULL); track->Insert(frame->m_Pcb, NULL);
track->m_Layer = frame->GetScreen()->m_Active_Layer; track->SetLayer( frame->GetScreen()->m_Active_Layer );
track->m_Width = diametre ; track->m_Width = diametre ;
track->m_Start = track->m_End = pos; track->m_Start = track->m_End = pos;
NEGATE(track->m_Start.y); NEGATE(track->m_Start.y);
@ -129,13 +129,13 @@ static void Append_1_Flash_GERBER(int Dcode_index,
TRACK * track; TRACK * track;
int width, len; int width, len;
width = min( size.x, size.y ); width = MIN( size.x, size.y );
len = max( size.x, size.y ) - width; len = MAX( size.x, size.y ) - width;
track = new TRACK(frame->m_Pcb); track = new TRACK(frame->m_Pcb);
track->Insert(frame->m_Pcb, NULL); track->Insert(frame->m_Pcb, NULL);
track->m_Layer = frame->GetScreen()->m_Active_Layer; track->SetLayer( frame->GetScreen()->m_Active_Layer );
track->m_Width = width; track->m_Width = width;
track->m_Start = track->m_End = pos; track->m_Start = track->m_End = pos;
NEGATE(track->m_Start.y); NEGATE(track->m_Start.y);
@ -176,7 +176,7 @@ TRACK * track;
track = new TRACK( frame->m_Pcb ); track = new TRACK( frame->m_Pcb );
track->Insert(frame->m_Pcb, NULL); track->Insert(frame->m_Pcb, NULL);
track->m_Layer = frame->GetScreen()->m_Active_Layer ; track->SetLayer( frame->GetScreen()->m_Active_Layer );
track->m_Width = largeur ; track->m_Width = largeur ;
track->m_Start = startpoint; track->m_Start = startpoint;
NEGATE(track->m_Start.y); NEGATE(track->m_Start.y);
@ -213,7 +213,7 @@ wxPoint center, delta;
track->Insert(frame->m_Pcb, NULL); track->Insert(frame->m_Pcb, NULL);
track->m_Shape = S_ARC; track->m_Shape = S_ARC;
track->m_Layer = frame->GetScreen()->m_Active_Layer ; track->SetLayer( frame->GetScreen()->m_Active_Layer );
track->m_Width = largeur ; track->m_Width = largeur ;
if ( multiquadrant ) if ( multiquadrant )
@ -643,7 +643,7 @@ wxString msg;
if ( last ) while (last->Pnext ) last = (SEGZONE*)last->Pnext; if ( last ) while (last->Pnext ) last = (SEGZONE*)last->Pnext;
edge_poly->Insert(frame->m_Pcb, last); edge_poly->Insert(frame->m_Pcb, last);
edge_poly->m_Layer = frame->GetScreen()->m_Active_Layer ; edge_poly->SetLayer( frame->GetScreen()->m_Active_Layer );
edge_poly->m_Width = 1; edge_poly->m_Width = 1;
edge_poly->m_Start = m_PreviousPos; edge_poly->m_Start = m_PreviousPos;
NEGATE(edge_poly->m_Start.y); NEGATE(edge_poly->m_Start.y);

View File

@ -116,7 +116,7 @@ void WinEDA_GerberFrame::Trace_Gerber( wxDC* DC, int draw_mode, int printmasklay
{ {
if( nbpoints ) if( nbpoints )
{ {
int Color = g_DesignSettings.m_LayerColor[track->m_Layer]; int Color = g_DesignSettings.m_LayerColor[track->GetLayer()];
GRClosedPoly( &DrawPanel->m_ClipBox, DC, nbpoints, coord, GRClosedPoly( &DrawPanel->m_ClipBox, DC, nbpoints, coord,
1, Color, Color ); 1, Color, Color );
} }
@ -141,7 +141,7 @@ void WinEDA_GerberFrame::Trace_Gerber( wxDC* DC, int draw_mode, int printmasklay
} }
if( track->Next() == NULL ) // Last point if( track->Next() == NULL ) // Last point
{ {
int Color = g_DesignSettings.m_LayerColor[track->m_Layer]; int Color = g_DesignSettings.m_LayerColor[track->GetLayer()];
GRClosedPoly( &DrawPanel->m_ClipBox, DC, nbpoints, coord, GRClosedPoly( &DrawPanel->m_ClipBox, DC, nbpoints, coord,
1, Color, Color ); 1, Color, Color );
} }

View File

@ -17,10 +17,12 @@
/* variables locales : */ /* variables locales : */
/***************************************************************************************************/ /***************************************************************************************************/
void Draw_Track_Buffer(WinEDA_DrawPanel * panel, wxDC * DC, BOARD * Pcb, int draw_mode, int printmasklayer) void Draw_Track_Buffer( WinEDA_DrawPanel* panel, wxDC* DC, BOARD* Pcb, int draw_mode,
int printmasklayer )
/***************************************************************************************************/ /***************************************************************************************************/
/* Function to draw the tracks (i.e Sports or lines) in gerbview /* Function to draw the tracks (i.e Sports or lines) in gerbview
Polygons are not handled here (there are in Pcb->m_Zone) * Polygons are not handled here (there are in Pcb->m_Zone)
* @param DC = device context to draw * @param DC = device context to draw
* @param Pcb = Board to draw (only Pcb->m_Track is used) * @param Pcb = Board to draw (only Pcb->m_Track is used)
* @param draw_mode = draw mode for the device context (GR_COPY, GR_OR, GR_XOR ..) * @param draw_mode = draw mode for the device context (GR_COPY, GR_OR, GR_XOR ..)
@ -39,12 +41,14 @@ int dcode_hightlight = 0;
for( ; Track != NULL; Track = (TRACK*) Track->Pnext ) for( ; Track != NULL; Track = (TRACK*) Track->Pnext )
{ {
if( printmasklayer != -1 ) if( printmasklayer != -1 )
if ( (Track->ReturnMaskLayer() & printmasklayer) == 0 ) continue; if( (Track->ReturnMaskLayer() & printmasklayer) == 0 )
continue;
if ( (dcode_hightlight == Track->m_NetCode) && if( (dcode_hightlight == Track->m_NetCode)
(Track->m_Layer == layer) ) && (Track->GetLayer() == layer) )
Trace_Segment( panel, DC, Track, draw_mode | GR_SURBRILL ); Trace_Segment( panel, DC, Track, draw_mode | GR_SURBRILL );
else Trace_Segment(panel, DC, Track, draw_mode ); else
Trace_Segment( panel, DC, Track, draw_mode );
} }
} }
@ -52,10 +56,11 @@ int dcode_hightlight = 0;
/***********************************************************************************/ /***********************************************************************************/
void Trace_Segment( WinEDA_DrawPanel* panel, wxDC* DC, TRACK* track, int draw_mode ) void Trace_Segment( WinEDA_DrawPanel* panel, wxDC* DC, TRACK* track, int draw_mode )
/***********************************************************************************/ /***********************************************************************************/
/* routine de trace de 1 segment de piste. /* routine de trace de 1 segment de piste.
Parametres : * Parametres :
track = adresse de la description de la piste en buflib * track = adresse de la description de la piste en buflib
draw_mode = mode ( GR_XOR, GR_OR..) * draw_mode = mode ( GR_XOR, GR_OR..)
*/ */
{ {
int l_piste; int l_piste;
@ -65,16 +70,19 @@ int rayon;
int fillopt; int fillopt;
static bool show_err; static bool show_err;
color = g_DesignSettings.m_LayerColor[track->m_Layer]; color = g_DesignSettings.m_LayerColor[track->GetLayer()];
if(color & ITEM_NOT_SHOW ) return ; if( color & ITEM_NOT_SHOW )
return;
zoom = panel->GetZoom(); zoom = panel->GetZoom();
GRSetDrawMode( DC, draw_mode ); GRSetDrawMode( DC, draw_mode );
if( draw_mode & GR_SURBRILL ) if( draw_mode & GR_SURBRILL )
{ {
if( draw_mode & GR_AND) color &= ~HIGHT_LIGHT_FLAG; if( draw_mode & GR_AND )
else color |= HIGHT_LIGHT_FLAG; color &= ~HIGHT_LIGHT_FLAG;
else
color |= HIGHT_LIGHT_FLAG;
} }
if( color & HIGHT_LIGHT_FLAG ) if( color & HIGHT_LIGHT_FLAG )
color = ColorRefs[color & MASKCOLOR].m_LightColor; color = ColorRefs[color & MASKCOLOR].m_LightColor;
@ -133,7 +141,6 @@ static bool show_err;
GRCircle( &panel->m_ClipBox, DC, track->m_Start.x, track->m_Start.y, GRCircle( &panel->m_ClipBox, DC, track->m_Start.x, track->m_Start.y,
rayon, 0, color ); rayon, 0, color );
} }
else if( fillopt == SKETCH ) else if( fillopt == SKETCH )
{ {
GRCircle( &panel->m_ClipBox, DC, track->m_Start.x, track->m_Start.y, GRCircle( &panel->m_ClipBox, DC, track->m_Start.x, track->m_Start.y,
@ -176,6 +183,7 @@ static bool show_err;
case S_SPOT_OVALE: case S_SPOT_OVALE:
fillopt = DisplayOpt.DisplayPadFill ? FILLED : SKETCH; fillopt = DisplayOpt.DisplayPadFill ? FILLED : SKETCH;
case S_SEGMENT: case S_SEGMENT:
if( (l_piste / zoom) < L_MIN_DESSIN ) if( (l_piste / zoom) < L_MIN_DESSIN )
{ {
@ -208,17 +216,19 @@ static bool show_err;
} }
} }
/**************************************************************************/ /**************************************************************************/
void Trace_DrawSegmentPcb( WinEDA_DrawPanel* panel, wxDC* DC, void Trace_DrawSegmentPcb( WinEDA_DrawPanel* panel, wxDC* DC,
DRAWSEGMENT* PtDrawSegment, int draw_mode ) DRAWSEGMENT* PtDrawSegment, int draw_mode )
/**************************************************************************/ /**************************************************************************/
/* Affichage d'un segment type drawing PCB: /* Affichage d'un segment type drawing PCB:
Entree : ox, oy = offset de trace * Entree : ox, oy = offset de trace
draw_mode = mode de trace ( GR_OR, GR_XOR, GrAND) * draw_mode = mode de trace ( GR_OR, GR_XOR, GrAND)
Les contours sont de differents type: * Les contours sont de differents type:
segment * segment
cercle * cercle
arc * arc
*/ */
{ {
int ux0, uy0, dx, dy; int ux0, uy0, dx, dy;
@ -227,8 +237,9 @@ int color, mode;
int zoom = panel->GetZoom(); int zoom = panel->GetZoom();
int rayon; int rayon;
color = g_DesignSettings.m_LayerColor[PtDrawSegment->m_Layer]; color = g_DesignSettings.m_LayerColor[PtDrawSegment->GetLayer()];
if(color & ITEM_NOT_SHOW ) return ; if( color & ITEM_NOT_SHOW )
return;
GRSetDrawMode( DC, draw_mode ); GRSetDrawMode( DC, draw_mode );
l_piste = PtDrawSegment->m_Width >> 1; /* l_piste = demi largeur piste */ l_piste = PtDrawSegment->m_Width >> 1; /* l_piste = demi largeur piste */
@ -242,8 +253,10 @@ int rayon;
mode = DisplayOpt.DisplayPcbTrackFill ? FILLED : SKETCH; mode = DisplayOpt.DisplayPcbTrackFill ? FILLED : SKETCH;
if(PtDrawSegment->m_Flags & FORCE_SKETCH) mode = SKETCH; if( PtDrawSegment->m_Flags & FORCE_SKETCH )
if ( l_piste < (L_MIN_DESSIN * zoom) ) mode = FILAIRE; mode = SKETCH;
if( l_piste < (L_MIN_DESSIN * zoom) )
mode = FILAIRE;
switch( PtDrawSegment->m_Shape ) switch( PtDrawSegment->m_Shape )
{ {
@ -319,14 +332,13 @@ wxString Line;
track = Pcb->m_Track; track = Pcb->m_Track;
for( ; track != NULL; track = (TRACK*) track->Pnext ) for( ; track != NULL; track = (TRACK*) track->Pnext )
{ {
if ( (track->m_Shape == S_ARC) || if( (track->m_Shape == S_ARC)
(track->m_Shape == S_CIRCLE) || || (track->m_Shape == S_CIRCLE)
(track->m_Shape == S_ARC_RECT) ) || (track->m_Shape == S_ARC_RECT) )
{ {
pos.x = track->m_Start.x; pos.x = track->m_Start.x;
pos.y = track->m_Start.y; pos.y = track->m_Start.y;
} }
else else
{ {
pos.x = (track->m_Start.x + track->m_End.x) / 2; pos.x = (track->m_Start.x + track->m_End.x) / 2;
@ -339,13 +351,13 @@ wxString Line;
{ {
width /= 3; width /= 3;
} }
else // lines else // lines
{ {
int dx, dy; int dx, dy;
dx = track->m_Start.x - track->m_End.x; dx = track->m_Start.x - track->m_End.x;
dy = track->m_Start.y - track->m_End.y; dy = track->m_Start.y - track->m_End.y;
if ( abs(dx) < abs(dy) ) orient = TEXT_ORIENT_VERT; if( abs( dx ) < abs( dy ) )
orient = TEXT_ORIENT_VERT;
width /= 2; width /= 2;
} }
@ -355,4 +367,3 @@ wxString Line;
GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER ); GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER );
} }
} }

View File

@ -110,7 +110,7 @@ public:
* *
* @param testItem An EDA_BaseStruct to examine. * @param testItem An EDA_BaseStruct to examine.
* @param testData is arbitrary data needed by the inspector to determine * @param testData is arbitrary data needed by the inspector to determine
* if the EDA_BaseStruct under test meets its match criteria. * if the BOARD_ITEM under test meets its match criteria.
* @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan, * @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
* else SCAN_CONTINUE; * else SCAN_CONTINUE;
*/ */
@ -154,7 +154,7 @@ public:
unsigned long m_TimeStamp; // Time stamp used for logical links unsigned long m_TimeStamp; // Time stamp used for logical links
int m_Selected; /* Used by block commands, and selective editing */ int m_Selected; /* Used by block commands, and selective editing */
int m_Layer; ///< used by many derived classes, so make common // int m_Layer; ///< used by many derived classes, so make common
private: private:
int m_Status; int m_Status;
@ -298,21 +298,6 @@ public:
**/ **/
static std::ostream& NestedSpace( int nestLevel, std::ostream& os ); static std::ostream& NestedSpace( int nestLevel, std::ostream& os );
/**
* Function ListHas
* scans the given array and detects if the given type t is present.
* @param list An array of KICAD_T, terminated with EOT.
* @param t A KICAD_T to check for.
* @return bool - true if present, else false.
*/
static bool ListHas( const KICAD_T list[], KICAD_T t )
{
for( const KICAD_T* p = list; *p != EOT; ++p )
if( *p == t )
return true;
return false;
}
#endif #endif
}; };
@ -383,12 +368,59 @@ public:
}; };
/* Basic class for build items like lines, which have 1 start point and 1 end point. /**
* Class BOARD_ITEM
* is an abstract base class for any item which can be embedded within the BOARD
* container class, and therefore instances of derived classes should only be
* found in PCBNEW or other programs that use class BOARD and its contents.
* The corresponding class in EESCHEMA seems to be DrawPartStruct.
*/
class BOARD_ITEM : public EDA_BaseStruct
{
protected:
int m_Layer;
public:
BOARD_ITEM( BOARD_ITEM* StructFather, DrawStructureType idtype ) :
EDA_BaseStruct( StructFather, idtype ),
m_Layer(0)
{
}
BOARD_ITEM( const BOARD_ITEM& src ) :
EDA_BaseStruct( src.m_Parent, src.m_StructType ),
m_Layer( src.m_Layer )
{
}
BOARD_ITEM* Next() { return (BOARD_ITEM*) Pnext; }
/**
* Function GetLayer
* returns the layer this item is on.
*/
int GetLayer() const { return m_Layer; }
/**
* Function SetLayer
* sets the layer this item is on.
* @param aLayer The layer number.
*/
void SetLayer( int aLayer ) { m_Layer = aLayer; }
};
/* Base class for building items like lines, which have 1 start point and 1 end point.
* Arc and circles can use this class. * Arc and circles can use this class.
*/ */
class EDA_BaseLineStruct : public EDA_BaseStruct class EDA_BaseLineStruct : public EDA_BaseStruct
{ {
public: public:
int m_Layer; // Layer number
int m_Width; // 0 = line, > 0 = tracks, bus ... int m_Width; // 0 = line, > 0 = tracks, bus ...
wxPoint m_Start; // Line start point wxPoint m_Start; // Line start point
wxPoint m_End; // Line end point wxPoint m_End; // Line end point

242
include/class_collector.h Normal file
View File

@ -0,0 +1,242 @@
/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2007 Dick Hollenbeck, dick@softplc.com
* Copyright (C) 2004-2007 Kicad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef COLLECTOR_H
#define COLLECTOR_H
#include <vector>
//#include <cstdlib> // abs()
#include "fctsys.h"
#include "base_struct.h" // SEARCH_RESULT
#include "common.h" // GetTimeStamp()
class EDA_BaseStruct;
class BOARD;
/**
* Class COLLECTOR
* is an abstract class that will find and hold all the objects according to
* an inspection done by the Inspect() function which must be implemented by
* any derived class. When Inspect() finds an object that it wants to collect,
* i.e. one that it "likes", then it only has to do an Append( testItem )
* on it to add it to its collection, but in all cases for the scan to continue,
* Inspect() must return SEARCH_CONTINUE.
*
* Later, after collection, the user can iterate through all the objects
* in the remembered collection using GetCount() and the [int] operator.
*
* Philosophy: this class knows nothing of the context in which as BOARD is used
* and that means it knows nothing about which layers are visible or current,
* but can handle those concerns by the SetPreferredLayer() function.
*/
class COLLECTOR : public INSPECTOR
{
protected:
// int m_Type;
/// Which object types to scan
const KICAD_T* m_ScanTypes;
/// The layer that is desired as a primary search criterion
int m_PreferredLayer;
/// A place to hold collected objects without taking ownership of their memory.
std::vector<EDA_BaseStruct*> list;
/// The point at which the snapshot was taken.
wxPoint m_RefPos;
/// The time at which the collection was made.
int m_TimeAtCollection;
public:
COLLECTOR()
{
m_PreferredLayer = 0;
m_ScanTypes = 0;
}
virtual ~COLLECTOR()
{
// empty the list so that ~list() does not try and delete all
// the objects that it holds. list is not the owner of such objects
// and this prevents a double free()ing.
Empty();
}
/**
* Function Type
* returns the type of the collector.
int Type() const { return m_Type; }
*/
void SetPreferredLayer( int aPreferredLayer )
{
m_PreferredLayer = aPreferredLayer;
}
/**
* Function GetCount
* returns the number of objects in the list
*/
int GetCount() const
{
return list.size();
}
/**
* Function Empty
* sets the list to empty
*/
void Empty()
{
list.clear();
}
/**
* Function Append
* adds an item to the end of the list.
* @param item An EDA_BaseStruct* to add.
*/
void Append( EDA_BaseStruct* item )
{
list.push_back( item );
}
/**
* Function operator[int]
* is used for read only access and returns the object at index ndx.
* @param ndx The index into the list.
* @return EDA_BaseStruct* - or something derived from it, or NULL.
*/
EDA_BaseStruct* operator[]( int ndx ) const
{
if( (unsigned)ndx < (unsigned)GetCount() )
return list[ ndx ];
return NULL;
}
void SetScanTypes( const KICAD_T* scanTypes )
{
m_ScanTypes = scanTypes;
}
wxPoint GetRefPos() const { return m_RefPos; }
void SetRefPos( const wxPoint& arefPos )
{
m_RefPos = arefPos;
}
void SetTimeNow()
{
m_TimeAtCollection = GetTimeStamp();
}
int GetTime()
{
return m_TimeAtCollection;
}
/**
* Function IsSimilarPointAndTime
* returns true if the given reference point is "similar" (defined here)
* to the internal reference point and the current time is within a few
* seconds of the internal m_TimeAtCollection.
*
* @param aRefPos A wxPoint to compare to.
* @return bool - true if the point and time are similar, else false.
*/
bool IsSimilarPointAndTime( const wxPoint& aRefPos )
{
const int distMax = 2; // adjust these here
const int timeMax = 3; // seconds, I think
int dx = abs( aRefPos.x - m_RefPos.x );
int dy = abs( aRefPos.y - m_RefPos.y );
if( dx <= distMax && dy <= distMax
&& GetTimeStamp()-m_TimeAtCollection <= timeMax )
return true;
else
return false;
}
/**
* Function Inspect
* is the examining function within the INSPECTOR which is passed to the
* Iterate function. It is used primarily for searching, but not limited to
* that. It can also collect or modify the scanned objects.
*
* @param testItem An EDA_BaseStruct to examine.
* @param testData is arbitrary data needed by the inspector to determine
* if the EDA_BaseStruct under test meets its match criteria.
* @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
* else SCAN_CONTINUE;
*
* implement in derived class:
SEARCH_RESULT virtual Inspect( EDA_BaseStruct* testItem,
const void* testData ) = 0;
*/
/**
* Function Scan
* scans a BOARD using this class's Inspector method, which does the collection.
* @param board A BOARD to scan.
* @param refPos A wxPoint to use in hit-testing.
*
* example implementation, in derived class:
*
virtual void Scan( BOARD* board, const wxPoint& refPos )
{
example implementation:
SetRefPos( refPos ); // remember where the snapshot was taken from
Empty(); // empty the collection
// visit the board with the INSPECTOR (me).
board->Visit( this, // INSPECTOR* inspector
NULL, // const void* testData,
m_ScanTypes);
SetTimeNow(); // when it was taken
}
*/
};
#endif // COLLECTOR_H

View File

@ -11,12 +11,14 @@
#define CONV_FROM_UTF8(utf8string) (utf8string) #define CONV_FROM_UTF8(utf8string) (utf8string)
#endif #endif
/* violation of C++ standard, cannot use MIN() and MAX()
#ifndef min #ifndef min
#define min(x, y) ((x) > (y) ? (y) : (x)) #define MIN(x, y) ((x) > (y) ? (y) : (x))
#endif #endif
#ifndef max #ifndef max
#define max(x, y) ((x) > (y) ? (x) : (y)) #define MAX(x, y) ((x) > (y) ? (x) : (y))
#endif #endif
*/
#ifndef MIN #ifndef MIN
#define MIN(x, y) ((x) > (y) ? (y) : (x)) #define MIN(x, y) ((x) > (y) ? (y) : (x))

View File

@ -187,7 +187,7 @@ enum DisplayViaMode {
}; };
class BOARD : public EDA_BaseStruct class BOARD : public BOARD_ITEM
{ {
public: public:
WinEDA_BasePcbFrame* m_PcbFrame; // Window de visualisation WinEDA_BasePcbFrame* m_PcbFrame; // Window de visualisation
@ -204,7 +204,7 @@ public:
int m_NbSegmTrack; // nombre d'elements de type segments de piste int m_NbSegmTrack; // nombre d'elements de type segments de piste
int m_NbSegmZone; // nombre d'elements de type segments de zone int m_NbSegmZone; // nombre d'elements de type segments de zone
EDA_BaseStruct* m_Drawings; // pointeur sur liste drawings BOARD_ITEM* m_Drawings; // pointeur sur liste drawings
MODULE* m_Modules; // pointeur sur liste zone modules MODULE* m_Modules; // pointeur sur liste zone modules
EQUIPOT* m_Equipots; // pointeur liste zone equipot EQUIPOT* m_Equipots; // pointeur liste zone equipot
TRACK* m_Track; // pointeur relatif zone piste TRACK* m_Track; // pointeur relatif zone piste
@ -339,15 +339,19 @@ public:
/* Description des elements du PCB */ /* Description des elements du PCB */
/***********************************/ /***********************************/
class DRAWSEGMENT : public EDA_BaseLineStruct class DRAWSEGMENT : public BOARD_ITEM
{ {
public: public:
int m_Width; // 0 = line, > 0 = tracks, bus ...
wxPoint m_Start; // Line start point
wxPoint m_End; // Line end point
int m_Shape; // forme: Segment , Cercle.. int m_Shape; // forme: Segment , Cercle..
int m_Type; // numero de sous type ( cotation.. ) int m_Type; // numero de sous type ( cotation.. )
int m_Angle; // pour les arcs: "longueur" de l'arc en 1/10 deg int m_Angle; // pour les arcs: "longueur" de l'arc en 1/10 deg
public: public:
DRAWSEGMENT( EDA_BaseStruct* StructFather, DrawStructureType idtype = TYPEDRAWSEGMENT ); DRAWSEGMENT( BOARD_ITEM* StructFather, DrawStructureType idtype = TYPEDRAWSEGMENT );
~DRAWSEGMENT( void ); ~DRAWSEGMENT( void );
// Read/write data // Read/write data
@ -405,7 +409,7 @@ public:
class EDGE_ZONE : public DRAWSEGMENT class EDGE_ZONE : public DRAWSEGMENT
{ {
public: public:
EDGE_ZONE( EDA_BaseStruct* StructFather ); EDGE_ZONE( BOARD_ITEM* StructFather );
EDGE_ZONE( const EDGE_ZONE& edgezone ); EDGE_ZONE( const EDGE_ZONE& edgezone );
~EDGE_ZONE( void ); ~EDGE_ZONE( void );
}; };
@ -415,7 +419,7 @@ public:
/* Gestion des marqueurs sur le PCB */ /* Gestion des marqueurs sur le PCB */
/************************************/ /************************************/
class MARQUEUR : public EDA_BaseStruct class MARQUEUR : public BOARD_ITEM
{ {
/* Description d'un marqueur */ /* Description d'un marqueur */
public: public:
@ -426,7 +430,7 @@ public:
wxString m_Diag; /* Associated text (comment) */ wxString m_Diag; /* Associated text (comment) */
public: public:
MARQUEUR( EDA_BaseStruct* StructFather ); MARQUEUR( BOARD_ITEM* StructFather );
~MARQUEUR( void ); ~MARQUEUR( void );
void UnLink( void ); void UnLink( void );
void Draw( WinEDA_DrawPanel* panel, wxDC* DC, int DrawMode ); void Draw( WinEDA_DrawPanel* panel, wxDC* DC, int DrawMode );

View File

@ -11,8 +11,6 @@
#define eda_global extern #define eda_global extern
#endif #endif
#include <vector>
#include <wx/socket.h> #include <wx/socket.h>
#include "wx/log.h" #include "wx/log.h"
#include "wx/config.h" #include "wx/config.h"
@ -98,6 +96,7 @@ class WinEDA3D_DrawFrame;
class PARAM_CFG_BASE; class PARAM_CFG_BASE;
class Ki_PageDescr; class Ki_PageDescr;
class Ki_HotkeyInfo; class Ki_HotkeyInfo;
class ARROWCOLLECTOR;
enum id_librarytype { enum id_librarytype {
@ -519,9 +518,7 @@ private:
wxMenu* m_FilesMenu; wxMenu* m_FilesMenu;
#if defined(DEBUG) #if defined(DEBUG)
class COLLECTOR; ARROWCOLLECTOR* m_ArrowCollector; ///< while arrow icon tool
COLLECTOR* m_GeneralCollector; ///< while arrow icon tool
COLLECTOR* m_RatsModuleCollector; ///< while find1rats icon tool
#endif #endif

View File

@ -448,7 +448,7 @@ int WinEDA_PcbFrame::GenPlaceBoard( void )
PtStruct = m_Pcb->m_Drawings; PtStruct = m_Pcb->m_Drawings;
TRACK TmpSegm( NULL ); TRACK TmpSegm( NULL );
TmpSegm.m_Layer = -1; TmpSegm.SetLayer( -1 );
TmpSegm.m_NetCode = -1; TmpSegm.m_NetCode = -1;
TmpSegm.m_Width = g_GridRoutingSize / 2; TmpSegm.m_Width = g_GridRoutingSize / 2;
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext ) for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext )
@ -459,7 +459,7 @@ int WinEDA_PcbFrame::GenPlaceBoard( void )
{ {
case TYPEDRAWSEGMENT: case TYPEDRAWSEGMENT:
DrawSegm = (DRAWSEGMENT*) PtStruct; DrawSegm = (DRAWSEGMENT*) PtStruct;
if( DrawSegm->m_Layer != EDGE_N ) if( DrawSegm->GetLayer() != EDGE_N )
break; break;
TmpSegm.m_Start = DrawSegm->m_Start; TmpSegm.m_Start = DrawSegm->m_Start;
@ -536,9 +536,9 @@ void WinEDA_PcbFrame::GenModuleOnBoard( MODULE* Module )
fy = m_Pcb->m_BoundaryBox.GetBottom(); fy = m_Pcb->m_BoundaryBox.GetBottom();
masque_layer = 0; masque_layer = 0;
if( Module->m_Layer == CMP_N ) if( Module->GetLayer() == CMP_N )
masque_layer = CMP_LAYER; masque_layer = CMP_LAYER;
if( Module->m_Layer == CUIVRE_N ) if( Module->GetLayer() == CUIVRE_N )
masque_layer = CUIVRE_LAYER; masque_layer = CUIVRE_LAYER;
TraceFilledRectangle( m_Pcb, ox, oy, fx, fy, masque_layer, TraceFilledRectangle( m_Pcb, ox, oy, fx, fy, masque_layer,
@ -615,7 +615,7 @@ int WinEDA_PcbFrame::RecherchePlacementModule( MODULE* Module, wxDC* DC )
{ {
D_PAD* Pad; int masque_otherlayer; D_PAD* Pad; int masque_otherlayer;
masque_otherlayer = CUIVRE_LAYER; masque_otherlayer = CUIVRE_LAYER;
if( Module->m_Layer == CUIVRE_N ) if( Module->GetLayer() == CUIVRE_N )
masque_otherlayer = CMP_LAYER; masque_otherlayer = CMP_LAYER;
for( Pad = Module->m_Pads; Pad != NULL; Pad = (D_PAD*) Pad->Pnext ) for( Pad = Module->m_Pads; Pad != NULL; Pad = (D_PAD*) Pad->Pnext )
@ -823,7 +823,7 @@ int TstModuleOnBoard( BOARD* Pcb, MODULE* Module, bool TstOtherSide )
int error, Penalite, marge, side, otherside; int error, Penalite, marge, side, otherside;
side = TOP; otherside = BOTTOM; side = TOP; otherside = BOTTOM;
if( Module->m_Layer == CUIVRE_N ) if( Module->GetLayer() == CUIVRE_N )
{ {
side = BOTTOM; otherside = TOP; side = BOTTOM; otherside = TOP;
} }
@ -1064,7 +1064,7 @@ static void TracePenaliteRectangle( BOARD* Pcb, int ux0, int uy0, int ux1, int u
if( trace & 2 ) if( trace & 2 )
{ {
data = GetDist( row, col, TOP ); data = GetDist( row, col, TOP );
data = max( data, LocalPenalite ); data = MAX( data, LocalPenalite );
SetDist( row, col, TOP, data ); SetDist( row, col, TOP, data );
} }
} }
@ -1193,7 +1193,7 @@ bool WinEDA_PcbFrame::SetBoardBoundaryBoxFromEdgesOnly( void )
{ {
int rayon, cx, cy, d; int rayon, cx, cy, d;
int xmax, ymax; int xmax, ymax;
EDA_BaseStruct* PtStruct; BOARD_ITEM* PtStruct;
DRAWSEGMENT* ptr; DRAWSEGMENT* ptr;
bool succes = FALSE; bool succes = FALSE;
@ -1205,7 +1205,7 @@ bool WinEDA_PcbFrame::SetBoardBoundaryBoxFromEdgesOnly( void )
/* Analyse des Contours PCB */ /* Analyse des Contours PCB */
PtStruct = m_Pcb->m_Drawings; PtStruct = m_Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext ) for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
{ {
if( PtStruct->m_StructType != TYPEDRAWSEGMENT ) if( PtStruct->m_StructType != TYPEDRAWSEGMENT )
continue; continue;
@ -1217,21 +1217,21 @@ bool WinEDA_PcbFrame::SetBoardBoundaryBoxFromEdgesOnly( void )
cx = ptr->m_Start.x; cy = ptr->m_Start.y; cx = ptr->m_Start.x; cy = ptr->m_Start.y;
rayon = (int) hypot( (double) (ptr->m_End.x - cx), (double) (ptr->m_End.y - cy) ); rayon = (int) hypot( (double) (ptr->m_End.x - cx), (double) (ptr->m_End.y - cy) );
rayon += d; rayon += d;
m_Pcb->m_BoundaryBox.m_Pos.x = min( m_Pcb->m_BoundaryBox.m_Pos.x, cx - rayon ); m_Pcb->m_BoundaryBox.m_Pos.x = MIN( m_Pcb->m_BoundaryBox.m_Pos.x, cx - rayon );
m_Pcb->m_BoundaryBox.m_Pos.y = min( m_Pcb->m_BoundaryBox.m_Pos.y, cy - rayon ); m_Pcb->m_BoundaryBox.m_Pos.y = MIN( m_Pcb->m_BoundaryBox.m_Pos.y, cy - rayon );
xmax = max( xmax, cx + rayon ); xmax = MAX( xmax, cx + rayon );
ymax = max( ymax, cy + rayon ); ymax = MAX( ymax, cy + rayon );
} }
else else
{ {
cx = min( ptr->m_Start.x, ptr->m_End.x ); cx = MIN( ptr->m_Start.x, ptr->m_End.x );
cy = min( ptr->m_Start.y, ptr->m_End.y ); cy = MIN( ptr->m_Start.y, ptr->m_End.y );
m_Pcb->m_BoundaryBox.m_Pos.x = min( m_Pcb->m_BoundaryBox.m_Pos.x, cx - d ); m_Pcb->m_BoundaryBox.m_Pos.x = MIN( m_Pcb->m_BoundaryBox.m_Pos.x, cx - d );
m_Pcb->m_BoundaryBox.m_Pos.y = min( m_Pcb->m_BoundaryBox.m_Pos.y, cy - d ); m_Pcb->m_BoundaryBox.m_Pos.y = MIN( m_Pcb->m_BoundaryBox.m_Pos.y, cy - d );
cx = max( ptr->m_Start.x, ptr->m_End.x ); cx = MAX( ptr->m_Start.x, ptr->m_End.x );
cy = max( ptr->m_Start.y, ptr->m_End.y ); cy = MAX( ptr->m_Start.y, ptr->m_End.y );
xmax = max( xmax, cx + d ); xmax = MAX( xmax, cx + d );
ymax = max( ymax, cy + d ); ymax = MAX( ymax, cy + d );
} }
} }

View File

@ -430,7 +430,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
* routine d'effacement du block deja selectionne * routine d'effacement du block deja selectionne
*/ */
{ {
EDA_BaseStruct* PtStruct, * NextS; BOARD_ITEM* PtStruct, * NextS;
int masque_layer; int masque_layer;
if( !InstallBlockCmdFrame( this, _( "Delete Block" ) ) ) if( !InstallBlockCmdFrame( this, _( "Delete Block" ) ) )
@ -448,7 +448,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
module = m_Pcb->m_Modules; module = m_Pcb->m_Modules;
for( ; module != NULL; module = (MODULE*) NextS ) for( ; module != NULL; module = (MODULE*) NextS )
{ {
NextS = module->Pnext; NextS = module->Next();
if( IsModuleInBox( GetScreen()->BlockLocate, module ) == NULL ) if( IsModuleInBox( GetScreen()->BlockLocate, module ) == NULL )
continue; continue;
/* le module est ici bon a etre efface */ /* le module est ici bon a etre efface */
@ -467,9 +467,10 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
Affiche_Message( _( "Delete tracks" ) ); Affiche_Message( _( "Delete tracks" ) );
for( pt_segm = m_Pcb->m_Track; pt_segm != NULL; pt_segm = (TRACK*) NextS ) for( pt_segm = m_Pcb->m_Track; pt_segm != NULL; pt_segm = (TRACK*) NextS )
{ {
NextS = pt_segm->Pnext; NextS = pt_segm->Next();
if( IsSegmentInBox( GetScreen()->BlockLocate, pt_segm ) ) if( IsSegmentInBox( GetScreen()->BlockLocate, pt_segm ) )
{ /* la piste est ici bonne a etre efface */ {
/* la piste est ici bonne a etre efface */
pt_segm->Draw( DrawPanel, DC, GR_XOR ); pt_segm->Draw( DrawPanel, DC, GR_XOR );
DeleteStructure( pt_segm ); DeleteStructure( pt_segm );
} }
@ -487,14 +488,14 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
PtStruct = m_Pcb->m_Drawings; PtStruct = m_Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = NextS ) for( ; PtStruct != NULL; PtStruct = NextS )
{ {
NextS = PtStruct->Pnext; NextS = PtStruct->Next();
switch( PtStruct->m_StructType ) switch( PtStruct->m_StructType )
{ {
case TYPEDRAWSEGMENT: case TYPEDRAWSEGMENT:
#undef STRUCT #undef STRUCT
#define STRUCT ( (DRAWSEGMENT*) PtStruct ) #define STRUCT ( (DRAWSEGMENT*) PtStruct )
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
break; break;
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL ) if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
break; break;
@ -517,7 +518,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
case TYPEMIRE: case TYPEMIRE:
#undef STRUCT #undef STRUCT
#define STRUCT ( (MIREPCB*) PtStruct ) #define STRUCT ( (MIREPCB*) PtStruct )
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
break; break;
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL ) if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
break; break;
@ -529,7 +530,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
case TYPECOTATION: case TYPECOTATION:
#undef STRUCT #undef STRUCT
#define STRUCT ( (COTATION*) PtStruct ) #define STRUCT ( (COTATION*) PtStruct )
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
break; break;
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL ) if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
break; break;
@ -551,7 +552,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
Affiche_Message( _( "Delete zones" ) ); Affiche_Message( _( "Delete zones" ) );
for( pt_segm = m_Pcb->m_Zone; pt_segm != NULL; pt_segm = (TRACK*) NextS ) for( pt_segm = m_Pcb->m_Zone; pt_segm != NULL; pt_segm = (TRACK*) NextS )
{ {
NextS = pt_segm->Pnext; NextS = pt_segm->Next();
if( IsSegmentInBox( GetScreen()->BlockLocate, pt_segm ) ) if( IsSegmentInBox( GetScreen()->BlockLocate, pt_segm ) )
{ /* la piste est ici bonne a etre efface */ { /* la piste est ici bonne a etre efface */
pt_segm->Draw( DrawPanel, DC, GR_XOR ); pt_segm->Draw( DrawPanel, DC, GR_XOR );
@ -682,7 +683,7 @@ void WinEDA_BasePcbFrame::Block_Rotate( wxDC* DC )
case TYPEDRAWSEGMENT: case TYPEDRAWSEGMENT:
#undef STRUCT #undef STRUCT
#define STRUCT ( (DRAWSEGMENT*) PtStruct ) #define STRUCT ( (DRAWSEGMENT*) PtStruct )
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
break; break;
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL ) if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
break; break;
@ -715,7 +716,7 @@ void WinEDA_BasePcbFrame::Block_Rotate( wxDC* DC )
case TYPEMIRE: case TYPEMIRE:
#undef STRUCT #undef STRUCT
#define STRUCT ( (MIREPCB*) PtStruct ) #define STRUCT ( (MIREPCB*) PtStruct )
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
break; break;
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL ) if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
break; break;
@ -728,7 +729,7 @@ void WinEDA_BasePcbFrame::Block_Rotate( wxDC* DC )
case TYPECOTATION: case TYPECOTATION:
#undef STRUCT #undef STRUCT
#define STRUCT ( (COTATION*) PtStruct ) #define STRUCT ( (COTATION*) PtStruct )
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
break; break;
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL ) if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
break; break;
@ -852,7 +853,7 @@ void WinEDA_BasePcbFrame::Block_Invert( wxDC* DC )
INVERT( track->m_End.y ); INVERT( track->m_End.y );
if( track->m_StructType != TYPEVIA ) if( track->m_StructType != TYPEVIA )
{ {
track->m_Layer = ChangeSideNumLayer( track->m_Layer ); track->SetLayer( ChangeSideNumLayer( track->GetLayer() ) );
} }
track->Draw( DrawPanel, DC, GR_OR ); // reaffichage track->Draw( DrawPanel, DC, GR_OR ); // reaffichage
@ -875,7 +876,7 @@ void WinEDA_BasePcbFrame::Block_Invert( wxDC* DC )
track->Draw( DrawPanel, DC, GR_XOR ); // effacement track->Draw( DrawPanel, DC, GR_XOR ); // effacement
INVERT( track->m_Start.y ); INVERT( track->m_Start.y );
INVERT( track->m_End.y ); INVERT( track->m_End.y );
track->m_Layer = ChangeSideNumLayer( track->m_Layer ); track->SetLayer( ChangeSideNumLayer( track->GetLayer() ) );
track->Draw( DrawPanel, DC, GR_OR ); // reaffichage track->Draw( DrawPanel, DC, GR_OR ); // reaffichage
} }
track = (TRACK*) track->Pnext; track = (TRACK*) track->Pnext;
@ -897,7 +898,7 @@ void WinEDA_BasePcbFrame::Block_Invert( wxDC* DC )
case TYPEDRAWSEGMENT: case TYPEDRAWSEGMENT:
#undef STRUCT #undef STRUCT
#define STRUCT ( (DRAWSEGMENT*) PtStruct ) #define STRUCT ( (DRAWSEGMENT*) PtStruct )
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
break; break;
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL ) if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
break; break;
@ -909,7 +910,7 @@ void WinEDA_BasePcbFrame::Block_Invert( wxDC* DC )
} }
INVERT( STRUCT->m_Start.y ); INVERT( STRUCT->m_Start.y );
INVERT( STRUCT->m_End.y ); INVERT( STRUCT->m_End.y );
STRUCT->m_Layer = ChangeSideNumLayer( STRUCT->m_Layer ); STRUCT->SetLayer( ChangeSideNumLayer( STRUCT->GetLayer() ) );
Trace_DrawSegmentPcb( DrawPanel, DC, (DRAWSEGMENT*) PtStruct, GR_OR ); Trace_DrawSegmentPcb( DrawPanel, DC, (DRAWSEGMENT*) PtStruct, GR_OR );
break; break;
@ -925,11 +926,11 @@ void WinEDA_BasePcbFrame::Block_Invert( wxDC* DC )
/* Redessin du Texte */ /* Redessin du Texte */
INVERT( STRUCT->m_Pos.y ); INVERT( STRUCT->m_Pos.y );
INVERT_ANGLE( STRUCT->m_Orient ); INVERT_ANGLE( STRUCT->m_Orient );
if( (STRUCT->m_Layer == CUIVRE_N) || (STRUCT->m_Layer == CMP_N) ) if( (STRUCT->GetLayer() == CUIVRE_N) || (STRUCT->GetLayer() == CMP_N) )
{ {
STRUCT->m_Miroir ^= 1; /* inverse miroir */ STRUCT->m_Miroir ^= 1; /* inverse miroir */
} }
STRUCT->m_Layer = ChangeSideNumLayer( STRUCT->m_Layer ); STRUCT->SetLayer( ChangeSideNumLayer( STRUCT->GetLayer() ) );
STRUCT->CreateDrawData(); STRUCT->CreateDrawData();
( (TEXTE_PCB*) PtStruct )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_OR ); ( (TEXTE_PCB*) PtStruct )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_OR );
break; break;
@ -937,21 +938,21 @@ void WinEDA_BasePcbFrame::Block_Invert( wxDC* DC )
case TYPEMIRE: case TYPEMIRE:
#undef STRUCT #undef STRUCT
#define STRUCT ( (MIREPCB*) PtStruct ) #define STRUCT ( (MIREPCB*) PtStruct )
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
break; break;
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL ) if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
break; break;
/* l'element est ici bon a etre modifie */ /* l'element est ici bon a etre modifie */
( (MIREPCB*) PtStruct )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_XOR ); ( (MIREPCB*) PtStruct )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_XOR );
INVERT( STRUCT->m_Pos.y ); INVERT( STRUCT->m_Pos.y );
STRUCT->m_Layer = ChangeSideNumLayer( STRUCT->m_Layer ); STRUCT->SetLayer( ChangeSideNumLayer( STRUCT->GetLayer() ) );
( (MIREPCB*) PtStruct )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_OR ); ( (MIREPCB*) PtStruct )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_OR );
break; break;
case TYPECOTATION: case TYPECOTATION:
#undef STRUCT #undef STRUCT
#define STRUCT ( (COTATION*) PtStruct ) #define STRUCT ( (COTATION*) PtStruct )
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
break; break;
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL ) if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
break; break;
@ -982,7 +983,7 @@ void WinEDA_BasePcbFrame::Block_Invert( wxDC* DC )
INVERT( STRUCT->FlecheD2_oy ); INVERT( STRUCT->FlecheD2_oy );
INVERT( STRUCT->FlecheD2_fy ); INVERT( STRUCT->FlecheD2_fy );
STRUCT->m_Layer = ChangeSideNumLayer( STRUCT->m_Layer ); STRUCT->SetLayer( ChangeSideNumLayer( STRUCT->GetLayer() ) );
( (COTATION*) PtStruct )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_OR ); ( (COTATION*) PtStruct )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_OR );
break; break;
@ -1111,7 +1112,7 @@ void WinEDA_BasePcbFrame::Block_Move( wxDC* DC )
case TYPEDRAWSEGMENT: case TYPEDRAWSEGMENT:
#undef STRUCT #undef STRUCT
#define STRUCT ( (DRAWSEGMENT*) PtStruct ) #define STRUCT ( (DRAWSEGMENT*) PtStruct )
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
break; break;
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL ) if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
break; break;
@ -1139,7 +1140,7 @@ void WinEDA_BasePcbFrame::Block_Move( wxDC* DC )
case TYPEMIRE: case TYPEMIRE:
#undef STRUCT #undef STRUCT
#define STRUCT ( (MIREPCB*) PtStruct ) #define STRUCT ( (MIREPCB*) PtStruct )
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
break; break;
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL ) if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
break; break;
@ -1152,7 +1153,7 @@ void WinEDA_BasePcbFrame::Block_Move( wxDC* DC )
case TYPECOTATION: case TYPECOTATION:
#undef STRUCT #undef STRUCT
#define STRUCT ( (COTATION*) PtStruct ) #define STRUCT ( (COTATION*) PtStruct )
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
break; break;
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL ) if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
break; break;
@ -1315,7 +1316,7 @@ void WinEDA_BasePcbFrame::Block_Duplicate( wxDC* DC )
{ {
#undef STRUCT #undef STRUCT
#define STRUCT ( (DRAWSEGMENT*) PtStruct ) #define STRUCT ( (DRAWSEGMENT*) PtStruct )
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
break; break;
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL ) if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
break; break;
@ -1357,7 +1358,7 @@ void WinEDA_BasePcbFrame::Block_Duplicate( wxDC* DC )
{ {
#undef STRUCT #undef STRUCT
#define STRUCT ( (MIREPCB*) PtStruct ) #define STRUCT ( (MIREPCB*) PtStruct )
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
break; break;
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL ) if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
break; break;
@ -1377,7 +1378,7 @@ void WinEDA_BasePcbFrame::Block_Duplicate( wxDC* DC )
{ {
#undef STRUCT #undef STRUCT
#define STRUCT ( (COTATION*) PtStruct ) #define STRUCT ( (COTATION*) PtStruct )
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
break; break;
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL ) if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
break; break;

View File

@ -395,8 +395,8 @@ void CopyMarkedItems( MODULE* module, wxPoint offset )
/* Copy marked items, at new position = old position + offset /* Copy marked items, at new position = old position + offset
*/ */
{ {
EDA_BaseStruct* item; BOARD_ITEM* item;
EDA_BaseStruct* NewStruct; BOARD_ITEM* NewStruct;
if( module == NULL ) if( module == NULL )
return; return;

View File

@ -186,7 +186,7 @@ void PlaceCells( BOARD* Pcb, int net_code, int flag )
TRACK* pt_segm; TRACK* pt_segm;
TEXTE_PCB* PtText; TEXTE_PCB* PtText;
DRAWSEGMENT* DrawSegm; DRAWSEGMENT* DrawSegm;
EDA_BaseStruct* PtStruct; BOARD_ITEM* PtStruct;
int ux0 = 0, uy0 = 0, ux1, uy1, dx, dy; int ux0 = 0, uy0 = 0, ux1, uy1, dx, dy;
int marge, via_marge; int marge, via_marge;
int masque_layer; int masque_layer;
@ -211,19 +211,19 @@ void PlaceCells( BOARD* Pcb, int net_code, int flag )
// Placement des elements de modules sur PCB // // Placement des elements de modules sur PCB //
/////////////////////////////////////////////// ///////////////////////////////////////////////
PtStruct = Pcb->m_Modules; PtStruct = Pcb->m_Modules;
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext ) for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
{ {
EDA_BaseStruct* PtModStruct = ( (MODULE*) PtStruct )->m_Drawings; BOARD_ITEM* PtModStruct = ( (MODULE*) PtStruct )->m_Drawings;
for( ; PtModStruct != NULL; PtModStruct = PtModStruct->Pnext ) for( ; PtModStruct != NULL; PtModStruct = PtModStruct->Next() )
{ {
switch( PtModStruct->m_StructType ) switch( PtModStruct->m_StructType )
{ {
case TYPEEDGEMODULE: case TYPEEDGEMODULE:
{ {
TRACK* TmpSegm = new TRACK( NULL ); TRACK* TmpSegm = new TRACK( NULL );
TmpSegm->m_Layer = ( (EDGE_MODULE*) PtModStruct )->m_Layer; TmpSegm->SetLayer( ( (EDGE_MODULE*) PtModStruct )->GetLayer() );
if( TmpSegm->m_Layer == EDGE_N ) if( TmpSegm->GetLayer() == EDGE_N )
TmpSegm->m_Layer = -1; TmpSegm->SetLayer( -1 );
TmpSegm->m_Start = ( (EDGE_MODULE*) PtModStruct )->m_Start; TmpSegm->m_Start = ( (EDGE_MODULE*) PtModStruct )->m_Start;
TmpSegm->m_End = ( (EDGE_MODULE*) PtModStruct )->m_End; TmpSegm->m_End = ( (EDGE_MODULE*) PtModStruct )->m_End;
@ -249,7 +249,7 @@ void PlaceCells( BOARD* Pcb, int net_code, int flag )
// Placement des contours et segments PCB // // Placement des contours et segments PCB //
//////////////////////////////////////////// ////////////////////////////////////////////
PtStruct = Pcb->m_Drawings; PtStruct = Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext ) for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
{ {
switch( PtStruct->m_StructType ) switch( PtStruct->m_StructType )
{ {
@ -258,10 +258,10 @@ void PlaceCells( BOARD* Pcb, int net_code, int flag )
int type_cell = HOLE; int type_cell = HOLE;
TRACK* TmpSegm = new TRACK( NULL ); TRACK* TmpSegm = new TRACK( NULL );
DrawSegm = (DRAWSEGMENT*) PtStruct; DrawSegm = (DRAWSEGMENT*) PtStruct;
TmpSegm->m_Layer = DrawSegm->m_Layer; TmpSegm->SetLayer( DrawSegm->GetLayer() );
if( DrawSegm->m_Layer == EDGE_N ) if( DrawSegm->GetLayer() == EDGE_N )
{ {
TmpSegm->m_Layer = -1; TmpSegm->SetLayer( -1 );
type_cell |= CELL_is_EDGE; type_cell |= CELL_is_EDGE;
} }
@ -293,7 +293,7 @@ void PlaceCells( BOARD* Pcb, int net_code, int flag )
ux1 = ux0 + dx; uy1 = uy0 + dy; ux1 = ux0 + dx; uy1 = uy0 + dy;
ux0 -= dx; uy0 -= dy; ux0 -= dx; uy0 -= dy;
masque_layer = g_TabOneLayerMask[PtText->m_Layer]; masque_layer = g_TabOneLayerMask[PtText->GetLayer()];
TraceFilledRectangle( Pcb, ux0 - marge, uy0 - marge, ux1 + marge, uy1 + marge, TraceFilledRectangle( Pcb, ux0 - marge, uy0 - marge, ux1 + marge, uy1 + marge,
(int) (PtText->m_Orient), (int) (PtText->m_Orient),

View File

@ -15,7 +15,7 @@
/* Constructor */ /* Constructor */
BOARD::BOARD( EDA_BaseStruct* parent, WinEDA_BasePcbFrame* frame ) : BOARD::BOARD( EDA_BaseStruct* parent, WinEDA_BasePcbFrame* frame ) :
EDA_BaseStruct( parent, TYPEPCB ) BOARD_ITEM( (BOARD_ITEM*) parent, TYPEPCB )
{ {
m_PcbFrame = frame; m_PcbFrame = frame;
m_Status_Pcb = 0; // Mot d'etat: Bit 1 = Chevelu calcule m_Status_Pcb = 0; // Mot d'etat: Bit 1 = Chevelu calcule
@ -160,22 +160,22 @@ bool BOARD::ComputeBoundaryBox( void )
cx = ptr->m_Start.x; cy = ptr->m_Start.y; cx = ptr->m_Start.x; cy = ptr->m_Start.y;
rayon = (int) hypot( (double) (ptr->m_End.x - cx), (double) (ptr->m_End.y - cy) ); rayon = (int) hypot( (double) (ptr->m_End.x - cx), (double) (ptr->m_End.y - cy) );
rayon += d; rayon += d;
xmin = min( xmin, cx - rayon ); xmin = MIN( xmin, cx - rayon );
ymin = min( ymin, cy - rayon ); ymin = MIN( ymin, cy - rayon );
xmax = max( xmax, cx + rayon ); xmax = MAX( xmax, cx + rayon );
ymax = max( ymax, cy + rayon ); ymax = MAX( ymax, cy + rayon );
Has_Items = TRUE; Has_Items = TRUE;
} }
else else
{ {
cx = min( ptr->m_Start.x, ptr->m_End.x ); cx = MIN( ptr->m_Start.x, ptr->m_End.x );
cy = min( ptr->m_Start.y, ptr->m_End.y ); cy = MIN( ptr->m_Start.y, ptr->m_End.y );
xmin = min( xmin, cx - d ); xmin = MIN( xmin, cx - d );
ymin = min( ymin, cy - d ); ymin = MIN( ymin, cy - d );
cx = max( ptr->m_Start.x, ptr->m_End.x ); cx = MAX( ptr->m_Start.x, ptr->m_End.x );
cy = max( ptr->m_Start.y, ptr->m_End.y ); cy = MAX( ptr->m_Start.y, ptr->m_End.y );
xmax = max( xmax, cx + d ); xmax = MAX( xmax, cx + d );
ymax = max( ymax, cy + d ); ymax = MAX( ymax, cy + d );
Has_Items = TRUE; Has_Items = TRUE;
} }
} }
@ -185,19 +185,19 @@ bool BOARD::ComputeBoundaryBox( void )
for( ; module != NULL; module = (MODULE*) module->Pnext ) for( ; module != NULL; module = (MODULE*) module->Pnext )
{ {
Has_Items = TRUE; Has_Items = TRUE;
xmin = min( xmin, ( module->m_Pos.x + module->m_BoundaryBox.GetX() ) ); xmin = MIN( xmin, ( module->m_Pos.x + module->m_BoundaryBox.GetX() ) );
ymin = min( ymin, ( module->m_Pos.y + module->m_BoundaryBox.GetY() ) ); ymin = MIN( ymin, ( module->m_Pos.y + module->m_BoundaryBox.GetY() ) );
xmax = max( xmax, module->m_Pos.x + module->m_BoundaryBox.GetRight() ); xmax = MAX( xmax, module->m_Pos.x + module->m_BoundaryBox.GetRight() );
ymax = max( ymax, module->m_Pos.y + module->m_BoundaryBox.GetBottom() ); ymax = MAX( ymax, module->m_Pos.y + module->m_BoundaryBox.GetBottom() );
D_PAD* pt_pad = module->m_Pads; D_PAD* pt_pad = module->m_Pads;
for( ; pt_pad != NULL; pt_pad = (D_PAD*) pt_pad->Pnext ) for( ; pt_pad != NULL; pt_pad = (D_PAD*) pt_pad->Pnext )
{ {
d = pt_pad->m_Rayon; d = pt_pad->m_Rayon;
xmin = min( xmin, pt_pad->m_Pos.x - d ); xmin = MIN( xmin, pt_pad->m_Pos.x - d );
ymin = min( ymin, pt_pad->m_Pos.y - d ); ymin = MIN( ymin, pt_pad->m_Pos.y - d );
xmax = max( xmax, pt_pad->m_Pos.x + d ); xmax = MAX( xmax, pt_pad->m_Pos.x + d );
ymax = max( ymax, pt_pad->m_Pos.y + d ); ymax = MAX( ymax, pt_pad->m_Pos.y + d );
} }
} }
@ -205,28 +205,28 @@ bool BOARD::ComputeBoundaryBox( void )
for( Track = m_Track; Track != NULL; Track = (TRACK*) Track->Pnext ) for( Track = m_Track; Track != NULL; Track = (TRACK*) Track->Pnext )
{ {
d = (Track->m_Width / 2) + 1; d = (Track->m_Width / 2) + 1;
cx = min( Track->m_Start.x, Track->m_End.x ); cx = MIN( Track->m_Start.x, Track->m_End.x );
cy = min( Track->m_Start.y, Track->m_End.y ); cy = MIN( Track->m_Start.y, Track->m_End.y );
xmin = min( xmin, cx - d ); xmin = MIN( xmin, cx - d );
ymin = min( ymin, cy - d ); ymin = MIN( ymin, cy - d );
cx = max( Track->m_Start.x, Track->m_End.x ); cx = MAX( Track->m_Start.x, Track->m_End.x );
cy = max( Track->m_Start.y, Track->m_End.y ); cy = MAX( Track->m_Start.y, Track->m_End.y );
xmax = max( xmax, cx + d ); xmax = MAX( xmax, cx + d );
ymax = max( ymax, cy + d ); ymax = MAX( ymax, cy + d );
Has_Items = TRUE; Has_Items = TRUE;
} }
for( Track = m_Zone; Track != NULL; Track = (TRACK*) Track->Pnext ) for( Track = m_Zone; Track != NULL; Track = (TRACK*) Track->Pnext )
{ {
d = (Track->m_Width / 2) + 1; d = (Track->m_Width / 2) + 1;
cx = min( Track->m_Start.x, Track->m_End.x ); cx = MIN( Track->m_Start.x, Track->m_End.x );
cy = min( Track->m_Start.y, Track->m_End.y ); cy = MIN( Track->m_Start.y, Track->m_End.y );
xmin = min( xmin, cx - d ); xmin = MIN( xmin, cx - d );
ymin = min( ymin, cy - d ); ymin = MIN( ymin, cy - d );
cx = max( Track->m_Start.x, Track->m_End.x ); cx = MAX( Track->m_Start.x, Track->m_End.x );
cy = max( Track->m_Start.y, Track->m_End.y ); cy = MAX( Track->m_Start.y, Track->m_End.y );
xmax = max( xmax, cx + d ); xmax = MAX( xmax, cx + d );
ymax = max( ymax, cy + d ); ymax = MAX( ymax, cy + d );
Has_Items = TRUE; Has_Items = TRUE;
} }
@ -378,7 +378,7 @@ EDA_BaseStruct* BOARD::FindPadOrModule( const wxPoint& refPos, int layer )
class PadOrModule : public INSPECTOR class PadOrModule : public INSPECTOR
{ {
public: public:
EDA_BaseStruct* found; BOARD_ITEM* found;
int layer; int layer;
int layer_mask; int layer_mask;
@ -388,46 +388,47 @@ EDA_BaseStruct* BOARD::FindPadOrModule( const wxPoint& refPos, int layer )
SEARCH_RESULT Inspect( EDA_BaseStruct* testItem, const void* testData ) SEARCH_RESULT Inspect( EDA_BaseStruct* testItem, const void* testData )
{ {
BOARD_ITEM* item = (BOARD_ITEM*) testItem;
const wxPoint& refPos = *(const wxPoint*) testData; const wxPoint& refPos = *(const wxPoint*) testData;
if( testItem->m_StructType == TYPEPAD ) if( item->m_StructType == TYPEPAD )
{ {
D_PAD* pad = (D_PAD*) testItem; D_PAD* pad = (D_PAD*) item;
if( pad->HitTest( refPos ) ) if( pad->HitTest( refPos ) )
{ {
if( layer_mask & pad->m_Masque_Layer ) if( layer_mask & pad->m_Masque_Layer )
{ {
found = testItem; found = item;
return SEARCH_QUIT; return SEARCH_QUIT;
} }
else if( !found ) else if( !found )
{ {
MODULE* parent = (MODULE*) pad->m_Parent; MODULE* parent = (MODULE*) pad->m_Parent;
if( IsModuleLayerVisible( parent->m_Layer ) ) if( IsModuleLayerVisible( parent->GetLayer() ) )
found = testItem; found = item;
} }
} }
} }
else if( testItem->m_StructType == TYPEMODULE ) else if( item->m_StructType == TYPEMODULE )
{ {
MODULE* module = (MODULE*) testItem; MODULE* module = (MODULE*) item;
// consider only visible modules // consider only visible modules
if( IsModuleLayerVisible( module->m_Layer ) ) if( IsModuleLayerVisible( module->GetLayer() ) )
{ {
if( module->HitTest( refPos ) ) if( module->HitTest( refPos ) )
{ {
if( layer == module->m_Layer ) if( layer == module->GetLayer() )
{ {
found = testItem; found = item;
return SEARCH_QUIT; return SEARCH_QUIT;
} }
// layer mismatch, save in case we don't find a // layer mismatch, save in case we don't find a
// future layer match hit. // future layer match hit.
if( !found ) if( !found )
found = testItem; found = item;
} }
} }
} }

View File

@ -11,8 +11,8 @@
#include "wxstruct.h" #include "wxstruct.h"
COTATION::COTATION( EDA_BaseStruct* StructFather ) : COTATION::COTATION( BOARD_ITEM* StructFather ) :
EDA_BaseStruct( StructFather, TYPECOTATION ) BOARD_ITEM( StructFather, TYPECOTATION )
{ {
m_Layer = DRAW_LAYER; m_Layer = DRAW_LAYER;
m_Width = 50; m_Width = 50;
@ -24,7 +24,7 @@ COTATION::COTATION( EDA_BaseStruct* StructFather ) :
/* Effacement memoire de la structure */ /* Effacement memoire de la structure */
COTATION::~COTATION( void ) COTATION::~COTATION()
{ {
delete m_Text; delete m_Text;
} }
@ -44,7 +44,7 @@ void COTATION::UnLink( void )
} }
else /* Le chainage arriere pointe sur la structure "Pere" */ else /* Le chainage arriere pointe sur la structure "Pere" */
{ {
( (BOARD*) Pback )->m_Drawings = Pnext; ( (BOARD*) Pback )->m_Drawings = (BOARD_ITEM*) Pnext;
} }
} }
@ -68,7 +68,7 @@ void COTATION::Copy( COTATION* source )
/*************************************/ /*************************************/
{ {
m_Value = source->m_Value; m_Value = source->m_Value;
m_Layer = source->m_Layer; SetLayer( source->GetLayer() );
m_Width = source->m_Width; m_Width = source->m_Width;
m_Pos = source->m_Pos; m_Pos = source->m_Pos;
m_Shape = source->m_Shape; m_Shape = source->m_Shape;
@ -112,15 +112,18 @@ bool COTATION::ReadCotationDescr( FILE* File, int* LineNum )
if( Line[0] == 'G' ) if( Line[0] == 'G' )
{ {
sscanf( Line + 2, " %d %d %lX", &m_Shape, &m_Layer, &m_TimeStamp ); int layer;
sscanf( Line + 2, " %d %d %lX", &m_Shape, &layer, &m_TimeStamp );
/* Mise a jour des param .layer des sous structures */ /* Mise a jour des param .layer des sous structures */
if( m_Layer < FIRST_NO_COPPER_LAYER ) if( layer < FIRST_NO_COPPER_LAYER )
m_Layer = FIRST_NO_COPPER_LAYER; layer = FIRST_NO_COPPER_LAYER;
if( m_Layer > LAST_NO_COPPER_LAYER ) if( layer > LAST_NO_COPPER_LAYER )
m_Layer = LAST_NO_COPPER_LAYER; layer = LAST_NO_COPPER_LAYER;
m_Text->m_Layer = m_Layer; SetLayer( layer );
m_Text->SetLayer( layer );
continue; continue;
} }

View File

@ -6,7 +6,7 @@
#include "base_struct.h" #include "base_struct.h"
class COTATION : public EDA_BaseStruct class COTATION : public BOARD_ITEM
{ {
public: public:
int m_Width; int m_Width;
@ -25,8 +25,8 @@ public:
int FlecheG2_ox, FlecheG2_oy, FlecheG2_fx, FlecheG2_fy; int FlecheG2_ox, FlecheG2_oy, FlecheG2_fx, FlecheG2_fy;
public: public:
COTATION( EDA_BaseStruct* StructFather ); COTATION( BOARD_ITEM* StructFather );
~COTATION( void ); ~COTATION();
bool ReadCotationDescr( FILE* File, int* LineNum ); bool ReadCotationDescr( FILE* File, int* LineNum );
bool WriteCotationDescr( FILE* File ); bool WriteCotationDescr( FILE* File );

View File

@ -29,7 +29,7 @@
/******************************************/ /******************************************/
EDGE_MODULE::EDGE_MODULE( MODULE* parent ) : EDGE_MODULE::EDGE_MODULE( MODULE* parent ) :
EDA_BaseLineStruct( parent, TYPEEDGEMODULE ) BOARD_ITEM( parent, TYPEEDGEMODULE )
{ {
m_Shape = S_SEGMENT; m_Shape = S_SEGMENT;
m_Angle = 0; m_Angle = 0;
@ -91,7 +91,7 @@ void EDGE_MODULE::UnLink( void )
} }
else /* Le chainage arriere pointe sur la structure "Pere" */ else /* Le chainage arriere pointe sur la structure "Pere" */
{ {
( (MODULE*) Pback )->m_Drawings = Pnext; ( (MODULE*) Pback )->m_Drawings = (BOARD_ITEM*) Pnext;
} }
} }
@ -287,10 +287,10 @@ void EDGE_MODULE::Display_Infos( WinEDA_DrawFrame* frame )
Affiche_1_Parametre( frame, 24, _( "TimeStamp" ), bufcar, BROWN ); Affiche_1_Parametre( frame, 24, _( "TimeStamp" ), bufcar, BROWN );
Affiche_1_Parametre( frame, 34, _( "Mod Layer" ), ReturnPcbLayerName( module->m_Layer ), RED ); Affiche_1_Parametre( frame, 34, _( "Mod Layer" ), ReturnPcbLayerName( module->GetLayer() ), RED );
Affiche_1_Parametre( frame, 44, _( "Seg Layer" ), Affiche_1_Parametre( frame, 44, _( "Seg Layer" ),
ReturnPcbLayerName( module->m_Layer ), RED ); ReturnPcbLayerName( module->GetLayer() ), RED );
valeur_param( m_Width, bufcar ); valeur_param( m_Width, bufcar );
Affiche_1_Parametre( frame, 54, _( "Width" ), bufcar, BLUE ); Affiche_1_Parametre( frame, 54, _( "Width" ), bufcar, BLUE );

View File

@ -7,9 +7,13 @@ class Pcb3D_GLCanvas;
/* description des contours (empreintes ) et TYPES des CONTOURS : */ /* description des contours (empreintes ) et TYPES des CONTOURS : */
class EDGE_MODULE : public EDA_BaseLineStruct class EDGE_MODULE : public BOARD_ITEM
{ {
public: public:
int m_Width; // 0 = line, > 0 = tracks, bus ...
wxPoint m_Start; // Line start point
wxPoint m_End; // Line end point
int m_Shape; // voir "enum Track_Shapes" int m_Shape; // voir "enum Track_Shapes"
wxPoint m_Start0; // coord relatives a l'ancre du point de depart(Orient 0) wxPoint m_Start0; // coord relatives a l'ancre du point de depart(Orient 0)
wxPoint m_End0; // coord relatives a l'ancre du point de fin (Orient 0) wxPoint m_End0; // coord relatives a l'ancre du point de fin (Orient 0)

View File

@ -22,8 +22,8 @@
/*********************************************************/ /*********************************************************/
/* Constructeur de la classe EQUIPOT */ /* Constructeur de la classe EQUIPOT */
EQUIPOT::EQUIPOT( EDA_BaseStruct* StructFather ) : EQUIPOT::EQUIPOT( BOARD_ITEM* StructFather ) :
EDA_BaseStruct( StructFather, PCB_EQUIPOT_STRUCT_TYPE ) BOARD_ITEM( StructFather, PCB_EQUIPOT_STRUCT_TYPE )
{ {
m_NetCode = 0; m_NetCode = 0;
m_NbNodes = m_NbLink = m_NbNoconn = 0; m_NbNodes = m_NbLink = m_NbNoconn = 0;
@ -39,7 +39,7 @@ EQUIPOT::EQUIPOT( EDA_BaseStruct* StructFather ) :
/* destructeut */ /* destructeut */
EQUIPOT::~EQUIPOT( void ) EQUIPOT::~EQUIPOT()
{ {
} }

View File

@ -5,7 +5,7 @@
/* Representation des descriptions des equipotentielles */ /* Representation des descriptions des equipotentielles */
class EQUIPOT : public EDA_BaseStruct class EQUIPOT : public BOARD_ITEM
{ {
public: public:
wxString m_Netname; // nom du net wxString m_Netname; // nom du net
@ -22,8 +22,8 @@ public:
CHEVELU* m_RatsnestStart; // pointeur sur debut de liste ratsnests du net CHEVELU* m_RatsnestStart; // pointeur sur debut de liste ratsnests du net
CHEVELU* m_RatsnestEnd; // pointeur sur fin de liste ratsnests du net CHEVELU* m_RatsnestEnd; // pointeur sur fin de liste ratsnests du net
EQUIPOT( EDA_BaseStruct* StructFather ); EQUIPOT( BOARD_ITEM* StructFather );
~EQUIPOT( void ); ~EQUIPOT();
/* Effacement memoire de la structure */ /* Effacement memoire de la structure */
void UnLink( void ); void UnLink( void );

View File

@ -9,15 +9,15 @@
#include "pcbnew.h" #include "pcbnew.h"
MIREPCB::MIREPCB( EDA_BaseStruct* StructFather ) : MIREPCB::MIREPCB( BOARD_ITEM* StructFather ) :
EDA_BaseStruct( StructFather, TYPEMIRE ) BOARD_ITEM( StructFather, TYPEMIRE )
{ {
m_Shape = 0; m_Shape = 0;
m_Size = 5000; m_Size = 5000;
} }
MIREPCB::~MIREPCB( void ) MIREPCB::~MIREPCB()
{ {
} }
@ -39,7 +39,7 @@ void MIREPCB::UnLink( void )
} }
else /* Le chainage arriere pointe sur la structure "Pere" */ else /* Le chainage arriere pointe sur la structure "Pere" */
{ {
( (BOARD*) Pback )->m_Drawings = Pnext; ( (BOARD*) Pback )->m_Drawings = (BOARD_ITEM*) Pnext;
} }
} }

View File

@ -7,7 +7,7 @@
#include "base_struct.h" #include "base_struct.h"
class MIREPCB : public EDA_BaseStruct class MIREPCB : public BOARD_ITEM
{ {
public: public:
int m_Width; int m_Width;
@ -16,8 +16,8 @@ public:
int m_Size; int m_Size;
public: public:
MIREPCB( EDA_BaseStruct* StructFather ); MIREPCB( BOARD_ITEM* StructFather );
~MIREPCB( void ); ~MIREPCB();
bool WriteMirePcbDescr( FILE* File ); bool WriteMirePcbDescr( FILE* File );
bool ReadMirePcbDescr( FILE* File, int* LineNum ); bool ReadMirePcbDescr( FILE* File, int* LineNum );

View File

@ -58,7 +58,8 @@ void MODULE::DrawAncre( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset
/*************************************************/ /*************************************************/
/* Constructeur de la classe MODULE */ /* Constructeur de la classe MODULE */
MODULE::MODULE( BOARD* parent ) : EDA_BaseStruct( parent, TYPEMODULE ) MODULE::MODULE( BOARD* parent ) :
BOARD_ITEM( parent, TYPEMODULE )
{ {
m_Pads = NULL; m_Pads = NULL;
m_Drawings = NULL; m_Drawings = NULL;
@ -168,9 +169,9 @@ void MODULE::Copy( MODULE* Module )
} }
/* Copy des structures auxiliaires: Drawings */ /* Copy des structures auxiliaires: Drawings */
EDA_BaseStruct* OldStruct = (EDA_BaseStruct*) Module->m_Drawings; BOARD_ITEM* OldStruct = Module->m_Drawings;
EDA_BaseStruct* NewStruct, * LastStruct = NULL; BOARD_ITEM* NewStruct, * LastStruct = NULL;
for( ; OldStruct; OldStruct = OldStruct->Pnext ) for( ; OldStruct; OldStruct = OldStruct->Next() )
{ {
NewStruct = NULL; NewStruct = NULL;
@ -423,7 +424,7 @@ int MODULE::WriteDescr( FILE* File )
m_Reference->m_Size.y, m_Reference->m_Size.x, m_Reference->m_Size.y, m_Reference->m_Size.x,
m_Reference->m_Orient + m_Orient, m_Reference->m_Width, m_Reference->m_Orient + m_Orient, m_Reference->m_Width,
m_Reference->m_Miroir ? 'N' : 'M', m_Reference->m_NoShow ? 'I' : 'V', m_Reference->m_Miroir ? 'N' : 'M', m_Reference->m_NoShow ? 'I' : 'V',
m_Reference->m_Layer, m_Reference->GetLayer(),
CONV_TO_UTF8( m_Reference->m_Text ) ); CONV_TO_UTF8( m_Reference->m_Text ) );
NbLigne++; NbLigne++;
@ -434,7 +435,7 @@ int MODULE::WriteDescr( FILE* File )
m_Value->m_Size.y, m_Value->m_Size.x, m_Value->m_Size.y, m_Value->m_Size.x,
m_Value->m_Orient + m_Orient, m_Value->m_Width, m_Value->m_Orient + m_Orient, m_Value->m_Width,
m_Value->m_Miroir ? 'N' : 'M', m_Value->m_NoShow ? 'I' : 'V', m_Value->m_Miroir ? 'N' : 'M', m_Value->m_NoShow ? 'I' : 'V',
m_Value->m_Layer, m_Value->GetLayer(),
CONV_TO_UTF8( m_Value->m_Text ) ); CONV_TO_UTF8( m_Value->m_Text ) );
NbLigne++; NbLigne++;
@ -453,7 +454,7 @@ int MODULE::WriteDescr( FILE* File )
PtText->m_Orient + m_Orient, PtText->m_Width, PtText->m_Orient + m_Orient, PtText->m_Width,
PtText->m_Miroir ? 'N' : 'M', PtText->m_Miroir ? 'N' : 'M',
PtText->m_NoShow ? 'I' : 'V', PtText->m_NoShow ? 'I' : 'V',
PtText->m_Layer, CONV_TO_UTF8( PtText->m_Text ) ); PtText->GetLayer(), CONV_TO_UTF8( PtText->m_Text ) );
NbLigne++; NbLigne++;
break; break;
@ -720,22 +721,23 @@ int MODULE::ReadDescr( FILE* File, int* LineNum )
if( LastModStruct == NULL ) if( LastModStruct == NULL )
{ {
DrawText->Pback = this; DrawText->Pback = this;
m_Drawings = (EDA_BaseStruct*) DrawText; m_Drawings = DrawText;
} }
else else
{ {
DrawText->Pback = LastModStruct; DrawText->Pback = LastModStruct;
LastModStruct->Pnext = DrawText; LastModStruct->Pnext = DrawText;
} }
LastModStruct = (EDA_BaseStruct*) DrawText; LastModStruct = DrawText;
} }
int layer;
sscanf( Line + 1, "%d %d %d %d %d %d %d %s %s %d", sscanf( Line + 1, "%d %d %d %d %d %d %d %s %s %d",
&itmp1, &itmp1,
&DrawText->m_Pos0.x, &DrawText->m_Pos0.y, &DrawText->m_Pos0.x, &DrawText->m_Pos0.y,
&DrawText->m_Size.y, &DrawText->m_Size.x, &DrawText->m_Size.y, &DrawText->m_Size.x,
&DrawText->m_Orient, &DrawText->m_Width, &DrawText->m_Orient, &DrawText->m_Width,
BufCar1, BufCar2, &DrawText->m_Layer ); BufCar1, BufCar2, &layer );
DrawText->m_Type = itmp1; DrawText->m_Type = itmp1;
DrawText->m_Orient -= m_Orient; // m_Orient texte relative au module DrawText->m_Orient -= m_Orient; // m_Orient texte relative au module
@ -748,10 +750,12 @@ int MODULE::ReadDescr( FILE* File, int* LineNum )
else else
DrawText->m_NoShow = 0; DrawText->m_NoShow = 0;
if( m_Layer == CUIVRE_N ) if( layer == CUIVRE_N )
DrawText->m_Layer = SILKSCREEN_N_CU; layer = SILKSCREEN_N_CU;
if( m_Layer == CMP_N ) else if( layer == CMP_N )
DrawText->m_Layer = SILKSCREEN_N_CMP; layer = SILKSCREEN_N_CMP;
DrawText->SetLayer( layer );
/* calcul de la position vraie */ /* calcul de la position vraie */
DrawText->SetDrawCoord(); DrawText->SetDrawCoord();
@ -961,22 +965,22 @@ void MODULE::Set_Rectangle_Encadrement( void )
uxf = pt_edge_mod->m_End0.x; uyf = pt_edge_mod->m_End0.y; uxf = pt_edge_mod->m_End0.x; uyf = pt_edge_mod->m_End0.y;
rayon = (int) hypot( (double) (cx - uxf), (double) (cy - uyf) ); rayon = (int) hypot( (double) (cx - uxf), (double) (cy - uyf) );
rayon += width; rayon += width;
m_BoundaryBox.m_Pos.x = min( m_BoundaryBox.m_Pos.x, cx - rayon ); m_BoundaryBox.m_Pos.x = MIN( m_BoundaryBox.m_Pos.x, cx - rayon );
m_BoundaryBox.m_Pos.y = min( m_BoundaryBox.m_Pos.y, cy - rayon ); m_BoundaryBox.m_Pos.y = MIN( m_BoundaryBox.m_Pos.y, cy - rayon );
xmax = max( xmax, cx + rayon ); xmax = MAX( xmax, cx + rayon );
ymax = max( ymax, cy + rayon ); ymax = MAX( ymax, cy + rayon );
break; break;
} }
default: default:
m_BoundaryBox.m_Pos.x = min( m_BoundaryBox.m_Pos.x, pt_edge_mod->m_Start0.x - width ); m_BoundaryBox.m_Pos.x = MIN( m_BoundaryBox.m_Pos.x, pt_edge_mod->m_Start0.x - width );
m_BoundaryBox.m_Pos.x = min( m_BoundaryBox.m_Pos.x, pt_edge_mod->m_End0.x - width ); m_BoundaryBox.m_Pos.x = MIN( m_BoundaryBox.m_Pos.x, pt_edge_mod->m_End0.x - width );
m_BoundaryBox.m_Pos.y = min( m_BoundaryBox.m_Pos.y, pt_edge_mod->m_Start0.y - width ); m_BoundaryBox.m_Pos.y = MIN( m_BoundaryBox.m_Pos.y, pt_edge_mod->m_Start0.y - width );
m_BoundaryBox.m_Pos.y = min( m_BoundaryBox.m_Pos.y, pt_edge_mod->m_End0.y - width ); m_BoundaryBox.m_Pos.y = MIN( m_BoundaryBox.m_Pos.y, pt_edge_mod->m_End0.y - width );
xmax = max( xmax, pt_edge_mod->m_Start0.x + width ); xmax = MAX( xmax, pt_edge_mod->m_Start0.x + width );
xmax = max( xmax, pt_edge_mod->m_End0.x + width ); xmax = MAX( xmax, pt_edge_mod->m_End0.x + width );
ymax = max( ymax, pt_edge_mod->m_Start0.y + width ); ymax = MAX( ymax, pt_edge_mod->m_Start0.y + width );
ymax = max( ymax, pt_edge_mod->m_End0.y + width ); ymax = MAX( ymax, pt_edge_mod->m_End0.y + width );
break; break;
} }
} }
@ -986,10 +990,10 @@ void MODULE::Set_Rectangle_Encadrement( void )
{ {
rayon = pad->m_Rayon; rayon = pad->m_Rayon;
cx = pad->m_Pos0.x; cy = pad->m_Pos0.y; cx = pad->m_Pos0.x; cy = pad->m_Pos0.y;
m_BoundaryBox.m_Pos.x = min( m_BoundaryBox.m_Pos.x, cx - rayon ); m_BoundaryBox.m_Pos.x = MIN( m_BoundaryBox.m_Pos.x, cx - rayon );
m_BoundaryBox.m_Pos.y = min( m_BoundaryBox.m_Pos.y, cy - rayon ); m_BoundaryBox.m_Pos.y = MIN( m_BoundaryBox.m_Pos.y, cy - rayon );
xmax = max( xmax, cx + rayon ); xmax = MAX( xmax, cx + rayon );
ymax = max( ymax, cy + rayon ); ymax = MAX( ymax, cy + rayon );
} }
m_BoundaryBox.SetWidth( xmax - m_BoundaryBox.m_Pos.x ); m_BoundaryBox.SetWidth( xmax - m_BoundaryBox.m_Pos.x );
@ -1035,22 +1039,22 @@ void MODULE::SetRectangleExinscrit( void )
uxf = EdgeMod->m_End.x; uyf = EdgeMod->m_End.y; uxf = EdgeMod->m_End.x; uyf = EdgeMod->m_End.y;
rayon = (int) hypot( (double) (cx - uxf), (double) (cy - uyf) ); rayon = (int) hypot( (double) (cx - uxf), (double) (cy - uyf) );
rayon += width; rayon += width;
m_RealBoundaryBox.m_Pos.x = min( m_RealBoundaryBox.m_Pos.x, cx - rayon ); m_RealBoundaryBox.m_Pos.x = MIN( m_RealBoundaryBox.m_Pos.x, cx - rayon );
m_RealBoundaryBox.m_Pos.y = min( m_RealBoundaryBox.m_Pos.y, cy - rayon ); m_RealBoundaryBox.m_Pos.y = MIN( m_RealBoundaryBox.m_Pos.y, cy - rayon );
xmax = max( xmax, cx + rayon ); xmax = MAX( xmax, cx + rayon );
ymax = max( ymax, cy + rayon ); ymax = MAX( ymax, cy + rayon );
break; break;
} }
default: default:
m_RealBoundaryBox.m_Pos.x = min( m_RealBoundaryBox.m_Pos.x, EdgeMod->m_Start.x - width ); m_RealBoundaryBox.m_Pos.x = MIN( m_RealBoundaryBox.m_Pos.x, EdgeMod->m_Start.x - width );
m_RealBoundaryBox.m_Pos.x = min( m_RealBoundaryBox.m_Pos.x, EdgeMod->m_End.x - width ); m_RealBoundaryBox.m_Pos.x = MIN( m_RealBoundaryBox.m_Pos.x, EdgeMod->m_End.x - width );
m_RealBoundaryBox.m_Pos.y = min( m_RealBoundaryBox.m_Pos.y, EdgeMod->m_Start.y - width ); m_RealBoundaryBox.m_Pos.y = MIN( m_RealBoundaryBox.m_Pos.y, EdgeMod->m_Start.y - width );
m_RealBoundaryBox.m_Pos.y = min( m_RealBoundaryBox.m_Pos.y, EdgeMod->m_End.y - width ); m_RealBoundaryBox.m_Pos.y = MIN( m_RealBoundaryBox.m_Pos.y, EdgeMod->m_End.y - width );
xmax = max( xmax, EdgeMod->m_Start.x + width ); xmax = MAX( xmax, EdgeMod->m_Start.x + width );
xmax = max( xmax, EdgeMod->m_End.x + width ); xmax = MAX( xmax, EdgeMod->m_End.x + width );
ymax = max( ymax, EdgeMod->m_Start.y + width ); ymax = MAX( ymax, EdgeMod->m_Start.y + width );
ymax = max( ymax, EdgeMod->m_End.y + width ); ymax = MAX( ymax, EdgeMod->m_End.y + width );
break; break;
} }
} }
@ -1060,10 +1064,10 @@ void MODULE::SetRectangleExinscrit( void )
{ {
rayon = Pad->m_Rayon; rayon = Pad->m_Rayon;
cx = Pad->m_Pos.x; cy = Pad->m_Pos.y; cx = Pad->m_Pos.x; cy = Pad->m_Pos.y;
m_RealBoundaryBox.m_Pos.x = min( m_RealBoundaryBox.m_Pos.x, cx - rayon ); m_RealBoundaryBox.m_Pos.x = MIN( m_RealBoundaryBox.m_Pos.x, cx - rayon );
m_RealBoundaryBox.m_Pos.y = min( m_RealBoundaryBox.m_Pos.y, cy - rayon ); m_RealBoundaryBox.m_Pos.y = MIN( m_RealBoundaryBox.m_Pos.y, cy - rayon );
xmax = max( xmax, cx + rayon ); xmax = MAX( xmax, cx + rayon );
ymax = max( ymax, cy + rayon ); ymax = MAX( ymax, cy + rayon );
} }
m_RealBoundaryBox.SetWidth( xmax - m_RealBoundaryBox.m_Pos.x ); m_RealBoundaryBox.SetWidth( xmax - m_RealBoundaryBox.m_Pos.x );

View File

@ -35,12 +35,12 @@ enum Mod_Attribut /* Attributs d'un module */
#define MODULE_is_PLACED 0x02 /* In autoplace: module automatically placed */ #define MODULE_is_PLACED 0x02 /* In autoplace: module automatically placed */
#define MODULE_to_PLACE 0x04 /* In autoplace: module waiting for autoplace */ #define MODULE_to_PLACE 0x04 /* In autoplace: module waiting for autoplace */
class MODULE : public EDA_BaseStruct class MODULE : public BOARD_ITEM
{ {
public: public:
wxPoint m_Pos; // Real coord on board wxPoint m_Pos; // Real coord on board
D_PAD* m_Pads; /* Pad list (linked list) */ D_PAD* m_Pads; /* Pad list (linked list) */
EDA_BaseStruct* m_Drawings; /* Graphic items list (linked list) */ BOARD_ITEM* m_Drawings; /* Graphic items list (linked list) */
Struct3D_Master* m_3D_Drawings; /* Pointeur sur la liste des elements de trace 3D*/ Struct3D_Master* m_3D_Drawings; /* Pointeur sur la liste des elements de trace 3D*/
TEXTE_MODULE* m_Reference; // texte reference du composant (U34, R18..) TEXTE_MODULE* m_Reference; // texte reference du composant (U34, R18..)
TEXTE_MODULE* m_Value; // texte valeur du composant (74LS00, 22K..) TEXTE_MODULE* m_Value; // texte valeur du composant (74LS00, 22K..)
@ -74,7 +74,7 @@ public:
void Copy( MODULE* Module ); // Copy structure void Copy( MODULE* Module ); // Copy structure
MODULE* Next( void ) { return (MODULE*) Pnext; } MODULE* Next() { return (MODULE*) Pnext; }
void Set_Rectangle_Encadrement( void );/* mise a jour du rect d'encadrement void Set_Rectangle_Encadrement( void );/* mise a jour du rect d'encadrement
* en coord locales (orient 0 et origine = pos module) */ * en coord locales (orient 0 et origine = pos module) */

View File

@ -25,7 +25,8 @@
/* classe D_PAD : constructeur */ /* classe D_PAD : constructeur */
/*******************************/ /*******************************/
D_PAD::D_PAD( MODULE* parent ) : EDA_BaseStruct( parent, TYPEPAD ) D_PAD::D_PAD( MODULE* parent ) :
BOARD_ITEM( parent, TYPEPAD )
{ {
m_NumPadName = 0; m_NumPadName = 0;
m_Masque_Layer = CUIVRE_LAYER; m_Masque_Layer = CUIVRE_LAYER;
@ -520,7 +521,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
/* Trace du symbole "No connect" ( / ou \ ou croix en X) si necessaire : */ /* Trace du symbole "No connect" ( / ou \ ou croix en X) si necessaire : */
if( m_Netname.IsEmpty() && DisplayOpt.DisplayPadNoConn ) if( m_Netname.IsEmpty() && DisplayOpt.DisplayPadNoConn )
{ {
dx0 = min( dx0, dy0 ); dx0 = MIN( dx0, dy0 );
int nc_color = BLUE; int nc_color = BLUE;
if( m_Masque_Layer & CMP_LAYER ) /* Trace forme \ */ if( m_Masque_Layer & CMP_LAYER ) /* Trace forme \ */
GRLine( &panel->m_ClipBox, DC, cx0 - dx0, cy0 - dx0, GRLine( &panel->m_ClipBox, DC, cx0 - dx0, cy0 - dx0,
@ -535,7 +536,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
if( !frame->m_DisplayPadNum ) if( !frame->m_DisplayPadNum )
return; return;
dx = min( m_Size.x, m_Size.y ); /* dx = text size */ dx = MIN( m_Size.x, m_Size.y ); /* dx = text size */
if( (dx / zoom) > 12 ) /* size must be enought to draw 2 chars */ if( (dx / zoom) > 12 ) /* size must be enought to draw 2 chars */
{ {
wxString buffer; wxString buffer;

View File

@ -20,7 +20,7 @@ class Pcb3D_GLCanvas;
#define PAD_STACK 0x80 // bit 7 de .attrib (flag) #define PAD_STACK 0x80 // bit 7 de .attrib (flag)
/* Definition type Structure d'un pad */ /* Definition type Structure d'un pad */
class D_PAD : public EDA_BaseStruct class D_PAD : public BOARD_ITEM
{ {
public: public:
union union

View File

@ -15,15 +15,15 @@
/* class TEXTE_PCB */ /* class TEXTE_PCB */
/*******************/ /*******************/
TEXTE_PCB::TEXTE_PCB( EDA_BaseStruct* parent ) : TEXTE_PCB::TEXTE_PCB( BOARD_ITEM* parent ) :
EDA_BaseStruct( parent, TYPETEXTE ), BOARD_ITEM( parent, TYPETEXTE ),
EDA_TextStruct() EDA_TextStruct()
{ {
} }
/* Destructeur */ /* Destructeur */
TEXTE_PCB:: ~TEXTE_PCB( void ) TEXTE_PCB:: ~TEXTE_PCB()
{ {
} }
@ -59,7 +59,7 @@ void TEXTE_PCB::UnLink( void )
} }
else /* Le chainage arriere pointe sur la structure "Pere" */ else /* Le chainage arriere pointe sur la structure "Pere" */
{ {
( (BOARD*) Pback )->m_Drawings = Pnext; ( (BOARD*) Pback )->m_Drawings = (BOARD_ITEM*) Pnext;
} }
} }

View File

@ -6,12 +6,12 @@
#include "base_struct.h" #include "base_struct.h"
class TEXTE_PCB : public EDA_BaseStruct, public EDA_TextStruct class TEXTE_PCB : public BOARD_ITEM, public EDA_TextStruct
{ {
public: public:
TEXTE_PCB(EDA_BaseStruct * parent); TEXTE_PCB( BOARD_ITEM* parent );
TEXTE_PCB( TEXTE_PCB* textepcb ); TEXTE_PCB( TEXTE_PCB* textepcb );
~TEXTE_PCB(void); ~TEXTE_PCB();
/* supprime du chainage la structure Struct */ /* supprime du chainage la structure Struct */
void UnLink( void ); void UnLink( void );

View File

@ -28,7 +28,7 @@
/* Constructeur de TEXTE_MODULE */ /* Constructeur de TEXTE_MODULE */
TEXTE_MODULE::TEXTE_MODULE( MODULE* parent, int text_type ) : TEXTE_MODULE::TEXTE_MODULE( MODULE* parent, int text_type ) :
EDA_BaseStruct( parent, TYPETEXTEMODULE ) BOARD_ITEM( parent, TYPETEXTEMODULE )
{ {
MODULE* Module = (MODULE*) m_Parent; MODULE* Module = (MODULE*) m_Parent;
@ -41,20 +41,29 @@ TEXTE_MODULE::TEXTE_MODULE( MODULE* parent, int text_type ) :
m_Orient = 0; /* en 1/10 degre */ m_Orient = 0; /* en 1/10 degre */
m_Miroir = 1; // Mode normal (pas de miroir) m_Miroir = 1; // Mode normal (pas de miroir)
m_Unused = 0; m_Unused = 0;
m_Layer = SILKSCREEN_N_CMP;
SetLayer( SILKSCREEN_N_CMP );
if( Module && (Module->m_StructType == TYPEMODULE) ) if( Module && (Module->m_StructType == TYPEMODULE) )
{ {
m_Pos = Module->m_Pos; m_Pos = Module->m_Pos;
m_Layer = Module->m_Layer;
if( Module->m_Layer == CUIVRE_N ) int moduleLayer = Module->GetLayer();
m_Layer = SILKSCREEN_N_CU;
if( Module->m_Layer == CMP_N ) if( moduleLayer == CUIVRE_N )
m_Layer = SILKSCREEN_N_CMP; SetLayer( SILKSCREEN_N_CU );
if( (Module->m_Layer == SILKSCREEN_N_CU) else if( moduleLayer == CMP_N )
|| (Module->m_Layer == ADHESIVE_N_CU) || (Module->m_Layer == CUIVRE_N) ) SetLayer( SILKSCREEN_N_CMP );
else
SetLayer( moduleLayer );
if( moduleLayer == SILKSCREEN_N_CU
|| moduleLayer == ADHESIVE_N_CU
|| moduleLayer == CUIVRE_N )
{
m_Miroir = 0; m_Miroir = 0;
} }
} }
}
TEXTE_MODULE::~TEXTE_MODULE( void ) TEXTE_MODULE::~TEXTE_MODULE( void )
@ -68,7 +77,7 @@ void TEXTE_MODULE::Copy( TEXTE_MODULE* source ) // copy structure
return; return;
m_Pos = source->m_Pos; m_Pos = source->m_Pos;
m_Layer = source->m_Layer; SetLayer( source->GetLayer() );
m_Miroir = source->m_Miroir; // vue normale / miroir m_Miroir = source->m_Miroir; // vue normale / miroir
m_NoShow = source->m_NoShow; // 0: visible 1: invisible m_NoShow = source->m_NoShow; // 0: visible 1: invisible
@ -97,7 +106,7 @@ void TEXTE_MODULE::UnLink( void )
} }
else /* Le chainage arriere pointe sur la structure "Pere" */ else /* Le chainage arriere pointe sur la structure "Pere" */
{ {
( (MODULE*) Pback )->m_Drawings = Pnext; ( (MODULE*) Pback )->m_Drawings = (BOARD_ITEM*) Pnext;
} }
} }
@ -245,11 +254,12 @@ void TEXTE_MODULE::Draw( WinEDA_DrawPanel* panel, wxDC* DC, wxPoint offset, int
pos.x, pos.y + anchor_size, 0, g_AnchorColor ); pos.x, pos.y + anchor_size, 0, g_AnchorColor );
} }
color = g_DesignSettings.m_LayerColor[Module->m_Layer]; color = g_DesignSettings.m_LayerColor[Module->GetLayer()];
if( Module && Module->m_Layer == CUIVRE_N ) if( Module && Module->GetLayer() == CUIVRE_N )
color = g_ModuleTextCUColor; color = g_ModuleTextCUColor;
if( Module && Module->m_Layer == CMP_N )
else if( Module && Module->GetLayer() == CMP_N )
color = g_ModuleTextCMPColor; color = g_ModuleTextCMPColor;
if( (color & ITEM_NOT_SHOW) != 0 ) if( (color & ITEM_NOT_SHOW) != 0 )

View File

@ -13,7 +13,7 @@
#define TEXT_is_DIVERS 2 #define TEXT_is_DIVERS 2
class TEXTE_MODULE : public EDA_BaseStruct class TEXTE_MODULE : public BOARD_ITEM
{ {
public: public:
int m_Width; int m_Width;

View File

@ -22,8 +22,8 @@
/* Constructeur des classes type pistes, vias et zones */ /* Constructeur des classes type pistes, vias et zones */
TRACK::TRACK( EDA_BaseStruct* StructFather, DrawStructureType idtype ) : TRACK::TRACK( BOARD_ITEM* StructFather, DrawStructureType idtype ) :
EDA_BaseLineStruct( StructFather, idtype ) BOARD_ITEM( StructFather, idtype )
{ {
m_Shape = S_SEGMENT; m_Shape = S_SEGMENT;
start = end = NULL; start = end = NULL;
@ -35,13 +35,13 @@ TRACK::TRACK( EDA_BaseStruct* StructFather, DrawStructureType idtype ) :
SEGZONE::SEGZONE( EDA_BaseStruct* StructFather ) : SEGZONE::SEGZONE( BOARD_ITEM* StructFather ) :
TRACK( StructFather, TYPEZONE ) TRACK( StructFather, TYPEZONE )
{ {
} }
SEGVIA::SEGVIA( EDA_BaseStruct* StructFather ) : SEGVIA::SEGVIA( BOARD_ITEM* StructFather ) :
TRACK( StructFather, TYPEVIA ) TRACK( StructFather, TYPEVIA )
{ {
} }
@ -50,7 +50,7 @@ SEGVIA::SEGVIA( EDA_BaseStruct* StructFather ) :
/* Copy constructor */ /* Copy constructor */
TRACK::TRACK( const TRACK& Source ) : TRACK::TRACK( const TRACK& Source ) :
EDA_BaseLineStruct( Source.m_Parent, (DrawStructureType)Source.m_StructType ) BOARD_ITEM( (const BOARD_ITEM&) Source )
{ {
m_StructType = Source.m_StructType; m_StructType = Source.m_StructType;
m_Shape = Source.m_Shape; m_Shape = Source.m_Shape;
@ -235,14 +235,6 @@ void SEGVIA::ReturnLayerPair( int* top_layer, int* bottom_layer )
} }
/************************/
TRACK* TRACK::Next( void )
/************************/
{
return (TRACK*) Pnext;
}
/* supprime du chainage la structure Struct /* supprime du chainage la structure Struct
* les structures arrieres et avant sont chainees directement * les structures arrieres et avant sont chainees directement
*/ */

View File

@ -19,12 +19,19 @@
/***/ /***/
class TRACK : public EDA_BaseLineStruct class TRACK : public BOARD_ITEM
{ {
public: public:
int m_Width; // 0 = line, > 0 = tracks, bus ...
wxPoint m_Start; // Line start point
wxPoint m_End; // Line end point
int m_Shape; // vias: shape and type, Track = shape.. int m_Shape; // vias: shape and type, Track = shape..
int m_Drill; // for vias: via drill (- 1 for default value) int m_Drill; // for vias: via drill (- 1 for default value)
EDA_BaseStruct* start, * end; // pointers on a connected item (pad or track)
BOARD_ITEM* start; // pointers on a connected item (pad or track)
BOARD_ITEM* end;
int m_NetCode; // Net number int m_NetCode; // Net number
int m_Sous_Netcode; /* In rastnest routines : for the current net, int m_Sous_Netcode; /* In rastnest routines : for the current net,
* block number (number common to the current connected items found) */ * block number (number common to the current connected items found) */
@ -33,15 +40,12 @@ public:
int m_Param; // Auxiliary variable ( used in some computations ) int m_Param; // Auxiliary variable ( used in some computations )
public: public:
TRACK( EDA_BaseStruct* StructFather, DrawStructureType idtype = TYPETRACK ); TRACK( BOARD_ITEM* StructFather, DrawStructureType idtype = TYPETRACK );
TRACK( const TRACK& track ); TRACK( const TRACK& track );
TRACK* Next( void ); // Retourne le chainage avant TRACK* Next() { return (TRACK*) Pnext; }
TRACK* Back( void ) // Retourne le chainage avant TRACK* Back() { return (TRACK*) Pback; }
{
return (TRACK*) Pback;
}
/* supprime du chainage la structure Struct */ /* supprime du chainage la structure Struct */
@ -122,7 +126,7 @@ public:
class SEGZONE : public TRACK class SEGZONE : public TRACK
{ {
public: public:
SEGZONE( EDA_BaseStruct* StructFather ); SEGZONE( BOARD_ITEM* StructFather );
#if defined(DEBUG) #if defined(DEBUG)
/** /**
@ -141,7 +145,7 @@ public:
class SEGVIA : public TRACK class SEGVIA : public TRACK
{ {
public: public:
SEGVIA( EDA_BaseStruct* StructFather ); SEGVIA( BOARD_ITEM* StructFather );
bool IsViaOnLayer( int layer ); bool IsViaOnLayer( int layer );
void SetLayerPair( int top_layer, int bottom_layer ); void SetLayerPair( int top_layer, int bottom_layer );
void ReturnLayerPair( int* top_layer, int* bottom_layer ); void ReturnLayerPair( int* top_layer, int* bottom_layer );

View File

@ -35,7 +35,7 @@ void EDA_BaseStruct::Place( WinEDA_DrawFrame* frame, wxDC* DC )
/**********************/ /**********************/
/* Classe EDGE_ZONE: constructeur */ /* Classe EDGE_ZONE: constructeur */
EDGE_ZONE::EDGE_ZONE( EDA_BaseStruct* parent ) : EDGE_ZONE::EDGE_ZONE( BOARD_ITEM* parent ) :
DRAWSEGMENT( parent, TYPEEDGEZONE ) DRAWSEGMENT( parent, TYPEEDGEZONE )
{ {
} }
@ -52,8 +52,8 @@ EDGE_ZONE:: ~EDGE_ZONE( void )
/**********************/ /**********************/
/* Classe DRAWSEGMENT: constructeur */ /* Classe DRAWSEGMENT: constructeur */
DRAWSEGMENT::DRAWSEGMENT( EDA_BaseStruct* StructFather, DrawStructureType idtype ) : DRAWSEGMENT::DRAWSEGMENT( BOARD_ITEM* StructFather, DrawStructureType idtype ) :
EDA_BaseLineStruct( StructFather, idtype ) BOARD_ITEM( StructFather, idtype )
{ {
m_Flags = m_Shape = m_Type = m_Angle = 0; m_Flags = m_Shape = m_Type = m_Angle = 0;
} }
@ -76,7 +76,7 @@ void DRAWSEGMENT::UnLink( void )
} }
else /* Le chainage arriere pointe sur la structure "Pere" */ else /* Le chainage arriere pointe sur la structure "Pere" */
{ {
( (BOARD*) Pback )->m_Drawings = Pnext; ( (BOARD*) Pback )->m_Drawings = (BOARD_ITEM*) Pnext;
} }
} }
@ -262,8 +262,8 @@ bool DRAWSEGMENT::HitTest( const wxPoint& ref_pos )
/* Classe MARQUEUR */ /* Classe MARQUEUR */
/*******************/ /*******************/
MARQUEUR::MARQUEUR( EDA_BaseStruct* StructFather ) : MARQUEUR::MARQUEUR( BOARD_ITEM* StructFather ) :
EDA_BaseStruct( StructFather, TYPEMARQUEUR ) BOARD_ITEM( StructFather, TYPEMARQUEUR )
{ {
m_Bitmap = NULL; m_Bitmap = NULL;
m_Type = 0; m_Type = 0;
@ -291,7 +291,7 @@ void MARQUEUR::UnLink( void )
} }
else /* Le chainage arriere pointe sur la structure "Pere" */ else /* Le chainage arriere pointe sur la structure "Pere" */
{ {
( (BOARD*) Pback )->m_Drawings = Pnext; ( (BOARD*) Pback )->m_Drawings = (BOARD_ITEM*) Pnext;
} }
} }

View File

@ -379,7 +379,7 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC )
if( PtSegm->m_StructType != pt_aux->m_StructType ) if( PtSegm->m_StructType != pt_aux->m_StructType )
continue; continue;
if( PtSegm->m_Layer != pt_aux->m_Layer ) if( PtSegm->GetLayer() != pt_aux->GetLayer() )
continue; continue;
if( PtSegm->m_NetCode != pt_aux->m_NetCode ) if( PtSegm->m_NetCode != pt_aux->m_NetCode )
break; break;
@ -587,7 +587,7 @@ static TRACK* AlignSegment( BOARD* Pcb, TRACK* pt_ref, TRACK* pt_segm, int extre
{ {
/* Ce ne doit pas etre sur un pad */ /* Ce ne doit pas etre sur un pad */
if( Fast_Locate_Pad_Connecte( Pcb, pt_ref->m_Start, if( Fast_Locate_Pad_Connecte( Pcb, pt_ref->m_Start,
g_TabOneLayerMask[pt_ref->m_Layer] ) ) g_TabOneLayerMask[pt_ref->GetLayer()] ) )
return NULL; return NULL;
if( (pt_ref->m_Start.x == pt_segm->m_Start.x) if( (pt_ref->m_Start.x == pt_segm->m_Start.x)
@ -605,7 +605,7 @@ static TRACK* AlignSegment( BOARD* Pcb, TRACK* pt_ref, TRACK* pt_segm, int extre
else /* extremite == END */ else /* extremite == END */
{ {
/* Ce ne doit pas etre sur un pad */ /* Ce ne doit pas etre sur un pad */
if( Fast_Locate_Pad_Connecte( Pcb, pt_ref->m_End, g_TabOneLayerMask[pt_ref->m_Layer] ) ) if( Fast_Locate_Pad_Connecte( Pcb, pt_ref->m_End, g_TabOneLayerMask[pt_ref->GetLayer()] ) )
return NULL; return NULL;
if( pt_ref->m_End == pt_segm->m_Start ) if( pt_ref->m_End == pt_segm->m_Start )

134
pcbnew/collectors.cpp Normal file
View File

@ -0,0 +1,134 @@
/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2007 Dick Hollenbeck, dick@softplc.com
* Copyright (C) 2004-2007 Kicad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#if defined(DEBUG)
#include "collectors.h"
#include "pcbnew.h" // class BOARD
/* This module contains out of line member functions for classes given in
collectors.h. Those classes augment the functionality of class WinEDA_PcbFrame.
*/
// see collectors.h
const KICAD_T ARROWCOLLECTOR::AllBoardItems[] = {
TYPETEXTE,
TYPEDRAWSEGMENT,
TYPECOTATION,
TYPEVIA,
TYPETRACK,
TYPEPAD,
TYPETEXTEMODULE,
TYPEMODULE,
EOT
};
/**
* Function Inspect
* is the examining function within the INSPECTOR which is passed to the
* Iterate function. Searches and collects all the objects that the old
* function PcbGeneralLocateAndDisplay() would find, except that it keeps all
* that it finds and does not do any displaying.
*
* @param testItem An EDA_BaseStruct to examine.
* @param notUsed The const void* testData.
* @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
* else SCAN_CONTINUE;
*/
SEARCH_RESULT ARROWCOLLECTOR::Inspect( EDA_BaseStruct* testItem, const void* notUsed )
{
BOARD_ITEM* item = (BOARD_ITEM*) testItem;
switch( item->m_StructType )
{
case TYPEPAD:
case TYPEVIA:
/*
if( item->IsOnOneOfTheseLayers( m_LayerMask ) )
{
if( item->HitTest( refPos ) )
Append2nd( testItem );
}
*/
break;
case TYPETRACK:
case TYPETEXTE:
case TYPEDRAWSEGMENT:
case TYPECOTATION:
case TYPETEXTEMODULE:
case TYPEMODULE:
if( item->GetLayer() == m_PreferredLayer )
{
if( item->HitTest( m_RefPos ) )
Append( item );
}
/*
else if( item->IsOnOneOfTheseLayers( m_LayerMask ) )
{
if( item->HitTest( m_RefPos ) )
Append2nd( item );
}
*/
break;
default:
; // nothing
}
return SEARCH_CONTINUE;
}
// see collectors.h
void ARROWCOLLECTOR::Scan( BOARD* board, const wxPoint& refPos,
int aPreferredLayer, int aLayerMask )
{
Empty(); // empty the collection, primary criteria list
Empty2nd(); // empty the collection, secondary criteria list
/* remember where the snapshot was taken from and pass refPos to
the Inspect() function.
*/
SetRefPos( refPos );
// visit the board with the INSPECTOR (me).
board->Visit( this, // INSPECTOR* inspector
NULL, // const void* testData, not used here
m_ScanTypes);
SetTimeNow(); // when snapshot was taken
// @todo: append 2nd list onto end of the first "list"
Empty2nd();
}
#endif // DEBUG
//EOF

141
pcbnew/collectors.h Normal file
View File

@ -0,0 +1,141 @@
/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2007 Dick Hollenbeck, dick@softplc.com
* Copyright (C) 2004-2007 Kicad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef COLLECTORS_H
#define COLLECTORS_H
/* This module contains a number of COLLECTOR implementations which are used
to augment the functionality of class WinEDA_PcbFrame.
*/
#include "class_collector.h"
class RAT1COLLECTOR : public COLLECTOR
{
;
};
/**
* Class ARROWCOLLECTOR
* is intended for use when the right click button is pressed, or when the
* plain "arrow" tool is in effect. This class can be used by window classes
* such as WinEDA_PcbFrame.
*
* Philosophy: this class knows nothing of the context in which as BOARD is used
* and that means it knows nothing about which layers are visible or current,
* but can handle those concerns by the SetPreferredLayer() function and the
* SetLayerMask() fuction.
*/
class ARROWCOLLECTOR : public COLLECTOR
{
/**
* A place to hold collected objects which don't match precisely the search
* criteria, but would be acceptable if nothing else is found.
* "2nd" choice, which will be appended to the end of COLLECTOR's prime
* "list" at the end of the search.
*/
std::vector<EDA_BaseStruct*> list2nd;
/**
* A bit-mapped layer mask that defines any layers which are acceptable
* on a secondary search criterion basis.
*/
int m_LayerMask;
public:
/// A scan list for all editable board items, like PcbGeneralLocateAndDisplay()
static const KICAD_T AllBoardItems[];
/**
* Constructor ARROWCOLLECTOR
*/
ARROWCOLLECTOR()
{
m_LayerMask = 0;
SetScanTypes( AllBoardItems );
}
void Empty2nd()
{
list2nd.clear();
}
void Append2nd( EDA_BaseStruct* item )
{
list2nd.push_back( item );
}
/**
* Function SetLayerMask
* takes a bit-mapped layer mask and records it. During the scan/search,
* this is used as a secondary criterion. That is, if there is no direct
* layer match with COLLECTOR::m_PreferredLayer (the primary criterion),
* then an object on any layer given in this bit-map is recorded as a
* second choice object if it also HitTest()s true.
*
* @param aLayerMask A layer mask which has bits in it indicating which
* layers are acceptable. Caller must pay attention to which layers are
* visible, selected, etc. All those concerns are handled outside this
* class, as stated in the class Philosophy above.
*/
void SetLayerMask( int aLayerMask )
{
m_LayerMask = aLayerMask;
}
/**
* Function Inspect
* is the examining function within the INSPECTOR which is passed to the
* Iterate function.
*
* @param testItem An EDA_BaseStruct to examine.
* @param testData is not used in this class.
* @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
* else SCAN_CONTINUE;
*/
SEARCH_RESULT Inspect( EDA_BaseStruct* testItem, const void* testData );
/**
* Function Scan
* scans a BOARD using this class's Inspector method, which does the collection.
* @param board A BOARD to scan.
* @param refPos A wxPoint to use in hit-testing.
*/
void Scan( BOARD* board, const wxPoint& refPos, int aPreferredLayer, int aLayerMask );
};
#endif // COLLECTORS_H

View File

@ -31,26 +31,30 @@ static int tri_par_netcode(TRACK ** pt_ref, TRACK ** pt_compare);
static int change_equipot( TRACK* pt_start_conn, TRACK* pt_end_conn, static int change_equipot( TRACK* pt_start_conn, TRACK* pt_end_conn,
int old_val, int new_val ) int old_val, int new_val )
/*****************************************************************/ /*****************************************************************/
/* /*
Change les num locaux d'equipot old valeur en new valeur * Change les num locaux d'equipot old valeur en new valeur
retourne le nombre de changements * retourne le nombre de changements
si pt_end_conn = NULL: recherche jusqu'a fin de chaine * si pt_end_conn = NULL: recherche jusqu'a fin de chaine
*/ */
{ {
TRACK* pt_conn; TRACK* pt_conn;
int nb_change = 0; int nb_change = 0;
D_PAD* pt_pad; D_PAD* pt_pad;
if( old_val == new_val) return(0) ; if( old_val == new_val )
return 0;
if( (old_val > 0) && (old_val < new_val) ) EXCHG(old_val,new_val) ; if( (old_val > 0) && (old_val < new_val) )
EXCHG( old_val, new_val );
pt_conn = pt_start_conn; pt_conn = pt_start_conn;
for( ; pt_conn != NULL; pt_conn = (TRACK*) pt_conn->Pnext ) for( ; pt_conn != NULL; pt_conn = (TRACK*) pt_conn->Pnext )
{ {
if( pt_conn->m_Sous_Netcode != old_val ) if( pt_conn->m_Sous_Netcode != old_val )
{ {
if(pt_conn == pt_end_conn) break; if( pt_conn == pt_end_conn )
break;
continue; continue;
} }
@ -70,28 +74,32 @@ D_PAD * pt_pad;
if( pt_pad->m_physical_connexion == old_val ) if( pt_pad->m_physical_connexion == old_val )
pt_pad->m_physical_connexion = pt_conn->m_Sous_Netcode; pt_pad->m_physical_connexion = pt_conn->m_Sous_Netcode;
} }
if(pt_conn == pt_end_conn) break; if( pt_conn == pt_end_conn )
break;
} }
return(nb_change);
return nb_change;
} }
/******************************************************************/ /******************************************************************/
static void propage_equipot( TRACK* pt_start_conn, TRACK* pt_end_conn ) static void propage_equipot( TRACK* pt_start_conn, TRACK* pt_end_conn )
/******************************************************************/ /******************************************************************/
/* balaye la liste des SEGMENTS de PISTE /* balaye la liste des SEGMENTS de PISTE
- debut = pt_start_conn * - debut = pt_start_conn
- fin = pt_end_conn (pointe le dernier segment a analyser) * - fin = pt_end_conn (pointe le dernier segment a analyser)
pour attribuer ou propager un numero d'equipotentielle par * pour attribuer ou propager un numero d'equipotentielle par
blocs de connexions existantes * blocs de connexions existantes
la zone balayee est supposee appartenir au meme net, c'est a dire que * la zone balayee est supposee appartenir au meme net, c'est a dire que
les segments de pistes sont tries par net_code * les segments de pistes sont tries par net_code
*/ */
{ {
TRACK* pt_conn; TRACK* pt_conn;
int sous_net_code; int sous_net_code;
D_PAD* pt_pad; D_PAD* pt_pad;
TRACK* pt_autre_piste; TRACK* pt_autre_piste;
EDA_BaseStruct * PtStruct; BOARD_ITEM* PtStruct;
/* Initialisations prealables */ /* Initialisations prealables */
pt_conn = pt_start_conn; pt_conn = pt_start_conn;
@ -106,9 +114,12 @@ EDA_BaseStruct * PtStruct;
if( PtStruct && (PtStruct->m_StructType == TYPEPAD) ) if( PtStruct && (PtStruct->m_StructType == TYPEPAD) )
( (D_PAD*) PtStruct )->m_physical_connexion = 0; ( (D_PAD*) PtStruct )->m_physical_connexion = 0;
if (pt_conn == pt_end_conn) break; if( pt_conn == pt_end_conn )
break;
} }
sous_net_code = 1 ; pt_start_conn->m_Sous_Netcode = sous_net_code;
sous_net_code = 1;
pt_start_conn->m_Sous_Netcode = sous_net_code;
/* debut du calcul de propagation */ /* debut du calcul de propagation */
pt_conn = pt_start_conn; pt_conn = pt_start_conn;
@ -127,7 +138,8 @@ EDA_BaseStruct * PtStruct;
change_equipot( pt_start_conn, pt_end_conn, change_equipot( pt_start_conn, pt_end_conn,
pt_pad->m_physical_connexion, pt_conn->m_Sous_Netcode ); pt_pad->m_physical_connexion, pt_conn->m_Sous_Netcode );
} }
else pt_pad->m_physical_connexion = pt_conn->m_Sous_Netcode; else
pt_pad->m_physical_connexion = pt_conn->m_Sous_Netcode;
} }
else /* la connexion ne fait pas partie encore d'une chaine */ else /* la connexion ne fait pas partie encore d'une chaine */
{ {
@ -137,7 +149,8 @@ EDA_BaseStruct * PtStruct;
} }
else else
{ {
sous_net_code++ ; pt_conn->m_Sous_Netcode = sous_net_code; sous_net_code++;
pt_conn->m_Sous_Netcode = sous_net_code;
pt_pad->m_physical_connexion = pt_conn->m_Sous_Netcode; pt_pad->m_physical_connexion = pt_conn->m_Sous_Netcode;
} }
} }
@ -155,7 +168,8 @@ EDA_BaseStruct * PtStruct;
change_equipot( pt_start_conn, pt_end_conn, change_equipot( pt_start_conn, pt_end_conn,
pt_pad->m_physical_connexion, pt_conn->m_Sous_Netcode ); pt_pad->m_physical_connexion, pt_conn->m_Sous_Netcode );
} }
else pt_pad->m_physical_connexion = pt_conn->m_Sous_Netcode; else
pt_pad->m_physical_connexion = pt_conn->m_Sous_Netcode;
} }
else else
{ {
@ -175,7 +189,8 @@ EDA_BaseStruct * PtStruct;
/* traitement des connexions entre segments */ /* traitement des connexions entre segments */
PtStruct = pt_conn->start; PtStruct = pt_conn->start;
if( PtStruct && (PtStruct->m_StructType != TYPEPAD) ) if( PtStruct && (PtStruct->m_StructType != TYPEPAD) )
{ /* debut sur une autre piste */ {
/* debut sur une autre piste */
pt_autre_piste = (TRACK*) PtStruct; pt_autre_piste = (TRACK*) PtStruct;
if( pt_conn->m_Sous_Netcode ) /* La connexion fait deja partie d'un block */ if( pt_conn->m_Sous_Netcode ) /* La connexion fait deja partie d'un block */
@ -190,7 +205,6 @@ EDA_BaseStruct * PtStruct;
pt_autre_piste->m_Sous_Netcode = pt_conn->m_Sous_Netcode; pt_autre_piste->m_Sous_Netcode = pt_conn->m_Sous_Netcode;
} }
} }
else /* La connexion ne fait partie d'aucun block */ else /* La connexion ne fait partie d'aucun block */
{ {
if( pt_autre_piste->m_Sous_Netcode ) if( pt_autre_piste->m_Sous_Netcode )
@ -207,8 +221,10 @@ EDA_BaseStruct * PtStruct;
PtStruct = pt_conn->end; PtStruct = pt_conn->end;
if( PtStruct && (PtStruct->m_StructType != TYPEPAD) ) if( PtStruct && (PtStruct->m_StructType != TYPEPAD) )
{ /* fin connectee a une autre piste */ {
/* fin connectee a une autre piste */
pt_autre_piste = (TRACK*) PtStruct; pt_autre_piste = (TRACK*) PtStruct;
if( pt_conn->m_Sous_Netcode ) /* La connexion fait deja partie d'un block */ if( pt_conn->m_Sous_Netcode ) /* La connexion fait deja partie d'un block */
{ {
if( pt_autre_piste->m_Sous_Netcode ) if( pt_autre_piste->m_Sous_Netcode )
@ -216,7 +232,8 @@ EDA_BaseStruct * PtStruct;
change_equipot( pt_start_conn, pt_end_conn, change_equipot( pt_start_conn, pt_end_conn,
pt_autre_piste->m_Sous_Netcode, pt_conn->m_Sous_Netcode ); pt_autre_piste->m_Sous_Netcode, pt_conn->m_Sous_Netcode );
} }
else pt_autre_piste->m_Sous_Netcode = pt_conn->m_Sous_Netcode; else
pt_autre_piste->m_Sous_Netcode = pt_conn->m_Sous_Netcode;
} }
else /* La connexion ne fait partie d'aucun block */ else /* La connexion ne fait partie d'aucun block */
{ {
@ -231,17 +248,20 @@ EDA_BaseStruct * PtStruct;
} }
} }
} }
if (pt_conn == pt_end_conn) break; if( pt_conn == pt_end_conn )
break;
} }
} }
/***************************************************/ /***************************************************/
void WinEDA_BasePcbFrame::test_connexions( wxDC* DC ) void WinEDA_BasePcbFrame::test_connexions( wxDC* DC )
/***************************************************/ /***************************************************/
/* /*
Routine recherchant les connexions deja faites et mettant a jour * Routine recherchant les connexions deja faites et mettant a jour
le status du chevelu ( Bit CH_ACTIF mis a 0 si connexion trouvee * le status du chevelu ( Bit CH_ACTIF mis a 0 si connexion trouvee
Les pistes sont supposees etre triees par ordre de net_code croissant * Les pistes sont supposees etre triees par ordre de net_code croissant
*/ */
{ {
TRACK* pt_start_conn, * pt_end_conn; TRACK* pt_start_conn, * pt_end_conn;
@ -261,7 +281,7 @@ int current_net_code;
//////////////////////////// ////////////////////////////
/* Les pointeurs .start et .end sont mis a jour, si la /* Les pointeurs .start et .end sont mis a jour, si la
connexion est du type segment a segment * connexion est du type segment a segment
*/ */
pt_start_conn = m_Pcb->m_Track; pt_start_conn = m_Pcb->m_Track;
@ -279,25 +299,30 @@ int current_net_code;
return; return;
} }
/**************************************************************/ /**************************************************************/
void WinEDA_BasePcbFrame::Recalcule_all_net_connexion( wxDC* DC ) void WinEDA_BasePcbFrame::Recalcule_all_net_connexion( wxDC* DC )
/**************************************************************/ /**************************************************************/
/* /*
Routine Recalculant les pointeurs sur connexions types piste a piste * Routine Recalculant les pointeurs sur connexions types piste a piste
relatives a tous les nets. * relatives a tous les nets.
Cette routine est utilisee apres reclassement des segments de piste par * Cette routine est utilisee apres reclassement des segments de piste par
ordre de net_code, puisque des pointeurs sur connexions deviennent faux * ordre de net_code, puisque des pointeurs sur connexions deviennent faux
( les pointeurs type pad restent bons ) * ( les pointeurs type pad restent bons )
*/ */
{ {
TRACK* EndConn; TRACK* EndConn;
int net_code, net_code_max; int net_code, net_code_max;
if(m_Pcb->m_Track == NULL ) return; if( m_Pcb->m_Track == NULL )
return;
/* calcul du net_code max */ /* calcul du net_code max */
EndConn = m_Pcb->m_Track; EndConn = m_Pcb->m_Track;
while( EndConn->Pnext) EndConn = (TRACK*)EndConn->Pnext; while( EndConn->Pnext )
EndConn = (TRACK*) EndConn->Pnext;
net_code_max = EndConn->m_NetCode; net_code_max = EndConn->m_NetCode;
for( net_code = 0; net_code <= net_code_max; net_code++ ) for( net_code = 0; net_code <= net_code_max; net_code++ )
@ -306,11 +331,13 @@ int net_code, net_code_max;
} }
} }
/*************************************************************************/ /*************************************************************************/
void WinEDA_BasePcbFrame::test_1_net_connexion( wxDC* DC, int net_code ) void WinEDA_BasePcbFrame::test_1_net_connexion( wxDC* DC, int net_code )
/*************************************************************************/ /*************************************************************************/
/* /*
Routine recherchant les connexions deja faites relatives a 1 net * Routine recherchant les connexions deja faites relatives a 1 net
*/ */
{ {
TRACK* pt_start_conn, * pt_end_conn; TRACK* pt_start_conn, * pt_end_conn;
@ -318,7 +345,8 @@ int ii, nb_net_noconnect = 0;
LISTE_PAD* pt_pad; LISTE_PAD* pt_pad;
wxString msg; wxString msg;
if(net_code == 0) return; if( net_code == 0 )
return;
if( (m_Pcb->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 ) if( (m_Pcb->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 )
Compile_Ratsnest( DC, TRUE ); Compile_Ratsnest( DC, TRUE );
@ -327,8 +355,10 @@ wxString msg;
for( ii = 0; ii < m_Pcb->m_NbPads; ii++, pt_pad++ ) for( ii = 0; ii < m_Pcb->m_NbPads; ii++, pt_pad++ )
{ {
int pad_net_code = (*pt_pad)->m_NetCode; int pad_net_code = (*pt_pad)->m_NetCode;
if(pad_net_code < net_code) continue; if( pad_net_code < net_code )
if(pad_net_code > net_code) break; continue;
if( pad_net_code > net_code )
break;
(*pt_pad)->m_physical_connexion = 0; (*pt_pad)->m_physical_connexion = 0;
} }
@ -360,34 +390,37 @@ wxString msg;
} }
/***************************************************************************/ /***************************************************************************/
static void calcule_connexite_1_net( TRACK* pt_start_conn, TRACK* pt_end_conn ) static void calcule_connexite_1_net( TRACK* pt_start_conn, TRACK* pt_end_conn )
/***************************************************************************/ /***************************************************************************/
/* calcule la connexite d'un net constitue de segments de piste consecutifs. /* calcule la connexite d'un net constitue de segments de piste consecutifs.
Entree: * Entree:
pt_start_conn = adresse du 1er segment ( debut du net ) * pt_start_conn = adresse du 1er segment ( debut du net )
pt_end_conn = adr de fin (dernier segment) * pt_end_conn = adr de fin (dernier segment)
Les connexions relatives aux pads doivent etre deja calculees, car elles * Les connexions relatives aux pads doivent etre deja calculees, car elles
ne sont pas ici recalculees ( pour des raisons de temps de calcul, et * ne sont pas ici recalculees ( pour des raisons de temps de calcul, et
du fait que lors des modif de pistes, les pads ne sont pas touches * du fait que lors des modif de pistes, les pads ne sont pas touches
*/ */
{ {
TRACK* Track; TRACK* Track;
/* Les pointeurs .start et .end sont mis a jour, si la /* Les pointeurs .start et .end sont mis a jour, si la
connexion est du type segment a segment. * connexion est du type segment a segment.
la connexion sur pads est supposee etre deja calculee */ * la connexion sur pads est supposee etre deja calculee */
/* Raz des pointeurs sur pistes */ /* Raz des pointeurs sur pistes */
for( Track = pt_start_conn; Track != NULL; Track = (TRACK*) Track->Pnext ) for( Track = pt_start_conn; Track != NULL; Track = (TRACK*) Track->Pnext )
{ {
Track->m_Sous_Netcode = 0; Track->m_Sous_Netcode = 0;
if( Track->GetState(BEGIN_ONPAD) == 0 ) Track->start = NULL; if( Track->GetState( BEGIN_ONPAD ) == 0 )
if( Track->GetState(END_ONPAD) == 0 ) Track->end = NULL; Track->start = NULL;
if( Track->GetState( END_ONPAD ) == 0 )
Track->end = NULL;
if (Track == pt_end_conn) break; if( Track == pt_end_conn )
break;
} }
/* calcul des connexions */ /* calcul des connexions */
@ -400,17 +433,18 @@ TRACK * Track;
for( pt_segm = pt_start_conn; pt_segm != NULL; pt_segm = (TRACK*) pt_segm->Pnext ) for( pt_segm = pt_start_conn; pt_segm != NULL; pt_segm = (TRACK*) pt_segm->Pnext )
{ {
int curlayermask = pt_segm->ReturnMaskLayer(); int curlayermask = pt_segm->ReturnMaskLayer();
if( !pt_segm->start && (pt_segm->m_Start == Track->m_Start) && if( !pt_segm->start && (pt_segm->m_Start == Track->m_Start)
( layermask & curlayermask ) ) && ( layermask & curlayermask ) )
{ {
pt_segm->start = Track; pt_segm->start = Track;
} }
if( !pt_segm->end && (pt_segm->m_End == Track->m_Start) && if( !pt_segm->end && (pt_segm->m_End == Track->m_Start)
(layermask & curlayermask) ) && (layermask & curlayermask) )
{ {
pt_segm->end = Track; pt_segm->end = Track;
} }
if( pt_segm == pt_end_conn ) break; if( pt_segm == pt_end_conn )
break;
} }
} }
@ -423,45 +457,46 @@ TRACK * Track;
{ {
Track->end = Locate_Piste_Connectee( Track, Track, pt_end_conn, END ); Track->end = Locate_Piste_Connectee( Track, Track, pt_end_conn, END );
} }
if (Track == pt_end_conn) break; if( Track == pt_end_conn )
break;
} }
/* Generation des sous equipots du net */ /* Generation des sous equipots du net */
propage_equipot( pt_start_conn, pt_end_conn ); propage_equipot( pt_start_conn, pt_end_conn );
} }
/********************************************/ /********************************************/
/* Reattribution des net_codes de reference */ /* Reattribution des net_codes de reference */
/********************************************/ /********************************************/
/*
reattribution des net_codes aux segments de pistes.
Routine utilisee apres modification generale des noms de nets (apres
lecrure netliste ou edition de nets sur pads, effacement /ajout de
modules...)
Elle se fait en 2 passes: /*
1 - reattribution des segments commencant ( et/ou finissant ) sur 1 pad * reattribution des net_codes aux segments de pistes.
les autres segments sont mis a reference NULLE * Routine utilisee apres modification generale des noms de nets (apres
2 - reattribution des segments restantes a ref NULLE * lecrure netliste ou edition de nets sur pads, effacement /ajout de
* modules...)
*
* Elle se fait en 2 passes:
* 1 - reattribution des segments commencant ( et/ou finissant ) sur 1 pad
* les autres segments sont mis a reference NULLE
* 2 - reattribution des segments restantes a ref NULLE
*/ */
#define POS_AFF_CHREF 62 #define POS_AFF_CHREF 62
/* recherche le pad connecte a l'extremite de la piste de coord px, py
parametres d'appel:
px, py = coord du point tst
masque_layer = couche(s) de connexion
pt_liste = adresse de la liste des pointeurs de pads, tels que
apparaissant apres build_liste_pad, mais classee par position X
de pads croissantes.
retourne : pointeur sur le pad connecte
la routine travaille par dichotomie sur la liste des pads tries par pos X
croissante, elle est donc beaucoup plus rapide que Fast_Locate_Pad_connecte,
mais implique le calcul de cette liste.
(la liste placee en m_Pcb->m_Pads et elle triee par netcodes croissants) /* recherche le pad connecte a l'extremite de la piste de coord px, py
* parametres d'appel:
* px, py = coord du point tst
* masque_layer = couche(s) de connexion
* pt_liste = adresse de la liste des pointeurs de pads, tels que
* apparaissant apres build_liste_pad, mais classee par position X
* de pads croissantes.
* retourne : pointeur sur le pad connecte
* la routine travaille par dichotomie sur la liste des pads tries par pos X
* croissante, elle est donc beaucoup plus rapide que Fast_Locate_Pad_connecte,
* mais implique le calcul de cette liste.
*
* (la liste placee en m_Pcb->m_Pads et elle triee par netcodes croissants)
*/ */
static D_PAD* SuperFast_Locate_Pad_Connecte( BOARD* pcb, LISTE_PAD* pt_liste, static D_PAD* SuperFast_Locate_Pad_Connecte( BOARD* pcb, LISTE_PAD* pt_liste,
@ -471,22 +506,26 @@ D_PAD * pad ;
LISTE_PAD* ptr_pad, * lim; LISTE_PAD* ptr_pad, * lim;
int nb_pad = pcb->m_NbPads; int nb_pad = pcb->m_NbPads;
int ii; int ii;
lim = pt_liste + (pcb->m_NbPads - 1 ); lim = pt_liste + (pcb->m_NbPads - 1 );
ptr_pad = pt_liste; ptr_pad = pt_liste;
while( nb_pad ) while( nb_pad )
{ {
pad = *ptr_pad; pad = *ptr_pad;
ii = nb_pad; ii = nb_pad;
nb_pad >>= 1; if( (ii & 1) && ( ii > 1 ) ) nb_pad++; nb_pad >>= 1; if( (ii & 1) && ( ii > 1 ) )
nb_pad++;
if( pad->m_Pos.x < px ) /* on doit chercher plus loin */ if( pad->m_Pos.x < px ) /* on doit chercher plus loin */
{ {
ptr_pad += nb_pad; if(ptr_pad > lim) ptr_pad = lim; ptr_pad += nb_pad; if( ptr_pad > lim )
ptr_pad = lim;
continue; continue;
} }
if( pad->m_Pos.x > px ) /* on doit chercher moins loin */ if( pad->m_Pos.x > px ) /* on doit chercher moins loin */
{ {
ptr_pad -= nb_pad; ptr_pad -= nb_pad;
if(ptr_pad < pt_liste) ptr_pad = pt_liste; if( ptr_pad < pt_liste )
ptr_pad = pt_liste;
continue; continue;
} }
@ -496,50 +535,64 @@ int ii;
while( ptr_pad >= pt_liste ) while( ptr_pad >= pt_liste )
{ {
pad = *ptr_pad; pad = *ptr_pad;
if(pad->m_Pos.x == px) ptr_pad--; if( pad->m_Pos.x == px )
else break; ptr_pad--;
else
break;
} }
ptr_pad++; /* pointe depart de zone a pad->m_Pos.x = px */ ptr_pad++; /* pointe depart de zone a pad->m_Pos.x = px */
for( ; ; ptr_pad++ ) for( ; ; ptr_pad++ )
{ {
if(ptr_pad > lim) return(NULL); /* hors zone */ if( ptr_pad > lim )
return NULL; /* hors zone */
pad = *ptr_pad; pad = *ptr_pad;
if( pad->m_Pos.x != px ) return(NULL); /* hors zone */ if( pad->m_Pos.x != px )
if( pad->m_Pos.y != py ) continue ; return NULL; /* hors zone */
if( pad->m_Pos.y != py )
continue;
/* Pad peut-etre trouve ici: il doit etre sur la bonne couche */ /* Pad peut-etre trouve ici: il doit etre sur la bonne couche */
if (pad->m_Masque_Layer & masque_layer) return(pad) ; if( pad->m_Masque_Layer & masque_layer )
return pad;
} }
} }
} }
return(NULL);
return NULL;
} }
static int SortPadsByXCoord( void* pt_ref, void* pt_comp ) static int SortPadsByXCoord( void* pt_ref, void* pt_comp )
/* used to Sort a pad list by x coordinate value /* used to Sort a pad list by x coordinate value
*/ */
{ {
D_PAD* ref = *(LISTE_PAD*) pt_ref; D_PAD* ref = *(LISTE_PAD*) pt_ref;
D_PAD* comp = *(LISTE_PAD*) pt_comp; D_PAD* comp = *(LISTE_PAD*) pt_comp;
return( ref->m_Pos.x - comp->m_Pos.x );
return ref->m_Pos.x - comp->m_Pos.x;
} }
/****************************************************/ /****************************************************/
LISTE_PAD* CreateSortedPadListByXCoord( BOARD* pcb ) LISTE_PAD* CreateSortedPadListByXCoord( BOARD* pcb )
/****************************************************/ /****************************************************/
/* Create a sorted list of pointers to pads. /* Create a sorted list of pointers to pads.
This list is sorted by X ccordinate value. * This list is sorted by X ccordinate value.
The list must be freed bu user * The list must be freed bu user
*/ */
{ {
LISTE_PAD* pad_list = (LISTE_PAD*) MyMalloc( pcb->m_NbPads * sizeof( D_PAD *) ); LISTE_PAD* pad_list = (LISTE_PAD*) MyMalloc( pcb->m_NbPads * sizeof( D_PAD *) );
memcpy( pad_list, pcb->m_Pads, pcb->m_NbPads * sizeof( D_PAD *) ); memcpy( pad_list, pcb->m_Pads, pcb->m_NbPads * sizeof( D_PAD *) );
qsort( pad_list, pcb->m_NbPads, sizeof( D_PAD *), qsort( pad_list, pcb->m_NbPads, sizeof( D_PAD *),
( int( * ) ( const void*, const void* ) )SortPadsByXCoord ); ( int( * ) ( const void*, const void* ) )SortPadsByXCoord );
return pad_list; return pad_list;
} }
/******************************************************************/ /******************************************************************/
void WinEDA_BasePcbFrame::reattribution_reference_piste( int affiche ) void WinEDA_BasePcbFrame::reattribution_reference_piste( int affiche )
/******************************************************************/ /******************************************************************/
@ -549,18 +602,20 @@ TRACK * pt_piste,
int a_color; int a_color;
char new_passe_request = 1, flag; char new_passe_request = 1, flag;
LISTE_PAD* pt_mem; LISTE_PAD* pt_mem;
EDA_BaseStruct * PtStruct; BOARD_ITEM* PtStruct;
int masque_layer; int masque_layer;
wxString msg; wxString msg;
if( m_Pcb->m_NbPads == 0 ) return; if( m_Pcb->m_NbPads == 0 )
return;
a_color = CYAN; a_color = CYAN;
if( affiche ) if( affiche )
Affiche_1_Parametre( this, POS_AFF_CHREF, wxT( "DataBase" ), wxT( "Netcodes" ), a_color ); Affiche_1_Parametre( this, POS_AFF_CHREF, wxT( "DataBase" ), wxT( "Netcodes" ), a_color );
recalcule_pad_net_code(); recalcule_pad_net_code();
if(affiche) Affiche_1_Parametre(this, -1,wxEmptyString, wxT("Gen Pads "),a_color); if( affiche )
Affiche_1_Parametre( this, -1, wxEmptyString, wxT( "Gen Pads " ), a_color );
////////////////////////////////////////////////////// //////////////////////////////////////////////////////
// Connexion des pistes accrochees a 1 pad au moins // // Connexion des pistes accrochees a 1 pad au moins //
@ -582,27 +637,33 @@ wxString msg;
for( ; pt_piste != NULL; pt_piste = (TRACK*) pt_piste->Pnext ) for( ; pt_piste != NULL; pt_piste = (TRACK*) pt_piste->Pnext )
{ {
flag = 0; flag = 0;
masque_layer = g_TabOneLayerMask[pt_piste->m_Layer]; masque_layer = g_TabOneLayerMask[pt_piste->GetLayer()];
/* y a t-il une pastille sur une extremite */ /* y a t-il une pastille sur une extremite */
pt_piste->start = SuperFast_Locate_Pad_Connecte(m_Pcb, pt_mem, pt_piste->start = SuperFast_Locate_Pad_Connecte( m_Pcb,
pt_piste->m_Start.x, pt_piste->m_Start.y, masque_layer); pt_mem,
pt_piste->m_Start.x,
pt_piste->m_Start.y,
masque_layer );
if( pt_piste->start != NULL ) if( pt_piste->start != NULL )
{ {
pt_piste->SetState( BEGIN_ONPAD, ON ); pt_piste->SetState( BEGIN_ONPAD, ON );
pt_piste->m_NetCode = ( (D_PAD*) (pt_piste->start) )->m_NetCode; pt_piste->m_NetCode = ( (D_PAD*) (pt_piste->start) )->m_NetCode;
} }
pt_piste->end = SuperFast_Locate_Pad_Connecte(m_Pcb, pt_mem, pt_piste->end = SuperFast_Locate_Pad_Connecte( m_Pcb,
pt_piste->m_End.x, pt_piste->m_End.y, masque_layer); pt_mem,
pt_piste->m_End.x,
pt_piste->m_End.y,
masque_layer );
if( pt_piste->end != NULL ) if( pt_piste->end != NULL )
{ {
pt_piste->SetState( END_ONPAD, ON ); pt_piste->SetState( END_ONPAD, ON );
pt_piste->m_NetCode = ( (D_PAD*) (pt_piste->end) )->m_NetCode; pt_piste->m_NetCode = ( (D_PAD*) (pt_piste->end) )->m_NetCode;
} }
} }
MyFree( pt_mem ); MyFree( pt_mem );
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
@ -610,7 +671,7 @@ wxString msg;
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
/* Les pointeurs .start et .end sont mis a jour, s'ils etaient NULLs. /* Les pointeurs .start et .end sont mis a jour, s'ils etaient NULLs.
La connexion est alors du type segment a segment * La connexion est alors du type segment a segment
*/ */
if( affiche ) if( affiche )
Affiche_1_Parametre( this, POS_AFF_CHREF, wxEmptyString, wxT( "Conn Segm" ), a_color ); Affiche_1_Parametre( this, POS_AFF_CHREF, wxEmptyString, wxT( "Conn Segm" ), a_color );
@ -647,8 +708,10 @@ wxString msg;
/* look for vias which could be connect many tracks */ /* look for vias which could be connect many tracks */
for( TRACK* via = m_Pcb->m_Track; via != NULL; via = via->Next() ) for( TRACK* via = m_Pcb->m_Track; via != NULL; via = via->Next() )
{ {
if ( via->m_StructType != TYPEVIA ) continue; if( via->m_StructType != TYPEVIA )
if ( via->m_NetCode > 0 ) continue; // Netcode already known continue;
if( via->m_NetCode > 0 )
continue; // Netcode already known
// Lock for a connection to a track with a known netcode // Lock for a connection to a track with a known netcode
pt_next = m_Pcb->m_Track; pt_next = m_Pcb->m_Track;
while( ( pt_next = Locate_Piste_Connectee( via, pt_next, NULL, START ) ) != NULL ) while( ( pt_next = Locate_Piste_Connectee( via, pt_next, NULL, START ) ) != NULL )
@ -663,7 +726,8 @@ wxString msg;
} }
} }
if ( reset_flag ) for ( pt_piste = m_Pcb->m_Track; pt_piste != NULL; pt_piste = pt_piste->Next()) if( reset_flag )
for( pt_piste = m_Pcb->m_Track; pt_piste != NULL; pt_piste = pt_piste->Next() )
{ {
pt_piste->SetState( BUSY, OFF ); pt_piste->SetState( BUSY, OFF );
} }
@ -671,7 +735,7 @@ wxString msg;
for( pt_piste = m_Pcb->m_Track; pt_piste != NULL; pt_piste = pt_piste->Next() ) for( pt_piste = m_Pcb->m_Track; pt_piste != NULL; pt_piste = pt_piste->Next() )
{ {
/* Traitement du point de debut */ /* Traitement du point de debut */
PtStruct = (EDA_BaseStruct*)pt_piste->start; PtStruct = (BOARD_ITEM*) pt_piste->start;
if( PtStruct && (PtStruct->m_StructType != TYPEPAD) ) if( PtStruct && (PtStruct->m_StructType != TYPEPAD) )
{ // Begin on an other track segment { // Begin on an other track segment
pt_next = (TRACK*) PtStruct; pt_next = (TRACK*) PtStruct;
@ -683,7 +747,6 @@ wxString msg;
pt_next->m_NetCode = pt_piste->m_NetCode; pt_next->m_NetCode = pt_piste->m_NetCode;
} }
} }
else else
{ {
if( pt_next->m_NetCode != 0 ) if( pt_next->m_NetCode != 0 )
@ -720,30 +783,34 @@ wxString msg;
} }
/* Reclassemment des pistes par numero de net: */ /* Reclassemment des pistes par numero de net: */
if( affiche ) Affiche_1_Parametre(this, -1,wxEmptyString, wxT("Reorder "),a_color); if( affiche )
Affiche_1_Parametre( this, -1, wxEmptyString, wxT( "Reorder " ), a_color );
RebuildTrackChain( m_Pcb ); RebuildTrackChain( m_Pcb );
if( affiche ) Affiche_1_Parametre(this, -1,wxEmptyString, wxT(" "),a_color); if( affiche )
Affiche_1_Parametre( this, -1, wxEmptyString, wxT( " " ), a_color );
} }
/* /*
routine de tri de connexion utilisee par la fonction QSORT * routine de tri de connexion utilisee par la fonction QSORT
le tri est fait par numero de net * le tri est fait par numero de net
*/ */
int tri_par_netcode( TRACK** pt_ref, TRACK** pt_compare ) int tri_par_netcode( TRACK** pt_ref, TRACK** pt_compare )
{ {
int ii; int ii;
ii = (*pt_ref)->m_NetCode -(* pt_compare)->m_NetCode ;
return(ii) ;
}
ii = (*pt_ref)->m_NetCode - (*pt_compare)->m_NetCode;
return ii;
}
/*****************************************/ /*****************************************/
static void RebuildTrackChain( BOARD* pcb ) static void RebuildTrackChain( BOARD* pcb )
/*****************************************/ /*****************************************/
/* Recalcule le chainage des pistes pour que le chainage soit fait par /* Recalcule le chainage des pistes pour que le chainage soit fait par
netcodes croissants * netcodes croissants
*/ */
{ {
TRACK* Track, ** Liste; TRACK* Track, ** Liste;
@ -751,7 +818,8 @@ int ii, nbsegm;
/* Count segments */ /* Count segments */
nbsegm = pcb->GetNumSegmTrack(); nbsegm = pcb->GetNumSegmTrack();
if( pcb->m_Track == NULL ) return; if( pcb->m_Track == NULL )
return;
Liste = (TRACK**) MyZMalloc( (nbsegm + 1) * sizeof(TRACK *) ); Liste = (TRACK**) MyZMalloc( (nbsegm + 1) * sizeof(TRACK *) );
@ -778,4 +846,3 @@ int ii, nbsegm;
MyFree( Liste ); MyFree( Liste );
} }

View File

@ -147,7 +147,7 @@ WinEDA_CotationPropertiesFrame::WinEDA_CotationPropertiesFrame( WinEDA_PcbFrame*
m_SelLayerBox->Append( ReturnPcbLayerName( ii ) ); m_SelLayerBox->Append( ReturnPcbLayerName( ii ) );
} }
m_SelLayerBox->SetSelection( Cotation->m_Layer - (CMP_N + 1) ); m_SelLayerBox->SetSelection( Cotation->GetLayer() - (CMP_N + 1) );
GetSizer()->Fit( this ); GetSizer()->Fit( this );
GetSizer()->SetSizeHints( this ); GetSizer()->SetSizeHints( this );
@ -180,8 +180,9 @@ void WinEDA_CotationPropertiesFrame::CotationPropertiesAccept( wxCommandEvent& e
CurrentCotation->m_Text->m_Width = CurrentCotation->m_Width = CurrentCotation->m_Text->m_Width = CurrentCotation->m_Width =
m_TxtWidthCtrl->GetValue(); m_TxtWidthCtrl->GetValue();
CurrentCotation->m_Text->m_Miroir = (m_Mirror->GetSelection() == 0) ? 1 : 0; CurrentCotation->m_Text->m_Miroir = (m_Mirror->GetSelection() == 0) ? 1 : 0;
CurrentCotation->m_Layer = CurrentCotation->m_Text->m_Layer =
m_SelLayerBox->GetChoice() + CMP_N + 1; CurrentCotation->SetLayer( m_SelLayerBox->GetChoice() + CMP_N + 1 );
CurrentCotation->m_Text->SetLayer( m_SelLayerBox->GetChoice() + CMP_N + 1 );
CurrentCotation->m_Text->CreateDrawData(); CurrentCotation->m_Text->CreateDrawData();
@ -236,7 +237,7 @@ COTATION* WinEDA_PcbFrame::Begin_Cotation( COTATION* Cotation, wxDC* DC )
Cotation = new COTATION( m_Pcb ); Cotation = new COTATION( m_Pcb );
Cotation->m_Flags = IS_NEW; Cotation->m_Flags = IS_NEW;
Cotation->m_Layer = GetScreen()->m_Active_Layer; Cotation->SetLayer( GetScreen()->m_Active_Layer );
Cotation->m_Width = g_DesignSettings.m_DrawSegmentWidth; Cotation->m_Width = g_DesignSettings.m_DrawSegmentWidth;
Cotation->m_Text->m_Width = Cotation->m_Width; Cotation->m_Text->m_Width = Cotation->m_Width;
@ -317,7 +318,7 @@ static void Montre_Position_New_Cotation( WinEDA_DrawPanel* panel, wxDC* DC, boo
Cotation->Draw( panel, DC, wxPoint( 0, 0 ), GR_XOR ); Cotation->Draw( panel, DC, wxPoint( 0, 0 ), GR_XOR );
} }
Cotation->m_Layer = screen->m_Active_Layer; Cotation->SetLayer( screen->m_Active_Layer );
if( status_cotation == 1 ) if( status_cotation == 1 )
{ {
Cotation->TraitD_ox = pos.x; Cotation->TraitD_ox = pos.x;
@ -399,7 +400,7 @@ static void Ajuste_Details_Cotation( COTATION* Cotation )
wxString msg; wxString msg;
/* Init des couches : */ /* Init des couches : */
Cotation->m_Text->m_Layer = Cotation->m_Layer; Cotation->m_Text->SetLayer( Cotation->GetLayer() );
/* calcul de la hauteur du texte + trait de cotation */ /* calcul de la hauteur du texte + trait de cotation */
ii = Cotation->m_Text->m_Size.y + ii = Cotation->m_Text->m_Size.y +

View File

@ -68,7 +68,7 @@ TRACK* WinEDA_PcbFrame::Delete_Segment( wxDC* DC, TRACK* Track )
delete Track; delete Track;
g_TrackSegmentCount--; g_TrackSegmentCount--;
if( g_CurrentTrackSegment && (g_CurrentTrackSegment->m_StructType != TYPEVIA) ) if( g_CurrentTrackSegment && (g_CurrentTrackSegment->m_StructType != TYPEVIA) )
previous_layer = g_CurrentTrackSegment->m_Layer; previous_layer = g_CurrentTrackSegment->GetLayer();
} }
if( g_CurrentTrackSegment ) if( g_CurrentTrackSegment )

View File

@ -236,7 +236,7 @@ void WinEDA_ModulePropertiesFrame::BuildPanelModuleProperties( bool FullOptions
wxString layer_list[2] = { _( "Component" ), _( "Copper" ) }; wxString layer_list[2] = { _( "Component" ), _( "Copper" ) };
m_LayerCtrl = new wxRadioBox( m_PanelProperties, -1, _( "Layer" ), wxDefaultPosition, m_LayerCtrl = new wxRadioBox( m_PanelProperties, -1, _( "Layer" ), wxDefaultPosition,
wxSize( -1, -1 ), 2, layer_list, 1 ); wxSize( -1, -1 ), 2, layer_list, 1 );
m_LayerCtrl->SetSelection( (m_CurrentModule->m_Layer == CUIVRE_N) ? 1 : 0 ); m_LayerCtrl->SetSelection( (m_CurrentModule->GetLayer() == CUIVRE_N) ? 1 : 0 );
PropLeftSizer->Add( m_LayerCtrl, 0, wxGROW | wxALL, 5 ); PropLeftSizer->Add( m_LayerCtrl, 0, wxGROW | wxALL, 5 );
bool select = FALSE; bool select = FALSE;
@ -518,10 +518,10 @@ void WinEDA_ModulePropertiesFrame::ModulePropertiesAccept( wxCommandEvent& event
{ {
if( m_LayerCtrl->GetSelection() == 0 ) // layer req = COMPONENT if( m_LayerCtrl->GetSelection() == 0 ) // layer req = COMPONENT
{ {
if( m_CurrentModule->m_Layer == CUIVRE_N ) if( m_CurrentModule->GetLayer() == CUIVRE_N )
change_layer = TRUE; change_layer = TRUE;
} }
else if( m_CurrentModule->m_Layer == CMP_N ) else if( m_CurrentModule->GetLayer() == CMP_N )
change_layer = TRUE; change_layer = TRUE;
} }

View File

@ -200,11 +200,11 @@ void WinEDA_ModuleEditFrame::Edit_Edge_Layer( EDGE_MODULE* Edge, wxDC* DC )
{ {
if( Edge->m_StructType != TYPEEDGEMODULE ) if( Edge->m_StructType != TYPEEDGEMODULE )
continue; continue;
Edge->m_Layer = new_layer; Edge->SetLayer( new_layer );
} }
} }
else else
Edge->m_Layer = new_layer; Edge->SetLayer( new_layer );
GetScreen()->SetModify(); GetScreen()->SetModify();
Module->Set_Rectangle_Encadrement(); Module->Set_Rectangle_Encadrement();
@ -336,11 +336,11 @@ EDGE_MODULE* WinEDA_ModuleEditFrame::Begin_Edge_Module( EDGE_MODULE* Edge,
if( Edge->m_Shape == S_ARC ) if( Edge->m_Shape == S_ARC )
Edge->m_Angle = ArcValue; Edge->m_Angle = ArcValue;
Edge->m_Width = ModuleSegmentWidth; Edge->m_Width = ModuleSegmentWidth;
Edge->m_Layer = Module->m_Layer; Edge->SetLayer( Module->GetLayer() );
if( Module->m_Layer == CMP_N ) if( Module->GetLayer() == CMP_N )
Edge->m_Layer = SILKSCREEN_N_CMP; Edge->SetLayer( SILKSCREEN_N_CMP );
if( Module->m_Layer == CUIVRE_N ) if( Module->GetLayer() == CUIVRE_N )
Edge->m_Layer = SILKSCREEN_N_CU; Edge->SetLayer( SILKSCREEN_N_CU );
/* Mise a jour du point de depart du segment ou de l'arc */ /* Mise a jour du point de depart du segment ou de l'arc */
Edge->m_Start = GetScreen()->m_Curseur; Edge->m_Start = GetScreen()->m_Curseur;
/* Mise a jour de la fin du segment , rectangle ou de l'arc*/ /* Mise a jour de la fin du segment , rectangle ou de l'arc*/

View File

@ -138,7 +138,7 @@ void WinEDA_PcbFrame::Drawing_SetNewWidth( DRAWSEGMENT* DrawSegm, wxDC* DC )
Trace_DrawSegmentPcb( DrawPanel, DC, DrawSegm, GR_XOR ); Trace_DrawSegmentPcb( DrawPanel, DC, DrawSegm, GR_XOR );
if( DrawSegm->m_Layer == EDGE_N ) if( DrawSegm->GetLayer() == EDGE_N )
DrawSegm->m_Width = g_DesignSettings.m_EdgeSegmentWidth; DrawSegm->m_Width = g_DesignSettings.m_EdgeSegmentWidth;
else else
DrawSegm->m_Width = g_DesignSettings.m_DrawSegmentWidth; DrawSegm->m_Width = g_DesignSettings.m_DrawSegmentWidth;
@ -159,7 +159,7 @@ void WinEDA_PcbFrame::Delete_Drawings_All_Layer( DRAWSEGMENT* Segment, wxDC* DC
TEXTE_PCB* pt_txt; TEXTE_PCB* pt_txt;
EDA_BaseStruct* PtStruct, * PtNext; EDA_BaseStruct* PtStruct, * PtNext;
COTATION* Cotation; COTATION* Cotation;
int layer = Segment->m_Layer; int layer = Segment->GetLayer();
if( layer <= CMP_N ) if( layer <= CMP_N )
{ {
@ -187,7 +187,7 @@ void WinEDA_PcbFrame::Delete_Drawings_All_Layer( DRAWSEGMENT* Segment, wxDC* DC
{ {
case TYPEDRAWSEGMENT: case TYPEDRAWSEGMENT:
pt_segm = (DRAWSEGMENT*) PtStruct; pt_segm = (DRAWSEGMENT*) PtStruct;
if( pt_segm->m_Layer == layer ) if( pt_segm->GetLayer() == layer )
{ {
Trace_DrawSegmentPcb( DrawPanel, DC, pt_segm, GR_XOR ); Trace_DrawSegmentPcb( DrawPanel, DC, pt_segm, GR_XOR );
DeleteStructure( PtStruct ); DeleteStructure( PtStruct );
@ -196,7 +196,7 @@ void WinEDA_PcbFrame::Delete_Drawings_All_Layer( DRAWSEGMENT* Segment, wxDC* DC
case TYPETEXTE: case TYPETEXTE:
pt_txt = (TEXTE_PCB*) PtStruct; pt_txt = (TEXTE_PCB*) PtStruct;
if( pt_txt->m_Layer == layer ) if( pt_txt->GetLayer() == layer )
{ {
pt_txt->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_XOR ); pt_txt->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_XOR );
DeleteStructure( PtStruct ); DeleteStructure( PtStruct );
@ -206,7 +206,7 @@ void WinEDA_PcbFrame::Delete_Drawings_All_Layer( DRAWSEGMENT* Segment, wxDC* DC
case TYPECOTATION: case TYPECOTATION:
Cotation = (COTATION*) PtStruct; Cotation = (COTATION*) PtStruct;
if( Cotation->m_Layer == layer ) if( Cotation->GetLayer() == layer )
{ {
Cotation->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_XOR ); Cotation->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_XOR );
DeleteStructure( PtStruct ); DeleteStructure( PtStruct );
@ -276,7 +276,7 @@ DRAWSEGMENT* WinEDA_PcbFrame::Begin_DrawSegment( DRAWSEGMENT* Segment,
{ {
GetScreen()->SetCurItem( Segment = new DRAWSEGMENT( m_Pcb ) ); GetScreen()->SetCurItem( Segment = new DRAWSEGMENT( m_Pcb ) );
Segment->m_Flags = IS_NEW; Segment->m_Flags = IS_NEW;
Segment->m_Layer = GetScreen()->m_Active_Layer; Segment->SetLayer( GetScreen()->m_Active_Layer );
Segment->m_Width = s_large; Segment->m_Width = s_large;
Segment->m_Shape = shape; Segment->m_Shape = shape;
Segment->m_Angle = 900; Segment->m_Angle = 900;
@ -307,7 +307,7 @@ DRAWSEGMENT* WinEDA_PcbFrame::Begin_DrawSegment( DRAWSEGMENT* Segment,
GetScreen()->SetCurItem( Segment = new DRAWSEGMENT( m_Pcb ) ); GetScreen()->SetCurItem( Segment = new DRAWSEGMENT( m_Pcb ) );
Segment->m_Flags = IS_NEW; Segment->m_Flags = IS_NEW;
Segment->m_Layer = DrawItem->m_Layer; Segment->SetLayer( DrawItem->GetLayer() );
Segment->m_Width = s_large; Segment->m_Width = s_large;
Segment->m_Shape = DrawItem->m_Shape; Segment->m_Shape = DrawItem->m_Shape;
Segment->m_Type = DrawItem->m_Type; Segment->m_Type = DrawItem->m_Type;

View File

@ -108,7 +108,7 @@ void WinEDA_PcbFrame::ExChange_Track_Layer( TRACK* pt_segm, wxDC* DC )
for( ; ii > 0; ii--, pt_segm = (TRACK*) pt_segm->Pnext ) for( ; ii > 0; ii--, pt_segm = (TRACK*) pt_segm->Pnext )
{ {
pt_segm->SetState( BUSY, OFF ); pt_segm->SetState( BUSY, OFF );
pt_segm->m_Param = pt_segm->m_Layer; /* pour sauvegarde */ pt_segm->m_Param = pt_segm->GetLayer(); /* pour sauvegarde */
} }
ii = 0; pt_segm = pt_track; ii = 0; pt_segm = pt_track;
@ -118,17 +118,17 @@ void WinEDA_PcbFrame::ExChange_Track_Layer( TRACK* pt_segm, wxDC* DC )
continue; continue;
/* inversion des couches */ /* inversion des couches */
if( pt_segm->m_Layer == l1 ) if( pt_segm->GetLayer() == l1 )
pt_segm->m_Layer = l2; pt_segm->SetLayer( l2 );
else if( pt_segm->m_Layer == l2 ) else if( pt_segm->GetLayer() == l2 )
pt_segm->m_Layer = l1; pt_segm->SetLayer( l1 );
if( (Drc_On) && ( Drc( this, DC, pt_segm, m_Pcb->m_Track, 1 ) == BAD_DRC ) ) if( (Drc_On) && ( Drc( this, DC, pt_segm, m_Pcb->m_Track, 1 ) == BAD_DRC ) )
{ /* Annulation du changement */ { /* Annulation du changement */
ii = 0; pt_segm = pt_track; ii = 0; pt_segm = pt_track;
for( ; ii < nb_segm; ii++, pt_segm = (TRACK*) pt_segm->Pnext ) for( ; ii < nb_segm; ii++, pt_segm = (TRACK*) pt_segm->Pnext )
{ {
pt_segm->m_Layer = pt_segm->m_Param; pt_segm->SetLayer( pt_segm->m_Param );
} }
Trace_Une_Piste( DrawPanel, DC, pt_track, nb_segm, GR_OR ); Trace_Une_Piste( DrawPanel, DC, pt_track, nb_segm, GR_OR );
@ -178,7 +178,7 @@ void WinEDA_PcbFrame::Other_Layer_Route( TRACK* track, wxDC* DC )
} }
/* Les vias ne doivent pas etre inutilement empilees: */ /* Les vias ne doivent pas etre inutilement empilees: */
if( Locate_Via( m_Pcb, g_CurrentTrackSegment->m_End, g_CurrentTrackSegment->m_Layer ) ) if( Locate_Via( m_Pcb, g_CurrentTrackSegment->m_End, g_CurrentTrackSegment->GetLayer() ) )
return; return;
pt_segm = g_FirstTrackSegment; pt_segm = g_FirstTrackSegment;
for( ii = 0; ii < g_TrackSegmentCount - 1; ii++, pt_segm = (TRACK*) pt_segm->Pnext ) for( ii = 0; ii < g_TrackSegmentCount - 1; ii++, pt_segm = (TRACK*) pt_segm->Pnext )
@ -206,7 +206,7 @@ void WinEDA_PcbFrame::Other_Layer_Route( TRACK* track, wxDC* DC )
Via->m_NetCode = g_HightLigth_NetCode; Via->m_NetCode = g_HightLigth_NetCode;
Via->m_Start = Via->m_End = g_CurrentTrackSegment->m_End; Via->m_Start = Via->m_End = g_CurrentTrackSegment->m_End;
Via->m_Layer = GetScreen()->m_Active_Layer; Via->SetLayer( GetScreen()->m_Active_Layer );
// Provisoirement. indicate the first layer (?) // Provisoirement. indicate the first layer (?)
@ -218,19 +218,19 @@ void WinEDA_PcbFrame::Other_Layer_Route( TRACK* track, wxDC* DC )
if( (Via->m_Shape & 15) == VIA_ENTERREE ) if( (Via->m_Shape & 15) == VIA_ENTERREE )
{ {
Via->m_Layer |= GetScreen()->m_Active_Layer << 4; Via->SetLayer( Via->GetLayer() | GetScreen()->m_Active_Layer << 4 );
} }
else if( (Via->m_Shape & 15) == VIA_BORGNE ) //blind via else if( (Via->m_Shape & 15) == VIA_BORGNE ) //blind via
{ // A revoir! ( la via devrait deboucher sur 1 cote ) { // A revoir! ( la via devrait deboucher sur 1 cote )
Via->m_Layer |= GetScreen()->m_Active_Layer << 4; Via->SetLayer( Via->GetLayer() | GetScreen()->m_Active_Layer << 4 );
} }
else else
Via->m_Layer = 0x0F; Via->SetLayer( 0x0F );
if( Drc_On &&( Drc( this, DC, Via, m_Pcb->m_Track, 1 ) == BAD_DRC ) ) if( Drc_On &&( Drc( this, DC, Via, m_Pcb->m_Track, 1 ) == BAD_DRC ) )
{ /* Via impossible a placer ici */ { /* Via impossible a placer ici */
delete Via; delete Via;
GetScreen()->m_Active_Layer = g_CurrentTrackSegment->m_Layer; GetScreen()->m_Active_Layer = g_CurrentTrackSegment->GetLayer();
DrawPanel->ManageCurseur( DrawPanel, DC, FALSE ); DrawPanel->ManageCurseur( DrawPanel, DC, FALSE );
return; return;
} }
@ -240,7 +240,7 @@ void WinEDA_PcbFrame::Other_Layer_Route( TRACK* track, wxDC* DC )
g_CurrentTrackSegment->Pnext = Via; g_CurrentTrackSegment->Pnext = Via;
g_TrackSegmentCount++; g_TrackSegmentCount++;
g_CurrentTrackSegment = new TRACK( *g_CurrentTrackSegment ); g_CurrentTrackSegment = new TRACK( *g_CurrentTrackSegment );
g_CurrentTrackSegment->m_Layer = GetScreen()->m_Active_Layer; g_CurrentTrackSegment->SetLayer( GetScreen()->m_Active_Layer );
g_CurrentTrackSegment->m_Start = g_CurrentTrackSegment->m_End = Via->m_Start; g_CurrentTrackSegment->m_Start = g_CurrentTrackSegment->m_End = Via->m_Start;
g_TrackSegmentCount++; g_TrackSegmentCount++;
g_CurrentTrackSegment->Pback = Via; g_CurrentTrackSegment->Pback = Via;

View File

@ -130,7 +130,7 @@ TRACK* WinEDA_PcbFrame::Begin_Route( TRACK* track, wxDC* DC )
Hight_Light( DC ); Hight_Light( DC );
g_CurrentTrackSegment->m_Flags = IS_NEW; g_CurrentTrackSegment->m_Flags = IS_NEW;
g_CurrentTrackSegment->m_Layer = GetScreen()->m_Active_Layer; g_CurrentTrackSegment->SetLayer( GetScreen()->m_Active_Layer );
g_CurrentTrackSegment->m_Width = g_DesignSettings.m_CurrentTrackWidth; g_CurrentTrackSegment->m_Width = g_DesignSettings.m_CurrentTrackWidth;
g_CurrentTrackSegment->m_Start = pos; g_CurrentTrackSegment->m_Start = pos;
g_CurrentTrackSegment->m_End = g_CurrentTrackSegment->m_Start; g_CurrentTrackSegment->m_End = g_CurrentTrackSegment->m_Start;
@ -211,7 +211,7 @@ TRACK* WinEDA_PcbFrame::Begin_Route( TRACK* track, wxDC* DC )
g_CurrentTrackSegment->m_Flags = IS_NEW; g_CurrentTrackSegment->m_Flags = IS_NEW;
g_TrackSegmentCount++; g_TrackSegmentCount++;
g_CurrentTrackSegment->m_Start = g_CurrentTrackSegment->m_End; g_CurrentTrackSegment->m_Start = g_CurrentTrackSegment->m_End;
g_CurrentTrackSegment->m_Layer = GetScreen()->m_Active_Layer; g_CurrentTrackSegment->SetLayer( GetScreen()->m_Active_Layer );
g_CurrentTrackSegment->m_Width = g_DesignSettings.m_CurrentTrackWidth; g_CurrentTrackSegment->m_Width = g_DesignSettings.m_CurrentTrackWidth;
/* Show the new position */ /* Show the new position */
ShowNewTrackWhenMovingCursor( DrawPanel, DC, FALSE ); ShowNewTrackWhenMovingCursor( DrawPanel, DC, FALSE );
@ -269,9 +269,9 @@ int Add_45_degrees_Segment( WinEDA_BasePcbFrame* frame, wxDC* DC, TRACK* pt_segm
dy1 = pt_segm->m_End.y - pt_segm->m_Start.y; dy1 = pt_segm->m_End.y - pt_segm->m_Start.y;
// les segments doivent etre de longueur suffisante: // les segments doivent etre de longueur suffisante:
if( max( abs( dx0 ), abs( dy0 ) ) < (pas_45 * 2) ) if( MAX( abs( dx0 ), abs( dy0 ) ) < (pas_45 * 2) )
return 0; return 0;
if( max( abs( dx1 ), abs( dy1 ) ) < (pas_45 * 2) ) if( MAX( abs( dx1 ), abs( dy1 ) ) < (pas_45 * 2) )
return 0; return 0;
/* creation du nouveau segment, raccordant des 2 segm: */ /* creation du nouveau segment, raccordant des 2 segm: */
@ -502,14 +502,14 @@ void ShowNewTrackWhenMovingCursor( WinEDA_DrawPanel* panel, wxDC* DC, bool erase
} }
/* dessin de la nouvelle piste : mise a jour du point d'arrivee */ /* dessin de la nouvelle piste : mise a jour du point d'arrivee */
g_CurrentTrackSegment->m_Layer = screen->m_Active_Layer; g_CurrentTrackSegment->SetLayer( screen->m_Active_Layer );
g_CurrentTrackSegment->m_Width = g_DesignSettings.m_CurrentTrackWidth; g_CurrentTrackSegment->m_Width = g_DesignSettings.m_CurrentTrackWidth;
if( g_TwoSegmentTrackBuild ) if( g_TwoSegmentTrackBuild )
{ {
TRACK* previous_track = (TRACK*) g_CurrentTrackSegment->Pback; TRACK* previous_track = (TRACK*) g_CurrentTrackSegment->Pback;
if( previous_track && (previous_track->m_StructType == TYPETRACK) ) if( previous_track && (previous_track->m_StructType == TYPETRACK) )
{ {
previous_track->m_Layer = screen->m_Active_Layer; previous_track->SetLayer( screen->m_Active_Layer );
previous_track->m_Width = g_DesignSettings.m_CurrentTrackWidth; previous_track->m_Width = g_DesignSettings.m_CurrentTrackWidth;
} }
} }
@ -584,7 +584,7 @@ void Calcule_Coord_Extremite_45( int ox, int oy, int* fx, int* fy )
break; break;
case 45: case 45:
deltax = min( deltax, deltay ); deltay = deltax; deltax = MIN( deltax, deltay ); deltay = deltax;
/* recalcul des signes de deltax et deltay */ /* recalcul des signes de deltax et deltay */
if( (ActiveScreen->m_Curseur.x - ox) < 0 ) if( (ActiveScreen->m_Curseur.x - ox) < 0 )
deltax = -deltax; deltax = -deltax;
@ -666,7 +666,7 @@ void ComputeBreakPoint( TRACK* track, int SegmentCount )
break; break;
case 45: case 45:
iDx = min( iDx, iDy ); iDx = MIN( iDx, iDy );
iDy = iDx; iDy = iDx;
/* recalcul des signes de deltax et deltay */ /* recalcul des signes de deltax et deltay */
if( (ActiveScreen->m_Curseur.x - track->m_Start.x) < 0 ) if( (ActiveScreen->m_Curseur.x - track->m_Start.x) < 0 )
@ -707,7 +707,7 @@ TRACK* DeleteNullTrackSegments( BOARD* pcb, TRACK* track, int* segmcount )
TRACK* firsttrack = track; TRACK* firsttrack = track;
TRACK* oldtrack; TRACK* oldtrack;
int nn = 0; int nn = 0;
EDA_BaseStruct* LockPoint; BOARD_ITEM* LockPoint;
if( track == 0 ) if( track == 0 )
return NULL; return NULL;

View File

@ -23,8 +23,8 @@ static void CreateShapesSection(FILE * file, BOARD * pcb);
static void CreatePadsShapesSection( FILE* file, BOARD* pcb ); static void CreatePadsShapesSection( FILE* file, BOARD* pcb );
static void ModuleWriteShape( FILE* File, MODULE* module ); static void ModuleWriteShape( FILE* File, MODULE* module );
wxString GenCAD_Layer_Name[32] // layer name pour extensions fichiers de trace // layer name pour extensions fichiers de tracewxString
= { static const wxString GenCAD_Layer_Name[32] = {
wxT( "BOTTOM" ), wxT( "INNER1" ), wxT( "INNER2" ), wxT("INNER3" ), wxT( "BOTTOM" ), wxT( "INNER1" ), wxT( "INNER2" ), wxT("INNER3" ),
wxT( "INNER4" ), wxT( "INNER5" ), wxT( "INNER6" ), wxT("INNER7" ), wxT( "INNER4" ), wxT( "INNER5" ), wxT( "INNER6" ), wxT("INNER7" ),
wxT( "INNER8" ), wxT( "INNER9" ), wxT( "INNER10" ), wxT("INNER11" ), wxT( "INNER8" ), wxT( "INNER9" ), wxT( "INNER10" ), wxT("INNER11" ),
@ -43,6 +43,8 @@ static int mapXto(int x)
{ {
return x - offsetX; return x - offsetX;
} }
static int mapYto( int y ) static int mapYto( int y )
{ {
return offsetY - y; return offsetY - y;
@ -52,8 +54,9 @@ static int mapYto(int y)
/***********************************************************/ /***********************************************************/
void WinEDA_PcbFrame::ExportToGenCAD( wxCommandEvent& event ) void WinEDA_PcbFrame::ExportToGenCAD( wxCommandEvent& event )
/***********************************************************/ /***********************************************************/
/* /*
Exporte le board au format GenCAD 1.4 * Exporte le board au format GenCAD 1.4
*/ */
{ {
wxString FullFileName = GetScreen()->m_FileName; wxString FullFileName = GetScreen()->m_FileName;
@ -72,7 +75,8 @@ FILE * file;
wxFD_SAVE, wxFD_SAVE,
FALSE FALSE
); );
if ( FullFileName == wxEmptyString ) return; if( FullFileName == wxEmptyString )
return;
if( ( file = wxFopen( FullFileName, wxT( "wt" ) ) ) == NULL ) if( ( file = wxFopen( FullFileName, wxT( "wt" ) ) ) == NULL )
{ {
@ -86,32 +90,34 @@ FILE * file;
offsetX = m_Auxiliary_Axis_Position.x; offsetX = m_Auxiliary_Axis_Position.x;
offsetY = m_Auxiliary_Axis_Position.y; offsetY = m_Auxiliary_Axis_Position.y;
wxClientDC dc( DrawPanel ); wxClientDC dc( DrawPanel );
DrawPanel->PrepareGraphicContext( &dc ); DrawPanel->PrepareGraphicContext( &dc );
Compile_Ratsnest( &dc, TRUE ); Compile_Ratsnest( &dc, TRUE );
/* Mise des modules vus en miroir en position "normale" /* Mise des modules vus en miroir en position "normale"
(necessaire pour decrire les formes sous GenCAD, * (necessaire pour decrire les formes sous GenCAD,
qui sont decrites en vue normale, orientation 0)) */ * qui sont decrites en vue normale, orientation 0)) */
MODULE* module; MODULE* module;
for( module = m_Pcb->m_Modules; module != NULL; module = module->Next() ) for( module = m_Pcb->m_Modules; module != NULL; module = module->Next() )
{ {
module->flag = 0; module->flag = 0;
if ( module->m_Layer == CUIVRE_N ) if( module->GetLayer() == CUIVRE_N )
{ {
Change_Side_Module( module, NULL ); Change_Side_Module( module, NULL );
module->flag = 1; module->flag = 1;
} }
} }
// Creation de l'entete: // Creation de l'entete:
CreateHeaderInfoData( file, this ); CreateHeaderInfoData( file, this );
CreateBoardSection( file, m_Pcb ); CreateBoardSection( file, m_Pcb );
/* Creation liste des TRACKS /* Creation liste des TRACKS
(section $TRACK) id liste des outils de tracage de pistes */ * (section $TRACK) id liste des outils de tracage de pistes */
CreateTracksInfoData( file, m_Pcb ); CreateTracksInfoData( file, m_Pcb );
/* Creation de la liste des formes utilisees /* Creation de la liste des formes utilisees
(formes des composants principalement */ * (formes des composants principalement */
CreatePadsShapesSection( file, m_Pcb ); // doit etre appele avant CreateShapesSection() CreatePadsShapesSection( file, m_Pcb ); // doit etre appele avant CreateShapesSection()
CreateShapesSection( file, m_Pcb ); CreateShapesSection( file, m_Pcb );
@ -139,8 +145,9 @@ MODULE * module;
/**************************************************************************/ /**************************************************************************/
static int Pad_list_Sort_by_Shapes( const void* refptr, const void* objptr ) static int Pad_list_Sort_by_Shapes( const void* refptr, const void* objptr )
/**************************************************************************/ /**************************************************************************/
/* /*
Routine de tri de la liste des pads par type, puis pa taille * Routine de tri de la liste des pads par type, puis pa taille
*/ */
{ {
const D_PAD* padref, * padcmp; const D_PAD* padref, * padcmp;
@ -148,23 +155,32 @@ int diff;
padref = *( (D_PAD**) refptr ); padref = *( (D_PAD**) refptr );
padcmp = *( (D_PAD**) objptr ); padcmp = *( (D_PAD**) objptr );
if( (diff = padref->m_PadShape - padcmp->m_PadShape) ) return diff; if( (diff = padref->m_PadShape - padcmp->m_PadShape) )
if( (diff = padref->m_Size.x - padcmp->m_Size.x) ) return diff; return diff;
if( (diff = padref->m_Size.y - padcmp->m_Size.y) ) return diff; if( (diff = padref->m_Size.x - padcmp->m_Size.x) )
if( (diff = padref->m_Offset.x - padcmp->m_Offset.x) ) return diff; return diff;
if( (diff = padref->m_Offset.y - padcmp->m_Offset.y) ) return diff; if( (diff = padref->m_Size.y - padcmp->m_Size.y) )
if( (diff = padref->m_DeltaSize.x - padcmp->m_DeltaSize.x) ) return diff; return diff;
if( (diff = padref->m_DeltaSize.y - padcmp->m_DeltaSize.y) ) return diff; if( (diff = padref->m_Offset.x - padcmp->m_Offset.x) )
return diff;
if( (diff = padref->m_Offset.y - padcmp->m_Offset.y) )
return diff;
if( (diff = padref->m_DeltaSize.x - padcmp->m_DeltaSize.x) )
return diff;
if( (diff = padref->m_DeltaSize.y - padcmp->m_DeltaSize.y) )
return diff;
return 0; return 0;
} }
/*****************************************************/ /*****************************************************/
void CreatePadsShapesSection( FILE* file, BOARD* pcb ) void CreatePadsShapesSection( FILE* file, BOARD* pcb )
/*****************************************************/ /*****************************************************/
/* Cree la liste des formes des pads ( 1 forme par pad ) /* Cree la liste des formes des pads ( 1 forme par pad )
initialise le membre .m_logical_connexion de la struct pad, la valeur 1 ..n * initialise le membre .m_logical_connexion de la struct pad, la valeur 1 ..n
pour les formes de pad PAD1 a PADn * pour les formes de pad PAD1 a PADn
*/ */
{ {
D_PAD* pad, ** padlist, ** pad_list_base; D_PAD* pad, ** padlist, ** pad_list_base;
@ -187,14 +203,14 @@ int pad_name_number;
pad = *padlist; pad = *padlist;
pad->m_logical_connexion = pad_name_number; pad->m_logical_connexion = pad_name_number;
if ( old_pad && if( old_pad
(old_pad->m_PadShape == pad->m_PadShape) && && (old_pad->m_PadShape == pad->m_PadShape)
(old_pad->m_Size.x == pad->m_Size.x) && && (old_pad->m_Size.x == pad->m_Size.x)
(old_pad->m_Size.y == pad->m_Size.y) && && (old_pad->m_Size.y == pad->m_Size.y)
(old_pad->m_Offset.x == pad->m_Offset.x) && && (old_pad->m_Offset.x == pad->m_Offset.x)
(old_pad->m_Offset.y == pad->m_Offset.y) && && (old_pad->m_Offset.y == pad->m_Offset.y)
(old_pad->m_DeltaSize.x == pad->m_DeltaSize.x) && && (old_pad->m_DeltaSize.x == pad->m_DeltaSize.x)
(old_pad->m_DeltaSize.y == pad->m_DeltaSize.y) && (old_pad->m_DeltaSize.y == pad->m_DeltaSize.y)
) )
continue; // Forme deja generee continue; // Forme deja generee
@ -286,21 +302,22 @@ int pad_name_number;
/**************************************************/ /**************************************************/
void CreateShapesSection( FILE* file, BOARD* pcb ) void CreateShapesSection( FILE* file, BOARD* pcb )
/**************************************************/ /**************************************************/
/* Creation de la liste des formes des composants. /* Creation de la liste des formes des composants.
Comme la forme de base (module de librairie peut etre modifiee, * Comme la forme de base (module de librairie peut etre modifiee,
une forme est creee par composant * une forme est creee par composant
La forme est donnee normalisee, c'est a dire orientation 0, position 0 non miroir * La forme est donnee normalisee, c'est a dire orientation 0, position 0 non miroir
Il y aura donc des formes indentiques redondantes * Il y aura donc des formes indentiques redondantes
*
Syntaxe: * Syntaxe:
$SHAPES * $SHAPES
SHAPE <shape_name> * SHAPE <shape_name>
shape_descr (line, arc ..) * shape_descr (line, arc ..)
PIN <pin_name> <pad_name> <x_y_ref> <layer> <rot> <mirror> * PIN <pin_name> <pad_name> <x_y_ref> <layer> <rot> <mirror>
*
SHAPE <shape_name> * SHAPE <shape_name>
.. * ..
$ENDSHAPES * $ENDSHAPES
*/ */
{ {
MODULE* module; MODULE* module;
@ -320,17 +337,22 @@ char * mirror = "0";
layer = "ALL"; layer = "ALL";
if( (pad->m_Masque_Layer & ALL_CU_LAYERS) == CUIVRE_LAYER ) if( (pad->m_Masque_Layer & ALL_CU_LAYERS) == CUIVRE_LAYER )
{ {
if ( module->m_Layer == CMP_N ) layer = "BOTTOM"; if( module->GetLayer() == CMP_N )
else layer = "TOP"; layer = "BOTTOM";
else
layer = "TOP";
} }
else if( (pad->m_Masque_Layer & ALL_CU_LAYERS) == CMP_LAYER ) else if( (pad->m_Masque_Layer & ALL_CU_LAYERS) == CMP_LAYER )
{ {
if ( module->m_Layer == CMP_N ) layer = "TOP"; if( module->GetLayer() == CMP_N )
else layer = "BOTTOM"; layer = "TOP";
else
layer = "BOTTOM";
} }
pad->ReturnStringPadName( pinname ); pad->ReturnStringPadName( pinname );
if( pinname.IsEmpty() ) pinname = wxT("noname"); if( pinname.IsEmpty() )
pinname = wxT( "noname" );
orient = pad->m_Orient - module->m_Orient; orient = pad->m_Orient - module->m_Orient;
NORMALIZE_ANGLE_POS( orient ); NORMALIZE_ANGLE_POS( orient );
@ -338,7 +360,8 @@ char * mirror = "0";
CONV_TO_UTF8( pinname ), pad->m_logical_connexion, CONV_TO_UTF8( pinname ), pad->m_logical_connexion,
pad->m_Pos0.x, -pad->m_Pos0.y, pad->m_Pos0.x, -pad->m_Pos0.y,
layer, orient / 10, mirror ); layer, orient / 10, mirror );
if ( orient % 10 ) fprintf(file, " .%d", orient % 10 ); if( orient % 10 )
fprintf( file, " .%d", orient % 10 );
fprintf( file, "\n" ); fprintf( file, "\n" );
} }
} }
@ -346,14 +369,16 @@ char * mirror = "0";
fputs( "$ENDSHAPES\n\n", file ); fputs( "$ENDSHAPES\n\n", file );
} }
/******************************************************/ /******************************************************/
void CreateComponentsSection( FILE* file, BOARD* pcb ) void CreateComponentsSection( FILE* file, BOARD* pcb )
/******************************************************/ /******************************************************/
/* Creation de la section $COMPONENTS (Placement des composants /* Creation de la section $COMPONENTS (Placement des composants
Composants cote CUIVRE: * Composants cote CUIVRE:
Les formes sont donnees avec l'option "FLIP", c.a.d.: * Les formes sont donnees avec l'option "FLIP", c.a.d.:
- ils sont decrits en vue normale (comme s'ils etaient sur cote COMPOSANT) * - ils sont decrits en vue normale (comme s'ils etaient sur cote COMPOSANT)
- leur orientation est donnée comme s'ils etaient cote composant. * - leur orientation est donnée comme s'ils etaient cote composant.
*/ */
{ {
MODULE* module = pcb->m_Modules; MODULE* module = pcb->m_Modules;
@ -385,7 +410,8 @@ int ii;
fprintf( file, "LAYER %s\n", (module->flag) ? "BOTTOM" : "TOP" ); fprintf( file, "LAYER %s\n", (module->flag) ? "BOTTOM" : "TOP" );
fprintf( file, "ROTATION %d", orient / 10 ); fprintf( file, "ROTATION %d", orient / 10 );
if (orient%10 ) fprintf(file, ".%d", orient%10 ); if( orient % 10 )
fprintf( file, ".%d", orient % 10 );
fputs( "\n", file ); fputs( "\n", file );
fprintf( file, "SHAPE %s %s %s\n", fprintf( file, "SHAPE %s %s %s\n",
@ -416,22 +442,23 @@ int ii;
// commentaire: // commentaire:
fprintf( file, "SHEET Part %s %s\n", CONV_TO_UTF8( module->m_Reference->m_Text ), fprintf( file, "SHEET Part %s %s\n", CONV_TO_UTF8( module->m_Reference->m_Text ),
CONV_TO_UTF8( module->m_Value->m_Text ) ); CONV_TO_UTF8( module->m_Value->m_Text ) );
} }
fputs( "$ENDCOMPONENTS\n\n", file ); fputs( "$ENDCOMPONENTS\n\n", file );
} }
/***************************************************/ /***************************************************/
void CreateSignalsSection( FILE* file, BOARD* pcb ) void CreateSignalsSection( FILE* file, BOARD* pcb )
/***************************************************/ /***************************************************/
/* Creation de la liste des equipotentielles: /* Creation de la liste des equipotentielles:
$SIGNALS * $SIGNALS
SIGNAL <equipot name> * SIGNAL <equipot name>
NODE <component name> <pin name> * NODE <component name> <pin name>
... * ...
NODE <component name> <pin name> * NODE <component name> <pin name>
$ENDSIGNALS * $ENDSIGNALS
*/ */
{ {
wxString msg; wxString msg;
@ -460,7 +487,8 @@ int NbNoConn = 1;
for( pad = module->m_Pads; pad != NULL; pad = (D_PAD*) pad->Pnext ) for( pad = module->m_Pads; pad != NULL; pad = (D_PAD*) pad->Pnext )
{ {
wxString padname; wxString padname;
if ( pad->m_NetCode != equipot->m_NetCode ) continue; if( pad->m_NetCode != equipot->m_NetCode )
continue;
pad->ReturnStringPadName( padname ); pad->ReturnStringPadName( padname );
msg.Printf( wxT( "NODE %s %.4s" ), msg.Printf( wxT( "NODE %s %.4s" ),
module->m_Reference->m_Text.GetData(), padname.GetData() ); module->m_Reference->m_Text.GetData(), padname.GetData() );
@ -470,12 +498,13 @@ int NbNoConn = 1;
} }
fputs( "$ENDSIGNALS\n\n", file ); fputs( "$ENDSIGNALS\n\n", file );
} }
/*************************************************************/ /*************************************************************/
bool CreateHeaderInfoData( FILE* file, WinEDA_PcbFrame* frame ) bool CreateHeaderInfoData( FILE* file, WinEDA_PcbFrame* frame )
/*************************************************************/ /*************************************************************/
/* Creation de la section $HEADER ... $ENDHEADER /* Creation de la section $HEADER ... $ENDHEADER
*/ */
{ {
@ -505,9 +534,10 @@ PCB_SCREEN * screen = frame->GetScreen();
/**************************************************************************/ /**************************************************************************/
static int Track_list_Sort_by_Netcode( const void* refptr, const void* objptr ) static int Track_list_Sort_by_Netcode( const void* refptr, const void* objptr )
/**************************************************************************/ /**************************************************************************/
/* /*
Routine de tri de la liste des piste par netcode, * Routine de tri de la liste des piste par netcode,
puis par largeur puis par layer * puis par largeur puis par layer
*/ */
{ {
const TRACK* ref, * cmp; const TRACK* ref, * cmp;
@ -515,21 +545,27 @@ int diff;
ref = *( (TRACK**) refptr ); ref = *( (TRACK**) refptr );
cmp = *( (TRACK**) objptr ); cmp = *( (TRACK**) objptr );
if( (diff = ref->m_NetCode - cmp->m_NetCode) ) return diff; if( (diff = ref->m_NetCode - cmp->m_NetCode) )
if( (diff = ref->m_Width - cmp->m_Width) ) return diff; return diff;
if( (diff = ref->m_Layer - cmp->m_Layer) ) return diff; if( (diff = ref->m_Width - cmp->m_Width) )
return diff;
if( (diff = ref->GetLayer() - cmp->GetLayer()) )
return diff;
return 0; return 0;
} }
/*************************************************/ /*************************************************/
void CreateRoutesSection( FILE* file, BOARD* pcb ) void CreateRoutesSection( FILE* file, BOARD* pcb )
/*************************************************/ /*************************************************/
/* Creation de la liste des pistes, vias et zones /* Creation de la liste des pistes, vias et zones
section: * section:
$ROUTE * $ROUTE
... * ...
$ENROUTE * $ENROUTE
Les segments de piste doivent etre regroupes par nets * Les segments de piste doivent etre regroupes par nets
*/ */
{ {
TRACK* track, ** tracklist; TRACK* track, ** tracklist;
@ -539,20 +575,27 @@ int nbitems, ii;
// Calcul du nombre de segments a ecrire // Calcul du nombre de segments a ecrire
nbitems = 0; nbitems = 0;
for( track = pcb->m_Track; track != NULL; track = (TRACK*) track->Pnext ) nbitems++; for( track = pcb->m_Track; track != NULL; track = (TRACK*) track->Pnext )
nbitems++;
for( track = pcb->m_Zone; track != NULL; track = (TRACK*) track->Pnext ) for( track = pcb->m_Zone; track != NULL; track = (TRACK*) track->Pnext )
{ {
if ( track->m_StructType == TYPEZONE ) nbitems++; if( track->m_StructType == TYPEZONE )
nbitems++;
} }
tracklist = (TRACK**) MyMalloc( (nbitems + 1) * sizeof(TRACK *) ); tracklist = (TRACK**) MyMalloc( (nbitems + 1) * sizeof(TRACK *) );
nbitems = 0; nbitems = 0;
for( track = pcb->m_Track; track != NULL; track = (TRACK*) track->Pnext ) for( track = pcb->m_Track; track != NULL; track = (TRACK*) track->Pnext )
tracklist[nbitems++] = track; tracklist[nbitems++] = track;
for( track = pcb->m_Zone; track != NULL; track = (TRACK*) track->Pnext ) for( track = pcb->m_Zone; track != NULL; track = (TRACK*) track->Pnext )
{ {
if ( track->m_StructType == TYPEZONE ) tracklist[nbitems++] = track; if( track->m_StructType == TYPEZONE )
tracklist[nbitems++] = track;
} }
tracklist[nbitems] = NULL; tracklist[nbitems] = NULL;
qsort( tracklist, nbitems, sizeof(TRACK *), Track_list_Sort_by_Netcode ); qsort( tracklist, nbitems, sizeof(TRACK *), Track_list_Sort_by_Netcode );
@ -570,7 +613,8 @@ int nbitems, ii;
wxString netname; wxString netname;
if( equipot && (equipot->m_Netname != wxEmptyString) ) if( equipot && (equipot->m_Netname != wxEmptyString) )
netname = equipot->m_Netname; netname = equipot->m_Netname;
else netname = wxT("_noname_" ); else
netname = wxT( "_noname_" );
fprintf( file, "\nROUTE %s\n", CONV_TO_UTF8( netname ) ); fprintf( file, "\nROUTE %s\n", CONV_TO_UTF8( netname ) );
} }
@ -582,11 +626,11 @@ int nbitems, ii;
if( (track->m_StructType == TYPETRACK) || (track->m_StructType == TYPEZONE) ) if( (track->m_StructType == TYPETRACK) || (track->m_StructType == TYPEZONE) )
{ {
if ( old_layer != track->m_Layer ) if( old_layer != track->GetLayer() )
{ {
old_layer = track->m_Layer; old_layer = track->GetLayer();
fprintf( file, "LAYER %s\n", fprintf( file, "LAYER %s\n",
CONV_TO_UTF8(GenCAD_Layer_Name[track->m_Layer & 0x1F])); CONV_TO_UTF8( GenCAD_Layer_Name[track->GetLayer() & 0x1F] ) );
} }
fprintf( file, "LINE %d %d %d %d\n", fprintf( file, "LINE %d %d %d %d\n",
@ -611,8 +655,9 @@ int nbitems, ii;
/***************************************************/ /***************************************************/
void CreateDevicesSection( FILE* file, BOARD* pcb ) void CreateDevicesSection( FILE* file, BOARD* pcb )
/***************************************************/ /***************************************************/
/* Creation de la section de description des proprietes des composants /* Creation de la section de description des proprietes des composants
( la forme des composants est dans la section shape ) * ( la forme des composants est dans la section shape )
*/ */
{ {
MODULE* module; MODULE* module;
@ -628,9 +673,12 @@ D_PAD * pad;
for( pad = module->m_Pads; pad != NULL; pad = (D_PAD*) pad->Pnext ) for( pad = module->m_Pads; pad != NULL; pad = (D_PAD*) pad->Pnext )
{ {
fprintf( file, "PINDESCR %.4s", pad->m_Padname ); fprintf( file, "PINDESCR %.4s", pad->m_Padname );
if ( pad->m_Netname == wxEmptyString ) fputs(" NoConn\n", file); if( pad->m_Netname == wxEmptyString )
else fprintf(file, " %.4s\n", pad->m_Padname); fputs( " NoConn\n", file );
else
fprintf( file, " %.4s\n", pad->m_Padname );
} }
fprintf( file, "ATTRIBUTE %s\n", CONV_TO_UTF8( module->m_Value->m_Text ) ); fprintf( file, "ATTRIBUTE %s\n", CONV_TO_UTF8( module->m_Value->m_Text ) );
} }
@ -641,8 +689,9 @@ D_PAD * pad;
/*************************************************/ /*************************************************/
void CreateBoardSection( FILE* file, BOARD* pcb ) void CreateBoardSection( FILE* file, BOARD* pcb )
/*************************************************/ /*************************************************/
/* Creation de la section $BOARD. /* Creation de la section $BOARD.
On ne cree ici que le rectangle d'encadrement du Board * On ne cree ici que le rectangle d'encadrement du Board
*/ */
{ {
fputs( "$BOARD\n", file ); fputs( "$BOARD\n", file );
@ -666,15 +715,16 @@ On ne cree ici que le rectangle d'encadrement du Board
/****************************************************/ /****************************************************/
int* CreateTracksInfoData( FILE* file, BOARD* pcb ) int* CreateTracksInfoData( FILE* file, BOARD* pcb )
/****************************************************/ /****************************************************/
/* Creation de la section "$TRACKS"
Cette section definit les largeurs de pistes utilsees
format:
$TRACK
TRACK <name> <width>
$ENDTRACK
on attribut ici comme nom l'epaisseur des traits precede de "TRACK": ex /* Creation de la section "$TRACKS"
pour une largeur de 120 : nom = "TRACK120". * Cette section definit les largeurs de pistes utilsees
* format:
* $TRACK
* TRACK <name> <width>
* $ENDTRACK
*
* on attribut ici comme nom l'epaisseur des traits precede de "TRACK": ex
* pour une largeur de 120 : nom = "TRACK120".
*/ */
{ {
TRACK* track; TRACK* track;
@ -692,9 +742,12 @@ int * trackinfo, * ptinfo;
ptinfo = (int*) adr_lowmem; ptinfo = (int*) adr_lowmem;
while( *ptinfo >= 0 ) while( *ptinfo >= 0 )
{ {
if ( *ptinfo != track->m_Width ) ptinfo ++; if( *ptinfo != track->m_Width )
else break; ptinfo++;
else
break;
} }
trackinfo = ptinfo; trackinfo = ptinfo;
if( *ptinfo < 0 ) if( *ptinfo < 0 )
{ {
@ -703,6 +756,7 @@ int * trackinfo, * ptinfo;
} }
} }
} }
for( track = pcb->m_Zone; track != NULL; track = (TRACK*) track->Pnext ) for( track = pcb->m_Zone; track != NULL; track = (TRACK*) track->Pnext )
{ {
if( *trackinfo != track->m_Width ) // recherche d'une epaisseur deja utilisee if( *trackinfo != track->m_Width ) // recherche d'une epaisseur deja utilisee
@ -710,9 +764,12 @@ int * trackinfo, * ptinfo;
ptinfo = (int*) adr_lowmem; ptinfo = (int*) adr_lowmem;
while( *ptinfo >= 0 ) while( *ptinfo >= 0 )
{ {
if ( *ptinfo != track->m_Width ) ptinfo ++; if( *ptinfo != track->m_Width )
else break; ptinfo++;
else
break;
} }
trackinfo = ptinfo; trackinfo = ptinfo;
if( *ptinfo < 0 ) if( *ptinfo < 0 )
{ {
@ -728,6 +785,7 @@ int * trackinfo, * ptinfo;
{ {
fprintf( file, "TRACK TRACK%d %d\n", *trackinfo, *trackinfo ); fprintf( file, "TRACK TRACK%d %d\n", *trackinfo, *trackinfo );
} }
fputs( "$ENDTRACKS\n\n", file ); fputs( "$ENDTRACKS\n\n", file );
return (int*) adr_lowmem; return (int*) adr_lowmem;
@ -737,14 +795,15 @@ int * trackinfo, * ptinfo;
/***************************************************/ /***************************************************/
void ModuleWriteShape( FILE* file, MODULE* module ) void ModuleWriteShape( FILE* file, MODULE* module )
/***************************************************/ /***************************************************/
/* Sauvegarde de la forme d'un MODULE (section SHAPE) /* Sauvegarde de la forme d'un MODULE (section SHAPE)
La forme est donnee "normalisee" (Orient 0, vue normale ( non miroir) * La forme est donnee "normalisee" (Orient 0, vue normale ( non miroir)
Syntaxe: * Syntaxe:
SHAPE <shape_name> * SHAPE <shape_name>
shape_descr (line, arc ..): * shape_descr (line, arc ..):
LINE startX startY endX endY * LINE startX startY endX endY
ARC startX startY endX endY centreX scentreY * ARC startX startY endX endY centreX scentreY
CIRCLE centreX scentreY radius * CIRCLE centreX scentreY radius
*/ */
{ {
EDGE_MODULE* PtEdge; EDGE_MODULE* PtEdge;
@ -759,8 +818,10 @@ int Yaxis_sign = -1; // Controle changement signe axe Y (selon module normal/mir
if( module->m_Attributs != MOD_DEFAULT ) if( module->m_Attributs != MOD_DEFAULT )
{ {
fprintf( file, "ATTRIBUTE" ); fprintf( file, "ATTRIBUTE" );
if( module->m_Attributs & MOD_CMS ) fprintf(file," SMD"); if( module->m_Attributs & MOD_CMS )
if( module->m_Attributs & MOD_VIRTUAL ) fprintf(file," VIRTUAL"); fprintf( file, " SMD" );
if( module->m_Attributs & MOD_VIRTUAL )
fprintf( file, " VIRTUAL" );
fprintf( file, "\n" ); fprintf( file, "\n" );
} }
@ -776,6 +837,7 @@ int Yaxis_sign = -1; // Controle changement signe axe Y (selon module normal/mir
case TYPEEDGEMODULE: case TYPEEDGEMODULE:
PtEdge = (EDGE_MODULE*) PtStruct; PtEdge = (EDGE_MODULE*) PtStruct;
switch( PtEdge->m_Shape ) switch( PtEdge->m_Shape )
{ {
case S_SEGMENT: case S_SEGMENT:
@ -783,6 +845,7 @@ int Yaxis_sign = -1; // Controle changement signe axe Y (selon module normal/mir
PtEdge->m_Start0.x, Yaxis_sign * PtEdge->m_Start0.y, PtEdge->m_Start0.x, Yaxis_sign * PtEdge->m_Start0.y,
PtEdge->m_End0.x, Yaxis_sign * PtEdge->m_End0.y ); PtEdge->m_End0.x, Yaxis_sign * PtEdge->m_End0.y );
break; break;
case S_CIRCLE: case S_CIRCLE:
{ {
int rayon = (int) hypot( int rayon = (int) hypot(
@ -806,15 +869,19 @@ int Yaxis_sign = -1; // Controle changement signe axe Y (selon module normal/mir
PtEdge->m_Start0.x, Yaxis_sign * PtEdge->m_Start0.y ); PtEdge->m_Start0.x, Yaxis_sign * PtEdge->m_Start0.y );
break; break;
} }
default: default:
DisplayError( NULL, wxT( "Type Edge Module inconnu" ) ); DisplayError( NULL, wxT( "Type Edge Module inconnu" ) );
break; break;
} /* Fin switch type edge */ }
/* Fin switch type edge */
break; break;
default: default:
break; break;
} /* Fin switch gestion des Items draw */
}
} }
/* Fin switch gestion des Items draw */
}
}

View File

@ -3,8 +3,8 @@
/*************************************/ /*************************************/
/* /*
1 - create ascii files for automatic placement of smd components * 1 - create ascii files for automatic placement of smd components
2 - create a module report (pos and module descr) (ascii file) * 2 - create a module report (pos and module descr) (ascii file)
*/ */
#include "fctsys.h" #include "fctsys.h"
@ -30,16 +30,16 @@ static void WriteDrawSegmentPcb(DRAWSEGMENT * PtDrawSegment, FILE * rptfile);
/* Routine de tri utilisee par GenereModulesPosition() */ /* Routine de tri utilisee par GenereModulesPosition() */
static int ListeModCmp( LIST_MOD* Ref, LIST_MOD* Cmp ) static int ListeModCmp( LIST_MOD* Ref, LIST_MOD* Cmp )
{ {
return ( StrLenNumCmp(Ref->m_Reference, Cmp->m_Reference, 16) ); return StrLenNumCmp( Ref->m_Reference, Cmp->m_Reference, 16 );
} }
/**************************************************************/ /**************************************************************/
void WinEDA_PcbFrame::GenModulesPosition( wxCommandEvent& event ) void WinEDA_PcbFrame::GenModulesPosition( wxCommandEvent& event )
/**************************************************************/ /**************************************************************/
/* Routine de generation du fichier de positionnement des modules, /* Routine de generation du fichier de positionnement des modules,
utilisé pour les machines de placement de composants * utilisé pour les machines de placement de composants
*/ */
{ {
float conv_unit; float conv_unit;
@ -53,6 +53,7 @@ FILE * LayerCu = NULL, *LayerCmp = NULL;
/* Calcul des echelles de conversion */ /* Calcul des echelles de conversion */
conv_unit = 0.0001; /* unites = INCHES */ conv_unit = 0.0001; /* unites = INCHES */
// if(IF_DRILL_METRIC) conv_unit = 0.000254; /* unites = mm */ // if(IF_DRILL_METRIC) conv_unit = 0.000254; /* unites = mm */
File_Place_Offset = m_Auxiliary_Axis_Position; File_Place_Offset = m_Auxiliary_Axis_Position;
@ -61,11 +62,15 @@ FILE * LayerCu = NULL, *LayerCmp = NULL;
NbMod = 0; Module = m_Pcb->m_Modules; NbMod = 0; Module = m_Pcb->m_Modules;
for( ; Module != NULL; Module = (MODULE*) Module->Pnext ) for( ; Module != NULL; Module = (MODULE*) Module->Pnext )
{ {
if( Module->m_Attributs & MOD_VIRTUAL ) continue; if( Module->m_Attributs & MOD_VIRTUAL )
if( (Module->m_Attributs & MOD_CMS) == 0 ) continue; continue;
if( Module->m_Layer == CUIVRE_N) GenCu = TRUE; if( (Module->m_Attributs & MOD_CMS) == 0 )
continue;
if( Module->GetLayer() == CUIVRE_N )
GenCu = TRUE;
NbMod++; NbMod++;
} }
if( NbMod == 0 ) if( NbMod == 0 )
{ {
DisplayError( this, _( "No Modules for Automated Placement" ), 20 ); return; DisplayError( this, _( "No Modules for Automated Placement" ), 20 ); return;
@ -117,8 +122,10 @@ FILE * LayerCu = NULL, *LayerCmp = NULL;
Module = (MODULE*) m_Pcb->m_Modules; Module = (MODULE*) m_Pcb->m_Modules;
for( ii = 0; Module != NULL; Module = Module->Next() ) for( ii = 0; Module != NULL; Module = Module->Next() )
{ {
if( Module->m_Attributs & MOD_VIRTUAL ) continue; if( Module->m_Attributs & MOD_VIRTUAL )
if( (Module->m_Attributs & MOD_CMS) == 0 ) continue; continue;
if( (Module->m_Attributs & MOD_CMS) == 0 )
continue;
Liste[ii].m_Module = Module; Liste[ii].m_Module = Module;
Liste[ii].m_Reference = Module->m_Reference->m_Text; Liste[ii].m_Reference = Module->m_Reference->m_Text;
@ -134,16 +141,19 @@ FILE * LayerCu = NULL, *LayerCmp = NULL;
sprintf( Line, "### Module positions - created on %s ###\n", sprintf( Line, "### Module positions - created on %s ###\n",
DateAndTime( Buff ) ); DateAndTime( Buff ) );
fputs( Line, LayerCmp ); fputs( Line, LayerCmp );
if( GenCu ) fputs(Line,LayerCu); if( GenCu )
fputs( Line, LayerCu );
wxString Title = g_Main_Title + wxT( " " ) + GetBuildVersion(); wxString Title = g_Main_Title + wxT( " " ) + GetBuildVersion();
sprintf( Line, "### Printed by PcbNew version %s\n", CONV_TO_UTF8( Title ) ); sprintf( Line, "### Printed by PcbNew version %s\n", CONV_TO_UTF8( Title ) );
fputs( Line, LayerCmp ); fputs( Line, LayerCmp );
if( GenCu ) fputs(Line,LayerCu); if( GenCu )
fputs( Line, LayerCu );
sprintf( Line, "## Unit = inches, Angle = deg.\n" ); sprintf( Line, "## Unit = inches, Angle = deg.\n" );
fputs( Line, LayerCmp ); fputs( Line, LayerCmp );
if( GenCu ) fputs(Line,LayerCu); if( GenCu )
fputs( Line, LayerCu );
sprintf( Line, "## Side : Components\n" ); sprintf( Line, "## Side : Components\n" );
fputs( Line, LayerCmp ); fputs( Line, LayerCmp );
@ -157,7 +167,8 @@ FILE * LayerCu = NULL, *LayerCmp = NULL;
sprintf( Line, sprintf( Line,
"# Ref Val PosX PosY Rot Side\n" ); "# Ref Val PosX PosY Rot Side\n" );
fputs( Line, LayerCmp ); fputs( Line, LayerCmp );
if( GenCu ) fputs(Line,LayerCu); if( GenCu )
fputs( Line, LayerCu );
/* Generation lignes utiles du fichier */ /* Generation lignes utiles du fichier */
for( ii = 0; ii < NbMod; ii++ ) for( ii = 0; ii < NbMod; ii++ )
@ -177,13 +188,12 @@ FILE * LayerCu = NULL, *LayerCmp = NULL;
(float) module_pos.y * conv_unit, (float) module_pos.y * conv_unit,
(float) Liste[ii].m_Module->m_Orient / 10 ); (float) Liste[ii].m_Module->m_Orient / 10 );
if (Liste[ii].m_Module->m_Layer == CMP_N) if( Liste[ii].m_Module->GetLayer() == CMP_N )
{ {
strcat( Line, "Cmp.\n" ); strcat( Line, "Cmp.\n" );
fputs( Line, LayerCmp ); fputs( Line, LayerCmp );
} }
else if( Liste[ii].m_Module->GetLayer() == CUIVRE_N )
else if (Liste[ii].m_Module->m_Layer == CUIVRE_N)
{ {
strcat( Line, "Cu\n" ); strcat( Line, "Cu\n" );
fputs( Line, LayerCu ); fputs( Line, LayerCu );
@ -202,16 +212,17 @@ FILE * LayerCu = NULL, *LayerCmp = NULL;
setlocale( LC_NUMERIC, "" ); // revert to the current locale setlocale( LC_NUMERIC, "" ); // revert to the current locale
msg = wxT( "Cmp File: " ) + NameLayerCmp; msg = wxT( "Cmp File: " ) + NameLayerCmp;
if( GenCu ) msg += wxT("\nCu File: ") + NameLayerCu; if( GenCu )
msg += wxT( "\nCu File: " ) + NameLayerCu;
DisplayInfo( this, msg ); DisplayInfo( this, msg );
} }
/**************************************************************/ /**************************************************************/
void WinEDA_PcbFrame::GenModuleReport( wxCommandEvent& event ) void WinEDA_PcbFrame::GenModuleReport( wxCommandEvent& event )
/**************************************************************/ /**************************************************************/
/* Print a module report. /* Print a module report.
*/ */
{ {
@ -225,6 +236,7 @@ wxPoint module_pos;
/* Calcul des echelles de conversion */ /* Calcul des echelles de conversion */
conv_unit = 0.0001; /* unites = INCHES */ conv_unit = 0.0001; /* unites = INCHES */
// if(IF_DRILL_METRIC) conv_unit = 0.000254; /* unites = mm */ // if(IF_DRILL_METRIC) conv_unit = 0.000254; /* unites = mm */
File_Place_Offset = wxPoint( 0, 0 ); File_Place_Offset = wxPoint( 0, 0 );
@ -285,8 +297,10 @@ wxPoint module_pos;
fputs( Line, rptfile ); fputs( Line, rptfile );
msg = wxT( "attribut" ); msg = wxT( "attribut" );
if ( Module->m_Attributs & MOD_VIRTUAL ) msg += wxT(" virtual"); if( Module->m_Attributs & MOD_VIRTUAL )
if ( Module->m_Attributs & MOD_CMS ) msg += wxT(" smd"); msg += wxT( " virtual" );
if( Module->m_Attributs & MOD_CMS )
msg += wxT( " smd" );
if( ( Module->m_Attributs & (MOD_VIRTUAL | MOD_CMS) ) == 0 ) if( ( Module->m_Attributs & (MOD_VIRTUAL | MOD_CMS) ) == 0 )
msg += wxT( " none" ); msg += wxT( " none" );
msg += wxT( "\n" ); msg += wxT( "\n" );
@ -301,9 +315,12 @@ wxPoint module_pos;
fputs( Line, rptfile ); fputs( Line, rptfile );
sprintf( Line, "orientation %.2f\n", (float) Module->m_Orient / 10 ); sprintf( Line, "orientation %.2f\n", (float) Module->m_Orient / 10 );
if (Module->m_Layer == CMP_N) strcat(Line,"layer component\n"); if( Module->GetLayer() == CMP_N )
else if (Module->m_Layer == CUIVRE_N) strcat(Line,"layer copper\n"); strcat( Line, "layer component\n" );
else strcat(Line,"layer other\n"); else if( Module->GetLayer() == CUIVRE_N )
strcat( Line, "layer copper\n" );
else
strcat( Line, "layer other\n" );
fputs( Line, rptfile ); fputs( Line, rptfile );
Module->Write_3D_Descr( rptfile ); Module->Write_3D_Descr( rptfile );
@ -334,23 +351,28 @@ char *shape_name[6] = {"??? ","Circ","Rect","Oval","trap","spec"} ;
fputs( Line, rptfile ); fputs( Line, rptfile );
int layer = 0; int layer = 0;
if(pad->m_Masque_Layer & CUIVRE_LAYER) layer = 1; if( pad->m_Masque_Layer & CUIVRE_LAYER )
if(pad->m_Masque_Layer & CMP_LAYER) layer |= 2; layer = 1;
if( pad->m_Masque_Layer & CMP_LAYER )
layer |= 2;
char* layer_name[4] = { "??? ", "copper", "component", "all" }; char* layer_name[4] = { "??? ", "copper", "component", "all" };
sprintf( Line, "Layer %s\n", layer_name[layer] ); sprintf( Line, "Layer %s\n", layer_name[layer] );
fputs( Line, rptfile ); fputs( Line, rptfile );
fprintf( rptfile, "$EndPAD\n" ); fprintf( rptfile, "$EndPAD\n" );
} }
fprintf( rptfile,"$EndMODULE %s\n\n", (const char*) Module->m_Reference->m_Text.GetData() ); fprintf( rptfile, "$EndMODULE %s\n\n",
(const char*) Module->m_Reference->m_Text.GetData() );
} }
/* Write board Edges */ /* Write board Edges */
EDA_BaseStruct* PtStruct; EDA_BaseStruct* PtStruct;
for( PtStruct = m_Pcb->m_Drawings; PtStruct != NULL; PtStruct = PtStruct->Pnext ) for( PtStruct = m_Pcb->m_Drawings; PtStruct != NULL; PtStruct = PtStruct->Pnext )
{ {
if( PtStruct->m_StructType != TYPEDRAWSEGMENT ) continue; if( PtStruct->m_StructType != TYPEDRAWSEGMENT )
if( ((DRAWSEGMENT *) PtStruct)->m_Layer != EDGE_N ) continue; continue;
if( ( (DRAWSEGMENT*) PtStruct )->GetLayer() != EDGE_N )
continue;
WriteDrawSegmentPcb( (DRAWSEGMENT*) PtStruct, rptfile ); WriteDrawSegmentPcb( (DRAWSEGMENT*) PtStruct, rptfile );
} }
@ -364,11 +386,12 @@ EDA_BaseStruct * PtStruct;
/*******************************************************************/ /*******************************************************************/
void WriteDrawSegmentPcb( DRAWSEGMENT* PtDrawSegment, FILE* rptfile ) void WriteDrawSegmentPcb( DRAWSEGMENT* PtDrawSegment, FILE* rptfile )
/*******************************************************************/ /*******************************************************************/
/* Sortie dsur rptfile d'un segment type drawing PCB: /* Sortie dsur rptfile d'un segment type drawing PCB:
Les contours sont de differents type: * Les contours sont de differents type:
segment * segment
cercle * cercle
arc * arc
*/ */
{ {
double conv_unit, ux0, uy0, dx, dy; double conv_unit, ux0, uy0, dx, dy;
@ -402,7 +425,11 @@ char Line[1024];
{ {
int endx = PtDrawSegment->m_End.x, endy = PtDrawSegment->m_End.y; int endx = PtDrawSegment->m_End.x, endy = PtDrawSegment->m_End.y;
rayon = hypot( dx - ux0, dy - uy0 ); rayon = hypot( dx - ux0, dy - uy0 );
RotatePoint(&endx, &endy, PtDrawSegment->m_Start.x, PtDrawSegment->m_Start.y,PtDrawSegment->m_Angle); RotatePoint( &endx,
&endy,
PtDrawSegment->m_Start.x,
PtDrawSegment->m_Start.y,
PtDrawSegment->m_Angle );
sprintf( Line, "$ARC \n" ); fputs( Line, rptfile ); sprintf( Line, "$ARC \n" ); fputs( Line, rptfile );
sprintf( Line, "centre %.6lf %.6lf\n", ux0, uy0 ); sprintf( Line, "centre %.6lf %.6lf\n", ux0, uy0 );
sprintf( Line, "start %.6lf %.6lf\n", endx * conv_unit, endy * conv_unit ); sprintf( Line, "start %.6lf %.6lf\n", endx * conv_unit, endy * conv_unit );
@ -424,4 +451,3 @@ char Line[1024];
break; break;
} }
} }

View File

@ -245,7 +245,7 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
Mself.m_Size.x = Mself.m_Size.y / 2; Mself.m_Size.x = Mself.m_Size.y / 2;
// Choix d'une Valeur de depart raisonnable pour le rayon des arcs de cercle // Choix d'une Valeur de depart raisonnable pour le rayon des arcs de cercle
Mself.rayon = min( Mself.m_Width * 5, Mself.m_Size.x / 4 ); Mself.rayon = MIN( Mself.m_Width * 5, Mself.m_Size.x / 4 );
/* Calcul des parametres */ /* Calcul des parametres */
for( Mself.nbrin = 2; ; Mself.nbrin++ ) for( Mself.nbrin = 2; ; Mself.nbrin++ )
@ -307,7 +307,7 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
PtSegm->m_End.x = Mself.m_Start.x; PtSegm->m_End.x = Mself.m_Start.x;
PtSegm->m_End.y = PtSegm->m_Start.y + Mself.delta; PtSegm->m_End.y = PtSegm->m_Start.y + Mself.delta;
PtSegm->m_Width = Mself.m_Width; PtSegm->m_Width = Mself.m_Width;
PtSegm->m_Layer = Module->m_Layer; PtSegm->SetLayer( Module->GetLayer() );
PtSegm->m_Shape = S_SEGMENT; PtSegm->m_Shape = S_SEGMENT;
newedge = new EDGE_MODULE( Module ); newedge = new EDGE_MODULE( Module );
@ -432,7 +432,7 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
PtPad->m_Pos0.x = PtPad->m_Pos.x - Module->m_Pos.x; PtPad->m_Pos0.x = PtPad->m_Pos.x - Module->m_Pos.x;
PtPad->m_Pos0.y = PtPad->m_Pos.y - Module->m_Pos.y; PtPad->m_Pos0.y = PtPad->m_Pos.y - Module->m_Pos.y;
PtPad->m_Size.x = PtPad->m_Size.y = LastSegm->m_Width; PtPad->m_Size.x = PtPad->m_Size.y = LastSegm->m_Width;
PtPad->m_Masque_Layer = g_TabOneLayerMask[LastSegm->m_Layer]; PtPad->m_Masque_Layer = g_TabOneLayerMask[LastSegm->GetLayer()];
PtPad->m_Attribut = SMD; PtPad->m_Attribut = SMD;
PtPad->m_PadShape = CIRCLE; PtPad->m_PadShape = CIRCLE;
PtPad->m_Rayon = PtPad->m_Size.x / 2; PtPad->m_Rayon = PtPad->m_Size.x / 2;

View File

@ -915,7 +915,7 @@ wxString msg;
float Xscale = (float) (SheetSize.x - (marge*2)) / dX; float Xscale = (float) (SheetSize.x - (marge*2)) / dX;
float Yscale = (float) (SheetSize.y * 0.6 - (marge*2)) / dY; float Yscale = (float) (SheetSize.y * 0.6 - (marge*2)) / dY;
scale_x = scale_y = min(Xscale, Yscale); scale_x = scale_y = MIN(Xscale, Yscale);
g_PlotOffset.x = - (SheetSize.x/2) + g_PlotOffset.x = - (SheetSize.x/2) +
(int)(BoardCentre.x * scale_x) + marge; (int)(BoardCentre.x * scale_x) + marge;

View File

@ -35,26 +35,30 @@ void TraceArc(int ux0,int uy0,int ux1,int uy1,int ArcAngle, int lg,int layer,
#define OP_CELL( layer, dy, dx ) { if( layer < 0 ) \ #define OP_CELL( layer, dy, dx ) { if( layer < 0 ) \
{ \ { \
WriteCell( dy, dx, BOTTOM, color ); \ WriteCell( dy, dx, BOTTOM, color ); \
if(Nb_Sides) WriteCell(dy,dx,TOP,color);\ if( Nb_Sides ) \
WriteCell( dy, dx, TOP, color );\
} \ } \
else { \ else { \
if(layer == Route_Layer_BOTTOM) WriteCell(dy,dx,BOTTOM,color);\ if( layer == Route_Layer_BOTTOM ) \
WriteCell( dy, dx, BOTTOM, color );\
if( Nb_Sides ) \ if( Nb_Sides ) \
if(layer == Route_Layer_TOP) WriteCell(dy,dx,TOP,color);\ if( layer == Route_Layer_TOP ) \
WriteCell( dy, dx, TOP, color );\
} } } }
/******************************************************************************/ /******************************************************************************/
void Place_1_Pad_Board( BOARD* Pcb, D_PAD* pt_pad, int color, int marge, int op_logique ) void Place_1_Pad_Board( BOARD* Pcb, D_PAD* pt_pad, int color, int marge, int op_logique )
/******************************************************************************/ /******************************************************************************/
/* Initialise a la valeur color, les cellules du Board comprises dans la /* Initialise a la valeur color, les cellules du Board comprises dans la
surface du pad pointe par pt_pad, avec la marge reservee pour l'isolement * surface du pad pointe par pt_pad, avec la marge reservee pour l'isolement
et la demi largeur de la piste * et la demi largeur de la piste
Parametres: * Parametres:
pt_pad : pointeur sur la description du pad * pt_pad : pointeur sur la description du pad
color : masque a ecrire dans les cellules * color : masque a ecrire dans les cellules
marge : valeur a ajouter au rayon ou demi cote du pad * marge : valeur a ajouter au rayon ou demi cote du pad
op_logique: type d'ecriture dans la cellule ( WRITE, OR ) * op_logique: type d'ecriture dans la cellule ( WRITE, OR )
*/ */
{ {
int dx, dy; int dx, dy;
@ -80,7 +84,6 @@ wxPoint shape_pos = pt_pad->ReturnShapePos();;
if( (pt_pad->m_Orient % 900) == 0 ) if( (pt_pad->m_Orient % 900) == 0 )
{ /* Le pad est un rectangle horizontal ou vertical */ { /* Le pad est un rectangle horizontal ou vertical */
if( (pt_pad->m_Orient == 900 ) || (pt_pad->m_Orient == 2700) ) if( (pt_pad->m_Orient == 900 ) || (pt_pad->m_Orient == 2700) )
{ /* orient tournee de 90 deg */ { /* orient tournee de 90 deg */
EXCHG( dx, dy ); EXCHG( dx, dy );
@ -90,7 +93,6 @@ wxPoint shape_pos = pt_pad->ReturnShapePos();;
shape_pos.x + dx, shape_pos.y + dy, shape_pos.x + dx, shape_pos.y + dy,
pt_pad->m_Masque_Layer, color, op_logique ); pt_pad->m_Masque_Layer, color, op_logique );
} }
else else
{ {
TraceFilledRectangle( Pcb, shape_pos.x - dx, shape_pos.y - dy, TraceFilledRectangle( Pcb, shape_pos.x - dx, shape_pos.y - dy,
@ -105,13 +107,14 @@ wxPoint shape_pos = pt_pad->ReturnShapePos();;
void TraceFilledCercle( BOARD* Pcb, int cx, int cy, int rayon, int masque_layer, void TraceFilledCercle( BOARD* Pcb, int cx, int cy, int rayon, int masque_layer,
int color, int op_logique ) int color, int op_logique )
/************************************************************************/ /************************************************************************/
/* Initialise a la valeur color, les cellules du Board comprises dans la /* Initialise a la valeur color, les cellules du Board comprises dans la
surface du cercle de centre cx,cy. * surface du cercle de centre cx,cy.
Parametres: * Parametres:
rayon : valeur a ajouter au rayon ou demi cote du pad * rayon : valeur a ajouter au rayon ou demi cote du pad
masque_layer = couches occupees * masque_layer = couches occupees
color : masque a ecrire dans les cellules * color : masque a ecrire dans les cellules
op_logique: type d'ecriture dans la cellule ( WRITE, OR ) * op_logique: type d'ecriture dans la cellule ( WRITE, OR )
*/ */
{ {
int row, col; int row, col;
@ -119,6 +122,7 @@ int ux0 , uy0 , ux1, uy1;
int row_max, col_max, row_min, col_min; int row_max, col_max, row_min, col_min;
int trace = 0; int trace = 0;
float fdistmin, fdistx, fdisty; float fdistmin, fdistx, fdisty;
void (*WriteCell)( int, int, int, BoardCell ); void (*WriteCell)( int, int, int, BoardCell );
int tstwrite = 0; int tstwrite = 0;
int distmin; int distmin;
@ -126,7 +130,7 @@ int distmin;
/* Determination des couches occupees : */ /* Determination des couches occupees : */
/* routage sur 1 seule couche: /* routage sur 1 seule couche:
sur bitmap BOTTOM et Route_Layer_B = Route_Layer_A*/ * sur bitmap BOTTOM et Route_Layer_B = Route_Layer_A*/
if( masque_layer & g_TabOneLayerMask[Route_Layer_BOTTOM] ) if( masque_layer & g_TabOneLayerMask[Route_Layer_BOTTOM] )
trace = 1; /* Trace sur BOTTOM */ trace = 1; /* Trace sur BOTTOM */
@ -135,16 +139,26 @@ int distmin;
if( Nb_Sides ) if( Nb_Sides )
trace |= 2;/* Trace sur TOP */ trace |= 2;/* Trace sur TOP */
if( trace == 0) return; if( trace == 0 )
return;
switch( op_logique ) switch( op_logique )
{ {
default: default:
case WRITE_CELL: WriteCell = SetCell; break; case WRITE_CELL:
case WRITE_OR_CELL: WriteCell = OrCell; break; WriteCell = SetCell; break;
case WRITE_XOR_CELL: WriteCell = XorCell; break;
case WRITE_AND_CELL: WriteCell = AndCell; break; case WRITE_OR_CELL:
case WRITE_ADD_CELL: WriteCell = AddCell; break; WriteCell = OrCell; break;
case WRITE_XOR_CELL:
WriteCell = XorCell; break;
case WRITE_AND_CELL:
WriteCell = AndCell; break;
case WRITE_ADD_CELL:
WriteCell = AddCell; break;
} }
cx -= Pcb->m_BoundaryBox.m_Pos.x; cy -= Pcb->m_BoundaryBox.m_Pos.y; cx -= Pcb->m_BoundaryBox.m_Pos.x; cy -= Pcb->m_BoundaryBox.m_Pos.y;
@ -161,14 +175,20 @@ int distmin;
row_min = uy0 / g_GridRoutingSize; // if (uy0 > row_min*g_GridRoutingSize ) row_min++; row_min = uy0 / g_GridRoutingSize; // if (uy0 > row_min*g_GridRoutingSize ) row_min++;
col_min = ux0 / g_GridRoutingSize; // if (ux0 > col_min*g_GridRoutingSize ) col_min++; col_min = ux0 / g_GridRoutingSize; // if (ux0 > col_min*g_GridRoutingSize ) col_min++;
if( row_min < 0 ) row_min = 0; if( row_min < 0 )
if( row_max >= (Nrows-1)) row_max = Nrows-1; row_min = 0;
if( col_min < 0 ) col_min = 0; if( row_max >= (Nrows - 1) )
if( col_max >= (Ncols-1)) col_max = Ncols-1; row_max = Nrows - 1;
if( col_min < 0 )
col_min = 0;
if( col_max >= (Ncols - 1) )
col_max = Ncols - 1;
/* On s'assure que l'on place toujours au moins une cellule */ /* On s'assure que l'on place toujours au moins une cellule */
if( row_min > row_max ) row_max = row_min; if( row_min > row_max )
if( col_min > col_max ) col_max = col_min; row_max = row_min;
if( col_min > col_max )
col_max = col_min;
fdistmin = (float) distmin * distmin; fdistmin = (float) distmin * distmin;
@ -181,18 +201,22 @@ int distmin;
fdistx = (float) ( cx - (col * g_GridRoutingSize) ); fdistx = (float) ( cx - (col * g_GridRoutingSize) );
fdistx *= fdistx; fdistx *= fdistx;
if( fdistmin <= (fdistx + fdisty) ) continue; if( fdistmin <= (fdistx + fdisty) )
continue;
if(trace & 1) WriteCell(row,col,BOTTOM,color); if( trace & 1 )
if(trace & 2) WriteCell(row,col,TOP,color); WriteCell( row, col, BOTTOM, color );
if( trace & 2 )
WriteCell( row, col, TOP, color );
tstwrite = 1; tstwrite = 1;
} }
} }
if (tstwrite) return; if( tstwrite )
return;
/* Si aucune cellule n'a ete ecrite, on touche les 4 voisins diagonaux /* Si aucune cellule n'a ete ecrite, on touche les 4 voisins diagonaux
(cas defavorable: pad hors grille, au centre des 4 voisins diagonaux) */ * (cas defavorable: pad hors grille, au centre des 4 voisins diagonaux) */
distmin = g_GridRoutingSize / 2 + 1; distmin = g_GridRoutingSize / 2 + 1;
fdistmin = ( (float) distmin * distmin ) * 2; /* = dist centre au point diagonal*/ fdistmin = ( (float) distmin * distmin ) * 2; /* = dist centre au point diagonal*/
@ -206,25 +230,28 @@ if (tstwrite) return;
fdistx = (float) ( cx - (col * g_GridRoutingSize) ); fdistx = (float) ( cx - (col * g_GridRoutingSize) );
fdistx *= fdistx; fdistx *= fdistx;
if( fdistmin <= (fdistx + fdisty) ) continue; if( fdistmin <= (fdistx + fdisty) )
continue;
if(trace & 1) WriteCell(row,col,BOTTOM,color); if( trace & 1 )
if(trace & 2) WriteCell(row,col,TOP,color); WriteCell( row, col, BOTTOM, color );
if( trace & 2 )
WriteCell( row, col, TOP, color );
} }
} }
} }
/******************************************************************************/ /******************************************************************************/
void TraceSegmentPcb( BOARD* Pcb, TRACK* pt_segm, int color, int marge, int op_logique ) void TraceSegmentPcb( BOARD* Pcb, TRACK* pt_segm, int color, int marge, int op_logique )
/******************************************************************************/ /******************************************************************************/
/* trace un Segment de piste sur le BOARD de routage /* trace un Segment de piste sur le BOARD de routage
*/ */
{ {
int demi_pas, demi_largeur; int demi_pas, demi_largeur;
int ux0, uy0, ux1, uy1; int ux0, uy0, ux1, uy1;
int layer = pt_segm->m_Layer; int layer = pt_segm->GetLayer();
demi_pas = g_GridRoutingSize / 2; demi_pas = g_GridRoutingSize / 2;
@ -235,7 +262,8 @@ int layer = pt_segm->m_Layer;
ux1 = pt_segm->m_End.x - Pcb->m_BoundaryBox.m_Pos.x; ux1 = pt_segm->m_End.x - Pcb->m_BoundaryBox.m_Pos.x;
uy1 = pt_segm->m_End.y - Pcb->m_BoundaryBox.m_Pos.y; uy1 = pt_segm->m_End.y - Pcb->m_BoundaryBox.m_Pos.y;
if ( color == VIA_IMPOSSIBLE ) layer = -1; if( color == VIA_IMPOSSIBLE )
layer = -1;
/* Test si VIA (cercle plein a tracer) */ /* Test si VIA (cercle plein a tracer) */
if( pt_segm->m_StructType == TYPEVIA ) if( pt_segm->m_StructType == TYPEVIA )
@ -269,75 +297,99 @@ int layer = pt_segm->m_Layer;
// DrawHVSegment(ux0,uy0,ux1,uy1,demi_largeur,layer,color,op_logique); //F4EXB 051018-01 // DrawHVSegment(ux0,uy0,ux1,uy1,demi_largeur,layer,color,op_logique); //F4EXB 051018-01
DrawSegmentQcq( ux0, uy0, ux1, uy1, demi_largeur, layer, color, op_logique ); //F4EXB 051018-01 DrawSegmentQcq( ux0, uy0, ux1, uy1, demi_largeur, layer, color, op_logique ); //F4EXB 051018-01
return; //F4EXB 051018-01 return; //F4EXB 051018-01
} }
/******************************************************************************************/ /******************************************************************************************/
void TraceLignePcb( int x0, int y0, int x1, int y1, int layer, int color, int op_logique ) void TraceLignePcb( int x0, int y0, int x1, int y1, int layer, int color, int op_logique )
/******************************************************************************************/ /******************************************************************************************/
/* trace une ligne; si layer = -1 sur toutes les couches /* trace une ligne; si layer = -1 sur toutes les couches
*/ */
{ {
int dx, dy, lim; int dx, dy, lim;
int cumul, inc, il, delta; int cumul, inc, il, delta;
void (*WriteCell)( int, int, int, BoardCell ); void (*WriteCell)( int, int, int, BoardCell );
switch( op_logique ) switch( op_logique )
{ {
default: default:
case WRITE_CELL: WriteCell = SetCell; break; case WRITE_CELL:
case WRITE_OR_CELL: WriteCell = OrCell; break; WriteCell = SetCell; break;
case WRITE_XOR_CELL: WriteCell = XorCell; break;
case WRITE_AND_CELL: WriteCell = AndCell; break; case WRITE_OR_CELL:
case WRITE_ADD_CELL: WriteCell = AddCell; break; WriteCell = OrCell; break;
case WRITE_XOR_CELL:
WriteCell = XorCell; break;
case WRITE_AND_CELL:
WriteCell = AndCell; break;
case WRITE_ADD_CELL:
WriteCell = AddCell; break;
} }
if( x0 == x1 ) // ligne verticale if( x0 == x1 ) // ligne verticale
{ {
if(y1 < y0 ) EXCHG (y0,y1); if( y1 < y0 )
EXCHG( y0, y1 );
dy = y0 / g_GridRoutingSize; lim = y1 / g_GridRoutingSize; dy = y0 / g_GridRoutingSize; lim = y1 / g_GridRoutingSize;
dx = x0 / g_GridRoutingSize; dx = x0 / g_GridRoutingSize;
/* Clipping aux limites du board */ /* Clipping aux limites du board */
if( (dx < 0) || (dx >= Ncols) ) return; if( (dx < 0) || (dx >= Ncols) )
if( dy < 0 ) dy = 0; return;
if( lim >= Nrows ) lim = Nrows-1; if( dy < 0 )
dy = 0;
if( lim >= Nrows )
lim = Nrows - 1;
for( ; dy <= lim; dy++ ) for( ; dy <= lim; dy++ )
{ {
OP_CELL( layer, dy, dx ); OP_CELL( layer, dy, dx );
} }
return; return;
} }
if( y0 == y1 ) // ligne horizontale if( y0 == y1 ) // ligne horizontale
{ {
if(x1 < x0 ) EXCHG (x0,x1); if( x1 < x0 )
EXCHG( x0, x1 );
dx = x0 / g_GridRoutingSize; lim = x1 / g_GridRoutingSize; dx = x0 / g_GridRoutingSize; lim = x1 / g_GridRoutingSize;
dy = y0 / g_GridRoutingSize; dy = y0 / g_GridRoutingSize;
/* Clipping aux limites du board */ /* Clipping aux limites du board */
if( (dy < 0) || (dy >= Nrows) ) return; if( (dy < 0) || (dy >= Nrows) )
if( dx < 0 ) dx = 0; return;
if( lim >= Ncols ) lim = Ncols-1; if( dx < 0 )
dx = 0;
if( lim >= Ncols )
lim = Ncols - 1;
for( ; dx <= lim; dx++ ) for( ; dx <= lim; dx++ )
{ {
OP_CELL( layer, dy, dx ); OP_CELL( layer, dy, dx );
} }
return; return;
} }
/* Ici l'angle est quelconque: on utilise l'algorithme de LUCAS */ /* Ici l'angle est quelconque: on utilise l'algorithme de LUCAS */
if( abs( x1 - x0 ) >= abs( y1 - y0 ) ) /* segment peu incline */ if( abs( x1 - x0 ) >= abs( y1 - y0 ) ) /* segment peu incline */
{ {
if(x1 < x0) {EXCHG(x1,x0); EXCHG(y1,y0) ;} if( x1 < x0 )
{
EXCHG( x1, x0 ); EXCHG( y1, y0 );
}
dx = x0 / g_GridRoutingSize; lim = x1 / g_GridRoutingSize; dx = x0 / g_GridRoutingSize; lim = x1 / g_GridRoutingSize;
dy = y0 / g_GridRoutingSize; dy = y0 / g_GridRoutingSize;
inc = 1; if( y1 < y0) inc = -1; inc = 1; if( y1 < y0 )
inc = -1;
il = lim - dx; cumul = il / 2; delta = abs( y1 - y0 ) / g_GridRoutingSize; il = lim - dx; cumul = il / 2; delta = abs( y1 - y0 ) / g_GridRoutingSize;
for( ; dx <= lim; ) for( ; dx <= lim; )
{ {
if( (dx >= 0) && (dy >= 0) && if( (dx >= 0) && (dy >= 0)
(dx < Ncols) && (dy < Nrows) ) && (dx < Ncols) && (dy < Nrows) )
{ {
OP_CELL( layer, dy, dx ); OP_CELL( layer, dy, dx );
} }
@ -350,16 +402,20 @@ void (*WriteCell)(int,int,int,BoardCell);
} }
else else
{ {
if(y1 < y0) {EXCHG(x1,x0); EXCHG(y1,y0) ;} if( y1 < y0 )
{
EXCHG( x1, x0 ); EXCHG( y1, y0 );
}
dy = y0 / g_GridRoutingSize; lim = y1 / g_GridRoutingSize; dy = y0 / g_GridRoutingSize; lim = y1 / g_GridRoutingSize;
dx = x0 / g_GridRoutingSize; dx = x0 / g_GridRoutingSize;
inc = 1; if( x1 < x0) inc = -1; inc = 1; if( x1 < x0 )
inc = -1;
il = lim - dy; cumul = il / 2; delta = abs( x1 - x0 ) / g_GridRoutingSize; il = lim - dy; cumul = il / 2; delta = abs( x1 - x0 ) / g_GridRoutingSize;
for( ; dy <= lim; ) for( ; dy <= lim; )
{ {
if( (dx >= 0) && (dy >= 0) && if( (dx >= 0) && (dy >= 0)
(dx < Ncols) && (dy < Nrows) ) && (dx < Ncols) && (dy < Nrows) )
{ {
OP_CELL( layer, dy, dx ); OP_CELL( layer, dy, dx );
} }
@ -372,23 +428,26 @@ void (*WriteCell)(int,int,int,BoardCell);
} }
} }
/*****************************************************************/ /*****************************************************************/
void TraceFilledRectangle( BOARD* Pcb, void TraceFilledRectangle( BOARD* Pcb,
int ux0, int uy0, int ux1, int uy1, int ux0, int uy0, int ux1, int uy1,
int masque_layer, int color, int op_logique ) int masque_layer, int color, int op_logique )
/*****************************************************************/ /*****************************************************************/
/* Fonction Surchargee.
Met a la valeur color l'ensemble des cellules du board inscrites dans /* Fonction Surchargee.
le rectangle de coord ux0,uy0 ( angle haut a gauche ) *
a ux1,uy1 ( angle bas a droite ) * Met a la valeur color l'ensemble des cellules du board inscrites dans
Le rectangle est horizontal ( ou vertical ) * le rectangle de coord ux0,uy0 ( angle haut a gauche )
Coordonnees PCB. * a ux1,uy1 ( angle bas a droite )
* Le rectangle est horizontal ( ou vertical )
* Coordonnees PCB.
*/ */
{ {
int row, col; int row, col;
int row_min, row_max, col_min, col_max; int row_min, row_max, col_min, col_max;
int trace = 0; int trace = 0;
void (*WriteCell)( int, int, int, BoardCell ); void (*WriteCell)( int, int, int, BoardCell );
if( masque_layer & g_TabOneLayerMask[Route_Layer_BOTTOM] ) if( masque_layer & g_TabOneLayerMask[Route_Layer_BOTTOM] )
@ -397,16 +456,26 @@ void (*WriteCell)(int,int,int,BoardCell);
if( (masque_layer & g_TabOneLayerMask[Route_Layer_TOP] ) && Nb_Sides ) if( (masque_layer & g_TabOneLayerMask[Route_Layer_TOP] ) && Nb_Sides )
trace |= 2; /* Trace sur TOP */ trace |= 2; /* Trace sur TOP */
if(trace == 0) return; if( trace == 0 )
return;
switch( op_logique ) switch( op_logique )
{ {
default: default:
case WRITE_CELL: WriteCell = SetCell; break; case WRITE_CELL:
case WRITE_OR_CELL: WriteCell = OrCell; break; WriteCell = SetCell; break;
case WRITE_XOR_CELL: WriteCell = XorCell; break;
case WRITE_AND_CELL: WriteCell = AndCell; break; case WRITE_OR_CELL:
case WRITE_ADD_CELL: WriteCell = AddCell; break; WriteCell = OrCell; break;
case WRITE_XOR_CELL:
WriteCell = XorCell; break;
case WRITE_AND_CELL:
WriteCell = AndCell; break;
case WRITE_ADD_CELL:
WriteCell = AddCell; break;
} }
ux0 -= Pcb->m_BoundaryBox.m_Pos.x; uy0 -= Pcb->m_BoundaryBox.m_Pos.y; ux0 -= Pcb->m_BoundaryBox.m_Pos.x; uy0 -= Pcb->m_BoundaryBox.m_Pos.y;
@ -415,20 +484,28 @@ void (*WriteCell)(int,int,int,BoardCell);
/* Calcul des coord limites des cellules appartenant au rectangle */ /* Calcul des coord limites des cellules appartenant au rectangle */
row_max = uy1 / g_GridRoutingSize; row_max = uy1 / g_GridRoutingSize;
col_max = ux1 / g_GridRoutingSize; col_max = ux1 / g_GridRoutingSize;
row_min = uy0 / g_GridRoutingSize; if (uy0 > row_min*g_GridRoutingSize ) row_min++; row_min = uy0 / g_GridRoutingSize; if( uy0 > row_min * g_GridRoutingSize )
col_min = ux0 / g_GridRoutingSize; if (ux0 > col_min*g_GridRoutingSize ) col_min++; row_min++;
col_min = ux0 / g_GridRoutingSize; if( ux0 > col_min * g_GridRoutingSize )
col_min++;
if( row_min < 0 ) row_min = 0; if( row_min < 0 )
if( row_max >= (Nrows-1)) row_max = Nrows-1; row_min = 0;
if( col_min < 0 ) col_min = 0; if( row_max >= (Nrows - 1) )
if( col_max >= (Ncols-1)) col_max = Ncols-1; row_max = Nrows - 1;
if( col_min < 0 )
col_min = 0;
if( col_max >= (Ncols - 1) )
col_max = Ncols - 1;
for( row = row_min; row <= row_max; row++ ) for( row = row_min; row <= row_max; row++ )
{ {
for( col = col_min; col <= col_max; col++ ) for( col = col_min; col <= col_max; col++ )
{ {
if(trace & 1) WriteCell(row,col,BOTTOM,color); if( trace & 1 )
if(trace & 2) WriteCell(row,col,TOP,color); WriteCell( row, col, BOTTOM, color );
if( trace & 2 )
WriteCell( row, col, TOP, color );
} }
} }
} }
@ -440,12 +517,12 @@ void TraceFilledRectangle(BOARD * Pcb, int ux0, int uy0, int ux1, int uy1, int a
/***********************************************************************************/ /***********************************************************************************/
/* Fonction Surchargee. /* Fonction Surchargee.
*
Met a la valeur color l'ensemble des cellules du board inscrites dans * Met a la valeur color l'ensemble des cellules du board inscrites dans
le rectangle de coord ux0,uy0 ( angle haut a droite ) * le rectangle de coord ux0,uy0 ( angle haut a droite )
a ux1,uy1 ( angle bas a gauche ) * a ux1,uy1 ( angle bas a gauche )
Le rectangle est tourne de la valeur angle (en 0,1 degres) * Le rectangle est tourne de la valeur angle (en 0,1 degres)
Coordonnees PCB. * Coordonnees PCB.
*/ */
{ {
int row, col; int row, col;
@ -454,6 +531,7 @@ int rayon; /* rayon du cercle exinscrit */
int row_min, row_max, col_min, col_max; int row_min, row_max, col_min, col_max;
int rotrow, rotcol; int rotrow, rotcol;
int trace = 0; int trace = 0;
void (*WriteCell)( int, int, int, BoardCell ); void (*WriteCell)( int, int, int, BoardCell );
if( masque_layer & g_TabOneLayerMask[Route_Layer_BOTTOM] ) if( masque_layer & g_TabOneLayerMask[Route_Layer_BOTTOM] )
@ -463,16 +541,26 @@ void (*WriteCell)(int,int,int,BoardCell);
if( Nb_Sides ) if( Nb_Sides )
trace |= 2;/* Trace sur TOP */ trace |= 2;/* Trace sur TOP */
if(trace == 0) return; if( trace == 0 )
return;
switch( op_logique ) switch( op_logique )
{ {
default: default:
case WRITE_CELL: WriteCell = SetCell; break; case WRITE_CELL:
case WRITE_OR_CELL: WriteCell = OrCell; break; WriteCell = SetCell; break;
case WRITE_XOR_CELL: WriteCell = XorCell; break;
case WRITE_AND_CELL: WriteCell = AndCell; break; case WRITE_OR_CELL:
case WRITE_ADD_CELL: WriteCell = AddCell; break; WriteCell = OrCell; break;
case WRITE_XOR_CELL:
WriteCell = XorCell; break;
case WRITE_AND_CELL:
WriteCell = AndCell; break;
case WRITE_ADD_CELL:
WriteCell = AddCell; break;
} }
ux0 -= Pcb->m_BoundaryBox.m_Pos.x; uy0 -= Pcb->m_BoundaryBox.m_Pos.y; ux0 -= Pcb->m_BoundaryBox.m_Pos.x; uy0 -= Pcb->m_BoundaryBox.m_Pos.y;
@ -485,13 +573,19 @@ void (*WriteCell)(int,int,int,BoardCell);
/* Calcul des coord limites des cellules appartenant au rectangle */ /* Calcul des coord limites des cellules appartenant au rectangle */
row_max = (cy + rayon) / g_GridRoutingSize; row_max = (cy + rayon) / g_GridRoutingSize;
col_max = (cx + rayon) / g_GridRoutingSize; col_max = (cx + rayon) / g_GridRoutingSize;
row_min = (cy - rayon) / g_GridRoutingSize; if (uy0 > row_min*g_GridRoutingSize ) row_min++; row_min = (cy - rayon) / g_GridRoutingSize; if( uy0 > row_min * g_GridRoutingSize )
col_min = (cx - rayon) / g_GridRoutingSize; if (ux0 > col_min*g_GridRoutingSize ) col_min++; row_min++;
col_min = (cx - rayon) / g_GridRoutingSize; if( ux0 > col_min * g_GridRoutingSize )
col_min++;
if( row_min < 0 ) row_min = 0; if( row_min < 0 )
if( row_max >= (Nrows-1)) row_max = Nrows-1; row_min = 0;
if( col_min < 0 ) col_min = 0; if( row_max >= (Nrows - 1) )
if( col_max >= (Ncols-1)) col_max = Ncols-1; row_max = Nrows - 1;
if( col_min < 0 )
col_min = 0;
if( col_max >= (Ncols - 1) )
col_max = Ncols - 1;
for( row = row_min; row <= row_max; row++ ) for( row = row_min; row <= row_max; row++ )
{ {
@ -499,31 +593,38 @@ void (*WriteCell)(int,int,int,BoardCell);
{ {
rotrow = row * g_GridRoutingSize; rotcol = col * g_GridRoutingSize; rotrow = row * g_GridRoutingSize; rotcol = col * g_GridRoutingSize;
RotatePoint( &rotcol, &rotrow, cx, cy, -angle ); RotatePoint( &rotcol, &rotrow, cx, cy, -angle );
if( rotrow <= uy0 ) continue; if( rotrow <= uy0 )
if( rotrow >= uy1 ) continue; continue;
if( rotcol <= ux0 ) continue; if( rotrow >= uy1 )
if( rotcol >= ux1 ) continue; continue;
if(trace & 1) WriteCell(row,col,BOTTOM,color); if( rotcol <= ux0 )
if(trace & 2) WriteCell(row,col,TOP,color); continue;
if( rotcol >= ux1 )
continue;
if( trace & 1 )
WriteCell( row, col, BOTTOM, color );
if( trace & 2 )
WriteCell( row, col, TOP, color );
} }
} }
} }
/*****************************************************************/ /*****************************************************************/
void DrawSegmentQcq( int ux0, int uy0, int ux1, int uy1, int lg, int layer, void DrawSegmentQcq( int ux0, int uy0, int ux1, int uy1, int lg, int layer,
int color, int op_logique ) int color, int op_logique )
/*****************************************************************/ /*****************************************************************/
/* Remplit toutes les cellules du BOARD contenues dans le segment /* Remplit toutes les cellules du BOARD contenues dans le segment
de demi-largeur lg, org ux,y0 fin ux,y1 a la valeur color . * de demi-largeur lg, org ux,y0 fin ux,y1 a la valeur color .
coord en unites PCB (0.1 mil) relatives a l'origine pt_pcb->m_PcbBox.m_Xmin,Y du board. * coord en unites PCB (0.1 mil) relatives a l'origine pt_pcb->m_PcbBox.m_Xmin,Y du board.
*/ */
{ {
int row, col; int row, col;
int inc; int inc;
int row_max, col_max, row_min, col_min; int row_max, col_max, row_min, col_min;
int demi_pas; int demi_pas;
void (*WriteCell)( int, int, int, BoardCell ); void (*WriteCell)( int, int, int, BoardCell );
int angle; int angle;
int cx, cy, dx, dy; int cx, cy, dx, dy;
@ -531,46 +632,71 @@ int cx, cy, dx, dy;
switch( op_logique ) switch( op_logique )
{ {
default: default:
case WRITE_CELL: WriteCell = SetCell; break; case WRITE_CELL:
case WRITE_OR_CELL: WriteCell = OrCell; break; WriteCell = SetCell; break;
case WRITE_XOR_CELL: WriteCell = XorCell; break;
case WRITE_AND_CELL: WriteCell = AndCell; break; case WRITE_OR_CELL:
case WRITE_ADD_CELL: WriteCell = AddCell; break; WriteCell = OrCell; break;
case WRITE_XOR_CELL:
WriteCell = XorCell; break;
case WRITE_AND_CELL:
WriteCell = AndCell; break;
case WRITE_ADD_CELL:
WriteCell = AddCell; break;
} }
/* on rend la coordonnee ux1 tj > ux0 , pour simplifier les calculs */ /* on rend la coordonnee ux1 tj > ux0 , pour simplifier les calculs */
if( ux1 < ux0 ) { EXCHG(ux1,ux0); EXCHG(uy1,uy0);} if( ux1 < ux0 )
{
EXCHG( ux1, ux0 ); EXCHG( uy1, uy0 );
}
/* calcul de l'increment selon axe Y */ /* calcul de l'increment selon axe Y */
inc = 1; if(uy1 < uy0) inc = -1; inc = 1; if( uy1 < uy0 )
inc = -1;
/* Calcul de l'encadrement : */ /* Calcul de l'encadrement : */
demi_pas = g_GridRoutingSize / 2; demi_pas = g_GridRoutingSize / 2;
col_min = (ux0 - lg) / g_GridRoutingSize; col_min = (ux0 - lg) / g_GridRoutingSize;
if (col_min < 0 ) col_min = 0; if( col_min < 0 )
col_min = 0;
col_max = (ux1 + lg + demi_pas) / g_GridRoutingSize; col_max = (ux1 + lg + demi_pas) / g_GridRoutingSize;
if (col_max > (Ncols-1) ) col_max = Ncols-1; if( col_max > (Ncols - 1) )
col_max = Ncols - 1;
if( inc > 0 ) if( inc > 0 )
{ {
row_min = (uy0 - lg) / g_GridRoutingSize; row_min = (uy0 - lg) / g_GridRoutingSize;
row_max = (uy1 + lg + demi_pas) / g_GridRoutingSize; row_max = (uy1 + lg + demi_pas) / g_GridRoutingSize;
} }
else{ else
{
row_min = (uy1 - lg) / g_GridRoutingSize; row_min = (uy1 - lg) / g_GridRoutingSize;
row_max = (uy0 + lg + demi_pas) / g_GridRoutingSize; row_max = (uy0 + lg + demi_pas) / g_GridRoutingSize;
} }
if (row_min < 0 ) row_min = 0; if( row_min < 0 )
if (row_min > (Nrows-1) ) row_min = Nrows-1; row_min = 0;
if (row_max < 0 ) row_max = 0; if( row_min > (Nrows - 1) )
if (row_max > (Nrows-1) ) row_max = Nrows-1; row_min = Nrows - 1;
if( row_max < 0 )
row_max = 0;
if( row_max > (Nrows - 1) )
row_max = Nrows - 1;
dx = ux1 - ux0; dy = uy1 - uy0; dx = ux1 - ux0; dy = uy1 - uy0;
if (dx) angle = (int)(atan2(dy,dx) * 1800 / M_PI); if( dx )
else { angle = 900; if (dy < 0) angle = -900; } angle = (int) (atan2( dy, dx ) * 1800 / M_PI);
else
{
angle = 900; if( dy < 0 )
angle = -900;
}
RotatePoint( &dx, &dy, angle ); /* dx = longueur, dy = 0 */ RotatePoint( &dx, &dy, angle ); /* dx = longueur, dy = 0 */
for( col = col_min; col <= col_max; col++ ) for( col = col_min; col <= col_max; col++ )
@ -582,10 +708,11 @@ int cx, cy, dx, dy;
cy = (row * g_GridRoutingSize) - uy0; cy = (row * g_GridRoutingSize) - uy0;
cx = cxr; cx = cxr;
RotatePoint( &cx, &cy, angle ); RotatePoint( &cx, &cy, angle );
if( abs(cy) > lg) continue; /* Le point est trop loin sur l'axe Y */ if( abs( cy ) > lg )
continue; /* Le point est trop loin sur l'axe Y */
/* ici le point a tester est proche du segment: la position /* ici le point a tester est proche du segment: la position
selon l'axe X doit etre testee */ * selon l'axe X doit etre testee */
if( (cx >= 0) && (cx <= dx) ) if( (cx >= 0) && (cx <= dx) )
{ {
OP_CELL( layer, row, col ); OP_CELL( layer, row, col );
@ -608,31 +735,45 @@ int cx, cy, dx, dy;
} }
} }
/********************************************************************/ /********************************************************************/
void DrawHVSegment( int ux0, int uy0, int ux1, int uy1, int demi_largeur, int layer, void DrawHVSegment( int ux0, int uy0, int ux1, int uy1, int demi_largeur, int layer,
int color, int op_logique ) int color, int op_logique )
/********************************************************************/ /********************************************************************/
/* Draw a horizontal or vertical segment. /* Draw a horizontal or vertical segment.
same as DrawSegmentQcq, but faster * same as DrawSegmentQcq, but faster
*/ */
{ {
int row, col; int row, col;
int row_max, col_max, row_min, col_min; int row_max, col_max, row_min, col_min;
void (*WriteCell)( int, int, int, BoardCell ); void (*WriteCell)( int, int, int, BoardCell );
switch( op_logique ) switch( op_logique )
{ {
default: default:
case WRITE_CELL: WriteCell = SetCell; break; case WRITE_CELL:
case WRITE_OR_CELL: WriteCell = OrCell; break; WriteCell = SetCell; break;
case WRITE_XOR_CELL: WriteCell = XorCell; break;
case WRITE_AND_CELL: WriteCell = AndCell; break; case WRITE_OR_CELL:
case WRITE_ADD_CELL: WriteCell = AddCell; break; WriteCell = OrCell; break;
case WRITE_XOR_CELL:
WriteCell = XorCell; break;
case WRITE_AND_CELL:
WriteCell = AndCell; break;
case WRITE_ADD_CELL:
WriteCell = AddCell; break;
} }
// Modif des coord pour que les coord de fin soient > coord de debut // Modif des coord pour que les coord de fin soient > coord de debut
if( uy1 < uy0 ) EXCHG(uy0,uy1) ; // ceci n'est vrai que parce que if( uy1 < uy0 )
if( ux1 < ux0 ) EXCHG(ux0,ux1) ; // dx ou dy ou les 2 sonts nuls EXCHG( uy0, uy1 ); // ceci n'est vrai que parce que
if( ux1 < ux0 )
EXCHG( ux0, ux1 ); // dx ou dy ou les 2 sonts nuls
// Le segment est assimile a un rectangle. // Le segment est assimile a un rectangle.
// TODO: traiter correctement les extremites arrondies // TODO: traiter correctement les extremites arrondies
@ -640,6 +781,7 @@ void (*WriteCell)(int,int,int,BoardCell);
{ {
ux0 -= demi_largeur; ux1 += demi_largeur; ux0 -= demi_largeur; ux1 += demi_largeur;
} }
// else // Horizontal segment // else // Horizontal segment
{ {
uy0 -= demi_largeur; uy1 += demi_largeur; uy0 -= demi_largeur; uy1 += demi_largeur;
@ -650,18 +792,26 @@ void (*WriteCell)(int,int,int,BoardCell);
col_max = ux1 / g_GridRoutingSize; col_max = ux1 / g_GridRoutingSize;
row_min = uy0 / g_GridRoutingSize; row_min = uy0 / g_GridRoutingSize;
if (uy0 > row_min*g_GridRoutingSize ) row_min++; // Traitement de l'arrondi par defaut if( uy0 > row_min * g_GridRoutingSize )
row_min++; // Traitement de l'arrondi par defaut
col_min = ux0 / g_GridRoutingSize; col_min = ux0 / g_GridRoutingSize;
if (ux0 > col_min*g_GridRoutingSize ) col_min++; if( ux0 > col_min * g_GridRoutingSize )
col_min++;
if( row_min < 0 ) row_min = 0; if( row_min < 0 )
if( row_max >= (Nrows-1)) row_max = Nrows-1; row_min = 0;
if( col_min < 0 ) col_min = 0; if( row_max >= (Nrows - 1) )
if( col_max >= (Ncols-1)) col_max = Ncols-1; row_max = Nrows - 1;
if( col_min < 0 )
col_min = 0;
if( col_max >= (Ncols - 1) )
col_max = Ncols - 1;
if( row_min > row_max ) row_max = row_min; if( row_min > row_max )
if( col_min > col_max ) col_max = col_min; row_max = row_min;
if( col_min > col_max )
col_max = col_min;
for( row = row_min; row <= row_max; row++ ) for( row = row_min; row <= row_max; row++ )
{ {
@ -672,13 +822,15 @@ void (*WriteCell)(int,int,int,BoardCell);
} }
} }
/*****************************************************************/ /*****************************************************************/
void TraceCercle( int ux0, int uy0, int ux1, int uy1, int lg, int layer, void TraceCercle( int ux0, int uy0, int ux1, int uy1, int lg, int layer,
int color, int op_logique ) int color, int op_logique )
/*****************************************************************/ /*****************************************************************/
/* Remplit toutes les cellules du BOARD contenues dans le cercle /* Remplit toutes les cellules du BOARD contenues dans le cercle
de demi-largeur lg, centre ux,y0 passant par ux,y1 a la valeur color . * de demi-largeur lg, centre ux,y0 passant par ux,y1 a la valeur color .
coord en unites PCB (0.1 mil) relatives a l'origine pt_pcb->m_PcbBox.m_Xmin,Y du board. * coord en unites PCB (0.1 mil) relatives a l'origine pt_pcb->m_PcbBox.m_Xmin,Y du board.
*/ */
{ {
int rayon, nb_segm; int rayon, nb_segm;
@ -690,10 +842,13 @@ int angle;
rayon = (int) hypot( (double) (ux1 - ux0), (double) (uy1 - uy0) ); rayon = (int) hypot( (double) (ux1 - ux0), (double) (uy1 - uy0) );
x0 = x1 = rayon; y0 = y1 = 0; x0 = x1 = rayon; y0 = y1 = 0;
if( lg < 1 ) lg = 1; if( lg < 1 )
lg = 1;
nb_segm = (2 * rayon) / lg; nb_segm = (2 * rayon) / lg;
if(nb_segm < 5) nb_segm = 5; if( nb_segm < 5 )
if(nb_segm > 100) nb_segm = 100; nb_segm = 5;
if( nb_segm > 100 )
nb_segm = 100;
for( ii = 1; ii < nb_segm; ii++ ) for( ii = 1; ii < nb_segm; ii++ )
{ {
angle = (3600 * ii) / nb_segm; angle = (3600 * ii) / nb_segm;
@ -706,15 +861,16 @@ int angle;
DrawSegmentQcq( x1 + ux0, y1 + uy0, ux0 + rayon, uy0, lg, layer, color, op_logique ); DrawSegmentQcq( x1 + ux0, y1 + uy0, ux0 + rayon, uy0, lg, layer, color, op_logique );
} }
/****************************************************************************/ /****************************************************************************/
void TraceArc( int ux0, int uy0, int ux1, int uy1, int ArcAngle, int lg, int layer, void TraceArc( int ux0, int uy0, int ux1, int uy1, int ArcAngle, int lg, int layer,
int color, int op_logique ) int color, int op_logique )
/****************************************************************************/ /****************************************************************************/
/* Remplit toutes les cellules du BOARD contenues dans l'arc de "longueur" angle /* Remplit toutes les cellules du BOARD contenues dans l'arc de "longueur" angle
de demi-largeur lg, centre ux,y0 commencant en ux,y1 a la valeur color . * de demi-largeur lg, centre ux,y0 commencant en ux,y1 a la valeur color .
coord en unites PCB (0.1 mil) relatives a l'origine * coord en unites PCB (0.1 mil) relatives a l'origine
pt_pcb->m_PcbBox.m_Xmin,Y du board. * pt_pcb->m_PcbBox.m_Xmin,Y du board.
*/ */
{ {
int rayon, nb_segm; int rayon, nb_segm;
@ -729,19 +885,25 @@ int angle, StAngle;
x0 = ux1 - ux0; x0 = ux1 - ux0;
y0 = uy1 - uy0; y0 = uy1 - uy0;
StAngle = ArcTangente( uy1 - uy0, ux1 - ux0 ); StAngle = ArcTangente( uy1 - uy0, ux1 - ux0 );
if( lg < 1 ) lg = 1; if( lg < 1 )
lg = 1;
nb_segm = (2 * rayon) / lg; nb_segm = (2 * rayon) / lg;
nb_segm = ( nb_segm * abs( ArcAngle ) ) / 3600; nb_segm = ( nb_segm * abs( ArcAngle ) ) / 3600;
if(nb_segm < 5) nb_segm = 5; if( nb_segm < 5 )
if(nb_segm > 100) nb_segm = 100; nb_segm = 5;
if( nb_segm > 100 )
nb_segm = 100;
for( ii = 1; ii <= nb_segm; ii++ ) for( ii = 1; ii <= nb_segm; ii++ )
{ {
angle = (ArcAngle * ii) / nb_segm; angle = (ArcAngle * ii) / nb_segm;
angle += StAngle; angle += StAngle;
while ( angle >= 3600 ) angle -= 3600; while( angle >= 3600 )
while ( angle < 0 ) angle += 3600; angle -= 3600;
while( angle < 0 )
angle += 3600;
x1 = (int) (rayon * fcosinus[angle]); x1 = (int) (rayon * fcosinus[angle]);
y1 = (int) (rayon * fsinus[angle]); y1 = (int) (rayon * fsinus[angle]);
@ -751,4 +913,3 @@ int angle, StAngle;
// DrawSegmentQcq(x1+ux0,y1+uy0, ux0+rayon, uy0,lg,layer, color, op_logique); // DrawSegmentQcq(x1+ux0,y1+uy0, ux0+rayon, uy0,lg,layer, color, op_logique);
} }

View File

@ -229,7 +229,8 @@ void WinEDA_PcbFrame::Erase_Zones( wxDC* DC, bool query )
void WinEDA_PcbFrame::Erase_Segments_Pcb( wxDC* DC, bool is_edges, bool query ) void WinEDA_PcbFrame::Erase_Segments_Pcb( wxDC* DC, bool is_edges, bool query )
/*****************************************************************************/ /*****************************************************************************/
{ {
EDA_BaseStruct* PtStruct, * PtNext; BOARD_ITEM* PtStruct;
BOARD_ITEM* PtNext;
int masque_layer = (~EDGE_LAYER) & 0x1FFF0000; int masque_layer = (~EDGE_LAYER) & 0x1FFF0000;
if( is_edges ) if( is_edges )
@ -244,30 +245,18 @@ void WinEDA_PcbFrame::Erase_Segments_Pcb( wxDC* DC, bool is_edges, bool query )
return; return;
} }
PtStruct = (EDA_BaseStruct*) m_Pcb->m_Drawings; PtStruct = m_Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtNext ) for( ; PtStruct != NULL; PtStruct = PtNext )
{ {
PtNext = PtStruct->Pnext; PtNext = PtStruct->Next();
switch( PtStruct->m_StructType ) switch( PtStruct->m_StructType )
{ {
case TYPEDRAWSEGMENT: case TYPEDRAWSEGMENT:
if( g_TabOneLayerMask[( (DRAWSEGMENT*) PtStruct )->m_Layer] & masque_layer )
DeleteStructure( PtStruct );
break;
case TYPETEXTE: case TYPETEXTE:
if( g_TabOneLayerMask[( (TEXTE_PCB*) PtStruct )->m_Layer] & masque_layer )
DeleteStructure( PtStruct );
break;
case TYPECOTATION: case TYPECOTATION:
if( g_TabOneLayerMask[( (COTATION*) PtStruct )->m_Layer] & masque_layer )
DeleteStructure( PtStruct );
break;
case TYPEMIRE: case TYPEMIRE:
if( g_TabOneLayerMask[( (MIREPCB*) PtStruct )->m_Layer] & masque_layer ) if( g_TabOneLayerMask[ PtStruct->GetLayer()] & masque_layer )
DeleteStructure( PtStruct ); DeleteStructure( PtStruct );
break; break;

View File

@ -154,7 +154,8 @@ int WinEDA_BasePcbFrame::ReadListeSegmentDescr( wxDC* DC, FILE* File,
&PtSegm->m_TimeStamp, &flags ); &PtSegm->m_TimeStamp, &flags );
if( type == 1 ) if( type == 1 )
PtSegm->m_StructType = TYPEVIA; PtSegm->m_StructType = TYPEVIA;
PtSegm->m_Layer = layer;
PtSegm->SetLayer( layer );
PtSegm->m_NetCode = net_code; PtSegm->SetState( flags, ON ); PtSegm->m_NetCode = net_code; PtSegm->SetState( flags, ON );
#ifdef PCBNEW #ifdef PCBNEW
PtSegm->Draw( DrawPanel, DC, GR_OR ); PtSegm->Draw( DrawPanel, DC, GR_OR );
@ -249,7 +250,7 @@ int WinEDA_BasePcbFrame::ReadGeneralDescrPcb( wxDC* DC, FILE* File, int* LineNum
screensize = DrawPanel->GetClientSize(); screensize = DrawPanel->GetClientSize();
ii = pcbsize.x / screensize.x; ii = pcbsize.x / screensize.x;
jj = pcbsize.y / screensize.y; jj = pcbsize.y / screensize.y;
bestzoom = max( ii, jj ); bestzoom = MAX( ii, jj );
screen->m_Curseur = m_Pcb->m_BoundaryBox.Centre(); screen->m_Curseur = m_Pcb->m_BoundaryBox.Centre();
screen->SetZoom( bestzoom ); screen->SetZoom( bestzoom );
@ -779,7 +780,7 @@ int WinEDA_PcbFrame::ReadPcbFile( wxDC* DC, FILE* File, bool Append )
char Line[1024]; char Line[1024];
int LineNum = 0; int LineNum = 0;
int nbsegm, nbmod; int nbsegm, nbmod;
EDA_BaseStruct* LastStructPcb = NULL, * StructPcb; BOARD_ITEM* LastStructPcb = NULL, * StructPcb;
MODULE* LastModule = NULL, * Module; MODULE* LastModule = NULL, * Module;
EQUIPOT* LastEquipot = NULL, * Equipot; EQUIPOT* LastEquipot = NULL, * Equipot;
@ -803,7 +804,7 @@ int WinEDA_PcbFrame::ReadPcbFile( wxDC* DC, FILE* File, bool Append )
} }
LastStructPcb = m_Pcb->m_Drawings; LastStructPcb = m_Pcb->m_Drawings;
for( ; LastStructPcb != NULL; LastStructPcb = LastStructPcb->Pnext ) for( ; LastStructPcb != NULL; LastStructPcb = LastStructPcb->Next() )
{ {
if( LastStructPcb->Pnext == NULL ) if( LastStructPcb->Pnext == NULL )
break; break;
@ -901,7 +902,7 @@ int WinEDA_PcbFrame::ReadPcbFile( wxDC* DC, FILE* File, bool Append )
if( strnicmp( Line, "$TEXTPCB", 8 ) == 0 ) if( strnicmp( Line, "$TEXTPCB", 8 ) == 0 )
{ {
TEXTE_PCB* pcbtxt = new TEXTE_PCB( m_Pcb ); TEXTE_PCB* pcbtxt = new TEXTE_PCB( m_Pcb );
StructPcb = (EDA_BaseStruct*) pcbtxt; StructPcb = pcbtxt;
pcbtxt->ReadTextePcbDescr( File, &LineNum ); pcbtxt->ReadTextePcbDescr( File, &LineNum );
if( LastStructPcb == NULL ) if( LastStructPcb == NULL )
{ {

View File

@ -22,13 +22,14 @@ static void Plot_Module(WinEDA_DrawPanel * panel, wxDC * DC, MODULE * Module,
/**********************************************************************************/ /**********************************************************************************/
void WinEDA_DrawPanel::PrintPage( wxDC* DC, bool Print_Sheet_Ref, int printmasklayer ) void WinEDA_DrawPanel::PrintPage( wxDC* DC, bool Print_Sheet_Ref, int printmasklayer )
/**********************************************************************************/ /**********************************************************************************/
/* Used to print the board. /* Used to print the board.
Draw the board, but only layers allowed by printmasklayer * Draw the board, but only layers allowed by printmasklayer
( printmasklayer is a 32 bits mask: bit n = 1 -> layer n is printed) * ( printmasklayer is a 32 bits mask: bit n = 1 -> layer n is printed)
*/ */
{ {
MODULE* Module; MODULE* Module;
EDA_BaseStruct * PtStruct; BOARD_ITEM* PtStruct;
int drawmode = GR_COPY; int drawmode = GR_COPY;
DISPLAY_OPTIONS save_opt; DISPLAY_OPTIONS save_opt;
TRACK* pt_piste; TRACK* pt_piste;
@ -36,8 +37,10 @@ WinEDA_BasePcbFrame * frame = (WinEDA_BasePcbFrame *) m_Parent;
BOARD* Pcb = frame->m_Pcb; BOARD* Pcb = frame->m_Pcb;
save_opt = DisplayOpt; save_opt = DisplayOpt;
if( printmasklayer & ALL_CU_LAYERS ) DisplayOpt.DisplayPadFill = FILLED; if( printmasklayer & ALL_CU_LAYERS )
else DisplayOpt.DisplayPadFill = SKETCH; DisplayOpt.DisplayPadFill = FILLED;
else
DisplayOpt.DisplayPadFill = SKETCH;
frame->m_DisplayPadFill = DisplayOpt.DisplayPadFill; frame->m_DisplayPadFill = DisplayOpt.DisplayPadFill;
frame->m_DisplayPadNum = DisplayOpt.DisplayPadNum = FALSE; frame->m_DisplayPadNum = DisplayOpt.DisplayPadNum = FALSE;
DisplayOpt.DisplayPadNoConn = FALSE; DisplayOpt.DisplayPadNoConn = FALSE;
@ -53,39 +56,41 @@ BOARD * Pcb = frame->m_Pcb;
/* Draw the pcb graphic items (texts, ...) */ /* Draw the pcb graphic items (texts, ...) */
PtStruct = Pcb->m_Drawings; PtStruct = Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext ) for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
{ {
switch( PtStruct->m_StructType ) switch( PtStruct->m_StructType )
{ {
case TYPEDRAWSEGMENT: case TYPEDRAWSEGMENT:
if( (g_TabOneLayerMask[((DRAWSEGMENT*)PtStruct)->m_Layer] & printmasklayer) == 0 ) if( (g_TabOneLayerMask[ PtStruct->GetLayer()] & printmasklayer) == 0 )
break; break;
Trace_DrawSegmentPcb( this, DC, (DRAWSEGMENT*) PtStruct, drawmode ); Trace_DrawSegmentPcb( this, DC, (DRAWSEGMENT*) PtStruct, drawmode );
break; break;
case TYPECOTATION: case TYPECOTATION:
if( (g_TabOneLayerMask[((COTATION*)PtStruct)->m_Layer] & printmasklayer) == 0 ) if( (g_TabOneLayerMask[ PtStruct->GetLayer()] & printmasklayer) == 0 )
break; break;
( (COTATION*) PtStruct )->Draw( this, DC, wxPoint( 0, 0 ), drawmode ); ( (COTATION*) PtStruct )->Draw( this, DC, wxPoint( 0, 0 ), drawmode );
break; break;
case TYPETEXTE: case TYPETEXTE:
{ {
if( (g_TabOneLayerMask[((TEXTE_PCB *)PtStruct)->m_Layer] & printmasklayer) == 0 ) if( (g_TabOneLayerMask[ PtStruct->GetLayer()] & printmasklayer) == 0 )
break; break;
( (TEXTE_PCB*) PtStruct )->Draw( this, DC, wxPoint( 0, 0 ), drawmode ); ( (TEXTE_PCB*) PtStruct )->Draw( this, DC, wxPoint( 0, 0 ), drawmode );
break; break;
} }
case TYPEMIRE: case TYPEMIRE:
if( (g_TabOneLayerMask[((MIREPCB*)PtStruct)->m_Layer] & printmasklayer) == 0 ) break; if( (g_TabOneLayerMask[ PtStruct->GetLayer()] & printmasklayer) == 0 )
break;
( (MIREPCB*) PtStruct )->Draw( this, DC, wxPoint( 0, 0 ), drawmode ); ( (MIREPCB*) PtStruct )->Draw( this, DC, wxPoint( 0, 0 ), drawmode );
break; break;
case TYPEMARQUEUR: /* Trace des marqueurs */ case TYPEMARQUEUR: /* Trace des marqueurs */
break; break;
default: break; default:
break;
} }
} }
@ -93,7 +98,8 @@ BOARD * Pcb = frame->m_Pcb;
pt_piste = Pcb->m_Track; pt_piste = Pcb->m_Track;
for( ; pt_piste != NULL; pt_piste = (TRACK*) pt_piste->Pnext ) for( ; pt_piste != NULL; pt_piste = (TRACK*) pt_piste->Pnext )
{ {
if( (printmasklayer & pt_piste->ReturnMaskLayer() ) == 0 ) continue; if( ( printmasklayer & pt_piste->ReturnMaskLayer() ) == 0 )
continue;
if( pt_piste->m_StructType == TYPEVIA ) /* VIA rencontree */ if( pt_piste->m_StructType == TYPEVIA ) /* VIA rencontree */
{ {
int rayon = pt_piste->m_Width >> 1; int rayon = pt_piste->m_Width >> 1;
@ -102,13 +108,15 @@ BOARD * Pcb = frame->m_Pcb;
GRFilledCircle( &m_ClipBox, DC, pt_piste->m_Start.x, pt_piste->m_Start.y, GRFilledCircle( &m_ClipBox, DC, pt_piste->m_Start.x, pt_piste->m_Start.y,
rayon, 0, color, color ); rayon, 0, color, color );
} }
else pt_piste->Draw(this, DC, drawmode); else
pt_piste->Draw( this, DC, drawmode );
} }
pt_piste = Pcb->m_Zone; pt_piste = Pcb->m_Zone;
for( ; pt_piste != NULL; pt_piste = (TRACK*) pt_piste->Pnext ) for( ; pt_piste != NULL; pt_piste = (TRACK*) pt_piste->Pnext )
{ {
if( (printmasklayer & pt_piste->ReturnMaskLayer() ) == 0 ) continue ; if( ( printmasklayer & pt_piste->ReturnMaskLayer() ) == 0 )
continue;
pt_piste->Draw( this, DC, drawmode ); pt_piste->Draw( this, DC, drawmode );
} }
@ -126,7 +134,8 @@ BOARD * Pcb = frame->m_Pcb;
int color = WHITE; int color = WHITE;
for( ; pt_piste != NULL; pt_piste = (TRACK*) pt_piste->Pnext ) for( ; pt_piste != NULL; pt_piste = (TRACK*) pt_piste->Pnext )
{ {
if( (printmasklayer & pt_piste->ReturnMaskLayer() ) == 0 ) continue; if( ( printmasklayer & pt_piste->ReturnMaskLayer() ) == 0 )
continue;
if( pt_piste->m_StructType == TYPEVIA ) /* VIA rencontree */ if( pt_piste->m_StructType == TYPEVIA ) /* VIA rencontree */
{ {
GRSetDrawMode( DC, drawmode ); GRSetDrawMode( DC, drawmode );
@ -159,22 +168,28 @@ int mlayer;
pt_pad = Module->m_Pads; pt_pad = Module->m_Pads;
for( ; pt_pad != NULL; pt_pad = (D_PAD*) pt_pad->Pnext ) for( ; pt_pad != NULL; pt_pad = (D_PAD*) pt_pad->Pnext )
{ {
if( (pt_pad->m_Masque_Layer & masklayer ) == 0 ) continue; if( (pt_pad->m_Masque_Layer & masklayer ) == 0 )
continue;
pt_pad->Draw( panel, DC, wxPoint( 0, 0 ), draw_mode ); pt_pad->Draw( panel, DC, wxPoint( 0, 0 ), draw_mode );
} }
/* draw footprint graphic shapes */ /* draw footprint graphic shapes */
PtStruct = Module->m_Drawings; PtStruct = Module->m_Drawings;
mlayer = g_TabOneLayerMask[Module->m_Layer]; mlayer = g_TabOneLayerMask[Module->GetLayer()];
if( Module->m_Layer == CUIVRE_N) mlayer = SILKSCREEN_LAYER_CU; if( Module->GetLayer() == CUIVRE_N )
if( Module->m_Layer == CMP_N) mlayer = SILKSCREEN_LAYER_CMP; mlayer = SILKSCREEN_LAYER_CU;
else if( Module->GetLayer() == CMP_N )
mlayer = SILKSCREEN_LAYER_CMP;
if( mlayer & masklayer ) if( mlayer & masklayer )
{ {
/* Analyse des autorisations de trace pour les textes VALEUR et REF */ /* Analyse des autorisations de trace pour les textes VALEUR et REF */
bool trace_val, trace_ref; bool trace_val, trace_ref;
trace_val = trace_ref = TRUE; // les 2 autorisations de tracer sont donnees trace_val = trace_ref = TRUE; // les 2 autorisations de tracer sont donnees
if(Module->m_Reference->m_NoShow) trace_ref = FALSE; if( Module->m_Reference->m_NoShow )
if(Module->m_Value->m_NoShow) trace_val = FALSE; trace_ref = FALSE;
if( Module->m_Value->m_NoShow )
trace_val = FALSE;
if( trace_ref ) if( trace_ref )
Module->m_Reference->Draw( panel, DC, wxPoint( 0, 0 ), draw_mode ); Module->m_Reference->Draw( panel, DC, wxPoint( 0, 0 ), draw_mode );
@ -182,12 +197,13 @@ int mlayer;
Module->m_Value->Draw( panel, DC, wxPoint( 0, 0 ), draw_mode ); Module->m_Value->Draw( panel, DC, wxPoint( 0, 0 ), draw_mode );
} }
for( ;PtStruct != NULL; PtStruct = PtStruct->Pnext ) for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
{ {
switch( PtStruct->m_StructType ) switch( PtStruct->m_StructType )
{ {
case TYPETEXTEMODULE: case TYPETEXTEMODULE:
if( (mlayer & masklayer ) == 0) break; if( (mlayer & masklayer ) == 0 )
break;
TextMod = (TEXTE_MODULE*) PtStruct; TextMod = (TEXTE_MODULE*) PtStruct;
TextMod->Draw( panel, DC, wxPoint( 0, 0 ), draw_mode ); TextMod->Draw( panel, DC, wxPoint( 0, 0 ), draw_mode );
@ -196,13 +212,14 @@ int mlayer;
case TYPEEDGEMODULE: case TYPEEDGEMODULE:
{ {
EDGE_MODULE* edge = (EDGE_MODULE*) PtStruct; EDGE_MODULE* edge = (EDGE_MODULE*) PtStruct;
if( (g_TabOneLayerMask[edge->m_Layer] & masklayer ) == 0) break; if( (g_TabOneLayerMask[edge->GetLayer()] & masklayer ) == 0 )
break;
edge->Draw( panel, DC, wxPoint( 0, 0 ), draw_mode ); edge->Draw( panel, DC, wxPoint( 0, 0 ), draw_mode );
break; break;
} }
default: break;
}
}
}
default:
break;
}
}
}

View File

@ -79,7 +79,7 @@ void WinEDA_ModuleEditFrame::Load_Module_Module_From_BOARD( MODULE* Module )
m_CurrentScreen->m_Curseur.x = m_CurrentScreen->m_Curseur.y = 0; m_CurrentScreen->m_Curseur.x = m_CurrentScreen->m_Curseur.y = 0;
Place_Module( Module, NULL ); Place_Module( Module, NULL );
if( Module->m_Layer != CMP_N ) if( Module->GetLayer() != CMP_N )
Change_Side_Module( Module, NULL ); Change_Side_Module( Module, NULL );
Rotate_Module( NULL, Module, 0, FALSE ); Rotate_Module( NULL, Module, 0, FALSE );
m_CurrentScreen->ClrModify(); m_CurrentScreen->ClrModify();

View File

@ -169,7 +169,7 @@ EDA_BaseStruct* WinEDA_BasePcbFrame::Locate( int typeloc, int LayerSearch )
MODULE* module = m_Pcb->m_Modules; MODULE* module = m_Pcb->m_Modules;
for( ; module != NULL; module = (MODULE*) module->Pnext ) for( ; module != NULL; module = (MODULE*) module->Pnext )
{ {
if( module->m_Layer != LayerSearch ) if( module->GetLayer() != LayerSearch )
continue; continue;
item = LocateTexteModule( m_Pcb, &module, typeloc | VISIBLE_ONLY ); item = LocateTexteModule( m_Pcb, &module, typeloc | VISIBLE_ONLY );
@ -266,7 +266,7 @@ D_PAD* Locate_Pad_Connecte( BOARD* Pcb, TRACK* ptr_piste, int extr )
MODULE* module; MODULE* module;
wxPoint ref_pos; wxPoint ref_pos;
masque_layer = g_TabOneLayerMask[ptr_piste->m_Layer]; masque_layer = g_TabOneLayerMask[ptr_piste->GetLayer()];
if( extr == START ) if( extr == START )
{ {
ref_pos = ptr_piste->m_Start; ref_pos = ptr_piste->m_Start;
@ -374,14 +374,14 @@ DRAWSEGMENT* Locate_Segment_Pcb( BOARD* Pcb, int LayerSearch, int typeloc )
DRAWSEGMENT* pts = (DRAWSEGMENT*) PtStruct; DRAWSEGMENT* pts = (DRAWSEGMENT*) PtStruct;
if( (pts->m_Layer != LayerSearch) && (LayerSearch != -1) ) if( (pts->GetLayer() != LayerSearch) && (LayerSearch != -1) )
continue; continue;
if( pts->HitTest( ref_pos ) ) if( pts->HitTest( ref_pos ) )
{ {
// return this hit if layer matches, else remember in // return this hit if layer matches, else remember in
// case no layer match is found. // case no layer match is found.
if( pts->m_Layer == screen->m_Active_Layer ) if( pts->GetLayer() == screen->m_Active_Layer )
return pts; return pts;
else if( !locate_segm ) else if( !locate_segm )
@ -394,8 +394,8 @@ DRAWSEGMENT* Locate_Segment_Pcb( BOARD* Pcb, int LayerSearch, int typeloc )
/************************************************* /*************************************************
* D_PAD * Locate_Any_Pad(int typeloc, bool OnlyCurrentLayer) * D_PAD * Locate_Any_Pad( BOARD* Pcb, int typeloc, bool OnlyCurrentLayer)
* D_PAD* Locate_Any_Pad(int ref_pos, bool OnlyCurrentLayer) * D_PAD* Locate_Any_Pad( BOARD* Pcb, int ref_pos, bool OnlyCurrentLayer)
*************************************************/ *************************************************/
/* /*
@ -522,7 +522,7 @@ MODULE* Locate_Prefered_Module( BOARD* Pcb, int typeloc )
* d'appartenance du module et a la couche cuivre si le module * d'appartenance du module et a la couche cuivre si le module
* est sur couche serigr,adhesive cuivre, a la couche cmp si le module * est sur couche serigr,adhesive cuivre, a la couche cmp si le module
* est sur couche serigr,adhesive composant */ * est sur couche serigr,adhesive composant */
layer = pt_module->m_Layer; layer = pt_module->GetLayer();
if( layer==ADHESIVE_N_CU || layer==SILKSCREEN_N_CU ) if( layer==ADHESIVE_N_CU || layer==SILKSCREEN_N_CU )
layer = CUIVRE_N; layer = CUIVRE_N;
@ -538,21 +538,21 @@ MODULE* Locate_Prefered_Module( BOARD* Pcb, int typeloc )
if( ( (PCB_SCREEN*) ActiveScreen )->m_Active_Layer == layer ) if( ( (PCB_SCREEN*) ActiveScreen )->m_Active_Layer == layer )
{ {
if( min( lx, ly ) <= min_dim ) if( MIN( lx, ly ) <= min_dim )
{ {
/* meilleure empreinte localisee sur couche active */ /* meilleure empreinte localisee sur couche active */
module = pt_module; module = pt_module;
min_dim = min( lx, ly ); min_dim = MIN( lx, ly );
} }
} }
else if( !(typeloc & MATCH_LAYER) else if( !(typeloc & MATCH_LAYER)
&& ( !(typeloc & VISIBLE_ONLY) || IsModuleLayerVisible( layer ) ) ) && ( !(typeloc & VISIBLE_ONLY) || IsModuleLayerVisible( layer ) ) )
{ {
if( min( lx, ly ) <= alt_min_dim ) if( MIN( lx, ly ) <= alt_min_dim )
{ {
/* meilleure empreinte localisee sur autres couches */ /* meilleure empreinte localisee sur autres couches */
Altmodule = pt_module; Altmodule = pt_module;
alt_min_dim = min( lx, ly ); alt_min_dim = MIN( lx, ly );
} }
} }
} }
@ -603,7 +603,7 @@ TEXTE_MODULE* LocateTexteModule( BOARD* Pcb, MODULE** PtModule, int typeloc )
for( ; module != NULL; module = (MODULE*) module->Pnext ) for( ; module != NULL; module = (MODULE*) module->Pnext )
{ {
int layer = module->m_Layer; int layer = module->GetLayer();
if( layer==ADHESIVE_N_CU || layer==SILKSCREEN_N_CU ) if( layer==ADHESIVE_N_CU || layer==SILKSCREEN_N_CU )
layer = CUIVRE_N; layer = CUIVRE_N;
else if( layer==ADHESIVE_N_CMP || layer==SILKSCREEN_N_CMP ) else if( layer==ADHESIVE_N_CMP || layer==SILKSCREEN_N_CMP )
@ -817,7 +817,7 @@ TRACK* Locate_Pistes( TRACK* start_adresse, const wxPoint& ref_pos, int MasqueLa
if( Track->GetState( BUSY | DELETED ) ) if( Track->GetState( BUSY | DELETED ) )
continue; continue;
if( (g_DesignSettings.m_LayerColor[Track->m_Layer] & ITEM_NOT_SHOW) ) if( (g_DesignSettings.m_LayerColor[Track->GetLayer()] & ITEM_NOT_SHOW) )
continue; continue;
if( Track->m_StructType == TYPEVIA ) /* VIA rencontree */ if( Track->m_StructType == TYPEVIA ) /* VIA rencontree */
@ -828,7 +828,7 @@ TRACK* Locate_Pistes( TRACK* start_adresse, const wxPoint& ref_pos, int MasqueLa
else else
{ {
if( MasqueLayer != -1 ) if( MasqueLayer != -1 )
if( (g_TabOneLayerMask[Track->m_Layer] & MasqueLayer) == 0 ) if( (g_TabOneLayerMask[Track->GetLayer()] & MasqueLayer) == 0 )
continue; /* Segments sur couches differentes */ continue; /* Segments sur couches differentes */
if( Track->HitTest( ref_pos ) ) if( Track->HitTest( ref_pos ) )
@ -869,7 +869,7 @@ TRACK* Locate_Zone( TRACK* start_adresse, const wxPoint& ref_pos, int layer )
{ {
for( TRACK* Zone = start_adresse; Zone; Zone = (TRACK*) Zone->Pnext ) for( TRACK* Zone = start_adresse; Zone; Zone = (TRACK*) Zone->Pnext )
{ {
if( (layer != -1) && (Zone->m_Layer != layer) ) if( (layer != -1) && (Zone->GetLayer() != layer) )
continue; continue;
if( Zone->HitTest( ref_pos ) ) if( Zone->HitTest( ref_pos ) )
@ -898,7 +898,7 @@ TEXTE_PCB* Locate_Texte_Pcb( EDA_BaseStruct* PtStruct, int LayerSearch, int type
TEXTE_PCB* pt_txt_pcb = (TEXTE_PCB*) PtStruct; TEXTE_PCB* pt_txt_pcb = (TEXTE_PCB*) PtStruct;
if( pt_txt_pcb->m_Layer == LayerSearch ) if( pt_txt_pcb->GetLayer() == LayerSearch )
{ {
if( pt_txt_pcb->HitTest( ref ) ) if( pt_txt_pcb->HitTest( ref ) )
{ {
@ -1048,7 +1048,7 @@ EDA_BaseStruct* Locate_MirePcb( EDA_BaseStruct* PtStruct, int LayerSearch,
continue; continue;
item = (MIREPCB*) PtStruct; item = (MIREPCB*) PtStruct;
if( LayerSearch != -1 && item->m_Layer != LayerSearch ) if( LayerSearch != -1 && item->GetLayer() != LayerSearch )
continue; continue;
if( item->HitTest( ref_pos ) ) if( item->HitTest( ref_pos ) )

View File

@ -101,7 +101,8 @@ OBJECTS= $(TARGET).o classpcb.o\
gen_modules_placefile.o\ gen_modules_placefile.o\
modedit.o\ modedit.o\
export_gencad.o\ export_gencad.o\
hotkeys.o hotkeys.o \
collectors.o
setpage.o: ../share/setpage.cpp setpage.o: ../share/setpage.cpp
$(CC) -c $(EDACPPFLAGS) -o $@ ../share/$*.cpp $(CC) -c $(EDACPPFLAGS) -o $@ ../share/$*.cpp
@ -289,3 +290,4 @@ dragsegm.o: dragsegm.cpp drag.h $(COMMON)
router.o: router.cpp $(COMMON) router.o: router.cpp $(COMMON)
collectors.o: collectors.cpp collectors.h $(COMMON)

View File

@ -218,7 +218,7 @@ MIREPCB* WinEDA_PcbFrame::Create_Mire( wxDC* DC )
m_Pcb->m_Drawings->Pback = MirePcb; m_Pcb->m_Drawings->Pback = MirePcb;
m_Pcb->m_Drawings = MirePcb; m_Pcb->m_Drawings = MirePcb;
MirePcb->m_Layer = EDGE_N; MirePcb->SetLayer( EDGE_N );
MirePcb->m_Width = g_DesignSettings.m_EdgeSegmentWidth; MirePcb->m_Width = g_DesignSettings.m_EdgeSegmentWidth;
MirePcb->m_Size = MireDefaultSize; MirePcb->m_Size = MireDefaultSize;
MirePcb->m_Pos = GetScreen()->m_Curseur; MirePcb->m_Pos = GetScreen()->m_Curseur;

View File

@ -104,7 +104,7 @@ void WinEDA_PcbFrame::StartMove_Module( MODULE* module, wxDC* DC )
m_Pcb->m_Status_Pcb &= ~CHEVELU_LOCAL_OK; m_Pcb->m_Status_Pcb &= ~CHEVELU_LOCAL_OK;
module->m_Flags |= IS_MOVED; module->m_Flags |= IS_MOVED;
ModuleInitOrient = module->m_Orient; ModuleInitOrient = module->m_Orient;
ModuleInitLayer = module->m_Layer; ModuleInitLayer = module->GetLayer();
/* Effacement chevelu general si necessaire */ /* Effacement chevelu general si necessaire */
if( g_Show_Ratsnest ) if( g_Show_Ratsnest )
@ -192,7 +192,7 @@ void Exit_Module( WinEDA_DrawPanel* Panel, wxDC* DC )
{ {
if( ModuleInitOrient != module->m_Orient ) if( ModuleInitOrient != module->m_Orient )
pcbframe->Rotate_Module( NULL, module, ModuleInitOrient, FALSE ); pcbframe->Rotate_Module( NULL, module, ModuleInitOrient, FALSE );
if( ModuleInitLayer != module->m_Layer ) if( ModuleInitLayer != module->GetLayer() )
pcbframe->Change_Side_Module( module, NULL ); pcbframe->Change_Side_Module( module, NULL );
module->Draw( Panel, DC, wxPoint( 0, 0 ), GR_OR ); module->Draw( Panel, DC, wxPoint( 0, 0 ), GR_OR );
} }
@ -337,7 +337,7 @@ void WinEDA_BasePcbFrame::Change_Side_Module( MODULE* Module, wxDC* DC )
if( Module == NULL ) if( Module == NULL )
return; return;
if( (Module->m_Layer != CMP_N) && (Module->m_Layer != CUIVRE_N) ) if( (Module->GetLayer() != CMP_N) && (Module->GetLayer() != CUIVRE_N) )
return; return;
m_CurrentScreen->SetModify(); m_CurrentScreen->SetModify();
@ -367,7 +367,7 @@ void WinEDA_BasePcbFrame::Change_Side_Module( MODULE* Module, wxDC* DC )
} }
/* mise a jour du Flag de l'empreinte et des couches des contours et textes */ /* mise a jour du Flag de l'empreinte et des couches des contours et textes */
Module->m_Layer = ChangeSideNumLayer( Module->m_Layer ); Module->SetLayer( ChangeSideNumLayer( Module->GetLayer() ) );
/* Inversion miroir de l'orientation */ /* Inversion miroir de l'orientation */
Module->m_Orient = -Module->m_Orient; Module->m_Orient = -Module->m_Orient;
@ -397,17 +397,17 @@ void WinEDA_BasePcbFrame::Change_Side_Module( MODULE* Module, wxDC* DC )
pt_texte->m_Pos0.y = pt_texte->m_Pos0.y; pt_texte->m_Pos0.y = pt_texte->m_Pos0.y;
pt_texte->m_Miroir = 1; pt_texte->m_Miroir = 1;
NEGATE_AND_NORMALIZE_ANGLE_POS( pt_texte->m_Orient ); NEGATE_AND_NORMALIZE_ANGLE_POS( pt_texte->m_Orient );
pt_texte->m_Layer = Module->m_Layer; pt_texte->SetLayer( Module->GetLayer() );
pt_texte->m_Layer = ChangeSideNumLayer( pt_texte->m_Layer ); pt_texte->SetLayer( ChangeSideNumLayer( pt_texte->GetLayer() ) );
if( Module->m_Layer == CUIVRE_N ) if( Module->GetLayer() == CUIVRE_N )
pt_texte->m_Layer = SILKSCREEN_N_CU; pt_texte->SetLayer( SILKSCREEN_N_CU );
if( Module->m_Layer == CMP_N ) if( Module->GetLayer() == CMP_N )
pt_texte->m_Layer = SILKSCREEN_N_CMP; pt_texte->SetLayer( SILKSCREEN_N_CMP );
if( (Module->m_Layer == SILKSCREEN_N_CU) if( (Module->GetLayer() == SILKSCREEN_N_CU)
|| (Module->m_Layer == ADHESIVE_N_CU) || (Module->m_Layer == CUIVRE_N) ) || (Module->GetLayer() == ADHESIVE_N_CU) || (Module->GetLayer() == CUIVRE_N) )
pt_texte->m_Miroir = 0; pt_texte->m_Miroir = 0;
/* Inversion miroir de la Valeur et mise en miroir : */ /* Inversion miroir de la Valeur et mise en miroir : */
@ -418,17 +418,17 @@ void WinEDA_BasePcbFrame::Change_Side_Module( MODULE* Module, wxDC* DC )
pt_texte->m_Pos0.y = pt_texte->m_Pos0.y; pt_texte->m_Pos0.y = pt_texte->m_Pos0.y;
pt_texte->m_Miroir = 1; pt_texte->m_Miroir = 1;
NEGATE_AND_NORMALIZE_ANGLE_POS( pt_texte->m_Orient ); NEGATE_AND_NORMALIZE_ANGLE_POS( pt_texte->m_Orient );
pt_texte->m_Layer = Module->m_Layer; pt_texte->SetLayer( Module->GetLayer() );
pt_texte->m_Layer = ChangeSideNumLayer( pt_texte->m_Layer ); pt_texte->SetLayer( ChangeSideNumLayer( pt_texte->GetLayer() ) );
if( Module->m_Layer == CUIVRE_N ) if( Module->GetLayer() == CUIVRE_N )
pt_texte->m_Layer = SILKSCREEN_N_CU; pt_texte->SetLayer( SILKSCREEN_N_CU );
if( Module->m_Layer == CMP_N ) if( Module->GetLayer() == CMP_N )
pt_texte->m_Layer = SILKSCREEN_N_CMP; pt_texte->SetLayer( SILKSCREEN_N_CMP );
if( (Module->m_Layer == SILKSCREEN_N_CU) if( (Module->GetLayer() == SILKSCREEN_N_CU)
|| (Module->m_Layer == ADHESIVE_N_CU) || (Module->m_Layer == CUIVRE_N) ) || (Module->GetLayer() == ADHESIVE_N_CU) || (Module->GetLayer() == CUIVRE_N) )
pt_texte->m_Miroir = 0; pt_texte->m_Miroir = 0;
/* Inversion miroir des dessins de l'empreinte : */ /* Inversion miroir des dessins de l'empreinte : */
@ -453,7 +453,7 @@ void WinEDA_BasePcbFrame::Change_Side_Module( MODULE* Module, wxDC* DC )
pt_edgmod->m_Angle = -pt_edgmod->m_Angle; pt_edgmod->m_Angle = -pt_edgmod->m_Angle;
} }
pt_edgmod->m_Layer = ChangeSideNumLayer( pt_edgmod->m_Layer ); pt_edgmod->SetLayer( ChangeSideNumLayer( pt_edgmod->GetLayer() ) );
break; break;
case TYPETEXTEMODULE: case TYPETEXTEMODULE:
@ -466,18 +466,21 @@ void WinEDA_BasePcbFrame::Change_Side_Module( MODULE* Module, wxDC* DC )
pt_texte->m_Miroir = 1; pt_texte->m_Miroir = 1;
NEGATE_AND_NORMALIZE_ANGLE_POS( pt_texte->m_Orient ); NEGATE_AND_NORMALIZE_ANGLE_POS( pt_texte->m_Orient );
pt_texte->m_Layer = Module->m_Layer; pt_texte->SetLayer( Module->GetLayer() );
pt_texte->m_Layer = ChangeSideNumLayer( pt_texte->m_Layer ); pt_texte->SetLayer( ChangeSideNumLayer( pt_texte->GetLayer() ) );
if( Module->m_Layer == CUIVRE_N ) if( Module->GetLayer() == CUIVRE_N )
pt_texte->m_Layer = SILKSCREEN_N_CU; pt_texte->SetLayer( SILKSCREEN_N_CU );
if( Module->m_Layer == CMP_N ) if( Module->GetLayer() == CMP_N )
pt_texte->m_Layer = SILKSCREEN_N_CMP; pt_texte->SetLayer( SILKSCREEN_N_CMP );
if( (Module->m_Layer == SILKSCREEN_N_CU) if( Module->GetLayer() == SILKSCREEN_N_CU
|| (Module->m_Layer == ADHESIVE_N_CU) || (Module->m_Layer == CUIVRE_N) ) || Module->GetLayer() == ADHESIVE_N_CU
|| Module->GetLayer() == CUIVRE_N )
{
pt_texte->m_Miroir = 0; pt_texte->m_Miroir = 0;
}
break; break;

View File

@ -815,7 +815,7 @@ bool WinEDA_PcbFrame::PlaceDraggedTrackSegment( TRACK* Track, wxDC* DC )
/* Test the connections modified by the move /* Test the connections modified by the move
* (only pad connection must be tested, track connection will be tested by test_1_net_connexion() ) */ * (only pad connection must be tested, track connection will be tested by test_1_net_connexion() ) */
int masque_layer = g_TabOneLayerMask[Track->m_Layer]; int masque_layer = g_TabOneLayerMask[Track->GetLayer()];
Track->start = Fast_Locate_Pad_Connecte( m_Pcb, Track->m_Start, masque_layer ); Track->start = Fast_Locate_Pad_Connecte( m_Pcb, Track->m_Start, masque_layer );
Track->end = Fast_Locate_Pad_Connecte( m_Pcb, Track->m_End, masque_layer ); Track->end = Fast_Locate_Pad_Connecte( m_Pcb, Track->m_End, masque_layer );
} }

View File

@ -243,7 +243,7 @@ MODULE* WinEDA_PcbFrame::Create_MuWaveComponent( wxDC* DC, int shape_type )
Module->m_Drawings = edge; Module->m_Drawings = edge;
edge->Pback = Module; edge->Pback = Module;
edge->m_Shape = S_POLYGON; edge->m_Shape = S_POLYGON;
edge->m_Layer = LAYER_CMP_N; edge->SetLayer( LAYER_CMP_N );
edge->m_PolyCount = ii + 3; edge->m_PolyCount = ii + 3;
edge->m_PolyList = (int*) MyMalloc( edge->m_PolyCount * 2 * sizeof(int) ); edge->m_PolyList = (int*) MyMalloc( edge->m_PolyCount * 2 * sizeof(int) );
ptr = edge->m_PolyList; ptr = edge->m_PolyList;
@ -574,7 +574,7 @@ MODULE* WinEDA_PcbFrame::Create_MuWavePolygonShape( wxDC* DC )
Module->m_Drawings = edge; Module->m_Drawings = edge;
edge->Pback = Module; edge->Pback = Module;
edge->m_Shape = S_POLYGON; edge->m_Shape = S_POLYGON;
edge->m_Layer = LAYER_CMP_N; edge->SetLayer( LAYER_CMP_N );
npoints = PolyEdgesCount; npoints = PolyEdgesCount;
switch( PolyShapeType ) switch( PolyShapeType )

View File

@ -120,9 +120,7 @@ bool Read_Hotkey_Config( WinEDA_DrawFrame * frame, bool verbose )
FullFileName = DEFAULT_HOTKEY_FILENAME_PATH; FullFileName = DEFAULT_HOTKEY_FILENAME_PATH;
FullFileName += wxT("module_edit"); FullFileName += wxT("module_edit");
FullFileName += DEFAULT_HOTKEY_FILENAME_EXT; FullFileName += DEFAULT_HOTKEY_FILENAME_EXT;
frame->ReadHotkeyConfigFile(FullFileName, s_module_edit_Hotkey_List, verbose); return frame->ReadHotkeyConfigFile(FullFileName, s_module_edit_Hotkey_List, verbose);
return TRUE;
} }

View File

@ -12,7 +12,7 @@
#include "id.h" #include "id.h"
#if defined(DEBUG) #if defined(DEBUG)
#include "class_collector.h" #include "collectors.h"
#endif #endif
@ -169,77 +169,6 @@ END_EVENT_TABLE()
#if defined(DEBUG)
class RAT1COLLECTOR : public COLLECTOR
{
;
};
class ARROWCOLLECTOR : public COLLECTOR
{
const KICAD_T* m_ScanTypes;
/**
* A place to hold collected objects which don't match precisely the search
* criteria, but would be acceptable if nothing else is found.
* "2nd" choice, which will be appended to the end of COLLECTOR's prime
* "list" at the end of the search.
*/
std::vector<EDA_BaseStruct*> list2nd;
public:
ARROWCOLLECTOR() :
COLLECTOR(0),
m_ScanTypes(0)
{
}
void Empty2nd()
{
list2nd.clear();
}
/**
* Function Inspect
* is the examining function within the INSPECTOR which is passed to the
* Iterate function. It is used primarily for searching, but not limited to
* that. It can also collect or modify the scanned objects.
*
* @param testItem An EDA_BaseStruct to examine.
* @param testData is arbitrary data needed by the inspector to determine
* if the EDA_BaseStruct under test meets its match criteria.
* @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
* else SCAN_CONTINUE;
*/
SEARCH_RESULT Inspect( EDA_BaseStruct* testItem, const void* testData )
{
const wxPoint& refPos = *(const wxPoint*) testData;
switch( testItem->m_StructType )
{
case TYPEMODULE:
if( testItem->HitTest( refPos ) )
Append( testItem );
break;
}
return SEARCH_CONTINUE;
}
void SetScanTypes( const KICAD_T* scanTypes )
{
m_ScanTypes = scanTypes;
}
};
#endif
///////****************************///////////: ///////****************************///////////:
/****************/ /****************/
@ -264,8 +193,7 @@ WinEDA_PcbFrame::WinEDA_PcbFrame( wxWindow* father, WinEDA_App* parent,
m_SelViaSizeBox_Changed = FALSE; m_SelViaSizeBox_Changed = FALSE;
#if defined(DEBUG) #if defined(DEBUG)
m_GeneralCollector = NULL; m_ArrowCollector = new ARROWCOLLECTOR();
m_RatsModuleCollector = NULL;
#endif #endif
m_DisplayPcbTrackFill = DisplayOpt.DisplayPcbTrackFill; m_DisplayPcbTrackFill = DisplayOpt.DisplayPcbTrackFill;
@ -313,6 +241,10 @@ WinEDA_PcbFrame::~WinEDA_PcbFrame( void )
{ {
m_Parent->m_PcbFrame = NULL; m_Parent->m_PcbFrame = NULL;
m_CurrentScreen = ScreenPcb; m_CurrentScreen = ScreenPcb;
#if defined(DEBUG)
delete m_ArrowCollector;
#endif
} }

View File

@ -148,7 +148,7 @@ WinEDA_TextPCBPropertiesFrame::WinEDA_TextPCBPropertiesFrame( WinEDA_PcbFrame* p
m_SelLayerBox->Append( ReturnPcbLayerName( ii ) ); m_SelLayerBox->Append( ReturnPcbLayerName( ii ) );
} }
m_SelLayerBox->SetSelection( TextPCB->m_Layer ); m_SelLayerBox->SetSelection( TextPCB->GetLayer() );
wxString orient_msg[4] = { wxT( "0" ), wxT( "90" ), wxT( "180" ), wxT( "-90" ) }; wxString orient_msg[4] = { wxT( "0" ), wxT( "90" ), wxT( "180" ), wxT( "-90" ) };
@ -216,7 +216,7 @@ void WinEDA_TextPCBPropertiesFrame::TextPCBPropertiesAccept( wxCommandEvent& eve
CurrentTextPCB->m_Width = m_TxtWidthCtlr->GetValue(); CurrentTextPCB->m_Width = m_TxtWidthCtlr->GetValue();
CurrentTextPCB->m_Miroir = (m_Mirror->GetSelection() == 0) ? 1 : 0; CurrentTextPCB->m_Miroir = (m_Mirror->GetSelection() == 0) ? 1 : 0;
CurrentTextPCB->m_Orient = m_Orient->GetSelection() * 900; CurrentTextPCB->m_Orient = m_Orient->GetSelection() * 900;
CurrentTextPCB->m_Layer = m_SelLayerBox->GetChoice(); CurrentTextPCB->SetLayer( m_SelLayerBox->GetChoice() );
CurrentTextPCB->CreateDrawData(); CurrentTextPCB->CreateDrawData();
if( m_DC ) // Affichage nouveau texte if( m_DC ) // Affichage nouveau texte
{ {
@ -349,13 +349,13 @@ TEXTE_PCB* WinEDA_PcbFrame::Create_Texte_Pcb( wxDC* DC )
TextePcb->Pback = (EDA_BaseStruct*) m_Pcb; TextePcb->Pback = (EDA_BaseStruct*) m_Pcb;
if( m_Pcb->m_Drawings ) if( m_Pcb->m_Drawings )
m_Pcb->m_Drawings->Pback = (EDA_BaseStruct*) TextePcb; m_Pcb->m_Drawings->Pback = (EDA_BaseStruct*) TextePcb;
m_Pcb->m_Drawings = (EDA_BaseStruct*) TextePcb; m_Pcb->m_Drawings = TextePcb;
/* Mise a jour des caracteristiques */ /* Mise a jour des caracteristiques */
TextePcb->m_Flags = IS_NEW; TextePcb->m_Flags = IS_NEW;
TextePcb->m_Layer = GetScreen()->m_Active_Layer; TextePcb->SetLayer( GetScreen()->m_Active_Layer );
TextePcb->m_Miroir = 1; TextePcb->m_Miroir = 1;
if( TextePcb->m_Layer == CUIVRE_N ) if( TextePcb->GetLayer() == CUIVRE_N )
TextePcb->m_Miroir = 0; TextePcb->m_Miroir = 0;
TextePcb->m_Size = g_DesignSettings.m_PcbTextSize; TextePcb->m_Size = g_DesignSettings.m_PcbTextSize;

View File

@ -203,12 +203,12 @@ wxString msg;
trace_val = Sel_Texte_Valeur; trace_val = Sel_Texte_Valeur;
trace_ref = Sel_Texte_Reference; // les 2 autorisations de tracer sont donnees trace_ref = Sel_Texte_Reference; // les 2 autorisations de tracer sont donnees
if( (g_TabOneLayerMask[Module->m_Reference->m_Layer] & masque_layer) == 0) if( (g_TabOneLayerMask[Module->m_Reference->GetLayer()] & masque_layer) == 0)
trace_ref = FALSE; trace_ref = FALSE;
if(Module->m_Reference->m_NoShow && !Sel_Texte_Invisible) if(Module->m_Reference->m_NoShow && !Sel_Texte_Invisible)
trace_ref = FALSE; trace_ref = FALSE;
if( (g_TabOneLayerMask[Module->m_Value->m_Layer] & masque_layer) == 0) if( (g_TabOneLayerMask[Module->m_Value->GetLayer()] & masque_layer) == 0)
trace_val = FALSE; trace_val = FALSE;
if(Module->m_Value->m_NoShow && !Sel_Texte_Invisible) if(Module->m_Value->m_NoShow && !Sel_Texte_Invisible)
trace_val = FALSE; trace_val = FALSE;
@ -238,7 +238,7 @@ wxString msg;
if( !Sel_Texte_Divers ) continue; if( !Sel_Texte_Divers ) continue;
if( (pt_texte->m_NoShow) && !Sel_Texte_Invisible ) if( (pt_texte->m_NoShow) && !Sel_Texte_Invisible )
continue; continue;
if( (g_TabOneLayerMask[pt_texte->m_Layer] & masque_layer) == 0) if( (g_TabOneLayerMask[pt_texte->GetLayer()] & masque_layer) == 0)
continue; continue;
PlotTextModule(pt_texte); PlotTextModule(pt_texte);
nb_items++ ; nb_items++ ;
@ -281,13 +281,13 @@ void PlotCotation( COTATION * Cotation, int format_plot,int masque_layer)
{ {
DRAWSEGMENT *DrawTmp; DRAWSEGMENT *DrawTmp;
if( (g_TabOneLayerMask[Cotation->m_Layer] & masque_layer) == 0) return; if( (g_TabOneLayerMask[Cotation->GetLayer()] & masque_layer) == 0) return;
DrawTmp = new DRAWSEGMENT(NULL); DrawTmp = new DRAWSEGMENT(NULL);
masque_layer |= EDGE_LAYER; masque_layer |= EDGE_LAYER;
DrawTmp->m_Width = Cotation->m_Width; DrawTmp->m_Width = Cotation->m_Width;
DrawTmp->m_Layer = Cotation->m_Layer; DrawTmp->SetLayer( Cotation->GetLayer() );
PlotTextePcb( Cotation->m_Text,format_plot, masque_layer); PlotTextePcb( Cotation->m_Text,format_plot, masque_layer);
@ -330,13 +330,13 @@ void PlotMirePcb( MIREPCB* Mire, int format_plot,int masque_layer)
DRAWSEGMENT *DrawTmp; DRAWSEGMENT *DrawTmp;
int dx1,dx2, dy1, dy2, rayon; int dx1,dx2, dy1, dy2, rayon;
if( (g_TabOneLayerMask[Mire->m_Layer] & masque_layer) == 0) return; if( (g_TabOneLayerMask[Mire->GetLayer()] & masque_layer) == 0) return;
DrawTmp = new DRAWSEGMENT(NULL); DrawTmp = new DRAWSEGMENT(NULL);
masque_layer |= EDGE_LAYER; masque_layer |= EDGE_LAYER;
DrawTmp->m_Width = Mire->m_Width; DrawTmp->m_Width = Mire->m_Width;
DrawTmp->m_Layer = Mire->m_Layer; DrawTmp->SetLayer( Mire->GetLayer() );
DrawTmp->m_Start.x = Mire->m_Pos.x; DrawTmp->m_Start.y = Mire->m_Pos.y; DrawTmp->m_Start.x = Mire->m_Pos.x; DrawTmp->m_Start.y = Mire->m_Pos.y;
DrawTmp->m_End.x = DrawTmp->m_Start.x + (Mire->m_Size / 4); DrawTmp->m_End.x = DrawTmp->m_Start.x + (Mire->m_Size / 4);
@ -384,7 +384,7 @@ wxString msg;
for ( ;PtEdge != NULL; PtEdge = (EDGE_MODULE*)PtEdge->Pnext) for ( ;PtEdge != NULL; PtEdge = (EDGE_MODULE*)PtEdge->Pnext)
{ {
if(PtEdge->m_StructType != TYPEEDGEMODULE) continue; if(PtEdge->m_StructType != TYPEEDGEMODULE) continue;
if( (g_TabOneLayerMask[PtEdge->m_Layer] & masque_layer) == 0) continue; if( (g_TabOneLayerMask[PtEdge->GetLayer()] & masque_layer) == 0) continue;
Plot_1_EdgeModule(format_plot, PtEdge); Plot_1_EdgeModule(format_plot, PtEdge);
} }
/* Affichage du nombre de modules traites */ /* Affichage du nombre de modules traites */
@ -488,7 +488,7 @@ wxPoint pos;
wxSize size; wxSize size;
if( pt_texte->m_Text.IsEmpty() ) return; if( pt_texte->m_Text.IsEmpty() ) return;
if( (g_TabOneLayerMask[pt_texte->m_Layer] & masque_layer) == 0 ) return ; if( (g_TabOneLayerMask[pt_texte->GetLayer()] & masque_layer) == 0 ) return ;
/* calcul des parametres du texte :*/ /* calcul des parametres du texte :*/
size = pt_texte->m_Size; size = pt_texte->m_Size;
@ -615,7 +615,7 @@ wxPoint start, end;
int epaisseur; int epaisseur;
int rayon = 0, StAngle = 0, EndAngle = 0; int rayon = 0, StAngle = 0, EndAngle = 0;
if( (g_TabOneLayerMask[pt_segm->m_Layer] & masque_layer) == 0) return; if( (g_TabOneLayerMask[pt_segm->GetLayer()] & masque_layer) == 0) return;
epaisseur = pt_segm->m_Width; epaisseur = pt_segm->m_Width;
if ( Plot_Mode == FILAIRE) epaisseur = g_PlotLine_Width; if ( Plot_Mode == FILAIRE) epaisseur = g_PlotLine_Width;

View File

@ -194,7 +194,7 @@ wxString msg;
switch( PtStruct->m_StructType ) switch( PtStruct->m_StructType )
{ {
case TYPEEDGEMODULE: case TYPEEDGEMODULE:
if( masque_layer & g_TabOneLayerMask[((EDGE_MODULE*)PtStruct)->m_Layer] ) if( masque_layer & g_TabOneLayerMask[((EDGE_MODULE*)PtStruct)->GetLayer()] )
Plot_1_EdgeModule(PLOT_FORMAT_GERBER, (EDGE_MODULE*) PtStruct); Plot_1_EdgeModule(PLOT_FORMAT_GERBER, (EDGE_MODULE*) PtStruct);
break; break;
@ -289,7 +289,7 @@ wxString msg;
wxPoint end; wxPoint end;
if ( track->m_StructType == TYPEVIA ) continue ; if ( track->m_StructType == TYPEVIA ) continue ;
if( (g_TabOneLayerMask[track->m_Layer] & masque_layer) == 0 ) continue; if( (g_TabOneLayerMask[track->GetLayer()] & masque_layer) == 0 ) continue;
size.x = size.y = track->m_Width; size.x = size.y = track->m_Width;
pos = track->m_Start; end = track->m_End; pos = track->m_Start; end = track->m_End;
@ -308,7 +308,7 @@ wxString msg;
{ {
wxPoint end; wxPoint end;
if( (g_TabOneLayerMask[track->m_Layer] & masque_layer) == 0 ) continue; if( (g_TabOneLayerMask[track->GetLayer()] & masque_layer) == 0 ) continue;
size.x = size.y = track->m_Width; size.x = size.y = track->m_Width;
pos = track->m_Start; end = track->m_End; pos = track->m_Start; end = track->m_End;

View File

@ -52,9 +52,11 @@ bool Center = FALSE;
pen_rayon = pen_diam / 2; pen_rayon = pen_diam / 2;
nb_plot_erreur = 0; nb_plot_erreur = 0;
// compute pen_recouvrement (from g_HPGL_Pen_Recouvrement in mils) // compute pen_recouvrement (from g_HPGL_Pen_Recouvrement in mils)
// with plot scale // with plot scale
if(g_HPGL_Pen_Recouvrement < 0 ) g_HPGL_Pen_Recouvrement = 0 ; if( g_HPGL_Pen_Recouvrement < 0 )
g_HPGL_Pen_Recouvrement = 0;
if( g_HPGL_Pen_Recouvrement >= g_HPGL_Pen_Diam ) if( g_HPGL_Pen_Recouvrement >= g_HPGL_Pen_Diam )
g_HPGL_Pen_Recouvrement = g_HPGL_Pen_Diam - 1; g_HPGL_Pen_Recouvrement = g_HPGL_Pen_Diam - 1;
pen_recouvrement = (int) round( g_HPGL_Pen_Recouvrement * 10.0 / Scale_X ); pen_recouvrement = (int) round( g_HPGL_Pen_Recouvrement * 10.0 / Scale_X );
@ -91,19 +93,21 @@ bool Center = FALSE;
float Xscale, Yscale; float Xscale, Yscale;
Xscale = (float) ( SheetSize.x - ( 2 * marge) ) / BoardSize.x; Xscale = (float) ( SheetSize.x - ( 2 * marge) ) / BoardSize.x;
Yscale = (float) ( SheetSize.y - ( 2 * marge) ) / BoardSize.y; Yscale = (float) ( SheetSize.y - ( 2 * marge) ) / BoardSize.y;
scale_x = scale_y = min( Xscale, Yscale) * SCALE_HPGL; scale_x = scale_y = MIN( Xscale, Yscale ) * SCALE_HPGL;
} }
BoardCenter.x = (int) (BoardCenter.x * scale_x); BoardCenter.x = (int) (BoardCenter.x * scale_x);
BoardCenter.y = (int) (BoardCenter.y * scale_y); BoardCenter.y = (int) (BoardCenter.y * scale_y);
if( g_PlotScaleOpt != 1 ) Center = TRUE; // Echelle != 1 if( g_PlotScaleOpt != 1 )
Center = TRUE; // Echelle != 1
/* Calcul du cadrage */ /* Calcul du cadrage */
marge = (int) (marge * SCALE_HPGL); marge = (int) (marge * SCALE_HPGL);
if( Center ) if( Center )
g_PlotOffset.x = (int) (-SheetSize.x / 2 * SCALE_HPGL) + g_PlotOffset.x = (int) (-SheetSize.x / 2 * SCALE_HPGL) +
BoardCenter.x + marge; BoardCenter.x + marge;
switch( g_PlotOrient ) switch( g_PlotOrient )
{ {
default: default:
@ -117,12 +121,15 @@ bool Center = FALSE;
case PLOT_MIROIR: case PLOT_MIROIR:
if( Center ) if( Center )
g_PlotOffset.y = (int) (-SheetSize.y / 2 * SCALE_HPGL) + BoardCenter.y; g_PlotOffset.y = (int) (-SheetSize.y / 2 * SCALE_HPGL) + BoardCenter.y;
else g_PlotOffset.y = (int)((- SheetSize.y + else
m_Pcb->m_BoundaryBox.GetBottom() + m_Pcb->m_BoundaryBox.GetY()) * SCALE_HPGL); g_PlotOffset.y = (int) ( ( -SheetSize.y +
m_Pcb->m_BoundaryBox.GetBottom() +
m_Pcb->m_BoundaryBox.GetY() ) * SCALE_HPGL );
break; break;
} }
InitPlotParametresHPGL( g_PlotOffset, scale_x, scale_y, g_PlotOrient ); InitPlotParametresHPGL( g_PlotOffset, scale_x, scale_y, g_PlotOrient );
switch( Layer ) switch( Layer )
{ {
case CUIVRE_N: case CUIVRE_N:
@ -140,7 +147,8 @@ bool Center = FALSE;
case LAYER_N_13: case LAYER_N_13:
case LAYER_N_14: case LAYER_N_14:
case LAYER_N_15: case LAYER_N_15:
case CMP_N : Plot_Layer_HPGL(dest,g_TabOneLayerMask[Layer], 0, 1, modetrace); case CMP_N:
Plot_Layer_HPGL( dest, g_TabOneLayerMask[Layer], 0, 1, modetrace );
break; break;
case SILKSCREEN_N_CU: case SILKSCREEN_N_CU:
@ -152,8 +160,10 @@ bool Center = FALSE;
case SOLDERMASK_N_CMP: /* Trace du vernis epargne */ case SOLDERMASK_N_CMP: /* Trace du vernis epargne */
{ {
int tracevia; int tracevia;
if (g_DrawViaOnMaskLayer) tracevia = 1; if( g_DrawViaOnMaskLayer )
else tracevia = 0; tracevia = 1;
else
tracevia = 0;
Plot_Layer_HPGL( dest, g_TabOneLayerMask[Layer], Plot_Layer_HPGL( dest, g_TabOneLayerMask[Layer],
g_DesignSettings.m_MaskMargin, tracevia, modetrace ); g_DesignSettings.m_MaskMargin, tracevia, modetrace );
} }
@ -168,10 +178,10 @@ bool Center = FALSE;
Plot_Serigraphie( PLOT_FORMAT_HPGL, dest, g_TabOneLayerMask[Layer] ); Plot_Serigraphie( PLOT_FORMAT_HPGL, dest, g_TabOneLayerMask[Layer] );
break; break;
} }
/* fin */ /* fin */
CloseFileHPGL( dest ); CloseFileHPGL( dest );
setlocale( LC_NUMERIC, "" ); setlocale( LC_NUMERIC, "" );
} }
@ -181,7 +191,7 @@ void WinEDA_BasePcbFrame::Plot_Layer_HPGL(FILE * File,int masque_layer,
/*********************************************************************/ /*********************************************************************/
/* Trace en format HPGL. d'une couche cuivre ou masque /* Trace en format HPGL. d'une couche cuivre ou masque
1 unite HPGL = 0.98 mils ( 1 mil = 1.02041 unite HPGL ) . * 1 unite HPGL = 0.98 mils ( 1 mil = 1.02041 unite HPGL ) .
*/ */
{ {
wxSize size; wxSize size;
@ -189,14 +199,14 @@ wxPoint start, end;
MODULE* Module; MODULE* Module;
D_PAD* PtPad; D_PAD* PtPad;
TRACK* pts; TRACK* pts;
EDA_BaseStruct * PtStruct; BOARD_ITEM* PtStruct;
wxString msg; wxString msg;
masque_layer |= EDGE_LAYER; /* Les elements de la couche EDGE sont tj traces */ masque_layer |= EDGE_LAYER; /* Les elements de la couche EDGE sont tj traces */
/* trace des elements type Drawings Pcb : */ /* trace des elements type Drawings Pcb : */
PtStruct = m_Pcb->m_Drawings; PtStruct = m_Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext ) for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
{ {
switch( PtStruct->m_StructType ) switch( PtStruct->m_StructType )
{ {
@ -229,7 +239,6 @@ wxString msg;
} }
} }
/* Trace des Elements des modules autres que pads */ /* Trace des Elements des modules autres que pads */
nb_items = 0; nb_items = 0;
Affiche_1_Parametre( this, 48, wxT( "DrawMod" ), wxEmptyString, GREEN ); Affiche_1_Parametre( this, 48, wxT( "DrawMod" ), wxEmptyString, GREEN );
@ -237,17 +246,18 @@ wxString msg;
for( ; Module != NULL; Module = (MODULE*) Module->Pnext ) for( ; Module != NULL; Module = (MODULE*) Module->Pnext )
{ {
PtStruct = Module->m_Drawings; PtStruct = Module->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext ) for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
{ {
switch( PtStruct->m_StructType ) switch( PtStruct->m_StructType )
{ {
case TYPEEDGEMODULE: case TYPEEDGEMODULE:
if( masque_layer & if( masque_layer &
g_TabOneLayerMask[((EDGE_MODULE*)PtStruct)->m_Layer] ) g_TabOneLayerMask[ PtStruct->GetLayer() ] )
Plot_1_EdgeModule( PLOT_FORMAT_HPGL, (EDGE_MODULE*) PtStruct ); Plot_1_EdgeModule( PLOT_FORMAT_HPGL, (EDGE_MODULE*) PtStruct );
break; break;
default: break; default:
break;
} }
} }
} }
@ -271,6 +281,7 @@ wxString msg;
size.x += garde * 2; size.y += garde * 2; size.x += garde * 2; size.y += garde * 2;
nb_items++; nb_items++;
switch( PtPad->m_PadShape & 0x7F ) switch( PtPad->m_PadShape & 0x7F )
{ {
case CIRCLE: case CIRCLE:
@ -298,6 +309,7 @@ wxString msg;
PtPad->m_Orient, modetrace ); PtPad->m_Orient, modetrace );
break; break;
} }
msg.Printf( wxT( "%d" ), nb_items ); msg.Printf( wxT( "%d" ), nb_items );
Affiche_1_Parametre( this, 48, wxT( "Pads" ), msg, GREEN ); Affiche_1_Parametre( this, 48, wxT( "Pads" ), msg, GREEN );
} }
@ -313,16 +325,21 @@ wxString msg;
for( pts = m_Pcb->m_Track; pts != NULL; pts = (TRACK*) pts->Pnext ) for( pts = m_Pcb->m_Track; pts != NULL; pts = (TRACK*) pts->Pnext )
{ {
if( pts->m_StructType != TYPEVIA ) continue; if( pts->m_StructType != TYPEVIA )
continue;
SEGVIA* Via = (SEGVIA*) pts; SEGVIA* Via = (SEGVIA*) pts;
/* vias not plotted if not on selected layer, but if layer /* vias not plotted if not on selected layer, but if layer
== SOLDERMASK_LAYER_CU or SOLDERMASK_LAYER_CMP, vias are drawn , * == SOLDERMASK_LAYER_CU or SOLDERMASK_LAYER_CMP, vias are drawn ,
if they are on a external copper layer * if they are on a external copper layer
*/ */
int via_mask_layer = Via->ReturnMaskLayer(); int via_mask_layer = Via->ReturnMaskLayer();
if ( (via_mask_layer & CUIVRE_LAYER ) ) via_mask_layer |= SOLDERMASK_LAYER_CU; if( (via_mask_layer & CUIVRE_LAYER ) )
if ( (via_mask_layer & CMP_LAYER ) ) via_mask_layer |= SOLDERMASK_LAYER_CMP; via_mask_layer |= SOLDERMASK_LAYER_CU;
if( (via_mask_layer & masque_layer) == 0 ) continue; if( (via_mask_layer & CMP_LAYER ) )
via_mask_layer |= SOLDERMASK_LAYER_CMP;
if( (via_mask_layer & masque_layer) == 0 )
continue;
start = Via->m_Start; start = Via->m_Start;
size.x = Via->m_Width + (garde * 2); size.x = Via->m_Width + (garde * 2);
@ -331,6 +348,7 @@ wxString msg;
nb_items++; msg.Printf( wxT( "%d" ), nb_items ); nb_items++; msg.Printf( wxT( "%d" ), nb_items );
Affiche_1_Parametre( this, 56, wxT( "Vias" ), msg, RED ); Affiche_1_Parametre( this, 56, wxT( "Vias" ), msg, RED );
} }
fputs( "PU;\n", dest ); fputs( "PU;\n", dest );
} }
@ -339,9 +357,11 @@ wxString msg;
Affiche_1_Parametre( this, 64, wxT( "Tracks " ), wxEmptyString, YELLOW ); Affiche_1_Parametre( this, 64, wxT( "Tracks " ), wxEmptyString, YELLOW );
for( pts = m_Pcb->m_Track; pts != NULL; pts = (TRACK*) pts->Pnext ) for( pts = m_Pcb->m_Track; pts != NULL; pts = (TRACK*) pts->Pnext )
{ {
if ( pts->m_StructType == TYPEVIA ) continue ; if( pts->m_StructType == TYPEVIA )
continue;
if( (g_TabOneLayerMask[pts->m_Layer] & masque_layer) == 0 ) continue; if( (g_TabOneLayerMask[pts->GetLayer()] & masque_layer) == 0 )
continue;
size.x = size.y = pts->m_Width; size.x = size.y = pts->m_Width;
start = pts->m_Start; start = pts->m_Start;
@ -358,7 +378,7 @@ wxString msg;
while( ( size.x -= (int) ( (pen_rayon - pen_recouvrement) * 2 ) ) > 0 ) while( ( size.x -= (int) ( (pen_rayon - pen_recouvrement) * 2 ) ) > 0 )
{ {
trace_1_segment_HPGL( start.x, start.y, end.x, end.y, trace_1_segment_HPGL( start.x, start.y, end.x, end.y,
max(size.x,pen_diam) ) ; MAX( size.x, pen_diam ) );
} }
} }
@ -374,7 +394,7 @@ wxString msg;
Affiche_1_Parametre( this, 64, wxT( "Zones " ), wxEmptyString, YELLOW ); Affiche_1_Parametre( this, 64, wxT( "Zones " ), wxEmptyString, YELLOW );
for( pts = m_Pcb->m_Zone; pts != NULL; pts = (TRACK*) pts->Pnext ) for( pts = m_Pcb->m_Zone; pts != NULL; pts = (TRACK*) pts->Pnext )
{ {
if( g_TabOneLayerMask[pts->m_Layer] & masque_layer) if( g_TabOneLayerMask[pts->GetLayer()] & masque_layer )
{ {
size.x = size.y = pts->m_Width; size.x = size.y = pts->m_Width;
start = pts->m_Start; start = pts->m_Start;
@ -391,7 +411,7 @@ wxString msg;
while( ( size.x -= (int) ( (pen_rayon - pen_recouvrement) * 2 ) ) > 0 ) while( ( size.x -= (int) ( (pen_rayon - pen_recouvrement) * 2 ) ) > 0 )
{ {
trace_1_segment_HPGL( start.x, start.y, end.x, end.y, trace_1_segment_HPGL( start.x, start.y, end.x, end.y,
max(size.x,pen_diam)) ; MAX( size.x, pen_diam ) );
} }
} }
@ -414,11 +434,12 @@ int rayon, deltaxy , cx, cy;
int trace_orient = orient; int trace_orient = orient;
/* la pastille est ramenee a une pastille ovale avec size.y > size.x /* la pastille est ramenee a une pastille ovale avec size.y > size.x
( ovale vertical en orientation 0 ) */ * ( ovale vertical en orientation 0 ) */
if( size.x > size.y ) if( size.x > size.y )
{ {
EXCHG( size.x, size.y ); trace_orient += 900; EXCHG( size.x, size.y ); trace_orient += 900;
if ( orient >= 3600 ) trace_orient -= 3600; if( orient >= 3600 )
trace_orient -= 3600;
} }
deltaxy = size.y - size.x; /* = distance entre centres de l'ovale */ deltaxy = size.y - size.x; /* = distance entre centres de l'ovale */
rayon = size.x / 2; rayon = size.x / 2;
@ -435,7 +456,6 @@ int trace_orient = orient;
RotatePoint( &cx, &cy, trace_orient ); RotatePoint( &cx, &cy, trace_orient );
trace_1_pastille_RONDE_HPGL( wxPoint( cx + pos.x, cy + pos.y ), size.x, modetrace ); trace_1_pastille_RONDE_HPGL( wxPoint( cx + pos.x, cy + pos.y ), size.x, modetrace );
} }
else /* Trace en mode FILAIRE */ else /* Trace en mode FILAIRE */
{ {
cx = -rayon; cy = -deltaxy / 2; cx = -rayon; cy = -deltaxy / 2;
@ -490,6 +510,7 @@ int rayon, delta;
rayon = 0; nb_plot_erreur++; Affiche_erreur( nb_plot_erreur ); rayon = 0; nb_plot_erreur++; Affiche_erreur( nb_plot_erreur );
} }
wxSize rsize( rayon, rayon ); wxSize rsize( rayon, rayon );
UserToDeviceSize( rsize ); UserToDeviceSize( rsize );
Plume_HPGL( 'U' ); Plume_HPGL( 'U' );
@ -511,14 +532,16 @@ int rayon, delta;
Plume_HPGL( 'U' ); return; Plume_HPGL( 'U' ); return;
} }
/***************************************************************/ /***************************************************************/
void PlotRectangularPad_HPGL( wxPoint padpos, wxSize padsize, void PlotRectangularPad_HPGL( wxPoint padpos, wxSize padsize,
int orient, int modetrace ) int orient, int modetrace )
/****************************************************************/ /****************************************************************/
/* /*
Trace 1 pad rectangulaire vertical ou horizontal ( Pad rectangulaire ) * Trace 1 pad rectangulaire vertical ou horizontal ( Pad rectangulaire )
donne par son centre et ses dimensions X et Y * donne par son centre et ses dimensions X et Y
Units are user units * Units are user units
*/ */
{ {
wxSize size; wxSize size;
@ -536,7 +559,9 @@ int ox, oy, fx, fy;
{ {
nb_plot_erreur++; Affiche_erreur( nb_plot_erreur ); nb_plot_erreur++; Affiche_erreur( nb_plot_erreur );
} }
if ( size.x < 0 ) size.x = 0 ; if ( size.y < 0 ) size.y = 0 ; if( size.x < 0 )
size.x = 0;if( size.y < 0 )
size.y = 0;
/* Si une des dimensions est nulle, le trace se reduit a 1 trait */ /* Si une des dimensions est nulle, le trace se reduit a 1 trait */
if( size.x == 0 ) if( size.x == 0 )
@ -589,7 +614,9 @@ int ox, oy, fx, fy;
while( (size.x > 0) && (size.y > 0) ) while( (size.x > 0) && (size.y > 0) )
{ {
size.x -= delta; size.y -= delta; size.x -= delta; size.y -= delta;
if ( size.x < 0 ) size.x = 0 ; if ( size.y < 0 ) size.y = 0 ; if( size.x < 0 )
size.x = 0;if( size.y < 0 )
size.y = 0;
ox = padpos.x - size.x; oy = padpos.y - size.y; ox = padpos.x - size.x; oy = padpos.y - size.y;
RotatePoint( &ox, &oy, padpos.x, padpos.y, orient ); RotatePoint( &ox, &oy, padpos.x, padpos.y, orient );
@ -609,6 +636,7 @@ int ox, oy, fx, fy;
Move_Plume_HPGL( wxPoint( ox, oy ), 'D' ); Move_Plume_HPGL( wxPoint( ox, oy ), 'D' );
} }
Plume_HPGL( 'U' ); Plume_HPGL( 'U' );
} }
@ -617,22 +645,23 @@ int ox, oy, fx, fy;
void trace_1_pad_TRAPEZE_HPGL( wxPoint padpos, wxSize size, wxSize delta, void trace_1_pad_TRAPEZE_HPGL( wxPoint padpos, wxSize size, wxSize delta,
int orient, int modetrace ) int orient, int modetrace )
/********************************************************************/ /********************************************************************/
/*
Trace 1 pad trapezoidal donne par :
son centre padpos.x,padpos.y
ses dimensions dimX et dimY
les variations deltaX et deltaY
son orientation orient et 0.1 degres
le mode de trace (FILLED, SKETCH, FILAIRE)
Le trace n'est fait que pour un trapeze, c.a.d que deltaX ou deltaY
= 0.
les notation des sommets sont ( vis a vis de la table tracante ) /*
0 ------------- 3 * Trace 1 pad trapezoidal donne par :
. . * son centre padpos.x,padpos.y
. . * ses dimensions dimX et dimY
. . * les variations deltaX et deltaY
1 --- 2 * son orientation orient et 0.1 degres
* le mode de trace (FILLED, SKETCH, FILAIRE)
* Le trace n'est fait que pour un trapeze, c.a.d que deltaX ou deltaY
* = 0.
*
* les notation des sommets sont ( vis a vis de la table tracante )
* 0 ------------- 3
* . .
* . .
* . .
* 1 --- 2
*/ */
{ {
int ii, jj; int ii, jj;
@ -641,9 +670,10 @@ wxPoint coord[4]; /* coord reelles des sommets du trapeze a tracer */
float fangle; /* angle d'inclinaison des cotes du trapeze */ float fangle; /* angle d'inclinaison des cotes du trapeze */
int rayon; /* rayon de la plume */ int rayon; /* rayon de la plume */
int moveX, moveY;/* variation de position plume selon axe X et Y , lors int moveX, moveY;/* variation de position plume selon axe X et Y , lors
du remplissage du trapeze */ * du remplissage du trapeze */
rayon = (int) pen_rayon; if (modetrace == FILAIRE) rayon = 0; rayon = (int) pen_rayon; if( modetrace == FILAIRE )
rayon = 0;
moveX = moveY = rayon; moveX = moveY = rayon;
size.x /= 2; size.y /= 2; size.x /= 2; size.y /= 2;
@ -660,7 +690,6 @@ int moveX, moveY; /* variation de position plume selon axe X et Y , lors
fangle = atan2( (float) (polygone[1].y - polygone[0].y), fangle = atan2( (float) (polygone[1].y - polygone[0].y),
(float) (polygone[1].x - polygone[0].x) ) / 2; (float) (polygone[1].x - polygone[0].x) ) / 2;
} }
else else
{ {
fangle = atan2( (float) (polygone[3].y - polygone[0].y), fangle = atan2( (float) (polygone[3].y - polygone[0].y),
@ -718,8 +747,8 @@ int moveX, moveY; /* variation de position plume selon axe X et Y , lors
polygone[3].x -= moveX; polygone[3].y -= moveY; polygone[3].x -= moveX; polygone[3].y -= moveY;
/* Test de limitation de variation des dimensions : /* Test de limitation de variation des dimensions :
si les sommets se "croisent", il ne faut plus modifier les * si les sommets se "croisent", il ne faut plus modifier les
coordonnees correspondantes */ * coordonnees correspondantes */
if( polygone[0].x > polygone[3].x ) if( polygone[0].x > polygone[3].x )
{ /* croisement sur axe X des 2 sommets 0 et 3 */ { /* croisement sur axe X des 2 sommets 0 et 3 */
polygone[0].x = polygone[3].x = 0; polygone[0].x = polygone[3].x = 0;
@ -761,13 +790,13 @@ void trace_1_segment_HPGL(int pos_X0,int pos_Y0,int pos_X1,int pos_Y1,
/********************************************************************/ /********************************************************************/
/* Trace 1 rectangle donne par son axe et son epaisseur (piste rectangulaire) /* Trace 1 rectangle donne par son axe et son epaisseur (piste rectangulaire)
en mode SKETCH * en mode SKETCH
*/ */
{ {
float alpha; /* angle de l'axe du rectangle */ float alpha; /* angle de l'axe du rectangle */
wxSize size; /* coord relatives a l'origine du segment de sa fin */ wxSize size; /* coord relatives a l'origine du segment de sa fin */
int dh; /* demi epaisseur du segment compte tenu de la int dh; /* demi epaisseur du segment compte tenu de la
largeur de la plume */ * largeur de la plume */
int dx_rot; /* coord du segment en repere modifie ( size.y_rot etant nul )*/ int dx_rot; /* coord du segment en repere modifie ( size.y_rot etant nul )*/
float sin_alpha, cos_alpha; float sin_alpha, cos_alpha;
@ -802,7 +831,8 @@ float sin_alpha, cos_alpha ;
} }
else if( size.x == 0 ) /* vertical */ else if( size.x == 0 ) /* vertical */
{ {
if( size.y < 0 ) dh = -dh ; if( size.y < 0 )
dh = -dh;
Move_Plume_HPGL( wxPoint( pos_X0 - dh, pos_Y0 ), 'U' ); Move_Plume_HPGL( wxPoint( pos_X0 - dh, pos_Y0 ), 'U' );
Move_Plume_HPGL( wxPoint( pos_X1 - dh, pos_Y1 ), 'D' ); Move_Plume_HPGL( wxPoint( pos_X1 - dh, pos_Y1 ), 'D' );
Move_Plume_HPGL( wxPoint( pos_X1 + dh, pos_Y1 ), 'D' ); Move_Plume_HPGL( wxPoint( pos_X1 + dh, pos_Y1 ), 'D' );
@ -812,15 +842,15 @@ float sin_alpha, cos_alpha ;
else /* piste inclinee */ else /* piste inclinee */
{ {
/* On calcule les coord des extremites du rectangle dans le repere /* On calcule les coord des extremites du rectangle dans le repere
a axe x confondu avec l'axe du rect. puis on revient dans le repere * a axe x confondu avec l'axe du rect. puis on revient dans le repere
de trace par 2 rotations inverses * de trace par 2 rotations inverses
coord : xrot = x*cos + y*sin * coord : xrot = x*cos + y*sin
yrot = y*cos - x*sin * yrot = y*cos - x*sin
*
avec ici yrot = 0 puisque le segment est horizontal dans le nouveau repere * avec ici yrot = 0 puisque le segment est horizontal dans le nouveau repere
Transformee inverse : * Transformee inverse :
coord : x = xrot*cos - yrot*sin * coord : x = xrot*cos - yrot*sin
y = yrot*cos + xrot*sin * y = yrot*cos + xrot*sin
*/ */
int dx0, dy0, dx1, dy1; int dx0, dy0, dx1, dy1;
@ -868,6 +898,3 @@ float sin_alpha, cos_alpha ;
} }
Plume_HPGL( 'U' ); Plume_HPGL( 'U' );
} }

View File

@ -17,6 +17,7 @@
// Routines Locales // Routines Locales
static void PrintDrillMark( BOARD* Pcb ); static void PrintDrillMark( BOARD* Pcb );
static Ki_PageDescr* SheetPS; static Ki_PageDescr* SheetPS;
// variables locales: // variables locales:
@ -60,6 +61,7 @@ int PlotMarge_in_mils = 0;
Center = TRUE; // Echelle != 1 donc trace centree du PCB Center = TRUE; // Echelle != 1 donc trace centree du PCB
modetrace = Plot_Mode; modetrace = Plot_Mode;
scale_format = 1.0; scale_format = 1.0;
// Set default line width // Set default line width
if( g_PlotLine_Width < 1 ) if( g_PlotLine_Width < 1 )
g_PlotLine_Width = 1; g_PlotLine_Width = 1;
@ -83,6 +85,7 @@ int PlotMarge_in_mils = 0;
// calcul de l'offset de trace: // calcul de l'offset de trace:
// calcul du cadrage horizontal du mode paysage ( val algebr. plus grande = decalage a gauche ) // calcul du cadrage horizontal du mode paysage ( val algebr. plus grande = decalage a gauche )
g_PlotOffset.x = PlotMarge_in_mils * U_PCB; g_PlotOffset.x = PlotMarge_in_mils * U_PCB;
// cadrage vertical du mode paysage ( val algebr. plus grande = decalage vers le haut ) // cadrage vertical du mode paysage ( val algebr. plus grande = decalage vers le haut )
g_PlotOffset.y = PaperSize.y - PlotMarge_in_mils * U_PCB; g_PlotOffset.y = PaperSize.y - PlotMarge_in_mils * U_PCB;
@ -119,7 +122,7 @@ int PlotMarge_in_mils = 0;
noprint_size += 500 * U_PCB; noprint_size += 500 * U_PCB;
Xscale = (float) ( PaperSize.x - noprint_size ) / BoardSize.x; Xscale = (float) ( PaperSize.x - noprint_size ) / BoardSize.x;
Yscale = (float) ( PaperSize.y - noprint_size ) / BoardSize.y; Yscale = (float) ( PaperSize.y - noprint_size ) / BoardSize.y;
scale_x = scale_y = min( Xscale, Yscale ); scale_x = scale_y = MIN( Xscale, Yscale );
} }
BoardCenter.x = (int) (BoardCenter.x * scale_x); BoardCenter.x = (int) (BoardCenter.x * scale_x);
@ -214,6 +217,7 @@ int PlotMarge_in_mils = 0;
Plot_Serigraphie( PLOT_FORMAT_POST, dest, g_TabOneLayerMask[Layer] ); Plot_Serigraphie( PLOT_FORMAT_POST, dest, g_TabOneLayerMask[Layer] );
break; break;
} }
// fin // fin
CloseFilePS( dest ); CloseFilePS( dest );
setlocale( LC_NUMERIC, "" ); setlocale( LC_NUMERIC, "" );
@ -233,14 +237,14 @@ wxSize size;
MODULE* Module; MODULE* Module;
D_PAD* PtPad; D_PAD* PtPad;
TRACK* pts; TRACK* pts;
EDA_BaseStruct * PtStruct; BOARD_ITEM* PtStruct;
wxString msg; wxString msg;
masque_layer |= EDGE_LAYER; // Les elements de la couche EDGE sont tj traces masque_layer |= EDGE_LAYER; // Les elements de la couche EDGE sont tj traces
// trace des elements type Drawings Pcb : // trace des elements type Drawings Pcb :
PtStruct = m_Pcb->m_Drawings; PtStruct = m_Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext ) for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
{ {
switch( PtStruct->m_StructType ) switch( PtStruct->m_StructType )
{ {
@ -268,7 +272,8 @@ wxString msg;
break; break;
default: default:
DisplayError(this, wxT("WinEDA_BasePcbFrame::Plot_Layer_PS() : Unexpected Draw Type")); DisplayError( this,
wxT( "WinEDA_BasePcbFrame::Plot_Layer_PS() : Unexpected Draw Type" ) );
break; break;
} }
} }
@ -280,12 +285,12 @@ wxString msg;
for( ; Module != NULL; Module = (MODULE*) Module->Pnext ) for( ; Module != NULL; Module = (MODULE*) Module->Pnext )
{ {
PtStruct = Module->m_Drawings; PtStruct = Module->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext ) for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
{ {
switch( PtStruct->m_StructType ) switch( PtStruct->m_StructType )
{ {
case TYPEEDGEMODULE: case TYPEEDGEMODULE:
if( masque_layer & g_TabOneLayerMask[((EDGE_MODULE*)PtStruct)->m_Layer] ) if( masque_layer & g_TabOneLayerMask[ PtStruct->GetLayer() ] )
Plot_1_EdgeModule( PLOT_FORMAT_POST, (EDGE_MODULE*) PtStruct ); Plot_1_EdgeModule( PLOT_FORMAT_POST, (EDGE_MODULE*) PtStruct );
break; break;
@ -338,10 +343,12 @@ wxString msg;
trace_1_pad_rectangulaire_POST( pos, size, PtPad->m_Orient, modetrace ); trace_1_pad_rectangulaire_POST( pos, size, PtPad->m_Orient, modetrace );
break; break;
} }
msg.Printf( wxT( "%d" ), nb_items ); msg.Printf( wxT( "%d" ), nb_items );
Affiche_1_Parametre( this, 48, wxT( "Pads" ), msg, GREEN ); Affiche_1_Parametre( this, 48, wxT( "Pads" ), msg, GREEN );
} }
} }
// trace des VIAS : // trace des VIAS :
if( tracevia ) if( tracevia )
{ {
@ -352,6 +359,7 @@ wxString msg;
if( pts->m_StructType != TYPEVIA ) if( pts->m_StructType != TYPEVIA )
continue; continue;
SEGVIA* Via = (SEGVIA*) pts; SEGVIA* Via = (SEGVIA*) pts;
// vias not plotted if not on selected layer, but if layer // vias not plotted if not on selected layer, but if layer
// == SOLDERMASK_LAYER_CU or SOLDERMASK_LAYER_CMP, vias are drawn, // == SOLDERMASK_LAYER_CU or SOLDERMASK_LAYER_CMP, vias are drawn,
// if they are on a external copper layer // if they are on a external copper layer
@ -371,6 +379,7 @@ wxString msg;
Affiche_1_Parametre( this, 56, wxEmptyString, msg, RED ); Affiche_1_Parametre( this, 56, wxEmptyString, msg, RED );
} }
} }
// trace des pistes et zones: // trace des pistes et zones:
nb_items = 0; nb_items = 0;
Affiche_1_Parametre( this, 64, _( "Tracks" ), wxEmptyString, YELLOW ); Affiche_1_Parametre( this, 64, _( "Tracks" ), wxEmptyString, YELLOW );
@ -380,7 +389,7 @@ wxString msg;
if( pts->m_StructType == TYPEVIA ) if( pts->m_StructType == TYPEVIA )
continue; continue;
if( (g_TabOneLayerMask[pts->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[pts->GetLayer()] & masque_layer) == 0 )
continue; continue;
size.x = size.y = pts->m_Width; size.x = size.y = pts->m_Width;
pos = pts->m_Start; pos = pts->m_Start;
@ -398,7 +407,7 @@ wxString msg;
for( pts = m_Pcb->m_Zone; pts != NULL; pts = (TRACK*) pts->Pnext ) for( pts = m_Pcb->m_Zone; pts != NULL; pts = (TRACK*) pts->Pnext )
{ {
if( (g_TabOneLayerMask[pts->m_Layer] & masque_layer) == 0 ) if( (g_TabOneLayerMask[pts->GetLayer()] & masque_layer) == 0 )
continue; continue;
size.x = size.y = pts->m_Width; size.x = size.y = pts->m_Width;
pos = pts->m_Start; pos = pts->m_Start;
@ -555,6 +564,7 @@ void trace_1_pastille_RONDE_POST(wxPoint centre, int diametre, int modetrace)
*/ */
{ {
int rayon, w; int rayon, w;
wxSize diam( diametre, diametre ); wxSize diam( diametre, diametre );
UserToDeviceCoordinate( centre ); UserToDeviceCoordinate( centre );
@ -735,6 +745,7 @@ int l_pen; // diam spot (plume)
if( modetrace == FILAIRE || Plot_Mode == FILAIRE ) if( modetrace == FILAIRE || Plot_Mode == FILAIRE )
{ {
wxSize lsize( g_PlotLine_Width, g_PlotLine_Width ); wxSize lsize( g_PlotLine_Width, g_PlotLine_Width );
UserToDeviceSize( lsize ); UserToDeviceSize( lsize );
l_pen = lsize.x; l_pen = lsize.x;
} }
@ -777,4 +788,3 @@ int l_pen; // diam spot (plume)
fprintf( dest, "fill " ); fprintf( dest, "fill " );
fprintf( dest, "stroke\n" ); fprintf( dest, "stroke\n" );
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,7 @@
/****************************************/ /****************************************/
/* EDITEUR de PCB: Menus d'AUTOROUTAGE: */ /* EDITEUR de PCB: Menus d'AUTOROUTAGE: */
/****************************************/ /****************************************/
// #define ROUTER // #define ROUTER
#include "fctsys.h" #include "fctsys.h"
@ -27,7 +28,6 @@ static void ReturnNbViasAndTracks(BOARD * Pcb, int netcode, int * nb_vias, int *
static int min_layer, max_layer; static int min_layer, max_layer;
/******************************************/ /******************************************/
void WinEDA_PcbFrame::GlobalRoute( wxDC* DC ) void WinEDA_PcbFrame::GlobalRoute( wxDC* DC )
/******************************************/ /******************************************/
@ -120,7 +120,8 @@ int net_number;
{ {
int dir; int dir;
dir = 3; /* horizontal */ dir = 3; /* horizontal */
if (ii & 1 ) dir = 1; /* vertical */ if( ii & 1 )
dir = 1; /* vertical */
fprintf( outfile, "l %d %d\n", ii, dir ); /* layer direction record */ fprintf( outfile, "l %d %d\n", ii, dir ); /* layer direction record */
} }
@ -146,18 +147,20 @@ static void Out_Pads(BOARD * Pcb, FILE * outfile)
/************************************************/ /************************************************/
{ {
D_PAD* pt_pad; D_PAD* pt_pad;
//MODULE * Module; //MODULE * Module;
int netcode, mod_num, nb_pads, plink; int netcode, mod_num, nb_pads, plink;
LISTE_PAD* pt_liste_pad, * pt_start_liste, LISTE_PAD* pt_liste_pad, * pt_start_liste,
* pt_end_liste, * pt_liste_pad_limite; * pt_end_liste, * pt_liste_pad_limite;
int pin_min_layer, pin_max_layer; int pin_min_layer, pin_max_layer;
int no_conn = Pcb->m_NbPads + 1;/* valeur incrementee pour indiquer int no_conn = Pcb->m_NbPads + 1;/* valeur incrementee pour indiquer
que le pad n'est pas deja connecte a une piste*/ * que le pad n'est pas deja connecte a une piste*/
pt_liste_pad = pt_start_liste = Pcb->m_Pads; pt_liste_pad = pt_start_liste = Pcb->m_Pads;
pt_liste_pad_limite = pt_start_liste + Pcb->m_NbPads; pt_liste_pad_limite = pt_start_liste + Pcb->m_NbPads;
if( pt_liste_pad == NULL ) return; if( pt_liste_pad == NULL )
return;
netcode = (*pt_liste_pad)->m_NetCode; netcode = (*pt_liste_pad)->m_NetCode;
nb_pads = 1; plink = 0; nb_pads = 1; plink = 0;
@ -166,8 +169,10 @@ int no_conn = Pcb->m_NbPads+1; /* valeur incrementee pour indiquer
/* Recherche de la fin de la liste des pads du net courant */ /* Recherche de la fin de la liste des pads du net courant */
for( pt_end_liste = pt_liste_pad + 1; ; pt_end_liste++ ) for( pt_end_liste = pt_liste_pad + 1; ; pt_end_liste++ )
{ {
if (pt_end_liste >= pt_liste_pad_limite ) break ; if( pt_end_liste >= pt_liste_pad_limite )
if ((*pt_end_liste)->m_NetCode != netcode ) break ; break;
if( (*pt_end_liste)->m_NetCode != netcode )
break;
nb_pads++; nb_pads++;
} }
@ -195,7 +200,8 @@ int no_conn = Pcb->m_NbPads+1; /* valeur incrementee pour indiquer
netcode = pt_pad->m_NetCode; netcode = pt_pad->m_NetCode;
plink = pt_pad->m_physical_connexion; plink = pt_pad->m_physical_connexion;
/* plink = numero unique si pad non deja connecte a une piste */ /* plink = numero unique si pad non deja connecte a une piste */
if (plink <= 0 ) plink = no_conn++; if( plink <= 0 )
plink = no_conn++;
if( netcode <= 0 ) /* pad non connecte */ if( netcode <= 0 ) /* pad non connecte */
fprintf( outfile, "u 0" ); fprintf( outfile, "u 0" );
@ -226,8 +232,11 @@ int no_conn = Pcb->m_NbPads+1; /* valeur incrementee pour indiquer
case SMD: case SMD:
fprintf( outfile, " %d", 1 ); fprintf( outfile, " %d", 1 );
break; break;
case CONN: fprintf(outfile," %d", 2);
case CONN:
fprintf( outfile, " %d", 2 );
break; break;
case P_HOLE: case P_HOLE:
case MECA: case MECA:
fprintf( outfile, " %d", 4 ); fprintf( outfile, " %d", 4 );
@ -252,6 +261,7 @@ int no_conn = Pcb->m_NbPads+1; /* valeur incrementee pour indiquer
/* output layer size record */ /* output layer size record */
fprintf( outfile, "q" ); fprintf( outfile, "q" );
switch( pt_pad->m_PadShape ) /* out type, dims */ switch( pt_pad->m_PadShape ) /* out type, dims */
{ {
case CIRCLE: case CIRCLE:
@ -265,22 +275,29 @@ int no_conn = Pcb->m_NbPads+1; /* valeur incrementee pour indiquer
int lmax = pt_pad->m_Size.x; int lmax = pt_pad->m_Size.x;
int lmin = pt_pad->m_Size.y; int lmin = pt_pad->m_Size.y;
int angle = pt_pad->m_Orient / 10; int angle = pt_pad->m_Orient / 10;
while (angle < 0 ) angle += 180; while( angle < 0 )
while (angle > 180 ) angle -= 180; angle += 180;
while( angle > 180 )
angle -= 180;
while( angle > 135 ) while( angle > 135 )
{ {
angle -= 90; angle -= 90;
EXCHG( lmax, lmin ); EXCHG( lmax, lmin );
} }
fprintf( outfile, " r %d %d %d", fprintf( outfile, " r %d %d %d",
angle, angle,
lmax / PSCALE, lmin / PSCALE ); lmax / PSCALE, lmin / PSCALE );
break; break;
} }
/* layers */ /* layers */
fprintf( outfile, " %d %d\n", pin_min_layer, pin_max_layer ); fprintf( outfile, " %d %d\n", pin_min_layer, pin_max_layer );
}
} /* fin generation liste pads pour 1 net */ /* fin generation liste pads pour 1 net */
if( netcode ) if( netcode )
{ {
@ -300,6 +317,7 @@ int no_conn = Pcb->m_NbPads+1; /* valeur incrementee pour indiquer
static void ReturnNbViasAndTracks( BOARD* Pcb, int netcode, int* nb_vias, static void ReturnNbViasAndTracks( BOARD* Pcb, int netcode, int* nb_vias,
int* nb_tracks ) int* nb_tracks )
/**************************************************************************/ /**************************************************************************/
/* calcule le nombre de vias et segments de pistes pour le net netcode /* calcule le nombre de vias et segments de pistes pour le net netcode
*/ */
{ {
@ -309,17 +327,23 @@ TRACK * track;
*nb_tracks = 0; *nb_tracks = 0;
track = Pcb->m_Track; track = Pcb->m_Track;
if( track == NULL ) return; if( track == NULL )
return;
for( ; track != NULL; track = (TRACK*) track->Pnext ) for( ; track != NULL; track = (TRACK*) track->Pnext )
{ {
if( track->m_NetCode > netcode ) return; if( track->m_NetCode > netcode )
if( track->m_NetCode != netcode ) continue; return;
if(track->m_StructType == TYPEVIA ) (*nb_vias)++; if( track->m_NetCode != netcode )
if(track->m_StructType == TYPETRACK ) (*nb_tracks)++; continue;
if( track->m_StructType == TYPEVIA )
(*nb_vias)++;
if( track->m_StructType == TYPETRACK )
(*nb_tracks)++;
} }
} }
/*************************************************************/ /*************************************************************/
static void GenExistantTracks( BOARD* Pcb, FILE* outfile, static void GenExistantTracks( BOARD* Pcb, FILE* outfile,
int current_net_code, int type ) int current_net_code, int type )
@ -332,38 +356,46 @@ TRACK * track;
track = Pcb->m_Track; track = Pcb->m_Track;
if( track == NULL ) return; if( track == NULL )
return;
for( ; track != NULL; track = (TRACK*) track->Pnext ) for( ; track != NULL; track = (TRACK*) track->Pnext )
{ {
netcode = track->m_NetCode; netcode = track->m_NetCode;
if( netcode > current_net_code ) return; if( netcode > current_net_code )
if( netcode != current_net_code ) continue; return;
if( netcode != current_net_code )
continue;
plink = track->m_Sous_Netcode; plink = track->m_Sous_Netcode;
via_min_layer = track->m_Layer; via_min_layer = track->GetLayer();
if(track->m_StructType != type ) continue; if( track->m_StructType != type )
continue;
if( track->m_StructType == TYPEVIA ) if( track->m_StructType == TYPEVIA )
{ {
via_min_layer &= 15; via_min_layer &= 15;
via_max_layer = (track->m_Layer >> 4) & 15; via_max_layer = (track->GetLayer() >> 4) & 15;
if( via_min_layer == via_max_layer ) if( via_min_layer == via_max_layer )
{ {
track->m_Layer = 0xF; track->SetLayer( 0xF );
via_min_layer = 0; via_max_layer = 15; via_min_layer = 0; via_max_layer = 15;
} }
if( via_max_layer < via_min_layer ) if( via_max_layer < via_min_layer )
EXCHG( via_max_layer, via_min_layer ); EXCHG( via_max_layer, via_min_layer );
if(via_max_layer == CMP_N) via_max_layer = max_layer; if( via_max_layer == CMP_N )
else via_max_layer++; via_max_layer = max_layer;
else
via_max_layer++;
if(via_min_layer == CUIVRE_N) via_min_layer = min_layer; if( via_min_layer == CUIVRE_N )
else via_min_layer++; via_min_layer = min_layer;
else
via_min_layer++;
fprintf( outfile, "v 0 " ); fprintf( outfile, "v 0 " );
fprintf( outfile, " %d %d", track->m_Start.x / PSCALE, track->m_Start.y / PSCALE ); fprintf( outfile, " %d %d", track->m_Start.x / PSCALE, track->m_Start.y / PSCALE );
@ -380,8 +412,10 @@ TRACK * track;
fprintf( outfile, " %d %d", track->m_Start.x / PSCALE, track->m_Start.y / PSCALE ); fprintf( outfile, " %d %d", track->m_Start.x / PSCALE, track->m_Start.y / PSCALE );
fprintf( outfile, " %d %d", track->m_End.x / PSCALE, track->m_End.y / PSCALE ); fprintf( outfile, " %d %d", track->m_End.x / PSCALE, track->m_End.y / PSCALE );
if(via_min_layer == CMP_N) via_min_layer = max_layer; if( via_min_layer == CMP_N )
else via_min_layer++; via_min_layer = max_layer;
else
via_min_layer++;
fprintf( outfile, " %d", via_min_layer ); fprintf( outfile, " %d", via_min_layer );
fprintf( outfile, " %d\n", 1 ); /*Number of corners */ fprintf( outfile, " %d\n", 1 ); /*Number of corners */
@ -393,11 +427,13 @@ TRACK * track;
} }
} }
/***********************************************/ /***********************************************/
static int GenEdges( BOARD* Pcb, FILE* outfile ) static int GenEdges( BOARD* Pcb, FILE* outfile )
/***********************************************/ /***********************************************/
/* Generation des contours (edges). /* Generation des contours (edges).
Il sont générés comme des segments de piste placés sur chaque couche routable. * Il sont générés comme des segments de piste placés sur chaque couche routable.
*/ */
{ {
#define NB_CORNERS 4 #define NB_CORNERS 4
@ -413,23 +449,27 @@ int NbItems = 0;
/* impression des contours */ /* impression des contours */
for( PtStruct = Pcb->m_Drawings; PtStruct != NULL; PtStruct = PtStruct->Pnext ) for( PtStruct = Pcb->m_Drawings; PtStruct != NULL; PtStruct = PtStruct->Pnext )
{ {
if( PtStruct->m_StructType != TYPEDRAWSEGMENT ) continue; if( PtStruct->m_StructType != TYPEDRAWSEGMENT )
continue;
PtDrawSegment = (DRAWSEGMENT*) PtStruct; PtDrawSegment = (DRAWSEGMENT*) PtStruct;
if( PtDrawSegment->m_Layer != EDGE_N) continue; if( PtDrawSegment->GetLayer() != EDGE_N )
continue;
fx = PtDrawSegment->m_End.x; ox = PtDrawSegment->m_Start.x; fx = PtDrawSegment->m_End.x; ox = PtDrawSegment->m_Start.x;
fy = PtDrawSegment->m_End.y; oy = PtDrawSegment->m_Start.y; fy = PtDrawSegment->m_End.y; oy = PtDrawSegment->m_Start.y;
dx = fx - ox; dy = fy - oy; dx = fx - ox; dy = fy - oy;
if( (dx == 0) && (dy == 0) ) continue; if( (dx == 0) && (dy == 0) )
continue;
/* elimination des segments non horizontaux, verticaux ou 45 degres, /* elimination des segments non horizontaux, verticaux ou 45 degres,
non gérés par l'autorouteur */ * non gérés par l'autorouteur */
if( (dx != 0) && (dy != 0) && ( abs( dx ) != abs( dy ) ) ) if( (dx != 0) && (dy != 0) && ( abs( dx ) != abs( dy ) ) )
continue; continue;
NbItems++; NbItems++;
if( outfile == NULL ) continue; /* car simple decompte des items */ if( outfile == NULL )
continue; /* car simple decompte des items */
/* generation de la zone interdite */ /* generation de la zone interdite */
@ -540,6 +580,7 @@ int max_layer = m_Pcb->m_BoardSettings->m_CopperLayerCount;
while( GetLine( File, Line, &LineNum ) != NULL ) while( GetLine( File, Line, &LineNum ) != NULL )
{ {
char ident = Line[0]; char ident = Line[0];
switch( ident ) switch( ident )
{ {
case 'j': // Header, not used case 'j': // Header, not used
@ -553,15 +594,19 @@ int max_layer = m_Pcb->m_BoardSettings->m_CopperLayerCount;
sscanf( Line + 2, "%d %d %d %d %d", &image, sscanf( Line + 2, "%d %d %d %d %d", &image,
&track_start.x, &track_start.y, &via_layer1, &via_layer2 ); &track_start.x, &track_start.y, &via_layer1, &via_layer2 );
via_layer1--; via_layer2--; via_layer1--; via_layer2--;
if ( via_layer1 == max_layer-1 ) via_layer1 = CMP_N; if( via_layer1 == max_layer - 1 )
if ( via_layer2 == max_layer-1 ) via_layer2 = CMP_N; via_layer1 = CMP_N;
if( via_layer2 == max_layer - 1 )
via_layer2 = CMP_N;
NewVia = new SEGVIA( m_Pcb ); NewVia = new SEGVIA( m_Pcb );
NewVia->m_Start = NewVia->m_End = track_start; NewVia->m_Start = NewVia->m_End = track_start;
NewVia->m_Width = via_size; NewVia->m_Width = via_size;
NewVia->m_Layer = via_layer1 + (via_layer2<<4); NewVia->SetLayer( via_layer1 + (via_layer2 << 4) );
if ( NewVia->m_Layer == 0x0F || NewVia->m_Layer == 0xF0) if( NewVia->GetLayer() == 0x0F || NewVia->GetLayer() == 0xF0 )
NewVia->m_Shape = VIA_NORMALE; NewVia->m_Shape = VIA_NORMALE;
else NewVia->m_Shape = VIA_ENTERREE; else
NewVia->m_Shape = VIA_ENTERREE;
NewVia->Insert( m_Pcb, NULL ); NewVia->Insert( m_Pcb, NULL );
NbTrack++; NbTrack++;
break; break;
@ -571,20 +616,23 @@ int max_layer = m_Pcb->m_BoardSettings->m_CopperLayerCount;
track_layer--; track_layer--;
if( (track_layer != CUIVRE_N) && (track_layer == max_layer - 1) ) if( (track_layer != CUIVRE_N) && (track_layer == max_layer - 1) )
track_layer = CMP_N; track_layer = CMP_N;
// Read corners: fmt = C x_pos y_pos // Read corners: fmt = C x_pos y_pos
for( int ii = 0; ii < track_count; ii++ ) for( int ii = 0; ii < track_count; ii++ )
{ {
if( GetLine( File, Line, &LineNum ) != NULL ) if( GetLine( File, Line, &LineNum ) != NULL )
{ {
if ( Line[0] != 'C' ) break; if( Line[0] != 'C' )
break;
if( ii == 0 ) if( ii == 0 )
sscanf( Line + 2, "%d %d", &track_start.x, &track_start.y ); sscanf( Line + 2, "%d %d", &track_start.x, &track_start.y );
else else
{ {
sscanf( Line + 2, "%d %d", &track_end.x, &track_end.y ); sscanf( Line + 2, "%d %d", &track_end.x, &track_end.y );
NewTrack = new TRACK( m_Pcb ); NewTrack = new TRACK( m_Pcb );
NewTrack->m_Width = track_width; NewTrack->m_Width = track_width;
NewTrack->m_Layer = track_layer; NewTrack->SetLayer( track_layer );
NewTrack->m_Start = track_start; NewTrack->m_Start = track_start;
NewTrack->m_End = track_end; NewTrack->m_End = track_end;
track_start = track_end; track_start = track_end;
@ -592,8 +640,10 @@ int max_layer = m_Pcb->m_BoardSettings->m_CopperLayerCount;
NbTrack++; NbTrack++;
} }
} }
else break; else
break;
} }
break; break;
default: default:
@ -605,7 +655,8 @@ int max_layer = m_Pcb->m_BoardSettings->m_CopperLayerCount;
setlocale( LC_NUMERIC, "" ); setlocale( LC_NUMERIC, "" );
if( NbTrack == 0 ) DisplayError(this, wxT("Warning: No tracks"), 10); if( NbTrack == 0 )
DisplayError( this, wxT( "Warning: No tracks" ), 10 );
else else
{ {
m_Pcb->m_Status_Pcb = 0; m_Pcb->m_Status_Pcb = 0;
@ -613,6 +664,6 @@ int max_layer = m_Pcb->m_BoardSettings->m_CopperLayerCount;
} }
Compile_Ratsnest( DC, TRUE ); Compile_Ratsnest( DC, TRUE );
if( NbTrack ) m_CurrentScreen->SetRefreshReq(); if( NbTrack )
m_CurrentScreen->SetRefreshReq();
} }

View File

@ -17,7 +17,8 @@
#include "cell.h" #include "cell.h"
/* Routines definies ici : */ /* Routines definies ici : */
static int Route_1_Trace(WinEDA_PcbFrame * pcbframe, wxDC * DC, int two_sides, int row_source,int col_source, static int Route_1_Trace( WinEDA_PcbFrame* pcbframe, wxDC* DC, int two_sides, int row_source,
int col_source,
int row_target, int col_target, CHEVELU* pt_chevelu ); int row_target, int col_target, CHEVELU* pt_chevelu );
static int Retrace( WinEDA_PcbFrame* pcbframe, wxDC* DC, int, int, int, int, int, int net_code ); static int Retrace( WinEDA_PcbFrame* pcbframe, wxDC* DC, int, int, int, int, int, int net_code );
static void OrCell_Trace( BOARD* pcb, int col, int row, int side, int orient, int current_net_code ); static void OrCell_Trace( BOARD* pcb, int col, int row, int side, int orient, int current_net_code );
@ -49,8 +50,8 @@ static int Ncurrent; /* measures of progress */
*/ */
/* for visiting neighbors on the same side: increments/decrements des coord /* for visiting neighbors on the same side: increments/decrements des coord
[][0] = row, []{1] = col a ajouter aux coord du point central pour * [][0] = row, []{1] = col a ajouter aux coord du point central pour
obtenir les coord des 8 points voisins */ * obtenir les coord des 8 points voisins */
static int delta[8][2] = { static int delta[8][2] = {
{ 1, -1 }, /* northwest */ { 1, -1 }, /* northwest */
{ 1, 0 }, /* north */ { 1, 0 }, /* north */
@ -114,26 +115,43 @@ static int ndir[8] = { /* for building paths back to source */
| SHARP_WtoSW | SHARP_WtoNW \ | SHARP_WtoSW | SHARP_WtoNW \
| SHARP_NtoNW | SHARP_StoSW | HOLE ) | SHARP_NtoNW | SHARP_StoSW | HOLE )
struct block { struct block
{
int r1, c1; int r1, c1;
long b1; long b1;
int r2, c2; int r2, c2;
long b2; long b2;
}; };
static struct block blocking[8] = { /* blocking masks for diagonal traces */ static struct block blocking[8] = /* blocking masks for diagonal traces */
{ 0, -1, BLOCK_NORTHEAST, 1, 0, BLOCK_SOUTHWEST }, { { 0, -1,
{ 0, 0, 0, 0, 0, 0 }, BLOCK_NORTHEAST,
{ 1, 0, BLOCK_SOUTHEAST, 0, 1, BLOCK_NORTHWEST }, 1, 0,
{ 0, 0, 0, 0, 0, 0 }, BLOCK_SOUTHWEST },
{ 0, 0, 0, 0, 0, 0 }, { 0, 0, 0,
{ 0, -1, BLOCK_SOUTHEAST, -1, 0, BLOCK_NORTHWEST }, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0 }, { 1, 0,
{ -1, 0, BLOCK_NORTHEAST, 0, 1, BLOCK_SOUTHWEST } BLOCK_SOUTHEAST,
}; 0, 1,
BLOCK_NORTHWEST },
{ 0, 0, 0,
0, 0, 0 },
{ 0, 0, 0,
0, 0, 0 },
{ 0, -1,
BLOCK_SOUTHEAST,
-1, 0,
BLOCK_NORTHWEST },
{ 0, 0, 0,
0, 0, 0 },
{ -1, 0,
BLOCK_NORTHEAST,
0, 1,
BLOCK_SOUTHWEST } };
/* mask for hole-related blocking effects */ /* mask for hole-related blocking effects */
static struct { static struct
{
long trace; long trace;
int present; int present;
} selfok2[8] = { } selfok2[8] = {
@ -173,9 +191,9 @@ static long newmask[8] = { /* patterns to mask out in neighbor cells */
/********************************************************/ /********************************************************/
/* route all traces /* route all traces
Return: 1 si OK * Return: 1 si OK
-1 si Escape (arret en cours de routage) demande * -1 si Escape (arret en cours de routage) demande
-2 si defaut alloc memoire * -2 si defaut alloc memoire
*/ */
int WinEDA_PcbFrame::Solve( wxDC* DC, int two_sides ) int WinEDA_PcbFrame::Solve( wxDC* DC, int two_sides )
@ -201,7 +219,8 @@ wxString msg;
&row_target, &col_target, &pt_cur_ch ); // 1er chevelu a router &row_target, &col_target, &pt_cur_ch ); // 1er chevelu a router
for( ; row_source != ILLEGAL; GetWork( &row_source, &col_source, for( ; row_source != ILLEGAL; GetWork( &row_source, &col_source,
&current_net_code, &row_target, &col_target, &pt_cur_ch )) &current_net_code, &row_target, &col_target,
&pt_cur_ch ) )
{ {
/* Tst demande d'arret de routage ( key ESCAPE actionnee ) */ /* Tst demande d'arret de routage ( key ESCAPE actionnee ) */
wxYield(); wxYield();
@ -213,7 +232,8 @@ wxString msg;
stop = TRUE; stop = TRUE;
break; break;
} }
else DrawPanel->m_AbortRequest = 0; else
DrawPanel->m_AbortRequest = 0;
} }
Ncurrent++; Ncurrent++;
@ -239,6 +259,7 @@ wxString msg;
success = Route_1_Trace( this, DC, two_sides, row_source, col_source, success = Route_1_Trace( this, DC, two_sides, row_source, col_source,
row_target, col_target, pt_cur_ch ); row_target, col_target, pt_cur_ch );
switch( success ) switch( success )
{ {
case NOSUCCESS: case NOSUCCESS:
@ -270,32 +291,34 @@ wxString msg;
pt_cur_ch->pad_start->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_AND ); pt_cur_ch->pad_start->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_AND );
pt_cur_ch->pad_end->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_AND ); pt_cur_ch->pad_end->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_AND );
if ( stop ) break; if( stop )
break;
} }
DrawPanel->m_AbortEnable = FALSE; DrawPanel->m_AbortEnable = FALSE;
return(SUCCESS); return SUCCESS;
} }
/**************************/ /**************************/
/* int Route_1_Trace(xxx) */ /* int Route_1_Trace(xxx) */
/**************************/ /**************************/
/* Route une piste du BOARD. /* Route une piste du BOARD.
Parametres: * Parametres:
1 face / 2 faces ( 0 / 1) * 1 face / 2 faces ( 0 / 1)
coord source (row,col) * coord source (row,col)
coord destination (row,col) * coord destination (row,col)
net_code * net_code
pointeur sur le chevelu de reference * pointeur sur le chevelu de reference
*
Retourne : * Retourne :
SUCCESS si route trouvee * SUCCESS si route trouvee
TRIVIAL_SUCCESS si pads connectes par superposition ( pas de piste a tirer) * TRIVIAL_SUCCESS si pads connectes par superposition ( pas de piste a tirer)
NOSUCCESS si echec * NOSUCCESS si echec
STOP_FROM_ESC si Escape demande * STOP_FROM_ESC si Escape demande
ERR_MEMORY defaut alloc RAM * ERR_MEMORY defaut alloc RAM
*/ */
static int Route_1_Trace( WinEDA_PcbFrame* pcbframe, wxDC* DC, static int Route_1_Trace( WinEDA_PcbFrame* pcbframe, wxDC* DC,
int two_sides, int row_source, int col_source, int two_sides, int row_source, int col_source,
@ -315,7 +338,7 @@ int masque_layer_TOP = g_TabOneLayerMask[Route_Layer_TOP];
int masque_layer_BOTTOM = g_TabOneLayerMask[Route_Layer_BOTTOM]; int masque_layer_BOTTOM = g_TabOneLayerMask[Route_Layer_BOTTOM];
int masque_layers; /* Masque des 2 couches de routage */ int masque_layers; /* Masque des 2 couches de routage */
int tab_mask[2];/* permet le calcul du Masque de la couche en cours int tab_mask[2];/* permet le calcul du Masque de la couche en cours
de tst (side = TOP ou BOTTOM)*/ * de tst (side = TOP ou BOTTOM)*/
int start_mask_layer = 0; int start_mask_layer = 0;
wxString msg; wxString msg;
@ -343,13 +366,15 @@ wxString msg;
pad_masque_layer_e = pt_cur_ch->pad_end->m_Masque_Layer; pad_masque_layer_e = pt_cur_ch->pad_end->m_Masque_Layer;
/* Test 1 Si routage possible c.a.d si les pads sont accessibles /* Test 1 Si routage possible c.a.d si les pads sont accessibles
sur les couches de routage */ * sur les couches de routage */
if( (masque_layers & pad_masque_layer_s) == 0 ) goto end_of_route; if( (masque_layers & pad_masque_layer_s) == 0 )
if( (masque_layers & pad_masque_layer_e) == 0 ) goto end_of_route; goto end_of_route;
if( (masque_layers & pad_masque_layer_e) == 0 )
goto end_of_route;
/* Test 2 Si routage possible c.a.d si les pads sont accessibles /* Test 2 Si routage possible c.a.d si les pads sont accessibles
sur la grille de routage ( 1 point de grille doit etre dans le pad)*/ * sur la grille de routage ( 1 point de grille doit etre dans le pad)*/
{ {
int cX = (g_GridRoutingSize * col_source) + pcbframe->m_Pcb->m_BoundaryBox.m_Pos.x; int cX = (g_GridRoutingSize * col_source) + pcbframe->m_Pcb->m_BoundaryBox.m_Pos.x;
int cY = (g_GridRoutingSize * row_source) + pcbframe->m_Pcb->m_BoundaryBox.m_Pos.y; int cY = (g_GridRoutingSize * row_source) + pcbframe->m_Pcb->m_BoundaryBox.m_Pos.y;
@ -358,8 +383,10 @@ wxString msg;
int px = pt_cur_ch->pad_start->m_Pos.x; int px = pt_cur_ch->pad_start->m_Pos.x;
int py = pt_cur_ch->pad_start->m_Pos.y; int py = pt_cur_ch->pad_start->m_Pos.y;
if ( ((pt_cur_ch->pad_start->m_Orient/900)&1) != 0 ) EXCHG(dx,dy) ; if( ( (pt_cur_ch->pad_start->m_Orient / 900) & 1 ) != 0 )
if ( (abs(cX - px) > dx ) || (abs(cY - py) > dy) ) goto end_of_route; EXCHG( dx, dy );
if( (abs( cX - px ) > dx ) || (abs( cY - py ) > dy) )
goto end_of_route;
cX = (g_GridRoutingSize * col_target) + pcbframe->m_Pcb->m_BoundaryBox.m_Pos.x; cX = (g_GridRoutingSize * col_target) + pcbframe->m_Pcb->m_BoundaryBox.m_Pos.x;
cY = (g_GridRoutingSize * row_target) + pcbframe->m_Pcb->m_BoundaryBox.m_Pos.y; cY = (g_GridRoutingSize * row_target) + pcbframe->m_Pcb->m_BoundaryBox.m_Pos.y;
@ -367,21 +394,23 @@ wxString msg;
dy = pt_cur_ch->pad_end->m_Size.y / 2; dy = pt_cur_ch->pad_end->m_Size.y / 2;
px = pt_cur_ch->pad_end->m_Pos.x; px = pt_cur_ch->pad_end->m_Pos.x;
py = pt_cur_ch->pad_end->m_Pos.y; py = pt_cur_ch->pad_end->m_Pos.y;
if ( ((pt_cur_ch->pad_end->m_Orient/900)&1) != 0 ) EXCHG(dx,dy) ; if( ( (pt_cur_ch->pad_end->m_Orient / 900) & 1 ) != 0 )
EXCHG( dx, dy );
if ( (abs(cX - px) > dx ) || (abs(cY - py) > dy) ) goto end_of_route; if( (abs( cX - px ) > dx ) || (abs( cY - py ) > dy) )
goto end_of_route;
} }
/* Test du cas trivial: connection directe par superposition des pads */ /* Test du cas trivial: connection directe par superposition des pads */
if( (row_source == row_target) && (col_source == col_target) if( (row_source == row_target) && (col_source == col_target)
&& ( pad_masque_layer_e & pad_masque_layer_s & g_TabAllCopperLayerMask[g_DesignSettings.m_CopperLayerCount-1]) ) && ( pad_masque_layer_e & pad_masque_layer_s &
g_TabAllCopperLayerMask[g_DesignSettings.m_CopperLayerCount - 1]) )
{ {
result = TRIVIAL_SUCCESS; result = TRIVIAL_SUCCESS;
goto end_of_route; goto end_of_route;
} }
/* Placement du bit de suppression d'obstacle relative aux 2 pads a relier */ /* Placement du bit de suppression d'obstacle relative aux 2 pads a relier */
pcbframe->Affiche_Message( wxT( "Gen Cells" ) ); pcbframe->Affiche_Message( wxT( "Gen Cells" ) );
@ -389,7 +418,7 @@ wxString msg;
Place_1_Pad_Board( pcbframe->m_Pcb, pt_cur_ch->pad_end, CURRENT_PAD, marge, WRITE_OR_CELL ); Place_1_Pad_Board( pcbframe->m_Pcb, pt_cur_ch->pad_end, CURRENT_PAD, marge, WRITE_OR_CELL );
/* Regenere les barrieres restantes (qui peuvent empieter sur le placement /* Regenere les barrieres restantes (qui peuvent empieter sur le placement
des bits precedents) */ * des bits precedents) */
ptr = (LISTE_PAD*) pcbframe->m_Pcb->m_Pads; i = pcbframe->m_Pcb->m_NbPads; ptr = (LISTE_PAD*) pcbframe->m_Pcb->m_Pads; i = pcbframe->m_Pcb->m_NbPads;
for( ; i > 0; i--, ptr++ ) for( ; i > 0; i--, ptr++ )
{ {
@ -413,7 +442,7 @@ wxString msg;
if( SetQueue( row_source, col_source, TOP, 0, apx_dist, if( SetQueue( row_source, col_source, TOP, 0, apx_dist,
row_target, col_target ) == 0 ) row_target, col_target ) == 0 )
{ {
return(ERR_MEMORY); return ERR_MEMORY;
} }
} }
if( pad_masque_layer_s & masque_layer_BOTTOM ) if( pad_masque_layer_s & masque_layer_BOTTOM )
@ -423,7 +452,7 @@ wxString msg;
if( SetQueue( row_source, col_source, BOTTOM, 0, apx_dist, if( SetQueue( row_source, col_source, BOTTOM, 0, apx_dist,
row_target, col_target ) == 0 ) row_target, col_target ) == 0 )
{ {
return(ERR_MEMORY); return ERR_MEMORY;
} }
} }
} }
@ -435,7 +464,7 @@ wxString msg;
if( SetQueue( row_source, col_source, BOTTOM, 0, apx_dist, if( SetQueue( row_source, col_source, BOTTOM, 0, apx_dist,
row_target, col_target ) == 0 ) row_target, col_target ) == 0 )
{ {
return(ERR_MEMORY); return ERR_MEMORY;
} }
} }
if( pad_masque_layer_s & masque_layer_TOP ) if( pad_masque_layer_s & masque_layer_TOP )
@ -445,21 +474,19 @@ wxString msg;
if( SetQueue( row_source, col_source, TOP, 0, apx_dist, if( SetQueue( row_source, col_source, TOP, 0, apx_dist,
row_target, col_target ) == 0 ) row_target, col_target ) == 0 )
{ {
return(ERR_MEMORY); return ERR_MEMORY;
} }
} }
} }
} }
else if( pad_masque_layer_s & masque_layer_BOTTOM )
else
if( pad_masque_layer_s & masque_layer_BOTTOM )
{ {
start_mask_layer = 1; start_mask_layer = 1;
if( SetQueue( row_source, col_source, BOTTOM, 0, apx_dist, if( SetQueue( row_source, col_source, BOTTOM, 0, apx_dist,
row_target, col_target ) == 0 ) row_target, col_target ) == 0 )
{ {
return(ERR_MEMORY); return ERR_MEMORY;
} }
} }
@ -468,13 +495,21 @@ wxString msg;
for( ; r != ILLEGAL; GetQueue( &r, &c, &side, &d, &apx_dist ) ) for( ; r != ILLEGAL; GetQueue( &r, &c, &side, &d, &apx_dist ) )
{ {
curcell = GetCell( r, c, side ); curcell = GetCell( r, c, side );
if(curcell & CURRENT_PAD) curcell &= ~HOLE ; if( curcell & CURRENT_PAD )
curcell &= ~HOLE;
if( (r == row_target) && (c == col_target) /* success si layer OK */ if( (r == row_target) && (c == col_target) /* success si layer OK */
&& ( tab_mask[side] & pad_masque_layer_e) ) && ( tab_mask[side] & pad_masque_layer_e) )
{ {
/* Efface Liaison */ /* Efface Liaison */
GRSetDrawMode( DC, GR_XOR ); GRSetDrawMode( DC, GR_XOR );
GRLine(&pcbframe->DrawPanel->m_ClipBox, DC, segm_oX, segm_oY, segm_fX, segm_fY, 0, WHITE); GRLine( &pcbframe->DrawPanel->m_ClipBox,
DC,
segm_oX,
segm_oY,
segm_fX,
segm_fY,
0,
WHITE );
/* Generation de la trace */ /* Generation de la trace */
if( Retrace( pcbframe, DC, row_source, col_source, if( Retrace( pcbframe, DC, row_source, col_source,
@ -485,7 +520,8 @@ wxString msg;
break; /* Fin du routage */ break; /* Fin du routage */
} }
/* report every 300 new nodes or so */ /* report every 300 new nodes or so */
if( (OpenNodes-lastopen > 300) || (ClosNodes-lastclos > 300) || (MoveNodes - lastmove > 300)) if( (OpenNodes - lastopen > 300) || (ClosNodes - lastclos > 300) ||
(MoveNodes - lastmove > 300) )
{ {
lastopen = (OpenNodes / 300) * 300; lastclos = (ClosNodes / 300) * 300; lastopen = (OpenNodes / 300) * 300; lastclos = (ClosNodes / 300) * 300;
lastmove = (MoveNodes / 300) * 300; lastmove = (MoveNodes / 300) * 300;
@ -505,7 +541,8 @@ wxString msg;
for( i = 0; i < 8; i++ ) for( i = 0; i < 8; i++ )
{ {
selfok2[i].present = 0; selfok2[i].present = 0;
if( (curcell & selfok2[i].trace) ) selfok2[i].present = 1; if( (curcell & selfok2[i].trace) )
selfok2[i].present = 1;
} }
} }
@ -517,37 +554,48 @@ wxString msg;
if( nr < 0 || nr >= Nrows || nc < 0 || nc >= Ncols ) if( nr < 0 || nr >= Nrows || nc < 0 || nc >= Ncols )
continue;/* off the edge */ continue;/* off the edge */
if (_self == 5 && selfok2[i].present) continue; if( _self == 5 && selfok2[i].present )
continue;
newcell = GetCell( nr, nc, side ); newcell = GetCell( nr, nc, side );
if(newcell & CURRENT_PAD) newcell &= ~HOLE; if( newcell & CURRENT_PAD )
newcell &= ~HOLE;
/* check for non-target hole */ /* check for non-target hole */
if( newcell & HOLE ) if( newcell & HOLE )
{ {
if (nr != row_target || nc != col_target) continue; if( nr != row_target || nc != col_target )
continue;
} }
/* check for traces */ /* check for traces */
else if (newcell & HOLE & ~(newmask[i])) continue; else if( newcell & HOLE & ~(newmask[i]) )
continue;
/* check blocking on corner neighbors */ /* check blocking on corner neighbors */
if( delta[i][0] && delta[i][1] ) if( delta[i][0] && delta[i][1] )
{ {
/* check first buddy */ /* check first buddy */
buddy = GetCell( r + blocking[i].r1, c + blocking[i].c1, side ); buddy = GetCell( r + blocking[i].r1, c + blocking[i].c1, side );
if(buddy & CURRENT_PAD) buddy &= ~HOLE; if( buddy & CURRENT_PAD )
if (buddy & HOLE) continue; buddy &= ~HOLE;
if( buddy & HOLE )
continue;
// if (buddy & (blocking[i].b1)) continue; // if (buddy & (blocking[i].b1)) continue;
/* check second buddy */ /* check second buddy */
buddy = GetCell( r + blocking[i].r2, c + blocking[i].c2, side ); buddy = GetCell( r + blocking[i].r2, c + blocking[i].c2, side );
if(buddy & CURRENT_PAD) buddy &= ~HOLE; if( buddy & CURRENT_PAD )
if (buddy & HOLE) continue; buddy &= ~HOLE;
if( buddy & HOLE )
continue;
// if (buddy & (blocking[i].b2)) continue; // if (buddy & (blocking[i].b2)) continue;
} }
olddir = GetDir( r, c, side ); olddir = GetDir( r, c, side );
newdist = d + CalcDist( ndir[i], olddir, newdist = d + CalcDist( ndir[i], olddir,
(olddir == FROM_OTHERSIDE) ? GetDir( r, c, 1-side ) : 0 , side); (olddir == FROM_OTHERSIDE) ? GetDir( r,
c,
1 - side ) : 0, side );
/* if (a) not visited yet, or (b) we have */ /* if (a) not visited yet, or (b) we have */
/* found a better path, add it to queue */ /* found a better path, add it to queue */
@ -559,10 +607,9 @@ wxString msg;
GetApxDist( nr, nc, row_target, col_target ), GetApxDist( nr, nc, row_target, col_target ),
row_target, col_target ) == 0 ) row_target, col_target ) == 0 )
{ {
return(ERR_MEMORY); return ERR_MEMORY;
} }
} }
else if( newdist < GetDist( nr, nc, side ) ) else if( newdist < GetDist( nr, nc, side ) )
{ {
SetDir( nr, nc, side, ndir[i] ); SetDir( nr, nc, side, ndir[i] );
@ -611,8 +658,8 @@ wxString msg;
newdist = d + CalcDist( FROM_OTHERSIDE, olddir, 0, side ); newdist = d + CalcDist( FROM_OTHERSIDE, olddir, 0, side );
/* if (a) not visited yet, /* if (a) not visited yet,
or (b) we have found a better path, * or (b) we have found a better path,
add it to queue */ * add it to queue */
if( !GetDir( r, c, 1 - side ) ) if( !GetDir( r, c, 1 - side ) )
{ {
SetDir( r, c, 1 - side, FROM_OTHERSIDE ); SetDir( r, c, 1 - side, FROM_OTHERSIDE );
@ -620,7 +667,7 @@ wxString msg;
if( SetQueue( r, c, 1 - side, newdist, apx_dist, row_target, if( SetQueue( r, c, 1 - side, newdist, apx_dist, row_target,
col_target ) == 0 ) col_target ) == 0 )
{ {
return(ERR_MEMORY); return ERR_MEMORY;
} }
} }
else if( newdist < GetDist( r, c, 1 - side ) ) else if( newdist < GetDist( r, c, 1 - side ) )
@ -637,9 +684,10 @@ end_of_route:
Place_1_Pad_Board( pcbframe->m_Pcb, pt_cur_ch->pad_end, ~CURRENT_PAD, marge, WRITE_AND_CELL ); Place_1_Pad_Board( pcbframe->m_Pcb, pt_cur_ch->pad_end, ~CURRENT_PAD, marge, WRITE_AND_CELL );
AFFICHE_ACTIVITE_ROUTE; AFFICHE_ACTIVITE_ROUTE;
return(result); return result;
} }
static long bit[8][9] = { /* OT=Otherside */ static long bit[8][9] = { /* OT=Otherside */
/* N, NE, E, SE, S, SW, W, NW, OT */ /* N, NE, E, SE, S, SW, W, NW, OT */
/* N */ { LINE_VERTICAL, BENT_StoNE, CORNER_SOUTHEAST, SHARP_StoSE, 0, /* N */ { LINE_VERTICAL, BENT_StoNE, CORNER_SOUTHEAST, SHARP_StoSE, 0,
@ -652,7 +700,8 @@ static long bit[8][9] = { /* OT=Otherside */
ANGLE_SWtoNW, SHARP_WtoNW, 0, (HOLE | HOLE_NORTHWEST) }, ANGLE_SWtoNW, SHARP_WtoNW, 0, (HOLE | HOLE_NORTHWEST) },
/* S */ { 0, SHARP_NtoNE, CORNER_NORTHEAST, BENT_NtoSE, LINE_VERTICAL, /* S */ { 0, SHARP_NtoNE, CORNER_NORTHEAST, BENT_NtoSE, LINE_VERTICAL,
BENT_NtoSW, CORNER_NORTHWEST, SHARP_NtoNW, (HOLE | HOLE_NORTH) }, BENT_NtoSW, CORNER_NORTHWEST, SHARP_NtoNW, (HOLE | HOLE_NORTH) },
/* SW */ { SHARP_NtoNE, 0, SHARP_EtoNE, ANGLE_NEtoSE, BENT_StoNE, DIAG_NEtoSW, /* SW */ { SHARP_NtoNE, 0, SHARP_EtoNE, ANGLE_NEtoSE, BENT_StoNE,
DIAG_NEtoSW,
BENT_WtoNE, ANGLE_NWtoNE, (HOLE | HOLE_NORTHEAST) }, BENT_WtoNE, ANGLE_NWtoNE, (HOLE | HOLE_NORTHEAST) },
/* W */ { CORNER_NORTHEAST, SHARP_EtoNE, 0, SHARP_EtoSE, CORNER_SOUTHEAST, /* W */ { CORNER_NORTHEAST, SHARP_EtoNE, 0, SHARP_EtoSE, CORNER_SOUTHEAST,
BENT_EtoSW, LINE_HORIZONTAL, BENT_EtoNW, (HOLE | HOLE_EAST) }, BENT_EtoSW, LINE_HORIZONTAL, BENT_EtoNW, (HOLE | HOLE_EAST) },
@ -667,19 +716,19 @@ static long bit[8][9] = { /* OT=Otherside */
/*****************************************************************/ /*****************************************************************/
/* work from target back to source, actually laying the traces /* work from target back to source, actually laying the traces
Parametres: * Parametres:
start on side target_side, aux coordonnees row_target, col_target. * start on side target_side, aux coordonnees row_target, col_target.
arrivee sur side masque_layer_start, coord row_source, col_source * arrivee sur side masque_layer_start, coord row_source, col_source
La recherche se fait en sens inverse du routage, * La recherche se fait en sens inverse du routage,
c.a.d du point d'arrivee (target) vers le point de depart (source) * c.a.d du point d'arrivee (target) vers le point de depart (source)
du routeur. * du routeur.
*
target_side = cote (TOP / BOTTOM) de depart * target_side = cote (TOP / BOTTOM) de depart
mask_layer_source = masque des couches d'arrivee * mask_layer_source = masque des couches d'arrivee
*
Retourne: * Retourne:
0 si erreur * 0 si erreur
> 0 si Ok * > 0 si Ok
*/ */
static int Retrace( WinEDA_PcbFrame* pcbframe, wxDC* DC, static int Retrace( WinEDA_PcbFrame* pcbframe, wxDC* DC,
@ -705,67 +754,96 @@ long b;
/* find where we came from to get here */ /* find where we came from to get here */
r2 = r1; c2 = c1; s2 = s1; r2 = r1; c2 = c1; s2 = s1;
x = GetDir( r1, c1, s1 ); x = GetDir( r1, c1, s1 );
switch( x ) switch( x )
{ {
case FROM_NORTH: r2++; break; case FROM_NORTH:
case FROM_EAST: c2++; break; r2++; break;
case FROM_SOUTH: r2--; break;
case FROM_WEST: c2--; break; case FROM_EAST:
case FROM_NORTHEAST: r2++; c2++; break; c2++; break;
case FROM_SOUTHEAST: r2--; c2++; break;
case FROM_SOUTHWEST: r2--; c2--; break; case FROM_SOUTH:
case FROM_NORTHWEST: r2++; c2--; break; r2--; break;
case FROM_OTHERSIDE: s2 = 1-s2; break;
case FROM_WEST:
c2--; break;
case FROM_NORTHEAST:
r2++; c2++; break;
case FROM_SOUTHEAST:
r2--; c2++; break;
case FROM_SOUTHWEST:
r2--; c2--; break;
case FROM_NORTHWEST:
r2++; c2--; break;
case FROM_OTHERSIDE:
s2 = 1 - s2; break;
default: default:
DisplayError( pcbframe, wxT( "Retrace: internal error: no way back" ) ); DisplayError( pcbframe, wxT( "Retrace: internal error: no way back" ) );
return(0); return 0;
} }
if (r0 != ILLEGAL) y = GetDir( r0, c0, s0 ); if( r0 != ILLEGAL )
y = GetDir( r0, c0, s0 );
/* see if target or hole */ /* see if target or hole */
if( ( (r1 == row_target) && (c1 == col_target) ) if( ( (r1 == row_target) && (c1 == col_target) )
|| (s1 != s0) ) || (s1 != s0) )
{ {
int p_dir; int p_dir;
switch( x ) switch( x )
{ {
case FROM_NORTH: case FROM_NORTH:
p_dir = HOLE_NORTH; break; p_dir = HOLE_NORTH; break;
case FROM_EAST: case FROM_EAST:
p_dir = HOLE_EAST; break; p_dir = HOLE_EAST; break;
case FROM_SOUTH: case FROM_SOUTH:
p_dir = HOLE_SOUTH; break; p_dir = HOLE_SOUTH; break;
case FROM_WEST: case FROM_WEST:
p_dir = HOLE_WEST; break; p_dir = HOLE_WEST; break;
case FROM_NORTHEAST: case FROM_NORTHEAST:
p_dir = HOLE_NORTHEAST; break; p_dir = HOLE_NORTHEAST; break;
case FROM_SOUTHEAST: case FROM_SOUTHEAST:
p_dir = HOLE_SOUTHEAST; break; p_dir = HOLE_SOUTHEAST; break;
case FROM_SOUTHWEST: case FROM_SOUTHWEST:
p_dir = HOLE_SOUTHWEST; break; p_dir = HOLE_SOUTHWEST; break;
case FROM_NORTHWEST: case FROM_NORTHWEST:
p_dir = HOLE_NORTHWEST; break; p_dir = HOLE_NORTHWEST; break;
case FROM_OTHERSIDE: case FROM_OTHERSIDE:
default: default:
DisplayError( pcbframe, wxT( "Retrace: error 1" ) ); DisplayError( pcbframe, wxT( "Retrace: error 1" ) );
return(0); return 0;
}
OrCell_Trace(pcbframe->m_Pcb, r1, c1, s1, p_dir, current_net_code );
} }
else { OrCell_Trace( pcbframe->m_Pcb, r1, c1, s1, p_dir, current_net_code );
}
else
{
if( (y == FROM_NORTH || y == FROM_NORTHEAST if( (y == FROM_NORTH || y == FROM_NORTHEAST
|| y == FROM_EAST || y == FROM_SOUTHEAST || y == FROM_EAST || y == FROM_SOUTHEAST
|| y == FROM_SOUTH || y == FROM_SOUTHWEST || y == FROM_SOUTH || y == FROM_SOUTHWEST
|| y == FROM_WEST || y == FROM_NORTHWEST) && || y == FROM_WEST || y == FROM_NORTHWEST)
(x == FROM_NORTH || x == FROM_NORTHEAST && (x == FROM_NORTH || x == FROM_NORTHEAST
|| x == FROM_EAST || x == FROM_SOUTHEAST || x == FROM_EAST || x == FROM_SOUTHEAST
|| x == FROM_SOUTH || x == FROM_SOUTHWEST || x == FROM_SOUTH || x == FROM_SOUTHWEST
|| x == FROM_WEST || x == FROM_NORTHWEST || x == FROM_WEST || x == FROM_NORTHWEST
|| x == FROM_OTHERSIDE) && || x == FROM_OTHERSIDE)
((b = bit[y-1][x-1]) != 0) ) && ( (b = bit[y - 1][x - 1]) != 0 ) )
{ {
OrCell_Trace( pcbframe->m_Pcb, r1, c1, s1, b, current_net_code ); OrCell_Trace( pcbframe->m_Pcb, r1, c1, s1, b, current_net_code );
if( b & HOLE ) if( b & HOLE )
@ -774,29 +852,46 @@ long b;
else else
{ {
DisplayError( pcbframe, wxT( "Retrace: error 2" ) ); DisplayError( pcbframe, wxT( "Retrace: error 2" ) );
return(0); return 0;
} }
} }
if( (r2 == row_source) && (c2 == col_source) ) if( (r2 == row_source) && (c2 == col_source) )
{ /* see if source */ { /* see if source */
int p_dir; int p_dir;
switch( x ) switch( x )
{ {
case FROM_NORTH: p_dir = HOLE_SOUTH; break; case FROM_NORTH:
case FROM_EAST: p_dir = HOLE_WEST; break; p_dir = HOLE_SOUTH; break;
case FROM_SOUTH: p_dir = HOLE_NORTH; break;
case FROM_WEST: p_dir = HOLE_EAST; break; case FROM_EAST:
case FROM_NORTHEAST: p_dir = HOLE_SOUTHWEST; break; p_dir = HOLE_WEST; break;
case FROM_SOUTHEAST: p_dir = HOLE_NORTHWEST; break;
case FROM_SOUTHWEST: p_dir = HOLE_NORTHEAST; break; case FROM_SOUTH:
case FROM_NORTHWEST: p_dir = HOLE_SOUTHEAST; break; p_dir = HOLE_NORTH; break;
case FROM_WEST:
p_dir = HOLE_EAST; break;
case FROM_NORTHEAST:
p_dir = HOLE_SOUTHWEST; break;
case FROM_SOUTHEAST:
p_dir = HOLE_NORTHWEST; break;
case FROM_SOUTHWEST:
p_dir = HOLE_NORTHEAST; break;
case FROM_NORTHWEST:
p_dir = HOLE_SOUTHEAST; break;
case FROM_OTHERSIDE: case FROM_OTHERSIDE:
default: default:
DisplayError( pcbframe, wxT( "Retrace: error 3" ) ); DisplayError( pcbframe, wxT( "Retrace: error 3" ) );
return(0); return 0;
} }
OrCell_Trace( pcbframe->m_Pcb, r2, c2, s2, p_dir, current_net_code ); OrCell_Trace( pcbframe->m_Pcb, r2, c2, s2, p_dir, current_net_code );
} }
/* move to next cell */ /* move to next cell */
@ -805,7 +900,7 @@ long b;
} while( !( (r2 == row_source) && (c2 == col_source) ) ); } while( !( (r2 == row_source) && (c2 == col_source) ) );
Place_Piste_en_Buffer( pcbframe, DC ); Place_Piste_en_Buffer( pcbframe, DC );
return(1); return 1;
} }
@ -821,36 +916,44 @@ TRACK * NewTrack, *OldTrack;
if( orient == HOLE ) /* Placement d'une VIA */ if( orient == HOLE ) /* Placement d'une VIA */
{ {
NewTrack = new SEGVIA( pcb ); NewTrack = new SEGVIA( pcb );
g_TrackSegmentCount++; g_TrackSegmentCount++;
NewTrack->Pback = g_CurrentTrackSegment; NewTrack->Pback = g_CurrentTrackSegment;
if( g_CurrentTrackSegment) g_CurrentTrackSegment->Pnext = NewTrack; if( g_CurrentTrackSegment )
else g_FirstTrackSegment = NewTrack; g_CurrentTrackSegment->Pnext = NewTrack;
else
g_FirstTrackSegment = NewTrack;
g_CurrentTrackSegment = NewTrack; g_CurrentTrackSegment = NewTrack;
g_CurrentTrackSegment->SetState( SEGM_AR, ON ); g_CurrentTrackSegment->SetState( SEGM_AR, ON );
g_CurrentTrackSegment->m_Layer = 0x0F; g_CurrentTrackSegment->SetLayer( 0x0F );
g_CurrentTrackSegment->m_Start.x = g_CurrentTrackSegment->m_End.x = g_CurrentTrackSegment->m_Start.x = g_CurrentTrackSegment->m_End.x =
pcb->m_BoundaryBox.m_Pos.x + (g_GridRoutingSize * row); pcb->m_BoundaryBox.m_Pos.x +
(g_GridRoutingSize * row);
g_CurrentTrackSegment->m_Start.y = g_CurrentTrackSegment->m_End.y = g_CurrentTrackSegment->m_Start.y = g_CurrentTrackSegment->m_End.y =
pcb->m_BoundaryBox.m_Pos.y + (g_GridRoutingSize * col); pcb->m_BoundaryBox.m_Pos.y +
(g_GridRoutingSize * col);
g_CurrentTrackSegment->m_Width = g_DesignSettings.m_CurrentViaSize; g_CurrentTrackSegment->m_Width = g_DesignSettings.m_CurrentViaSize;
g_CurrentTrackSegment->m_Shape = g_DesignSettings.m_CurrentViaType; g_CurrentTrackSegment->m_Shape = g_DesignSettings.m_CurrentViaType;
g_CurrentTrackSegment->m_NetCode = current_net_code; g_CurrentTrackSegment->m_NetCode = current_net_code;
} }
else /* Placement d'un segment standard */ else /* Placement d'un segment standard */
{ {
NewTrack = new TRACK( pcb ); NewTrack = new TRACK( pcb );
g_TrackSegmentCount++; g_TrackSegmentCount++;
NewTrack->Pback = g_CurrentTrackSegment; NewTrack->Pback = g_CurrentTrackSegment;
if( g_CurrentTrackSegment) g_CurrentTrackSegment->Pnext = NewTrack; if( g_CurrentTrackSegment )
else g_FirstTrackSegment = NewTrack; g_CurrentTrackSegment->Pnext = NewTrack;
else
g_FirstTrackSegment = NewTrack;
g_CurrentTrackSegment = NewTrack; g_CurrentTrackSegment = NewTrack;
g_CurrentTrackSegment->m_Layer = Route_Layer_BOTTOM; g_CurrentTrackSegment->SetLayer( Route_Layer_BOTTOM );
if (side == TOP) g_CurrentTrackSegment->m_Layer = Route_Layer_TOP; if( side == TOP )
g_CurrentTrackSegment->SetLayer( Route_Layer_TOP );
g_CurrentTrackSegment->SetState( SEGM_AR, ON ); g_CurrentTrackSegment->SetState( SEGM_AR, ON );
g_CurrentTrackSegment->m_End.x = pcb->m_BoundaryBox.m_Pos.x + (g_GridRoutingSize * row); g_CurrentTrackSegment->m_End.x = pcb->m_BoundaryBox.m_Pos.x + (g_GridRoutingSize * row);
@ -874,7 +977,6 @@ TRACK * NewTrack, *OldTrack;
g_CurrentTrackSegment->m_Start.x = pt_cur_ch->pad_end->m_Pos.x; g_CurrentTrackSegment->m_Start.x = pt_cur_ch->pad_end->m_Pos.x;
g_CurrentTrackSegment->m_Start.y = pt_cur_ch->pad_end->m_Pos.y; g_CurrentTrackSegment->m_Start.y = pt_cur_ch->pad_end->m_Pos.y;
} }
else /* Creation d'un segment suppl raccord */ else /* Creation d'un segment suppl raccord */
{ {
NewTrack = g_CurrentTrackSegment->Copy(); NewTrack = g_CurrentTrackSegment->Copy();
@ -893,14 +995,16 @@ TRACK * NewTrack, *OldTrack;
{ {
if( g_CurrentTrackSegment->Pback ) if( g_CurrentTrackSegment->Pback )
{ {
g_CurrentTrackSegment->m_Start.x = ((TRACK*)g_CurrentTrackSegment->Pback)->m_End.x; g_CurrentTrackSegment->m_Start.x = ( (TRACK*) g_CurrentTrackSegment->Pback )->
g_CurrentTrackSegment->m_Start.y = ((TRACK*)g_CurrentTrackSegment->Pback)->m_End.y; m_End.x;
g_CurrentTrackSegment->m_Start.y = ( (TRACK*) g_CurrentTrackSegment->Pback )->
m_End.y;
} }
} }
g_CurrentTrackSegment->m_Width = g_DesignSettings.m_CurrentTrackWidth; g_CurrentTrackSegment->m_Width = g_DesignSettings.m_CurrentTrackWidth;
if ( (g_CurrentTrackSegment->m_Start.x != g_CurrentTrackSegment->m_End.x) || if( (g_CurrentTrackSegment->m_Start.x != g_CurrentTrackSegment->m_End.x)
(g_CurrentTrackSegment->m_Start.y != g_CurrentTrackSegment->m_End.y) ) || (g_CurrentTrackSegment->m_Start.y != g_CurrentTrackSegment->m_End.y) )
{ {
/* Reduction des segments alignes a 1 seul */ /* Reduction des segments alignes a 1 seul */
OldTrack = (TRACK*) g_CurrentTrackSegment->Pback; OldTrack = (TRACK*) g_CurrentTrackSegment->Pback;
@ -924,13 +1028,14 @@ TRACK * NewTrack, *OldTrack;
} }
} }
/*******************************************/ /*******************************************/
/* static void Place_Piste_en_Buffer(void) */ /* static void Place_Piste_en_Buffer(void) */
/*******************************************/ /*******************************************/
/* Insere la nouvelle piste creee dans la liste standard des pistes. /* Insere la nouvelle piste creee dans la liste standard des pistes.
Modifie les points de debut et fin de piste pour qu'ils soient relies * Modifie les points de debut et fin de piste pour qu'ils soient relies
au centre des pads corresponadants, meme hors grille * au centre des pads corresponadants, meme hors grille
*/ */
static void Place_Piste_en_Buffer( WinEDA_PcbFrame* pcbframe, wxDC* DC ) static void Place_Piste_en_Buffer( WinEDA_PcbFrame* pcbframe, wxDC* DC )
{ {
@ -972,10 +1077,12 @@ WinEDA_DrawPanel * panel = pcbframe->DrawPanel;
g_FirstTrackSegment->start = Locate_Pad_Connecte( pcbframe->m_Pcb, g_FirstTrackSegment, START ); g_FirstTrackSegment->start = Locate_Pad_Connecte( pcbframe->m_Pcb, g_FirstTrackSegment, START );
if(g_FirstTrackSegment->start) g_FirstTrackSegment->SetState(BEGIN_ONPAD,ON); if( g_FirstTrackSegment->start )
g_FirstTrackSegment->SetState( BEGIN_ONPAD, ON );
g_CurrentTrackSegment->end = Locate_Pad_Connecte( pcbframe->m_Pcb, g_CurrentTrackSegment, END ); g_CurrentTrackSegment->end = Locate_Pad_Connecte( pcbframe->m_Pcb, g_CurrentTrackSegment, END );
if(g_CurrentTrackSegment->end) g_CurrentTrackSegment->SetState(END_ONPAD,ON); if( g_CurrentTrackSegment->end )
g_CurrentTrackSegment->SetState( END_ONPAD, ON );
/* recherche de la zone de rangement et insertion de la nouvelle piste */ /* recherche de la zone de rangement et insertion de la nouvelle piste */
pt_track = g_FirstTrackSegment->GetBestInsertPoint( pcbframe->m_Pcb ); pt_track = g_FirstTrackSegment->GetBestInsertPoint( pcbframe->m_Pcb );
@ -990,9 +1097,9 @@ WinEDA_DrawPanel * panel = pcbframe->DrawPanel;
{ {
TraceSegmentPcb( pcbframe->m_Pcb, pt_track, HOLE, marge, WRITE_CELL ); TraceSegmentPcb( pcbframe->m_Pcb, pt_track, HOLE, marge, WRITE_CELL );
TraceSegmentPcb( pcbframe->m_Pcb, pt_track, VIA_IMPOSSIBLE, via_marge, WRITE_OR_CELL ); TraceSegmentPcb( pcbframe->m_Pcb, pt_track, VIA_IMPOSSIBLE, via_marge, WRITE_OR_CELL );
if(pt_track == g_CurrentTrackSegment ) break; if( pt_track == g_CurrentTrackSegment )
break;
} }
ActiveScreen->SetModify(); ActiveScreen->SetModify();
} }

View File

@ -42,8 +42,8 @@ private:
void Sel_Layer( wxCommandEvent& event ); void Sel_Layer( wxCommandEvent& event );
void Cancel( wxCommandEvent& event ); void Cancel( wxCommandEvent& event );
void Execute( wxCommandEvent& event ); void Execute( wxCommandEvent& event );
DECLARE_EVENT_TABLE()
DECLARE_EVENT_TABLE()
}; };
/* Table des evenements pour WinEDA_SwapLayerFrame */ /* Table des evenements pour WinEDA_SwapLayerFrame */
BEGIN_EVENT_TABLE( WinEDA_SwapLayerFrame, wxDialog ) BEGIN_EVENT_TABLE( WinEDA_SwapLayerFrame, wxDialog )
@ -75,39 +75,44 @@ wxSize winsize;
{ {
g_Layer_Name_Pair[ii] = ReturnPcbLayerName( ii ) + wxT( " -> " ) + _( "No Change" ); g_Layer_Name_Pair[ii] = ReturnPcbLayerName( ii ) + wxT( " -> " ) + _( "No Change" );
} }
pos.x = 5; pos.y = START_Y; pos.x = 5; pos.y = START_Y;
m_LayerList = new wxRadioBox( this, ID_SWAP_LAYER_SELECT, _( "Layers" ), m_LayerList = new wxRadioBox( this, ID_SWAP_LAYER_SELECT, _( "Layers" ),
pos, wxSize(-1,-1), 29, g_Layer_Name_Pair, 16, wxRA_SPECIFY_ROWS); pos,
wxSize( -1, -1 ), 29, g_Layer_Name_Pair, 16, wxRA_SPECIFY_ROWS );
winsize.y = m_LayerList->GetRect().GetBottom(); winsize.y = m_LayerList->GetRect().GetBottom();
pos.x = m_LayerList->GetRect().GetRight() + 12; pos.x = m_LayerList->GetRect().GetRight() + 12;
Button = new wxButton( this, ID_SWAP_LAYER_CANCEL, Button = new wxButton( this, ID_SWAP_LAYER_CANCEL,
_( "Cancel" ), pos ); _( "Cancel" ), pos );
Button->SetForegroundColour( *wxRED ); Button->SetForegroundColour( *wxRED );
winsize.x = MAX( winsize.x, Button->GetRect().GetRight() ); winsize.x = MAX( winsize.x, Button->GetRect().GetRight() );
pos.y += Button->GetSize().y + 5; pos.y += Button->GetSize().y + 5;
Button = new wxButton( this, ID_SWAP_LAYER_EXECUTE, Button = new wxButton( this, ID_SWAP_LAYER_EXECUTE,
_( "OK" ), pos ); _( "OK" ), pos );
Button->SetForegroundColour( *wxBLUE ); Button->SetForegroundColour( *wxBLUE );
winsize.x = MAX( winsize.x, Button->GetRect().GetRight() ); winsize.x = MAX( winsize.x, Button->GetRect().GetRight() );
pos.y += Button->GetSize().y + 15; pos.y += Button->GetSize().y + 15;
Button = new wxButton( this, ID_SWAP_LAYER_DESELECT, Button = new wxButton( this, ID_SWAP_LAYER_DESELECT,
_( "Deselect" ), pos ); _( "Deselect" ), pos );
Button->SetForegroundColour( wxColour( 0, 100, 0 ) ); Button->SetForegroundColour( wxColour( 0, 100, 0 ) );
winsize.x = MAX( winsize.x, Button->GetRect().GetRight() ); winsize.x = MAX( winsize.x, Button->GetRect().GetRight() );
pos.y += Button->GetSize().y + 5; pos.y += Button->GetSize().y + 5;
Button = new wxButton( this, ID_SWAP_LAYER_BUTTON_SELECT, Button = new wxButton( this, ID_SWAP_LAYER_BUTTON_SELECT,
_( "Select" ), pos ); _( "Select" ), pos );
Button->SetForegroundColour( wxColour( 0, 100, 100 ) ); Button->SetForegroundColour( wxColour( 0, 100, 100 ) );
winsize.x = MAX( winsize.x, Button->GetRect().GetRight() ); winsize.x = MAX( winsize.x, Button->GetRect().GetRight() );
winsize.x += 10; winsize.y += 10; winsize.x += 10; winsize.y += 10;
SetClientSize( winsize ); SetClientSize( winsize );
} }
@ -133,18 +138,21 @@ void WinEDA_SwapLayerFrame::Sel_Layer(wxCommandEvent& event)
case ID_SWAP_LAYER_BUTTON_SELECT: case ID_SWAP_LAYER_BUTTON_SELECT:
case ID_SWAP_LAYER_SELECT: case ID_SWAP_LAYER_SELECT:
jj = m_Parent->SelectLayer( ii, -1, -1 ); jj = m_Parent->SelectLayer( ii, -1, -1 );
if ( (jj < 0) || (jj >= 29) ) return; if( (jj < 0) || (jj >= 29) )
return;
if( ii != jj ) if( ii != jj )
{ {
New_Layer[ii] = jj; New_Layer[ii] = jj;
m_LayerList->SetString( ii, m_LayerList->SetString( ii,
ReturnPcbLayerName(ii) + wxT(" -> ") + ReturnPcbLayerName(jj) ); ReturnPcbLayerName( ii ) + wxT( " -> " ) +
ReturnPcbLayerName( jj ) );
} }
break; break;
} }
} }
/*********************************************************/ /*********************************************************/
void WinEDA_SwapLayerFrame::Cancel( wxCommandEvent& event ) void WinEDA_SwapLayerFrame::Cancel( wxCommandEvent& event )
/*********************************************************/ /*********************************************************/
@ -152,6 +160,7 @@ void WinEDA_SwapLayerFrame::Cancel(wxCommandEvent& event)
EndModal( -1 ); EndModal( -1 );
} }
/*********************************************************/ /*********************************************************/
void WinEDA_SwapLayerFrame::Execute( wxCommandEvent& event ) void WinEDA_SwapLayerFrame::Execute( wxCommandEvent& event )
/*********************************************************/ /*********************************************************/
@ -172,12 +181,15 @@ EDA_BaseStruct * PtStruct;
/* Init default values */ /* Init default values */
for ( ii = 0 ; ii < 32 ; ii++ ) New_Layer[ii] = -1 ; for( ii = 0; ii < 32; ii++ )
New_Layer[ii] = -1;
WinEDA_SwapLayerFrame* frame = new WinEDA_SwapLayerFrame( this ); WinEDA_SwapLayerFrame* frame = new WinEDA_SwapLayerFrame( this );
ii = frame->ShowModal(); frame->Destroy(); ii = frame->ShowModal(); frame->Destroy();
if ( ii != 1 ) return; if( ii != 1 )
return;
/* Modifications des pistes */ /* Modifications des pistes */
pt_segm = (TRACK*) m_Pcb->m_Track; pt_segm = (TRACK*) m_Pcb->m_Track;
@ -187,7 +199,8 @@ WinEDA_SwapLayerFrame * frame = new WinEDA_SwapLayerFrame(this);
if( pt_segm->m_StructType == TYPEVIA ) if( pt_segm->m_StructType == TYPEVIA )
{ {
SEGVIA* Via = (SEGVIA*) pt_segm; SEGVIA* Via = (SEGVIA*) pt_segm;
if ( Via->Shape() == VIA_NORMALE ) continue; if( Via->Shape() == VIA_NORMALE )
continue;
int top_layer, bottom_layer; int top_layer, bottom_layer;
Via->ReturnLayerPair( &top_layer, &bottom_layer ); Via->ReturnLayerPair( &top_layer, &bottom_layer );
if( New_Layer[bottom_layer] >= 0 ) if( New_Layer[bottom_layer] >= 0 )
@ -198,8 +211,9 @@ WinEDA_SwapLayerFrame * frame = new WinEDA_SwapLayerFrame(this);
} }
else else
{ {
jj = pt_segm->m_Layer; jj = pt_segm->GetLayer();
if( New_Layer[jj] >= 0) pt_segm->m_Layer = New_Layer[jj]; if( New_Layer[jj] >= 0 )
pt_segm->SetLayer( New_Layer[jj] );
} }
} }
@ -208,8 +222,9 @@ WinEDA_SwapLayerFrame * frame = new WinEDA_SwapLayerFrame(this);
for( ; pt_segm != NULL; pt_segm = (TRACK*) pt_segm->Pnext ) for( ; pt_segm != NULL; pt_segm = (TRACK*) pt_segm->Pnext )
{ {
m_CurrentScreen->SetModify(); m_CurrentScreen->SetModify();
jj = pt_segm->m_Layer; jj = pt_segm->GetLayer();
if( New_Layer[jj] >= 0) pt_segm->m_Layer = New_Layer[jj]; if( New_Layer[jj] >= 0 )
pt_segm->SetLayer( New_Layer[jj] );
} }
/* Modifications des autres segments */ /* Modifications des autres segments */
@ -220,11 +235,11 @@ WinEDA_SwapLayerFrame * frame = new WinEDA_SwapLayerFrame(this);
{ {
m_CurrentScreen->SetModify(); m_CurrentScreen->SetModify();
pt_drawsegm = (DRAWSEGMENT*) PtStruct; pt_drawsegm = (DRAWSEGMENT*) PtStruct;
jj = pt_drawsegm->m_Layer; jj = pt_drawsegm->GetLayer();
if( New_Layer[jj] >= 0) pt_drawsegm->m_Layer = New_Layer[jj]; if( New_Layer[jj] >= 0 )
pt_drawsegm->SetLayer( New_Layer[jj] );
} }
} }
DrawPanel->Refresh( TRUE ); DrawPanel->Refresh( TRUE );
} }

View File

@ -123,13 +123,13 @@ void WinEDA_PcbFrame::Trace_Pcb( wxDC* DC, int mode )
if( !DisplayOpt.Show_Modules_Cmp ) if( !DisplayOpt.Show_Modules_Cmp )
{ {
if( Module->m_Layer == CMP_N ) if( Module->GetLayer() == CMP_N )
display = FALSE; display = FALSE;
MaskLay &= ~CMP_LAYER; MaskLay &= ~CMP_LAYER;
} }
if( !DisplayOpt.Show_Modules_Cu ) if( !DisplayOpt.Show_Modules_Cu )
{ {
if( Module->m_Layer == CUIVRE_N ) if( Module->GetLayer() == CUIVRE_N )
display = FALSE; display = FALSE;
MaskLay &= ~CUIVRE_LAYER; MaskLay &= ~CUIVRE_LAYER;
} }

View File

@ -17,8 +17,7 @@ public:
TRACK* RefTrack; TRACK* RefTrack;
public: public:
TSTSEGM(TRACK * Father) TSTSEGM( TRACK * Father ) {
{
Pback = Pnext = NULL; Pback = Pnext = NULL;
RefTrack = Father; RefTrack = Father;
} }
@ -38,14 +37,15 @@ TSTSEGM * ListSegm = NULL;
TRACK* Marque_Une_Piste( WinEDA_BasePcbFrame* frame, wxDC* DC, TRACK* Marque_Une_Piste( WinEDA_BasePcbFrame* frame, wxDC* DC,
TRACK* pt_segm, int* nb_segm, int flagcolor ) TRACK* pt_segm, int* nb_segm, int flagcolor )
/****************************************************************************/ /****************************************************************************/
/* Routine de Marquage de 1 piste, a partir du segment pointe par pt_segm. /* Routine de Marquage de 1 piste, a partir du segment pointe par pt_segm.
le segment pointe est marque puis les segments connectes * le segment pointe est marque puis les segments connectes
jusqu'a un pad ou un point de jonction de plus de 2 segments * jusqu'a un pad ou un point de jonction de plus de 2 segments
le marquage est la mise a 1 du bit BUSY * le marquage est la mise a 1 du bit BUSY
Les segments sont ensuite reclasses pour etre contigus en liste chainee * Les segments sont ensuite reclasses pour etre contigus en liste chainee
Retourne: * Retourne:
adresse du 1er segment de la chaine creee * adresse du 1er segment de la chaine creee
nombre de segments * nombre de segments
*/ */
{ {
int NbSegmBusy, masque_layer; int NbSegmBusy, masque_layer;
@ -53,18 +53,20 @@ TRACK *Track, *FirstTrack, *NextTrack;
TSTSEGM* Segm, * NextSegm; TSTSEGM* Segm, * NextSegm;
*nb_segm = 0; *nb_segm = 0;
if (pt_segm == NULL ) return(NULL) ; if( pt_segm == NULL )
return NULL;
/* Marquage du segment pointe */ /* Marquage du segment pointe */
if(flagcolor) pt_segm->Draw(frame->DrawPanel, DC, flagcolor); if( flagcolor )
pt_segm->Draw( frame->DrawPanel, DC, flagcolor );
pt_segm->SetState( BUSY, ON ); pt_segm->SetState( BUSY, ON );
masque_layer = pt_segm->ReturnMaskLayer(); masque_layer = pt_segm->ReturnMaskLayer();
ListSegm = new TSTSEGM( pt_segm ); ListSegm = new TSTSEGM( pt_segm );
/* Traitement du segment pointe : si c'est un segment, le cas est simple. /* Traitement du segment pointe : si c'est un segment, le cas est simple.
Si c'est une via, on doit examiner le nombre de segments connectes. * Si c'est une via, on doit examiner le nombre de segments connectes.
Si <=2, on doit detecter une piste, si > 2 seule la via est marquee * Si <=2, on doit detecter une piste, si > 2 seule la via est marquee
*/ */
if( pt_segm->m_StructType == TYPEVIA ) if( pt_segm->m_StructType == TYPEVIA )
{ {
@ -83,7 +85,7 @@ TSTSEGM * Segm, * NextSegm;
} }
if( Segm3 ) if( Segm3 )
{ {
*nb_segm = 1; return (pt_segm); *nb_segm = 1; return pt_segm;
} }
if( Segm1 ) if( Segm1 )
{ {
@ -106,21 +108,24 @@ TSTSEGM * Segm, * NextSegm;
for( Segm = ListSegm; Segm != NULL; Segm = Segm->Pnext ) for( Segm = ListSegm; Segm != NULL; Segm = Segm->Pnext )
{ {
int layer; int layer;
if( Segm->RefTrack->m_StructType != TYPEVIA ) continue; if( Segm->RefTrack->m_StructType != TYPEVIA )
if( Segm->RefTrack == pt_segm ) continue; continue;
if( Segm->RefTrack == pt_segm )
continue;
Segm->RefTrack->SetState( BUSY, ON ); Segm->RefTrack->SetState( BUSY, ON );
masque_layer = Segm->RefTrack->ReturnMaskLayer(); masque_layer = Segm->RefTrack->ReturnMaskLayer();
Track = Fast_Locate_Piste( frame->m_Pcb->m_Track, NULL, Track = Fast_Locate_Piste( frame->m_Pcb->m_Track, NULL,
Segm->RefTrack->m_Start, Segm->RefTrack->m_Start,
masque_layer ); masque_layer );
if( Track == NULL ) continue; if( Track == NULL )
continue;
/* Test des connexions: si via utile: suppression marquage */ /* Test des connexions: si via utile: suppression marquage */
layer = Track->m_Layer; layer = Track->GetLayer();
while( ( Track = Fast_Locate_Piste( (TRACK*) Track->Pnext, NULL, while( ( Track = Fast_Locate_Piste( (TRACK*) Track->Pnext, NULL,
Segm->RefTrack->m_Start, Segm->RefTrack->m_Start,
masque_layer ) ) != NULL ) masque_layer ) ) != NULL )
{ {
if( layer != Track->m_Layer ) if( layer != Track->GetLayer() )
{ {
Segm->RefTrack->SetState( BUSY, OFF ); Segm->RefTrack->SetState( BUSY, OFF );
break; break;
@ -133,6 +138,7 @@ TSTSEGM * Segm, * NextSegm;
{ {
NextSegm = Segm->Pnext; delete Segm; NextSegm = Segm->Pnext; delete Segm;
} }
ListSegm = NULL; ListSegm = NULL;
/* Reclassement des segments marques en une chaine */ /* Reclassement des segments marques en une chaine */
@ -146,7 +152,7 @@ TSTSEGM * Segm, * NextSegm;
} }
/* Reclassement de la chaine debutant a FirstTrack et finissant /* Reclassement de la chaine debutant a FirstTrack et finissant
au dernier segment marque. FirstTrack n'est pas modifie */ * au dernier segment marque. FirstTrack n'est pas modifie */
Track = (TRACK*) FirstTrack->Pnext; Track = (TRACK*) FirstTrack->Pnext;
for( ; Track != NULL; Track = NextTrack ) for( ; Track != NULL; Track = NextTrack )
{ {
@ -161,22 +167,24 @@ TSTSEGM * Segm, * NextSegm;
*nb_segm = NbSegmBusy; *nb_segm = NbSegmBusy;
if(flagcolor) Trace_Une_Piste(frame->DrawPanel, DC, FirstTrack,NbSegmBusy,flagcolor); if( flagcolor )
Trace_Une_Piste( frame->DrawPanel, DC, FirstTrack, NbSegmBusy, flagcolor );
return(FirstTrack); return FirstTrack;
} }
/********************************************************************************/ /********************************************************************************/
static void Marque_Chaine_segments( BOARD* Pcb, wxPoint ref_pos, int masque_layer ) static void Marque_Chaine_segments( BOARD* Pcb, wxPoint ref_pos, int masque_layer )
/********************************************************************************/ /********************************************************************************/
/*
routine utilisee par Supprime_1_Piste()
Positionne le bit BUSY dans la chaine de segments commencant
au point ox, oy sur la couche layer
Les vias sont mises en liste des segments traites mais ne sont pas /*
marquees. * routine utilisee par Supprime_1_Piste()
* Positionne le bit BUSY dans la chaine de segments commencant
* au point ox, oy sur la couche layer
*
* Les vias sont mises en liste des segments traites mais ne sont pas
* marquees.
*/ */
{ {
TRACK* pt_segm, // Pointe le segment courant analyse TRACK* pt_segm, // Pointe le segment courant analyse
@ -185,29 +193,33 @@ TRACK *pt_segm, // Pointe le segment courant analyse
int NbSegm; int NbSegm;
TSTSEGM* Segm; TSTSEGM* Segm;
if(Pcb->m_Track == NULL) return; if( Pcb->m_Track == NULL )
return;
/* Marquage de la chaine */ /* Marquage de la chaine */
for( ; ; ) for( ; ; )
{ {
if( Fast_Locate_Pad_Connecte(Pcb, ref_pos,masque_layer) != NULL ) return; if( Fast_Locate_Pad_Connecte( Pcb, ref_pos, masque_layer ) != NULL )
return;
/* Localisation d'une via (car elle connecte plusieurs segments) */ /* Localisation d'une via (car elle connecte plusieurs segments) */
pt_via = Fast_Locate_Via( Pcb->m_Track, NULL, ref_pos, masque_layer ); pt_via = Fast_Locate_Via( Pcb->m_Track, NULL, ref_pos, masque_layer );
if( pt_via ) if( pt_via )
{ {
if(pt_via->GetState(EDIT)) return; if( pt_via->GetState( EDIT ) )
return;
masque_layer = pt_via->ReturnMaskLayer(); masque_layer = pt_via->ReturnMaskLayer();
Segm = new TSTSEGM( pt_via ); Segm = new TSTSEGM( pt_via );
Segm->Pnext = ListSegm; Segm->Pnext = ListSegm;
ListSegm->Pback = Segm; ListSegm->Pback = Segm;
ListSegm = Segm; ListSegm = Segm;
} }
/* Recherche des segments connectes au point ref_pos /* Recherche des segments connectes au point ref_pos
si 1 segment: peut etre marque * si 1 segment: peut etre marque
si > 1 segment: * si > 1 segment:
le segment ne peut etre marque * le segment ne peut etre marque
*/ */
pt_segm = Pcb->m_Track; MarqSegm = NULL; pt_segm = Pcb->m_Track; MarqSegm = NULL;
NbSegm = 0; NbSegm = 0;
@ -249,7 +261,8 @@ TSTSEGM * Segm;
{ {
ref_pos = MarqSegm->m_End; ref_pos = MarqSegm->m_End;
} }
else { else
{
ref_pos = MarqSegm->m_Start; ref_pos = MarqSegm->m_Start;
} }
@ -257,12 +270,14 @@ TSTSEGM * Segm;
/* Marquage et mise en liste du segment */ /* Marquage et mise en liste du segment */
Segm = new TSTSEGM( MarqSegm ); Segm = new TSTSEGM( MarqSegm );
Segm->Pnext = ListSegm; Segm->Pnext = ListSegm;
ListSegm->Pback = Segm; ListSegm->Pback = Segm;
ListSegm = Segm; ListSegm = Segm;
MarqSegm->SetState( BUSY, ON ); MarqSegm->SetState( BUSY, ON );
} }
else return; else
return;
} }
} }
@ -271,12 +286,13 @@ TSTSEGM * Segm;
int ReturnEndsTrack( TRACK* RefTrack, int NbSegm, int ReturnEndsTrack( TRACK* RefTrack, int NbSegm,
TRACK** StartTrack, TRACK** EndTrack ) TRACK** StartTrack, TRACK** EndTrack )
/**********************************************************/ /**********************************************************/
/* Calcule les coordonnes des extremites d'une piste /* Calcule les coordonnes des extremites d'une piste
retourne 1 si OK, 0 si piste bouclee * retourne 1 si OK, 0 si piste bouclee
Retourne dans *StartTrack en *EndTrack les segments de debut et fin * Retourne dans *StartTrack en *EndTrack les segments de debut et fin
Les coord StartTrack->m_Start.x, m_Start.y contiennent le debut de la piste * Les coord StartTrack->m_Start.x, m_Start.y contiennent le debut de la piste
Les coord EndTrack->m_End.x, m_End.y contiennent le debut de la piste * Les coord EndTrack->m_End.x, m_End.y contiennent le debut de la piste
Les segments sont supposes chaines de facon consecutive * Les segments sont supposes chaines de facon consecutive
*/ */
{ {
TRACK* Track, * via, * segm, * TrackListEnd; TRACK* Track, * via, * segm, * TrackListEnd;
@ -285,7 +301,7 @@ int NbEnds, masque_layer, ii, ok = 0;
if( NbSegm <= 1 ) if( NbSegm <= 1 )
{ {
*StartTrack = *EndTrack = RefTrack; *StartTrack = *EndTrack = RefTrack;
return(1); /* cas trivial */ return 1; /* cas trivial */
} }
/* calcul de la limite d'analyse */ /* calcul de la limite d'analyse */
@ -301,7 +317,8 @@ int NbEnds, masque_layer, ii, ok = 0;
NbEnds = 0; Track = RefTrack; ii = 0; NbEnds = 0; Track = RefTrack; ii = 0;
for( ; (Track != NULL) && (ii < NbSegm); ii++, Track = (TRACK*) Track->Pnext ) for( ; (Track != NULL) && (ii < NbSegm); ii++, Track = (TRACK*) Track->Pnext )
{ {
if(Track->m_StructType == TYPEVIA) continue; if( Track->m_StructType == TYPEVIA )
continue;
masque_layer = Track->ReturnMaskLayer(); masque_layer = Track->ReturnMaskLayer();
via = Fast_Locate_Via( RefTrack, TrackListEnd, via = Fast_Locate_Via( RefTrack, TrackListEnd,
@ -316,7 +333,8 @@ int NbEnds, masque_layer, ii, ok = 0;
segm = Fast_Locate_Piste( RefTrack, TrackListEnd, segm = Fast_Locate_Piste( RefTrack, TrackListEnd,
Track->m_Start, masque_layer ); Track->m_Start, masque_layer );
Track->SetState( BUSY, OFF ); Track->SetState( BUSY, OFF );
if(via) via->SetState(BUSY,OFF); if( via )
via->SetState( BUSY, OFF );
if( segm == NULL ) if( segm == NULL )
{ {
@ -339,7 +357,7 @@ int NbEnds, masque_layer, ii, ok = 0;
Track->SetState( BEGIN_ONPAD, ON ); Track->SetState( BEGIN_ONPAD, ON );
EXCHG( Track->m_Start, Track->m_End ); EXCHG( Track->m_Start, Track->m_End );
EXCHG( Track->start, Track->end ); EXCHG( Track->start, Track->end );
ok = 1; return(ok); ok = 1; return ok;
} }
} }
@ -356,7 +374,8 @@ int NbEnds, masque_layer, ii, ok = 0;
segm = Fast_Locate_Piste( RefTrack, TrackListEnd, segm = Fast_Locate_Piste( RefTrack, TrackListEnd,
Track->m_End, masque_layer ); Track->m_End, masque_layer );
Track->SetState( BUSY, OFF ); Track->SetState( BUSY, OFF );
if (via) via->SetState(BUSY,OFF); if( via )
via->SetState( BUSY, OFF );
if( segm == NULL ) if( segm == NULL )
{ {
switch( NbEnds ) switch( NbEnds )
@ -378,22 +397,24 @@ int NbEnds, masque_layer, ii, ok = 0;
case 1: case 1:
*EndTrack = Track; *EndTrack = Track;
ok = 1; return(ok); ok = 1; return ok;
} }
} }
} }
return(ok); return ok;
} }
/***************************************************************************/ /***************************************************************************/
void ListSetState( EDA_BaseStruct* Start, int NbItem, int State, int onoff ) void ListSetState( EDA_BaseStruct* Start, int NbItem, int State, int onoff )
/***************************************************************************/ /***************************************************************************/
/* Met a jour le membre .state d'une chaine de structures /* Met a jour le membre .state d'une chaine de structures
*/ */
{ {
if(Start == NULL ) return; if( Start == NULL )
return;
for( ; (Start != NULL) && (NbItem > 0); NbItem--, Start = Start->Pnext ) for( ; (Start != NULL) && (NbItem > 0); NbItem--, Start = Start->Pnext )
{ {
Start->SetState( State, onoff ); Start->SetState( State, onoff );

View File

@ -16,6 +16,7 @@
/*********************************************************************************/ /*********************************************************************************/
void Trace_Pistes( WinEDA_DrawPanel* panel, BOARD* Pcb, wxDC* DC, int drawmode ) void Trace_Pistes( WinEDA_DrawPanel* panel, BOARD* Pcb, wxDC* DC, int drawmode )
/********************************************************************************/ /********************************************************************************/
/* Draw all tracks and zones. /* Draw all tracks and zones.
*/ */
{ {
@ -35,41 +36,45 @@ TRACK * track;
} }
/************************************************************************/ /************************************************************************/
void Trace_Une_Piste( WinEDA_DrawPanel* panel, wxDC* DC, TRACK* Track, void Trace_Une_Piste( WinEDA_DrawPanel* panel, wxDC* DC, TRACK* Track,
int nbsegment, int draw_mode ) int nbsegment, int draw_mode )
/************************************************************************/ /************************************************************************/
/* routine de trace de n segments consecutifs en memoire. /* routine de trace de n segments consecutifs en memoire.
Utile pour monter une piste en cours de trace car les segments de cette * Utile pour monter une piste en cours de trace car les segments de cette
piste sont alors contigus en memoire * piste sont alors contigus en memoire
Parametres : * Parametres :
pt_start_piste = adresse de depart de la liste des segments * pt_start_piste = adresse de depart de la liste des segments
nbsegment = nombre de segments a tracer * nbsegment = nombre de segments a tracer
draw_mode = mode ( GR_XOR, GR_OR..) * draw_mode = mode ( GR_XOR, GR_OR..)
ATTENTION: * ATTENTION:
le point de depart d'une piste suivante DOIT exister: peut etre * le point de depart d'une piste suivante DOIT exister: peut etre
donc mis a 0 avant appel a la routine si la piste a tracer est la derniere * donc mis a 0 avant appel a la routine si la piste a tracer est la derniere
*/ */
{ {
if ( Track == NULL ) return; if( Track == NULL )
return;
for( ; nbsegment > 0; nbsegment--, Track = (TRACK*) Track->Pnext ) for( ; nbsegment > 0; nbsegment--, Track = (TRACK*) Track->Pnext )
{ {
if ( Track == NULL ) break; if( Track == NULL )
break;
Track->Draw( panel, DC, draw_mode ); Track->Draw( panel, DC, draw_mode );
} }
} }
/*************************************************************/ /*************************************************************/
void Trace_DrawSegmentPcb( WinEDA_DrawPanel* panel, wxDC* DC, void Trace_DrawSegmentPcb( WinEDA_DrawPanel* panel, wxDC* DC,
DRAWSEGMENT* PtDrawSegment, int draw_mode ) DRAWSEGMENT* PtDrawSegment, int draw_mode )
/*************************************************************/ /*************************************************************/
/* Affichage d'un segment type drawing PCB: /* Affichage d'un segment type drawing PCB:
draw_mode = mode de trace ( GR_OR, GR_XOR, GrAND) * draw_mode = mode de trace ( GR_OR, GR_XOR, GrAND)
Les contours sont de differents type: * Les contours sont de differents type:
segment * segment
cercle * cercle
arc * arc
*/ */
{ {
int ux0, uy0, dx, dy; int ux0, uy0, dx, dy;
@ -78,11 +83,14 @@ int color, mode;
int zoom; int zoom;
int rayon; int rayon;
color = g_DesignSettings.m_LayerColor[PtDrawSegment->m_Layer]; color = g_DesignSettings.m_LayerColor[PtDrawSegment->GetLayer()];
if(color & ITEM_NOT_SHOW ) return ; if( color & ITEM_NOT_SHOW )
return;
if ( panel ) zoom = panel->GetZoom(); if( panel )
else zoom = ActiveScreen->GetZoom(); zoom = panel->GetZoom();
else
zoom = ActiveScreen->GetZoom();
GRSetDrawMode( DC, draw_mode ); GRSetDrawMode( DC, draw_mode );
l_piste = PtDrawSegment->m_Width >> 1; /* l_piste = demi largeur piste */ l_piste = PtDrawSegment->m_Width >> 1; /* l_piste = demi largeur piste */
@ -96,8 +104,10 @@ int rayon;
mode = DisplayOpt.DisplayDrawItems; mode = DisplayOpt.DisplayDrawItems;
if(PtDrawSegment->m_Flags & FORCE_SKETCH) mode = SKETCH; if( PtDrawSegment->m_Flags & FORCE_SKETCH )
if ( l_piste < (L_MIN_DESSIN * zoom) ) mode = FILAIRE; mode = SKETCH;
if( l_piste < (L_MIN_DESSIN * zoom) )
mode = FILAIRE;
switch( PtDrawSegment->m_Shape ) switch( PtDrawSegment->m_Shape )
{ {
@ -124,7 +134,8 @@ int rayon;
rayon = (int) hypot( (double) (dx - ux0), (double) (dy - uy0) ); rayon = (int) hypot( (double) (dx - ux0), (double) (dy - uy0) );
StAngle = (int) ArcTangente( dy - uy0, dx - ux0 ); StAngle = (int) ArcTangente( dy - uy0, dx - ux0 );
EndAngle = StAngle + PtDrawSegment->m_Angle; EndAngle = StAngle + PtDrawSegment->m_Angle;
if ( StAngle > EndAngle) EXCHG (StAngle, EndAngle); if( StAngle > EndAngle )
EXCHG( StAngle, EndAngle );
if( mode == FILAIRE ) if( mode == FILAIRE )
GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, rayon, color ); GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, rayon, color );
else if( mode == SKETCH ) else if( mode == SKETCH )
@ -158,4 +169,3 @@ int rayon;
break; break;
} }
} }

View File

@ -14,8 +14,7 @@
/* variables locales */ /* variables locales */
enum id_ExchangeModule enum id_ExchangeModule {
{
ID_EXEC_EXCHANGE_MODULE = 1900, ID_EXEC_EXCHANGE_MODULE = 1900,
ID_EXEC_EXCHANGE_ID_MODULES, ID_EXEC_EXCHANGE_ID_MODULES,
ID_EXEC_EXCHANGE_ID_MODULE_AND_VALUE, ID_EXEC_EXCHANGE_ID_MODULE_AND_VALUE,
@ -41,6 +40,7 @@ private:
wxTextCtrl* m_WinMsg; wxTextCtrl* m_WinMsg;
public: public:
// Constructor and destructor // Constructor and destructor
WinEDA_ExchangeModuleFrame( WinEDA_BasePcbFrame * parent, WinEDA_ExchangeModuleFrame( WinEDA_BasePcbFrame * parent,
MODULE * Module, wxDC * DC, const wxPoint &pos ); MODULE * Module, wxDC * DC, const wxPoint &pos );
@ -90,53 +90,67 @@ wxButton * Button;
m_CurrentModule = Module; m_CurrentModule = Module;
wxBoxSizer* MainBoxSizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* MainBoxSizer = new wxBoxSizer( wxVERTICAL );
SetSizer( MainBoxSizer ); SetSizer( MainBoxSizer );
wxBoxSizer* UpperBoxSizer = new wxBoxSizer( wxHORIZONTAL ); wxBoxSizer* UpperBoxSizer = new wxBoxSizer( wxHORIZONTAL );
MainBoxSizer->Add( UpperBoxSizer, 0, wxGROW | wxALL, 5 ); MainBoxSizer->Add( UpperBoxSizer, 0, wxGROW | wxALL, 5 );
wxBoxSizer* LeftBoxSizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* LeftBoxSizer = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* RightBoxSizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* RightBoxSizer = new wxBoxSizer( wxVERTICAL );
UpperBoxSizer->Add( LeftBoxSizer, 0, wxGROW | wxALL, 5 ); UpperBoxSizer->Add( LeftBoxSizer, 0, wxGROW | wxALL, 5 );
UpperBoxSizer->Add( RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 ); UpperBoxSizer->Add( RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
/* Creation des boutons de commande */ /* Creation des boutons de commande */
Button = new wxButton( this, ID_EXEC_EXCHANGE_MODULE, Button = new wxButton( this, ID_EXEC_EXCHANGE_MODULE,
_( "Change module" ) ); _( "Change module" ) );
Button->SetForegroundColour( *wxBLUE ); Button->SetForegroundColour( *wxBLUE );
RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 ); RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 );
Button = new wxButton( this, ID_EXEC_EXCHANGE_ID_MODULES, Button = new wxButton( this, ID_EXEC_EXCHANGE_ID_MODULES,
_( "Change same modules" ) ); _( "Change same modules" ) );
Button->SetForegroundColour( *wxRED ); Button->SetForegroundColour( *wxRED );
RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT, 5 ); RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT, 5 );
Button = new wxButton( this, ID_EXEC_EXCHANGE_ID_MODULE_AND_VALUE, Button = new wxButton( this, ID_EXEC_EXCHANGE_ID_MODULE_AND_VALUE,
_( "Ch. same module+value" ) ); _( "Ch. same module+value" ) );
Button->SetForegroundColour( *wxRED ); Button->SetForegroundColour( *wxRED );
RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT, 5 ); RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT, 5 );
Button = new wxButton( this, ID_EXEC_EXCHANGE_ALL_MODULES, Button = new wxButton( this, ID_EXEC_EXCHANGE_ALL_MODULES,
_( "Change all" ) ); _( "Change all" ) );
Button->SetForegroundColour( *wxRED ); Button->SetForegroundColour( *wxRED );
RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT, 5 ); RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT, 5 );
Button = new wxButton( this, ID_BROWSE_LIB_MODULES, Button = new wxButton( this, ID_BROWSE_LIB_MODULES,
_( "Browse Libs modules" ) ); _( "Browse Libs modules" ) );
Button->SetForegroundColour( wxColour( 0, 100, 0 ) ); Button->SetForegroundColour( wxColour( 0, 100, 0 ) );
RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT, 5 ); RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT, 5 );
Button = new wxButton( this, ID_CLOSE_EXCHANGE_MODULE, Button = new wxButton( this, ID_CLOSE_EXCHANGE_MODULE,
_( "Close" ) ); _( "Close" ) );
Button->SetForegroundColour( *wxBLUE ); Button->SetForegroundColour( *wxBLUE );
RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 ); RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 );
m_OldModule = new WinEDA_EnterText( this, _( "Current Module" ), m_OldModule = new WinEDA_EnterText( this, _( "Current Module" ),
m_CurrentModule ? m_CurrentModule->m_LibRef.GetData() :wxEmptyString, m_CurrentModule ?
m_CurrentModule->m_LibRef.GetData () : wxEmptyString,
LeftBoxSizer, wxSize( 150, -1 ) ); LeftBoxSizer, wxSize( 150, -1 ) );
m_OldModule->Enable( FALSE ); m_OldModule->Enable( FALSE );
m_OldValue = new WinEDA_EnterText( this, _( "Current Value" ), m_OldValue = new WinEDA_EnterText( this, _( "Current Value" ),
m_CurrentModule ? m_CurrentModule->m_Value->m_Text.GetData() :wxEmptyString, m_CurrentModule ?
m_CurrentModule->m_Value->m_Text.GetData () : wxEmptyString,
LeftBoxSizer, wxSize( 150, -1 ) ); LeftBoxSizer, wxSize( 150, -1 ) );
m_OldValue->Enable( FALSE ); m_OldValue->Enable( FALSE );
m_NewModule = new WinEDA_EnterText( this, _( "New Module" ), m_NewModule = new WinEDA_EnterText( this, _( "New Module" ),
@ -144,6 +158,7 @@ wxButton * Button;
m_WinMsg = new wxTextCtrl( this, -1, wxEmptyString, wxDefaultPosition, wxSize( 340, 230 ), m_WinMsg = new wxTextCtrl( this, -1, wxEmptyString, wxDefaultPosition, wxSize( 340, 230 ),
wxTE_READONLY | wxTE_MULTILINE ); wxTE_READONLY | wxTE_MULTILINE );
MainBoxSizer->Add( m_WinMsg, 0, wxGROW | wxALL, 5 ); MainBoxSizer->Add( m_WinMsg, 0, wxGROW | wxALL, 5 );
GetSizer()->Fit( this ); GetSizer()->Fit( this );
@ -158,6 +173,7 @@ void WinEDA_BasePcbFrame::InstallExchangeModuleFrame( MODULE * Module,
{ {
WinEDA_ExchangeModuleFrame* frame = new WinEDA_ExchangeModuleFrame( this, WinEDA_ExchangeModuleFrame* frame = new WinEDA_ExchangeModuleFrame( this,
Module, DC, pos ); Module, DC, pos );
frame->ShowModal(); frame->Destroy(); frame->ShowModal(); frame->Destroy();
} }
@ -170,20 +186,20 @@ void WinEDA_ExchangeModuleFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
} }
/************************************************************************/ /************************************************************************/
int WinEDA_ExchangeModuleFrame::Maj_ListeCmp( int WinEDA_ExchangeModuleFrame::Maj_ListeCmp(
const wxString& reference, const wxString& reference,
const wxString& old_name, const wxString& old_name,
const wxString& new_name, bool ShowError ) const wxString& new_name, bool ShowError )
/************************************************************************/ /************************************************************************/
/*
Met a jour le fichier name.CMP (s'il existe) apres un echange de module
(par la commande changeMod), si les modules sont geres par ce fichier
Si ShowError != 0 affiche message d'erreur si le fichier .cmp n'est pas /*
trouve. * Met a jour le fichier name.CMP (s'il existe) apres un echange de module
Retoure 1 si erreur * (par la commande changeMod), si les modules sont geres par ce fichier
*
* Si ShowError != 0 affiche message d'erreur si le fichier .cmp n'est pas
* trouve.
* Retoure 1 si erreur
*/ */
{ {
wxString FileNameCmp, tmpfile; wxString FileNameCmp, tmpfile;
@ -191,12 +207,14 @@ FILE * FichCmp, *NewFile;
char Line[1024]; char Line[1024];
wxString msg; wxString msg;
if ( old_name == new_name ) return(0); /* pas de changement de nom */ if( old_name == new_name )
return 0; /* pas de changement de nom */
/* Calcul nom fichier CMP par changement de l'extension du nom netliste */ /* Calcul nom fichier CMP par changement de l'extension du nom netliste */
if( NetNameBuffer == wxEmptyString ) if( NetNameBuffer == wxEmptyString )
FileNameCmp = m_Parent->m_CurrentScreen->m_FileName; FileNameCmp = m_Parent->m_CurrentScreen->m_FileName;
else FileNameCmp = NetNameBuffer; else
FileNameCmp = NetNameBuffer;
ChangeFileNameExt( FileNameCmp, NetCmpExtBuffer ); ChangeFileNameExt( FileNameCmp, NetCmpExtBuffer );
// Modification du fichier .cmp correcpondant // Modification du fichier .cmp correcpondant
@ -208,7 +226,7 @@ wxString msg;
msg.Printf( _( "file %s not found" ), FileNameCmp.GetData() ); msg.Printf( _( "file %s not found" ), FileNameCmp.GetData() );
m_WinMsg->WriteText( msg ); m_WinMsg->WriteText( msg );
} }
return(1); return 1;
} }
/* Analyse du fichier et modif */ /* Analyse du fichier et modif */
@ -222,7 +240,7 @@ wxString msg;
msg.Printf( _( "Unable to create file %s" ), tmpfile.GetData() ); msg.Printf( _( "Unable to create file %s" ), tmpfile.GetData() );
m_WinMsg->WriteText( msg ); m_WinMsg->WriteText( msg );
} }
return(1); return 1;
} }
fgets( Line, sizeof(Line), FichCmp ); fgets( Line, sizeof(Line), FichCmp );
@ -242,8 +260,8 @@ wxString msg;
} }
} }
if ( (strnicmp( Line, "Begin", 5 ) == 0) || if( (strnicmp( Line, "Begin", 5 ) == 0)
(strnicmp( Line, "End", 3) == 0) ) || (strnicmp( Line, "End", 3 ) == 0) )
{ {
start_descr = FALSE; start_descr = FALSE;
} }
@ -264,26 +282,26 @@ wxString msg;
fclose( NewFile ); fclose( NewFile );
wxRemoveFile( FileNameCmp ); wxRemoveFile( FileNameCmp );
wxRenameFile( tmpfile, FileNameCmp ); wxRenameFile( tmpfile, FileNameCmp );
return(0); return 0;
} }
/********************************************************************/ /********************************************************************/
void WinEDA_ExchangeModuleFrame::Change_Module( wxCommandEvent& event ) void WinEDA_ExchangeModuleFrame::Change_Module( wxCommandEvent& event )
/********************************************************************/ /********************************************************************/
/* Routine de changement d'un module: /* Routine de changement d'un module:
Change le module pointe par la souris, par un autre en conservant * Change le module pointe par la souris, par un autre en conservant
- meme orientation * - meme orientation
- meme position * - meme position
- memes textes valeur et ref * - memes textes valeur et ref
- memes netnames pour pads de meme nom * - memes netnames pour pads de meme nom
*/ */
{ {
wxString newmodulename = m_NewModule->GetValue(); wxString newmodulename = m_NewModule->GetValue();
if( newmodulename == wxEmptyString ) return; if( newmodulename == wxEmptyString )
return;
if( Change_1_Module( m_CurrentModule, newmodulename, TRUE ) ) if( Change_1_Module( m_CurrentModule, newmodulename, TRUE ) )
{ {
@ -292,19 +310,20 @@ wxString newmodulename = m_NewModule->GetValue();
} }
} }
/*********************************************************************/ /*********************************************************************/
void WinEDA_ExchangeModuleFrame::Change_ModuleId( wxCommandEvent& event ) void WinEDA_ExchangeModuleFrame::Change_ModuleId( wxCommandEvent& event )
/**********************************************************************/ /**********************************************************************/
/* Routine de changement de tous les modules de meme nom lib que celui /* Routine de changement de tous les modules de meme nom lib que celui
selectionne, en conservant * selectionne, en conservant
- meme orientation * - meme orientation
- meme position * - meme position
- memes textes valeur et ref * - memes textes valeur et ref
- memes netnames pour pads de meme nom * - memes netnames pour pads de meme nom
et en remplacant l'ancien module par le noveau module * et en remplacant l'ancien module par le noveau module
Attention: m_CurrentModule ne pointe plus sur le module de reference * Attention: m_CurrentModule ne pointe plus sur le module de reference
puisque celui ci a ete change!! * puisque celui ci a ete change!!
*/ */
{ {
wxString msg; wxString msg;
@ -315,8 +334,10 @@ wxString value, lib_reference; // pour memo Reflib et value de reference
bool check_module_value = FALSE; bool check_module_value = FALSE;
int ShowErr = 5; // Affiche 5 messages d'err maxi int ShowErr = 5; // Affiche 5 messages d'err maxi
if( m_Parent->m_Pcb->m_Modules == NULL ) return; if( m_Parent->m_Pcb->m_Modules == NULL )
if( newmodulename == wxEmptyString ) return; return;
if( newmodulename == wxEmptyString )
return;
lib_reference = m_CurrentModule->m_LibRef; lib_reference = m_CurrentModule->m_LibRef;
if( event.GetId() == ID_EXEC_EXCHANGE_ID_MODULE_AND_VALUE ) if( event.GetId() == ID_EXEC_EXCHANGE_ID_MODULE_AND_VALUE )
@ -328,23 +349,24 @@ int ShowErr = 5; // Affiche 5 messages d'err maxi
newmodulename.GetData(), newmodulename.GetData(),
m_CurrentModule->m_Value->m_Text.GetData() ); m_CurrentModule->m_Value->m_Text.GetData() );
} }
else else
{ {
msg.Printf( _( "Change modules <%s> -> <%s> ?" ), msg.Printf( _( "Change modules <%s> -> <%s> ?" ),
lib_reference.GetData(), newmodulename.GetData() ); lib_reference.GetData(), newmodulename.GetData() );
} }
if( !IsOK(this, msg) ) return; if( !IsOK( this, msg ) )
return;
/* Le changement s'effectue a partir du dernier module car la routine /* Le changement s'effectue a partir du dernier module car la routine
Change_1_Module() modifie le dernier module de la liste * Change_1_Module() modifie le dernier module de la liste
*/ */
PtModule = m_Parent->m_Pcb->m_Modules; PtModule = m_Parent->m_Pcb->m_Modules;
for( ; PtModule != NULL; PtModule = (MODULE*) PtModule->Pnext ) for( ; PtModule != NULL; PtModule = (MODULE*) PtModule->Pnext )
{ {
if(PtModule->Pnext == NULL) break; if( PtModule->Pnext == NULL )
break;
} }
/* Ici PtModule pointe le dernier module de la liste */ /* Ici PtModule pointe le dernier module de la liste */
@ -360,9 +382,12 @@ int ShowErr = 5; // Affiche 5 messages d'err maxi
continue; continue;
} }
module = Change_1_Module( PtModule, newmodulename.GetData(), ShowErr ); module = Change_1_Module( PtModule, newmodulename.GetData(), ShowErr );
if ( module ) change = TRUE; if( module )
else if (ShowErr) ShowErr--; change = TRUE;
else if( ShowErr )
ShowErr--;
} }
if( change ) if( change )
{ {
m_Parent->m_Pcb->m_Status_Pcb = 0; m_Parent->m_Pcb->m_Status_Pcb = 0;
@ -370,33 +395,38 @@ int ShowErr = 5; // Affiche 5 messages d'err maxi
} }
} }
/***********************************************************************/ /***********************************************************************/
void WinEDA_ExchangeModuleFrame::Change_ModuleAll( wxCommandEvent& event ) void WinEDA_ExchangeModuleFrame::Change_ModuleAll( wxCommandEvent& event )
/***********************************************************************/ /***********************************************************************/
/* Routine de changement de tous les modules par les modules de meme nom lib: /* Routine de changement de tous les modules par les modules de meme nom lib:
en conservant * en conservant
- meme orientation * - meme orientation
- meme position * - meme position
- memes textes valeur et ref * - memes textes valeur et ref
- memes netnames pour pads de meme nom * - memes netnames pour pads de meme nom
*/ */
{ {
MODULE* PtModule, * PtBack; MODULE* PtModule, * PtBack;
bool change = FALSE; bool change = FALSE;
int ShowErr = 5; // Affiche 5 messages d'err maxi int ShowErr = 5; // Affiche 5 messages d'err maxi
if(m_Parent->m_Pcb->m_Modules == NULL) return; if( m_Parent->m_Pcb->m_Modules == NULL )
return;
if( !IsOK(this, _("Change ALL modules ?")) ) return; if( !IsOK( this, _( "Change ALL modules ?" ) ) )
return;
/* Le changement s'effectue a partir du dernier module car la routine /* Le changement s'effectue a partir du dernier module car la routine
Change_1_Module() modifie le dernier module de la liste * Change_1_Module() modifie le dernier module de la liste
*/ */
PtModule = (MODULE*) m_Parent->m_Pcb->m_Modules; PtModule = (MODULE*) m_Parent->m_Pcb->m_Modules;
for( ; PtModule != NULL; PtModule = (MODULE*) PtModule->Pnext ) for( ; PtModule != NULL; PtModule = (MODULE*) PtModule->Pnext )
{ {
if(PtModule->Pnext == NULL) break; if( PtModule->Pnext == NULL )
break;
} }
/* Ici PtModule pointe le dernier module de la liste */ /* Ici PtModule pointe le dernier module de la liste */
@ -405,7 +435,8 @@ int ShowErr = 5; // Affiche 5 messages d'err maxi
PtBack = (MODULE*) PtModule->Pback; PtBack = (MODULE*) PtModule->Pback;
if( Change_1_Module( PtModule, PtModule->m_LibRef.GetData(), ShowErr ) ) if( Change_1_Module( PtModule, PtModule->m_LibRef.GetData(), ShowErr ) )
change = TRUE; change = TRUE;
else if (ShowErr) ShowErr--; else if( ShowErr )
ShowErr--;
} }
if( change ) if( change )
@ -415,26 +446,29 @@ int ShowErr = 5; // Affiche 5 messages d'err maxi
} }
} }
/******************************************************************/ /******************************************************************/
MODULE* WinEDA_ExchangeModuleFrame::Change_1_Module( MODULE* PtModule, MODULE* WinEDA_ExchangeModuleFrame::Change_1_Module( MODULE* PtModule,
const wxString& new_module, bool ShowError ) const wxString& new_module, bool ShowError )
/*******************************************************************/ /*******************************************************************/
/* Routine de changement d'un module: /* Routine de changement d'un module:
Change le module de numero empr, avec le module de nom new_module * Change le module de numero empr, avec le module de nom new_module
- meme orientation * - meme orientation
- meme position * - meme position
- memes textes valeur et ref * - memes textes valeur et ref
- memes netnames pour pads de meme nom * - memes netnames pour pads de meme nom
Retourne : * Retourne :
0 si pas de changement ( si le nouveau module n'est pas en libr) * 0 si pas de changement ( si le nouveau module n'est pas en libr)
1 si OK * 1 si OK
*/ */
{ {
wxString namecmp, oldnamecmp; wxString namecmp, oldnamecmp;
MODULE* NewModule; MODULE* NewModule;
wxString Line; wxString Line;
if(PtModule == NULL) return(NULL); if( PtModule == NULL )
return NULL;
wxBusyCursor dummy; wxBusyCursor dummy;
@ -453,10 +487,11 @@ wxBusyCursor dummy;
if( NewModule == NULL ) /* Nouveau module NON trouve, reaffichage de l'ancien */ if( NewModule == NULL ) /* Nouveau module NON trouve, reaffichage de l'ancien */
{ {
m_WinMsg->WriteText( wxT( "No\n" ) ); m_WinMsg->WriteText( wxT( "No\n" ) );
return(NULL); return NULL;
} }
if ( PtModule == m_CurrentModule ) m_CurrentModule = NewModule; if( PtModule == m_CurrentModule )
m_CurrentModule = NewModule;
m_WinMsg->WriteText( wxT( "Ok\n" ) ); m_WinMsg->WriteText( wxT( "Ok\n" ) );
/* Effacement a l'ecran de l'ancien module */ /* Effacement a l'ecran de l'ancien module */
@ -469,16 +504,18 @@ wxBusyCursor dummy;
Maj_ListeCmp( NewModule->m_Reference->m_Text, oldnamecmp, namecmp, ShowError ); Maj_ListeCmp( NewModule->m_Reference->m_Text, oldnamecmp, namecmp, ShowError );
return(NewModule); return NewModule;
} }
/***********************************************************************************/ /***********************************************************************************/
MODULE* WinEDA_BasePcbFrame::Exchange_Module( wxWindow* winaff, MODULE* WinEDA_BasePcbFrame::Exchange_Module( wxWindow* winaff,
MODULE* OldModule, MODULE* NewModule ) MODULE* OldModule, MODULE* NewModule )
/***********************************************************************************/ /***********************************************************************************/
/* /*
Remplace le module OldModule par le module NewModule (en conservant position, orientation..) * Remplace le module OldModule par le module NewModule (en conservant position, orientation..)
OldModule est supprimé de la memoire. * OldModule est supprimé de la memoire.
*/ */
{ {
wxPoint oldpos;/* memorisation temporaire pos curseur */ wxPoint oldpos;/* memorisation temporaire pos curseur */
@ -499,7 +536,7 @@ D_PAD * pt_pad, * pt_old_pad;
m_CurrentScreen->m_Curseur = oldpos; m_CurrentScreen->m_Curseur = oldpos;
/* Changement eventuel de couche */ /* Changement eventuel de couche */
if( OldModule->m_Layer != NewModule->m_Layer) if( OldModule->GetLayer() != NewModule->GetLayer() )
{ {
Change_Side_Module( NewModule, NULL ); Change_Side_Module( NewModule, NULL );
} }
@ -526,7 +563,8 @@ D_PAD * pt_pad, * pt_old_pad;
pt_old_pad = OldModule->m_Pads; pt_old_pad = OldModule->m_Pads;
for( ; pt_old_pad != NULL; pt_old_pad = (D_PAD*) pt_old_pad->Pnext ) for( ; pt_old_pad != NULL; pt_old_pad = (D_PAD*) pt_old_pad->Pnext )
{ {
if(strnicmp( pt_pad->m_Padname, pt_old_pad->m_Padname,sizeof(pt_pad->m_Padname)) == 0) if( strnicmp( pt_pad->m_Padname, pt_old_pad->m_Padname,
sizeof(pt_pad->m_Padname) ) == 0 )
{ {
pt_pad->m_Netname = pt_old_pad->m_Netname; pt_pad->m_Netname = pt_old_pad->m_Netname;
pt_pad->m_NetCode = pt_old_pad->m_NetCode; pt_pad->m_NetCode = pt_old_pad->m_NetCode;
@ -552,7 +590,10 @@ void WinEDA_ExchangeModuleFrame::Sel_NewMod_By_Liste(wxCommandEvent& event)
{ {
wxString newname; wxString newname;
newname = m_Parent->Select_1_Module_From_List( m_Parent, wxEmptyString, wxEmptyString, wxEmptyString); newname = m_Parent->Select_1_Module_From_List( m_Parent,
wxEmptyString,
wxEmptyString,
wxEmptyString );
if( newname != wxEmptyString ) if( newname != wxEmptyString )
m_NewModule->SetValue( newname ); m_NewModule->SetValue( newname );
} }
@ -577,7 +618,8 @@ wxString msg;
/* Calcul nom fichier CMP par changement de l'extension du nom netliste */ /* Calcul nom fichier CMP par changement de l'extension du nom netliste */
if( NetNameBuffer == wxEmptyString ) if( NetNameBuffer == wxEmptyString )
FullFileNameCmp = m_CurrentScreen->m_FileName; FullFileNameCmp = m_CurrentScreen->m_FileName;
else FullFileNameCmp = NetNameBuffer; else
FullFileNameCmp = NetNameBuffer;
ChangeFileNameExt( FullFileNameCmp, NetCmpExtBuffer ); ChangeFileNameExt( FullFileNameCmp, NetCmpExtBuffer );
mask = wxT( "*" ) + NetCmpExtBuffer; mask = wxT( "*" ) + NetCmpExtBuffer;
@ -590,7 +632,8 @@ wxString msg;
wxFD_SAVE, wxFD_SAVE,
FALSE FALSE
); );
if ( FullFileNameCmp.IsEmpty() ) return FALSE; if( FullFileNameCmp.IsEmpty() )
return FALSE;
FichCmp = wxFopen( FullFileNameCmp, wxT( "wt" ) ); FichCmp = wxFopen( FullFileNameCmp, wxT( "wt" ) );

View File

@ -683,7 +683,7 @@ EDGE_ZONE* WinEDA_PcbFrame::Begin_Zone( void )
newedge->Pback = oldedge; newedge->Pback = oldedge;
if( oldedge ) if( oldedge )
oldedge->Pnext = newedge; oldedge->Pnext = newedge;
newedge->m_Layer = GetScreen()->m_Active_Layer; newedge->SetLayer( GetScreen()->m_Active_Layer );
newedge->m_Width = 2; /* Largeur minimum tracable */ newedge->m_Width = 2; /* Largeur minimum tracable */
newedge->m_Start = newedge->m_End = GetScreen()->m_Curseur; newedge->m_Start = newedge->m_End = GetScreen()->m_Curseur;
@ -702,7 +702,7 @@ EDGE_ZONE* WinEDA_PcbFrame::Begin_Zone( void )
oldedge->Pnext = newedge; oldedge->Pnext = newedge;
newedge->m_Flags = IS_NEW | IS_MOVED; newedge->m_Flags = IS_NEW | IS_MOVED;
newedge->m_Start = newedge->m_End = oldedge->m_End; newedge->m_Start = newedge->m_End = oldedge->m_End;
newedge->m_Layer = GetScreen()->m_Active_Layer; newedge->SetLayer( GetScreen()->m_Active_Layer );
m_Pcb->m_CurrentLimitZone = newedge; m_Pcb->m_CurrentLimitZone = newedge;
} }
} }
@ -777,7 +777,7 @@ static void Show_Zone_Edge_While_MoveMouse( WinEDA_DrawPanel* panel, wxDC* DC, b
edgezone = PtLim = pcbframe->m_Pcb->m_CurrentLimitZone; edgezone = PtLim = pcbframe->m_Pcb->m_CurrentLimitZone;
for( ; PtLim != NULL; PtLim = (EDGE_ZONE*) PtLim->Pback ) for( ; PtLim != NULL; PtLim = (EDGE_ZONE*) PtLim->Pback )
{ {
PtLim->m_Layer = pcbframe->GetScreen()->m_Active_Layer; PtLim->SetLayer( pcbframe->GetScreen()->m_Active_Layer );
} }
/* dessin de la nouvelle piste : mise a jour du point d'arrivee */ /* dessin de la nouvelle piste : mise a jour du point d'arrivee */
@ -849,7 +849,7 @@ void WinEDA_PcbFrame::Fill_Zone( wxDC* DC )
for( ; PtLim != NULL; PtLim = (EDGE_ZONE*) PtLim->Pback ) for( ; PtLim != NULL; PtLim = (EDGE_ZONE*) PtLim->Pback )
{ {
Trace_DrawSegmentPcb( DrawPanel, DC, PtLim, GR_XOR ); Trace_DrawSegmentPcb( DrawPanel, DC, PtLim, GR_XOR );
PtLim->m_Layer = GetScreen()->m_Active_Layer; PtLim->SetLayer( GetScreen()->m_Active_Layer );
Trace_DrawSegmentPcb( DrawPanel, DC, PtLim, GR_XOR ); Trace_DrawSegmentPcb( DrawPanel, DC, PtLim, GR_XOR );
} }
@ -922,7 +922,7 @@ void WinEDA_PcbFrame::Fill_Zone( wxDC* DC )
{ {
if( g_HightLigth_NetCode != pt_segm->m_NetCode ) if( g_HightLigth_NetCode != pt_segm->m_NetCode )
continue; continue;
if( pt_segm->m_Layer != GetScreen()->m_Active_Layer ) if( pt_segm->GetLayer() != GetScreen()->m_Active_Layer )
continue; continue;
if( pt_segm->m_StructType != TYPETRACK ) if( pt_segm->m_StructType != TYPETRACK )
continue; continue;
@ -1086,7 +1086,7 @@ static void Genere_Segments_Zone( WinEDA_PcbFrame* frame, wxDC* DC, int net_code
{ {
/* un segment avait debute de longueur > 0 */ /* un segment avait debute de longueur > 0 */
pt_track = new SEGZONE( frame->m_Pcb ); pt_track = new SEGZONE( frame->m_Pcb );
pt_track->m_Layer = layer; pt_track->SetLayer( layer );
pt_track->m_NetCode = net_code; pt_track->m_NetCode = net_code;
pt_track->m_Width = g_GridRoutingSize; pt_track->m_Width = g_GridRoutingSize;
pt_track->m_Start.x = ux0; pt_track->m_Start.y = uy0; pt_track->m_Start.x = ux0; pt_track->m_Start.y = uy0;
@ -1124,7 +1124,7 @@ static void Genere_Segments_Zone( WinEDA_PcbFrame* frame, wxDC* DC, int net_code
{ {
/* un segment avait debute de longueur > 0 */ /* un segment avait debute de longueur > 0 */
pt_track = new SEGZONE( frame->m_Pcb ); pt_track = new SEGZONE( frame->m_Pcb );
pt_track->m_Layer = layer; pt_track->SetLayer( layer );
pt_track->m_Width = g_GridRoutingSize; pt_track->m_Width = g_GridRoutingSize;
pt_track->m_NetCode = net_code; pt_track->m_NetCode = net_code;
pt_track->m_Start.x = ux0; pt_track->m_Start.y = uy0; pt_track->m_Start.x = ux0; pt_track->m_Start.y = uy0;
@ -1363,7 +1363,7 @@ static bool Genere_Pad_Connexion( WinEDA_PcbFrame* frame, wxDC* DC, int layer )
pt_track = new SEGZONE( frame->m_Pcb ); pt_track = new SEGZONE( frame->m_Pcb );
pt_track->m_Layer = layer; pt_track->SetLayer( layer );
pt_track->m_Width = g_DesignSettings.m_CurrentTrackWidth; pt_track->m_Width = g_DesignSettings.m_CurrentTrackWidth;
pt_track->m_NetCode = g_HightLigth_NetCode; pt_track->m_NetCode = g_HightLigth_NetCode;
pt_track->start = pt_pad; pt_track->start = pt_pad;