see change_log.txt for 2007-Aug-22
This commit is contained in:
parent
4da2971dcc
commit
cc62305777
|
@ -202,13 +202,14 @@ void Pcb3D_GLCanvas::Draw3D_Track(TRACK * track)
|
|||
/************************************************/
|
||||
{
|
||||
double zpos;
|
||||
int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[track->m_Layer];
|
||||
int layer = track->m_Layer;
|
||||
int layer = track->GetLayer();
|
||||
int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[layer];
|
||||
double ox, oy, fx, fy;
|
||||
double w;
|
||||
|
||||
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];
|
||||
|
||||
SetGLColor(color);
|
||||
|
@ -268,7 +269,7 @@ void Pcb3D_GLCanvas::Draw3D_DrawSegment(DRAWSEGMENT * segment)
|
|||
int layer;
|
||||
double x, y, xf, yf;
|
||||
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;
|
||||
|
||||
|
@ -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;
|
||||
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++ )
|
||||
{
|
||||
|
@ -291,7 +292,7 @@ int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[segment->m_Layer];
|
|||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,16 +5,36 @@ Please add newer entries at the top, list the date and your name with
|
|||
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>
|
||||
================================================================================
|
||||
+ 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
|
||||
but probably not on Windows: bitmap/Reload.xpm needed uppercase R.
|
||||
* Since so many classes introduced m_Layer, I moved m_Layer into
|
||||
EDA_BaseStruct so all classes can inherit it and that way we can test
|
||||
layer using a general, polymorphic test, i.e. don't have to cast a
|
||||
EDA_BaseStruct* to a class specific pointer to test layer. Could also have
|
||||
used a virtual function but too many places use m_Layer directly.
|
||||
* Wedged a new class BOARD_ITEM underneath all PCB drawable classes, this is
|
||||
a big change and may introduce a bug or two, but it is worth it for the
|
||||
future, because we can introduce virtual functions there that do not impact
|
||||
the entire project (since everything is derived from EDA_BaseStruct).
|
||||
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>
|
||||
|
|
|
@ -106,7 +106,6 @@ void EDA_BaseStruct::InitVars( void )
|
|||
m_TimeStamp = 0; // Time stamp used for logical links
|
||||
m_Status = 0;
|
||||
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
|
||||
|
||||
|
||||
|
||||
/**********************************************************************************************/
|
||||
EDA_BaseLineStruct::EDA_BaseLineStruct( EDA_BaseStruct* StructFather, DrawStructureType idtype ) :
|
||||
EDA_BaseStruct( StructFather, idtype )
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Name: sheet.cpp
|
||||
// Purpose:
|
||||
// Author: jean-pierre Charras
|
||||
|
@ -45,8 +46,9 @@ DrawSheetStruct::DrawSheetStruct(const wxPoint & pos) :
|
|||
m_StructType = DRAW_SHEET_STRUCT_TYPE;
|
||||
}
|
||||
|
||||
|
||||
/**************************************/
|
||||
DrawSheetStruct::~DrawSheetStruct(void)
|
||||
DrawSheetStruct::~DrawSheetStruct()
|
||||
/**************************************/
|
||||
{
|
||||
DrawSheetLabelStruct* label = m_Label, * next_label;
|
||||
|
@ -63,11 +65,13 @@ DrawSheetLabelStruct * label = m_Label, * next_label;
|
|||
/***********************************************/
|
||||
DrawSheetStruct* DrawSheetStruct::GenCopy( void )
|
||||
/***********************************************/
|
||||
|
||||
/* 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 );
|
||||
|
||||
DrawSheetLabelStruct* Slabel = NULL, * label = m_Label;
|
||||
|
||||
newitem->m_Size = m_Size;
|
||||
|
@ -129,8 +133,9 @@ DrawSheetLabelStruct * Slabel = NULL, * label = m_Label;
|
|||
/**********************************************************/
|
||||
void DrawSheetStruct::SwapData( DrawSheetStruct* copyitem )
|
||||
/**********************************************************/
|
||||
|
||||
/* Used if undo / redo command:
|
||||
swap data between this and copyitem
|
||||
* swap data between this and copyitem
|
||||
*/
|
||||
{
|
||||
EXCHG( m_Pos, copyitem->m_Pos );
|
||||
|
@ -142,6 +147,7 @@ void DrawSheetStruct::SwapData(DrawSheetStruct * copyitem)
|
|||
EXCHG( m_NbLabel, copyitem->m_NbLabel );
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************************/
|
||||
void DrawSheetStruct::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset,
|
||||
int DrawMode, int Color )
|
||||
|
@ -155,16 +161,20 @@ int color;
|
|||
wxPoint pos = m_Pos + offset;
|
||||
int LineWidth = g_DrawMinimunLineWidth;
|
||||
|
||||
if( Color >= 0 ) color = Color;
|
||||
else color = ReturnLayerColor(m_Layer);
|
||||
if( Color >= 0 )
|
||||
color = Color;
|
||||
else
|
||||
color = ReturnLayerColor( m_Layer );
|
||||
GRSetDrawMode( DC, DrawMode );
|
||||
|
||||
GRRect( &panel->m_ClipBox, DC, pos.x, pos.y,
|
||||
pos.x + m_Size.x, pos.y + m_Size.y, LineWidth, color );
|
||||
|
||||
/* Draw text : SheetName */
|
||||
if( Color > 0 ) txtcolor = Color;
|
||||
else txtcolor = ReturnLayerColor(LAYER_SHEETNAME);
|
||||
if( Color > 0 )
|
||||
txtcolor = Color;
|
||||
else
|
||||
txtcolor = ReturnLayerColor( LAYER_SHEETNAME );
|
||||
|
||||
Text = wxT( "Sheet: " ) + m_SheetName;
|
||||
DrawGraphicText( panel, DC,
|
||||
|
@ -173,8 +183,10 @@ int LineWidth = g_DrawMinimunLineWidth;
|
|||
GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_BOTTOM, LineWidth );
|
||||
|
||||
/* Draw text : FileName */
|
||||
if( Color >= 0 ) txtcolor = Color;
|
||||
else txtcolor = ReturnLayerColor(LAYER_SHEETFILENAME);
|
||||
if( Color >= 0 )
|
||||
txtcolor = Color;
|
||||
else
|
||||
txtcolor = ReturnLayerColor( LAYER_SHEETFILENAME );
|
||||
Text = wxT( "File: " ) + m_FileName;
|
||||
DrawGraphicText( panel, DC,
|
||||
wxPoint( pos.x, pos.y + m_Size.y + 4 ),
|
||||
|
@ -212,6 +224,7 @@ DrawSheetLabelStruct::DrawSheetLabelStruct(DrawSheetStruct * parent,
|
|||
m_IsDangling = TRUE;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************/
|
||||
DrawSheetLabelStruct* DrawSheetLabelStruct::GenCopy( void )
|
||||
/***********************************************************/
|
||||
|
@ -226,7 +239,6 @@ DrawSheetLabelStruct * newitem =
|
|||
}
|
||||
|
||||
|
||||
|
||||
/********************************************************************************************/
|
||||
void DrawSheetLabelStruct::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset,
|
||||
int DrawMode, int Color )
|
||||
|
@ -239,8 +251,10 @@ wxSize size;
|
|||
int NbSegm, coord[20];
|
||||
int LineWidth = g_DrawMinimunLineWidth;
|
||||
|
||||
if( Color >= 0 ) txtcolor = Color;
|
||||
else txtcolor = ReturnLayerColor(m_Layer);
|
||||
if( Color >= 0 )
|
||||
txtcolor = Color;
|
||||
else
|
||||
txtcolor = ReturnLayerColor( m_Layer );
|
||||
GRSetDrawMode( DC, DrawMode );
|
||||
|
||||
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;
|
||||
NbSegm = 0;
|
||||
|
||||
switch( m_Shape )
|
||||
{
|
||||
case 0: /* input |> */
|
||||
|
@ -309,8 +324,7 @@ int LineWidth = g_DrawMinimunLineWidth;
|
|||
NbSegm = 6;
|
||||
break;
|
||||
}
|
||||
|
||||
int FillShape = FALSE;
|
||||
GRPoly( &panel->m_ClipBox, DC, NbSegm, coord, FillShape, LineWidth, txtcolor, txtcolor ); /* Poly Non rempli */
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -107,10 +107,10 @@ public:
|
|||
};
|
||||
|
||||
|
||||
class DrawSheetLabelStruct : public EDA_BaseStruct
|
||||
, public EDA_TextStruct
|
||||
class DrawSheetLabelStruct : public EDA_BaseStruct, public EDA_TextStruct
|
||||
{
|
||||
public:
|
||||
int m_Layer;
|
||||
int m_Edge, m_Shape;
|
||||
bool m_IsDangling; // TRUE si non connecté
|
||||
|
||||
|
@ -141,6 +141,7 @@ public:
|
|||
int m_FileNameSize;
|
||||
wxPoint m_Pos;
|
||||
wxSize m_Size; /* Position and Size of sheet symbol */
|
||||
int m_Layer;
|
||||
DrawSheetLabelStruct* m_Label; /* Points de connection */
|
||||
int m_NbLabel; /* Nombre de points de connexion */
|
||||
|
||||
|
|
|
@ -14,13 +14,11 @@
|
|||
#include "protos.h"
|
||||
|
||||
|
||||
|
||||
/*******************************************************************/
|
||||
DrawBusEntryStruct::DrawBusEntryStruct( const wxPoint& pos, int shape, int id ) :
|
||||
EDA_BaseStruct( DRAW_BUSENTRY_STRUCT_TYPE )
|
||||
/*******************************************************************/
|
||||
{
|
||||
|
||||
m_Pos = pos;
|
||||
m_Size.x = 100;
|
||||
m_Size.y = 100;
|
||||
|
@ -33,19 +31,21 @@ DrawBusEntryStruct::DrawBusEntryStruct(const wxPoint & pos, int shape, int id) :
|
|||
m_Width = 1;
|
||||
}
|
||||
|
||||
if(shape == '/' ) m_Size.y = - 100;
|
||||
|
||||
if( shape == '/' )
|
||||
m_Size.y = -100;
|
||||
}
|
||||
|
||||
|
||||
/*************************************/
|
||||
wxPoint DrawBusEntryStruct::m_End( void )
|
||||
/*************************************/
|
||||
|
||||
// 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 )
|
||||
/***************************************************/
|
||||
|
@ -74,6 +74,7 @@ DrawJunctionStruct::DrawJunctionStruct(const wxPoint & pos) :
|
|||
m_Layer = LAYER_JUNCTION;
|
||||
}
|
||||
|
||||
|
||||
DrawJunctionStruct* DrawJunctionStruct::GenCopy( void )
|
||||
{
|
||||
DrawJunctionStruct* newitem = new DrawJunctionStruct( m_Pos );
|
||||
|
@ -95,6 +96,7 @@ DrawNoConnectStruct::DrawNoConnectStruct(const wxPoint & pos) :
|
|||
m_Pos = pos;
|
||||
}
|
||||
|
||||
|
||||
DrawNoConnectStruct* DrawNoConnectStruct::GenCopy( void )
|
||||
{
|
||||
DrawNoConnectStruct* newitem = new DrawNoConnectStruct( m_Pos );
|
||||
|
@ -118,13 +120,16 @@ DrawMarkerStruct::DrawMarkerStruct( const wxPoint & pos, const wxString & text):
|
|||
m_Comment = text;
|
||||
}
|
||||
|
||||
|
||||
DrawMarkerStruct::~DrawMarkerStruct( void )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
DrawMarkerStruct* DrawMarkerStruct::GenCopy( void )
|
||||
{
|
||||
DrawMarkerStruct* newitem = new DrawMarkerStruct( m_Pos, m_Comment );
|
||||
|
||||
newitem->m_Type = m_Type;
|
||||
newitem->m_MarkFlags = m_MarkFlags;
|
||||
|
||||
|
@ -160,6 +165,7 @@ EDA_DrawLineStruct::EDA_DrawLineStruct(const wxPoint & pos, int layer ):
|
|||
m_Layer = LAYER_WIRE;
|
||||
m_Width = GR_NORM_WIDTH;
|
||||
break;
|
||||
|
||||
case LAYER_BUS:
|
||||
m_Layer = LAYER_BUS;
|
||||
m_Width = GR_THICK_WIDTH;
|
||||
|
@ -167,6 +173,7 @@ EDA_DrawLineStruct::EDA_DrawLineStruct(const wxPoint & pos, int layer ):
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/***************************************************/
|
||||
EDA_DrawLineStruct* EDA_DrawLineStruct::GenCopy( void )
|
||||
/***************************************************/
|
||||
|
@ -178,17 +185,22 @@ EDA_DrawLineStruct * newitem = new EDA_DrawLineStruct(m_Start, m_Layer);
|
|||
return newitem;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************/
|
||||
bool EDA_DrawLineStruct::IsOneEndPointAt( const wxPoint& 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_End.x) && (pos.y == m_End.y) ) return TRUE;
|
||||
if( (pos.x == m_Start.x) && (pos.y == m_Start.y) )
|
||||
return TRUE;
|
||||
if( (pos.x == m_End.x) && (pos.y == m_End.y) )
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/****************************/
|
||||
/* Class DrawPolylineStruct */
|
||||
/****************************/
|
||||
|
@ -225,9 +237,11 @@ DrawPolylineStruct::DrawPolylineStruct(int layer):
|
|||
DrawPolylineStruct::~DrawPolylineStruct( void )
|
||||
/*********************************************/
|
||||
{
|
||||
if ( m_Points ) free ( m_Points );
|
||||
if( m_Points )
|
||||
free( m_Points );
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************/
|
||||
DrawPolylineStruct* DrawPolylineStruct::GenCopy( void )
|
||||
/*****************************************************/
|
||||
|
@ -244,6 +258,3 @@ DrawPolylineStruct * newitem =
|
|||
|
||||
return newitem;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@ typedef enum
|
|||
class PartTextStruct: public EDA_BaseStruct, public EDA_TextStruct
|
||||
{
|
||||
public:
|
||||
int m_Layer;
|
||||
int m_FieldId;
|
||||
wxString m_Name; /* Field name (ref, value,pcb, sheet, filed 1..
|
||||
and for fields 1 to 8 the name is editable */
|
||||
|
@ -54,6 +55,7 @@ public:
|
|||
void SwapData(PartTextStruct * copyitem);
|
||||
};
|
||||
|
||||
|
||||
/* the class DrawPartStruct describes a basic virtual component
|
||||
Not used directly:
|
||||
used classes are EDA_SchComponentStruct (the "classic" schematic component
|
||||
|
@ -62,6 +64,7 @@ public:
|
|||
class DrawPartStruct: public EDA_BaseStruct
|
||||
{
|
||||
public:
|
||||
int m_Layer;
|
||||
wxString m_ChipName; /* Key to look for in the library, i.e. "74LS00". */
|
||||
PartTextStruct m_Field[NUMBER_OF_FIELDS];
|
||||
wxPoint m_Pos; /* Exact position of part. */
|
||||
|
|
|
@ -106,6 +106,7 @@ class DrawBusEntryStruct: public EDA_BaseStruct /* Struct de descr 1 raccord
|
|||
a 45 degres de BUS ou WIRE */
|
||||
{
|
||||
public:
|
||||
int m_Layer;
|
||||
int m_Width;
|
||||
wxPoint m_Pos;
|
||||
wxSize m_Size;
|
||||
|
@ -121,6 +122,7 @@ public:
|
|||
class DrawPolylineStruct: public EDA_BaseStruct /* Polyligne (serie de segments) */
|
||||
{
|
||||
public:
|
||||
int m_Layer;
|
||||
int m_Width;
|
||||
int m_NumOfPoints; /* Number of XY pairs in Points array. */
|
||||
int *m_Points; /* XY pairs that forms the polyline. */
|
||||
|
@ -135,6 +137,7 @@ public:
|
|||
class DrawJunctionStruct: public EDA_BaseStruct
|
||||
{
|
||||
public:
|
||||
int m_Layer;
|
||||
wxPoint m_Pos; /* XY coordinates of connection. */
|
||||
|
||||
public:
|
||||
|
@ -147,6 +150,7 @@ public:
|
|||
class DrawTextStruct: public EDA_BaseStruct, public EDA_TextStruct
|
||||
{
|
||||
public:
|
||||
int m_Layer;
|
||||
int m_Shape;
|
||||
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);
|
||||
};
|
||||
|
||||
|
||||
class DrawLabelStruct: public DrawTextStruct
|
||||
{
|
||||
public:
|
||||
|
@ -170,6 +175,7 @@ public:
|
|||
~DrawLabelStruct(void) {}
|
||||
};
|
||||
|
||||
|
||||
class DrawGlobalLabelStruct: public DrawTextStruct
|
||||
{
|
||||
public:
|
||||
|
|
|
@ -15,9 +15,10 @@
|
|||
/****************************************************************************/
|
||||
void Affiche_Infos_PCB_Texte( WinEDA_BasePcbFrame* frame, TEXTE_PCB* pt_texte )
|
||||
/****************************************************************************/
|
||||
|
||||
/* Affiche en bas d'ecran les caract du texte sur PCB
|
||||
Entree :
|
||||
pointeur de la description du texte
|
||||
* Entree :
|
||||
* pointeur de la description du texte
|
||||
*/
|
||||
{
|
||||
wxString Line;
|
||||
|
@ -30,13 +31,18 @@ wxString Line;
|
|||
else
|
||||
Affiche_1_Parametre( frame, 1, _( "PCB Text" ), pt_texte->m_Text, DARKGREEN );
|
||||
|
||||
Line = _("Layer "); Line << pt_texte->m_Layer + 1;
|
||||
Affiche_1_Parametre(frame, 28, _("Layer:"), Line, g_DesignSettings.m_LayerColor[pt_texte->m_Layer] );
|
||||
Line = _( "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 );
|
||||
|
||||
if( (pt_texte->m_Miroir & 1) )
|
||||
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 );
|
||||
|
@ -50,11 +56,9 @@ wxString Line;
|
|||
|
||||
valeur_param( pt_texte->m_Size.y, Line );
|
||||
Affiche_1_Parametre( frame, 70, _( "V Size" ), Line, RED );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*********************************************************************/
|
||||
void Affiche_Infos_Piste( WinEDA_BasePcbFrame* frame, TRACK* pt_piste )
|
||||
/*********************************************************************/
|
||||
|
@ -73,8 +77,10 @@ wxString msg;
|
|||
switch( pt_piste->m_StructType )
|
||||
{
|
||||
case TYPETRACK:
|
||||
if ( pt_piste->m_Shape < S_SPOT_CIRCLE ) msg = wxT("LINE");
|
||||
else msg = wxT("FLASH");
|
||||
if( pt_piste->m_Shape < S_SPOT_CIRCLE )
|
||||
msg = wxT( "LINE" );
|
||||
else
|
||||
msg = wxT( "FLASH" );
|
||||
break;
|
||||
|
||||
case TYPEZONE:
|
||||
|
@ -83,6 +89,7 @@ wxString msg;
|
|||
default:
|
||||
msg = wxT( "????" ); break;
|
||||
}
|
||||
|
||||
Affiche_1_Parametre( frame, 1, _( "Type" ), msg, DARKCYAN );
|
||||
|
||||
msg.Printf( wxT( "%d" ), ii + 1 );
|
||||
|
@ -98,11 +105,10 @@ wxString msg;
|
|||
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 Epaisseur */
|
||||
valeur_param( (unsigned) (pt_piste->m_Width), msg );
|
||||
Affiche_1_Parametre( frame, 50, _( "Width" ), msg, DARKCYAN );
|
||||
}
|
||||
|
||||
|
|
|
@ -340,7 +340,7 @@ D_CODE * pt_Dcode; /* Pointeur sur le D code*/
|
|||
track = m_Pcb->m_Track;
|
||||
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;
|
||||
|
||||
if ( // Line Item
|
||||
|
@ -359,8 +359,8 @@ D_CODE * pt_Dcode; /* Pointeur sur le D code*/
|
|||
int width, len;
|
||||
wxSize size = pt_Dcode->m_Size;
|
||||
|
||||
width = min( size.x, size.y );
|
||||
len = max( size.x, size.y ) - width;
|
||||
width = MIN( size.x, size.y );
|
||||
len = MAX( size.x, size.y ) - width;
|
||||
|
||||
track->m_Width = width;
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ void WinEDA_GerberFrame::Delete_DCode_Items( wxDC* DC, int dcode_value, int laye
|
|||
next_track = track->Next();
|
||||
if( dcode_value != track->m_NetCode )
|
||||
continue;
|
||||
if( layer_number >= 0 && layer_number != track->m_Layer )
|
||||
if( layer_number >= 0 && layer_number != track->GetLayer() )
|
||||
continue;
|
||||
Delete_Segment( DC, track );
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* export_to_pcbnew.cpp */
|
||||
|
||||
/*
|
||||
Export des couches vers pcbnew
|
||||
* Export des couches vers pcbnew
|
||||
*/
|
||||
|
||||
#include "fctsys.h"
|
||||
|
@ -20,11 +21,14 @@ static int SavePcbFormatAscii(WinEDA_GerberFrame * frame,
|
|||
/************************************************************************/
|
||||
void WinEDA_GerberFrame::ExportDataInPcbnewFormat( wxCommandEvent& event )
|
||||
/************************************************************************/
|
||||
|
||||
/* Export data in pcbnew format
|
||||
*/
|
||||
{
|
||||
wxString FullFileName, msg;
|
||||
|
||||
wxString PcbExt( wxT( ".brd" ) );
|
||||
|
||||
FILE* dest;
|
||||
|
||||
msg = wxT( "*" ) + PcbExt;
|
||||
|
@ -37,7 +41,8 @@ FILE * dest;
|
|||
wxFD_SAVE,
|
||||
FALSE
|
||||
);
|
||||
if ( FullFileName == wxEmptyString ) return;
|
||||
if( FullFileName == wxEmptyString )
|
||||
return;
|
||||
|
||||
int* LayerLookUpTable;
|
||||
if( ( LayerLookUpTable = InstallDialogLayerPairChoice( this ) ) != NULL )
|
||||
|
@ -75,9 +80,10 @@ char text[1024];
|
|||
fprintf( File, "Layers %d\n", g_DesignSettings.m_CopperLayerCount );
|
||||
|
||||
fprintf( File, "$EndSETUP\n\n" );
|
||||
return(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************/
|
||||
static bool WriteGeneralDescrPcb( BOARD* Pcb, FILE* File )
|
||||
/******************************************************/
|
||||
|
@ -105,15 +111,17 @@ int NbLayers;
|
|||
static int SavePcbFormatAscii( WinEDA_GerberFrame* frame, FILE* File,
|
||||
int* LayerLookUpTable )
|
||||
/*******************************************************************/
|
||||
|
||||
/* Routine de sauvegarde du PCB courant sous format ASCII
|
||||
retourne
|
||||
1 si OK
|
||||
0 si sauvegarde non faite
|
||||
* retourne
|
||||
* 1 si OK
|
||||
* 0 si sauvegarde non faite
|
||||
*/
|
||||
{
|
||||
char Line[256];
|
||||
TRACK* track, * next_track;
|
||||
EDA_BaseStruct * PtStruct, *NextStruct;
|
||||
BOARD_ITEM* PtStruct;
|
||||
BOARD_ITEM* NextStruct;
|
||||
BOARD* GerberPcb = frame->m_Pcb;
|
||||
BOARD* Pcb;
|
||||
|
||||
|
@ -121,15 +129,18 @@ BOARD * Pcb;
|
|||
|
||||
/* Create an image of gerber data */
|
||||
Pcb = new BOARD( NULL, frame );
|
||||
|
||||
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];
|
||||
if ( pcb_layer_number < 0 ) continue;
|
||||
if( pcb_layer_number < 0 )
|
||||
continue;
|
||||
if( pcb_layer_number > CMP_N )
|
||||
{
|
||||
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_End = track->m_End;
|
||||
drawitem->m_Width = track->m_Width;
|
||||
|
@ -139,7 +150,8 @@ BOARD * Pcb;
|
|||
else
|
||||
{
|
||||
TRACK* newtrack = new TRACK( * track );
|
||||
newtrack->m_Layer = pcb_layer_number;
|
||||
|
||||
newtrack->SetLayer( pcb_layer_number );
|
||||
newtrack->Insert( Pcb, NULL );
|
||||
}
|
||||
}
|
||||
|
@ -147,37 +159,42 @@ BOARD * Pcb;
|
|||
/* replace spots by vias when possible */
|
||||
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;
|
||||
|
||||
/* 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_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;
|
||||
/* 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.y = (track->m_Start.y + track->m_End.y) / 2;
|
||||
track->m_End = track->m_Start;
|
||||
}
|
||||
|
||||
/* delete redundant vias */
|
||||
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*/
|
||||
TRACK* alt_track = track->Next();
|
||||
for( ; alt_track != NULL; alt_track = next_track )
|
||||
{
|
||||
next_track = (TRACK*) alt_track->Pnext;
|
||||
if( alt_track->m_Shape != VIA_NORMALE ) continue;
|
||||
if ( alt_track->m_Start != track->m_Start ) continue;
|
||||
if( alt_track->m_Shape != VIA_NORMALE )
|
||||
continue;
|
||||
if( alt_track->m_Start != track->m_Start )
|
||||
continue;
|
||||
/* delete track */
|
||||
alt_track->UnLink();
|
||||
delete alt_track;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
|
||||
setlocale( LC_NUMERIC, "C" );
|
||||
/* Ecriture de l'entete PCB : */
|
||||
|
@ -188,7 +205,7 @@ BOARD * Pcb;
|
|||
|
||||
/* Ecriture des donnes utiles du pcb */
|
||||
PtStruct = Pcb->m_Drawings;
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext )
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
|
||||
{
|
||||
switch( PtStruct->m_StructType )
|
||||
{
|
||||
|
@ -218,14 +235,16 @@ BOARD * Pcb;
|
|||
/* Delete the copy */
|
||||
for( PtStruct = Pcb->m_Drawings; PtStruct != NULL; PtStruct = NextStruct )
|
||||
{
|
||||
NextStruct = PtStruct->Pnext;
|
||||
NextStruct = PtStruct->Next();
|
||||
delete PtStruct;
|
||||
}
|
||||
|
||||
for( track = Pcb->m_Track; track != NULL; track = next_track )
|
||||
{
|
||||
next_track = (TRACK*) track->Pnext;
|
||||
delete track;
|
||||
}
|
||||
|
||||
delete Pcb;
|
||||
|
||||
setlocale( LC_NUMERIC, "" ); // revert to the current locale
|
||||
|
|
|
@ -14,23 +14,25 @@
|
|||
/* Routines Locales */
|
||||
|
||||
|
||||
|
||||
/********************************************************/
|
||||
bool WinEDA_GerberFrame::Clear_Pcb( wxDC* DC, bool query )
|
||||
/********************************************************/
|
||||
|
||||
/* 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;
|
||||
|
||||
if( m_Pcb == NULL ) return FALSE;
|
||||
if( m_Pcb == NULL )
|
||||
return FALSE;
|
||||
|
||||
if( query )
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************/
|
||||
void WinEDA_GerberFrame::Erase_Zones( wxDC* DC, bool query )
|
||||
/*********************************************************/
|
||||
{
|
||||
|
||||
if( query && !IsOK(this, _("Delete zones ?") ) ) return ;
|
||||
if( query && !IsOK( this, _( "Delete zones ?" ) ) )
|
||||
return;
|
||||
|
||||
if( m_Pcb->m_Zone )
|
||||
{
|
||||
|
@ -100,38 +103,25 @@ void WinEDA_GerberFrame::Erase_Segments_Pcb(wxDC * DC,
|
|||
bool all_layers, bool query )
|
||||
/*****************************************************/
|
||||
{
|
||||
EDA_BaseStruct * PtStruct, *PtNext;
|
||||
BOARD_ITEM* PtStruct;
|
||||
BOARD_ITEM* PtNext;
|
||||
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 )
|
||||
{
|
||||
PtNext = PtStruct->Pnext;
|
||||
PtNext = PtStruct->Next();
|
||||
|
||||
switch( PtStruct->m_StructType )
|
||||
{
|
||||
case TYPEDRAWSEGMENT:
|
||||
if( (((DRAWSEGMENT*)PtStruct)->m_Layer == layer)
|
||||
|| layer < 0)
|
||||
DeleteStructure(PtStruct);
|
||||
break;
|
||||
|
||||
case TYPETEXTE:
|
||||
if( (((TEXTE_PCB*)PtStruct)->m_Layer == layer)
|
||||
|| layer < 0)
|
||||
DeleteStructure(PtStruct);
|
||||
break;
|
||||
|
||||
case TYPECOTATION:
|
||||
if( (((COTATION*)PtStruct)->m_Layer == layer)
|
||||
|| layer < 0)
|
||||
DeleteStructure(PtStruct);
|
||||
break;
|
||||
|
||||
case TYPEMIRE:
|
||||
if( (((MIREPCB*)PtStruct)->m_Layer == layer)
|
||||
|| layer < 0)
|
||||
if( PtStruct->GetLayer() == layer || layer < 0 )
|
||||
DeleteStructure( PtStruct );
|
||||
break;
|
||||
|
||||
|
@ -149,22 +139,25 @@ int layer = GetScreen()->m_Active_Layer;
|
|||
void WinEDA_GerberFrame::Erase_Pistes( wxDC* DC, int masque_type,
|
||||
bool query )
|
||||
/****************************************************************/
|
||||
|
||||
/* Efface les segments de piste, selon les autorisations affichees
|
||||
masque_type = masque des options de selection:
|
||||
SEGM_FIXE, SEGM_AR
|
||||
Si un des bits est a 1, il n'y a pas effacement du segment de meme bit a 1
|
||||
* masque_type = masque des options de selection:
|
||||
* SEGM_FIXE, SEGM_AR
|
||||
* Si un des bits est a 1, il n'y a pas effacement du segment de meme bit a 1
|
||||
*/
|
||||
{
|
||||
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 */
|
||||
for( pt_segm = m_Pcb->m_Track; pt_segm != NULL; pt_segm = (TRACK*) PtNext )
|
||||
{
|
||||
PtNext = pt_segm->Pnext;
|
||||
if( pt_segm->GetState(SEGM_FIXE|SEGM_AR) & masque_type) continue;
|
||||
PtNext = pt_segm->Next();
|
||||
if( pt_segm->GetState( SEGM_FIXE | SEGM_AR ) & masque_type )
|
||||
continue;
|
||||
DeleteStructure( pt_segm );
|
||||
}
|
||||
|
||||
|
@ -176,43 +169,46 @@ EDA_BaseStruct * PtNext;
|
|||
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 )
|
||||
{
|
||||
PtNext = PtStruct->Pnext;
|
||||
if(PtStruct->m_StructType == TYPETEXTE ) DeleteStructure(PtStruct);
|
||||
PtNext = PtStruct->Next();
|
||||
if( PtStruct->m_StructType == TYPETEXTE )
|
||||
DeleteStructure( PtStruct );
|
||||
}
|
||||
|
||||
ScreenPcb->SetModify();
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************/
|
||||
void WinEDA_GerberFrame::Erase_Current_Layer( wxDC* DC, bool query )
|
||||
/*******************************************************************/
|
||||
{
|
||||
TRACK* pt_segm;
|
||||
EDA_BaseStruct * PtNext;
|
||||
BOARD_ITEM* PtNext;
|
||||
int layer = GetScreen()->m_Active_Layer;
|
||||
wxString msg;
|
||||
|
||||
msg.Printf( _( "Delete Layer %d" ), layer + 1 );
|
||||
if( query && ! IsOK(this, msg) ) return;
|
||||
if( query && !IsOK( this, msg ) )
|
||||
return;
|
||||
|
||||
/* Marquage des pistes a effacer */
|
||||
for( pt_segm = m_Pcb->m_Track; pt_segm != NULL; pt_segm = (TRACK*) PtNext )
|
||||
{
|
||||
PtNext = pt_segm->Pnext;
|
||||
if( pt_segm->m_Layer != layer) continue;
|
||||
PtNext = pt_segm->Next();
|
||||
if( pt_segm->GetLayer() != layer )
|
||||
continue;
|
||||
DeleteStructure( pt_segm );
|
||||
}
|
||||
|
||||
ScreenPcb->SetModify();
|
||||
ScreenPcb->SetRefreshReq();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -102,7 +102,7 @@ DRAWSEGMENT* Locate_Segment_Pcb( BOARD* Pcb, int typeloc )
|
|||
* NULL si rien trouve
|
||||
*/
|
||||
{
|
||||
EDA_BaseStruct* PtStruct;
|
||||
BOARD_ITEM* PtStruct;
|
||||
DRAWSEGMENT* pts;
|
||||
wxPoint ref;
|
||||
PCB_SCREEN* screen = (PCB_SCREEN*) ActiveScreen;
|
||||
|
@ -110,7 +110,7 @@ DRAWSEGMENT* Locate_Segment_Pcb( BOARD* Pcb, int typeloc )
|
|||
SET_REF_POS( ref );
|
||||
|
||||
PtStruct = Pcb->m_Drawings;
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext )
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
|
||||
{
|
||||
if( PtStruct->m_StructType != TYPEDRAWSEGMENT )
|
||||
continue;
|
||||
|
@ -121,7 +121,7 @@ DRAWSEGMENT* Locate_Segment_Pcb( BOARD* Pcb, int typeloc )
|
|||
spot_cX = ref.x - ux0; spot_cY = ref.y - uy0;
|
||||
|
||||
/* detection : */
|
||||
if( pts->m_Layer != screen->m_Active_Layer )
|
||||
if( pts->GetLayer() != screen->m_Active_Layer )
|
||||
continue;
|
||||
|
||||
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( Track->m_Layer != Layer )
|
||||
if( Track->GetLayer() != Layer )
|
||||
continue;/* Segments sur couches differentes */
|
||||
if( distance( l_piste ) )
|
||||
return Track;
|
||||
|
@ -260,7 +260,7 @@ TRACK* Locate_Zone( TRACK* start_adresse, wxPoint ref, int layer )
|
|||
dx -= ux0; dy -= 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;
|
||||
if( distance( l_segm ) )
|
||||
return Zone;
|
||||
|
|
|
@ -105,7 +105,7 @@ TRACK * track;
|
|||
track = new TRACK(frame->m_Pcb);
|
||||
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_Start = track->m_End = pos;
|
||||
NEGATE(track->m_Start.y);
|
||||
|
@ -129,13 +129,13 @@ static void Append_1_Flash_GERBER(int Dcode_index,
|
|||
TRACK * track;
|
||||
int width, len;
|
||||
|
||||
width = min( size.x, size.y );
|
||||
len = max( size.x, size.y ) - width;
|
||||
width = MIN( size.x, size.y );
|
||||
len = MAX( size.x, size.y ) - width;
|
||||
|
||||
track = new TRACK(frame->m_Pcb);
|
||||
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_Start = track->m_End = pos;
|
||||
NEGATE(track->m_Start.y);
|
||||
|
@ -176,7 +176,7 @@ TRACK * track;
|
|||
track = new TRACK( frame->m_Pcb );
|
||||
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_Start = startpoint;
|
||||
NEGATE(track->m_Start.y);
|
||||
|
@ -213,7 +213,7 @@ wxPoint center, delta;
|
|||
track->Insert(frame->m_Pcb, NULL);
|
||||
|
||||
track->m_Shape = S_ARC;
|
||||
track->m_Layer = frame->GetScreen()->m_Active_Layer ;
|
||||
track->SetLayer( frame->GetScreen()->m_Active_Layer );
|
||||
track->m_Width = largeur ;
|
||||
|
||||
if ( multiquadrant )
|
||||
|
@ -643,7 +643,7 @@ wxString msg;
|
|||
if ( last ) while (last->Pnext ) last = (SEGZONE*)last->Pnext;
|
||||
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_Start = m_PreviousPos;
|
||||
NEGATE(edge_poly->m_Start.y);
|
||||
|
|
|
@ -116,7 +116,7 @@ void WinEDA_GerberFrame::Trace_Gerber( wxDC* DC, int draw_mode, int printmasklay
|
|||
{
|
||||
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,
|
||||
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
|
||||
{
|
||||
int Color = g_DesignSettings.m_LayerColor[track->m_Layer];
|
||||
int Color = g_DesignSettings.m_LayerColor[track->GetLayer()];
|
||||
GRClosedPoly( &DrawPanel->m_ClipBox, DC, nbpoints, coord,
|
||||
1, Color, Color );
|
||||
}
|
||||
|
|
|
@ -17,10 +17,12 @@
|
|||
/* 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
|
||||
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 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 ..)
|
||||
|
@ -39,12 +41,14 @@ int dcode_hightlight = 0;
|
|||
for( ; Track != NULL; Track = (TRACK*) Track->Pnext )
|
||||
{
|
||||
if( printmasklayer != -1 )
|
||||
if ( (Track->ReturnMaskLayer() & printmasklayer) == 0 ) continue;
|
||||
if( (Track->ReturnMaskLayer() & printmasklayer) == 0 )
|
||||
continue;
|
||||
|
||||
if ( (dcode_hightlight == Track->m_NetCode) &&
|
||||
(Track->m_Layer == layer) )
|
||||
if( (dcode_hightlight == Track->m_NetCode)
|
||||
&& (Track->GetLayer() == layer) )
|
||||
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 )
|
||||
/***********************************************************************************/
|
||||
|
||||
/* routine de trace de 1 segment de piste.
|
||||
Parametres :
|
||||
track = adresse de la description de la piste en buflib
|
||||
draw_mode = mode ( GR_XOR, GR_OR..)
|
||||
* Parametres :
|
||||
* track = adresse de la description de la piste en buflib
|
||||
* draw_mode = mode ( GR_XOR, GR_OR..)
|
||||
*/
|
||||
{
|
||||
int l_piste;
|
||||
|
@ -65,16 +70,19 @@ int rayon;
|
|||
int fillopt;
|
||||
static bool show_err;
|
||||
|
||||
color = g_DesignSettings.m_LayerColor[track->m_Layer];
|
||||
if(color & ITEM_NOT_SHOW ) return ;
|
||||
color = g_DesignSettings.m_LayerColor[track->GetLayer()];
|
||||
if( color & ITEM_NOT_SHOW )
|
||||
return;
|
||||
|
||||
zoom = panel->GetZoom();
|
||||
|
||||
GRSetDrawMode( DC, draw_mode );
|
||||
if( draw_mode & GR_SURBRILL )
|
||||
{
|
||||
if( draw_mode & GR_AND) color &= ~HIGHT_LIGHT_FLAG;
|
||||
else color |= HIGHT_LIGHT_FLAG;
|
||||
if( draw_mode & GR_AND )
|
||||
color &= ~HIGHT_LIGHT_FLAG;
|
||||
else
|
||||
color |= HIGHT_LIGHT_FLAG;
|
||||
}
|
||||
if( color & HIGHT_LIGHT_FLAG )
|
||||
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,
|
||||
rayon, 0, color );
|
||||
}
|
||||
|
||||
else if( fillopt == SKETCH )
|
||||
{
|
||||
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:
|
||||
fillopt = DisplayOpt.DisplayPadFill ? FILLED : SKETCH;
|
||||
|
||||
case S_SEGMENT:
|
||||
if( (l_piste / zoom) < L_MIN_DESSIN )
|
||||
{
|
||||
|
@ -208,17 +216,19 @@ static bool show_err;
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
void Trace_DrawSegmentPcb( WinEDA_DrawPanel* panel, wxDC* DC,
|
||||
DRAWSEGMENT* PtDrawSegment, int draw_mode )
|
||||
/**************************************************************************/
|
||||
|
||||
/* Affichage d'un segment type drawing PCB:
|
||||
Entree : ox, oy = offset de trace
|
||||
draw_mode = mode de trace ( GR_OR, GR_XOR, GrAND)
|
||||
Les contours sont de differents type:
|
||||
segment
|
||||
cercle
|
||||
arc
|
||||
* Entree : ox, oy = offset de trace
|
||||
* draw_mode = mode de trace ( GR_OR, GR_XOR, GrAND)
|
||||
* Les contours sont de differents type:
|
||||
* segment
|
||||
* cercle
|
||||
* arc
|
||||
*/
|
||||
{
|
||||
int ux0, uy0, dx, dy;
|
||||
|
@ -227,8 +237,9 @@ int color, mode;
|
|||
int zoom = panel->GetZoom();
|
||||
int rayon;
|
||||
|
||||
color = g_DesignSettings.m_LayerColor[PtDrawSegment->m_Layer];
|
||||
if(color & ITEM_NOT_SHOW ) return ;
|
||||
color = g_DesignSettings.m_LayerColor[PtDrawSegment->GetLayer()];
|
||||
if( color & ITEM_NOT_SHOW )
|
||||
return;
|
||||
|
||||
GRSetDrawMode( DC, draw_mode );
|
||||
l_piste = PtDrawSegment->m_Width >> 1; /* l_piste = demi largeur piste */
|
||||
|
@ -242,8 +253,10 @@ int rayon;
|
|||
|
||||
|
||||
mode = DisplayOpt.DisplayPcbTrackFill ? FILLED : SKETCH;
|
||||
if(PtDrawSegment->m_Flags & FORCE_SKETCH) mode = SKETCH;
|
||||
if ( l_piste < (L_MIN_DESSIN * zoom) ) mode = FILAIRE;
|
||||
if( PtDrawSegment->m_Flags & FORCE_SKETCH )
|
||||
mode = SKETCH;
|
||||
if( l_piste < (L_MIN_DESSIN * zoom) )
|
||||
mode = FILAIRE;
|
||||
|
||||
switch( PtDrawSegment->m_Shape )
|
||||
{
|
||||
|
@ -319,14 +332,13 @@ wxString Line;
|
|||
track = Pcb->m_Track;
|
||||
for( ; track != NULL; track = (TRACK*) track->Pnext )
|
||||
{
|
||||
if ( (track->m_Shape == S_ARC) ||
|
||||
(track->m_Shape == S_CIRCLE) ||
|
||||
(track->m_Shape == S_ARC_RECT) )
|
||||
if( (track->m_Shape == S_ARC)
|
||||
|| (track->m_Shape == S_CIRCLE)
|
||||
|| (track->m_Shape == S_ARC_RECT) )
|
||||
{
|
||||
pos.x = track->m_Start.x;
|
||||
pos.y = track->m_Start.y;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
pos.x = (track->m_Start.x + track->m_End.x) / 2;
|
||||
|
@ -339,13 +351,13 @@ wxString Line;
|
|||
{
|
||||
width /= 3;
|
||||
}
|
||||
|
||||
else // lines
|
||||
{
|
||||
int dx, dy;
|
||||
dx = track->m_Start.x - track->m_End.x;
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -355,4 +367,3 @@ wxString Line;
|
|||
GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -110,7 +110,7 @@ public:
|
|||
*
|
||||
* @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.
|
||||
* if the BOARD_ITEM under test meets its match criteria.
|
||||
* @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
|
||||
* else SCAN_CONTINUE;
|
||||
*/
|
||||
|
@ -154,7 +154,7 @@ public:
|
|||
|
||||
unsigned long m_TimeStamp; // Time stamp used for logical links
|
||||
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:
|
||||
int m_Status;
|
||||
|
@ -298,21 +298,6 @@ public:
|
|||
**/
|
||||
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
|
||||
|
||||
};
|
||||
|
@ -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.
|
||||
*/
|
||||
class EDA_BaseLineStruct : public EDA_BaseStruct
|
||||
{
|
||||
public:
|
||||
int m_Layer; // Layer number
|
||||
int m_Width; // 0 = line, > 0 = tracks, bus ...
|
||||
wxPoint m_Start; // Line start point
|
||||
wxPoint m_End; // Line end point
|
||||
|
|
|
@ -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
|
||||
|
|
@ -11,12 +11,14 @@
|
|||
#define CONV_FROM_UTF8(utf8string) (utf8string)
|
||||
#endif
|
||||
|
||||
/* violation of C++ standard, cannot use MIN() and MAX()
|
||||
#ifndef min
|
||||
#define min(x, y) ((x) > (y) ? (y) : (x))
|
||||
#define MIN(x, y) ((x) > (y) ? (y) : (x))
|
||||
#endif
|
||||
#ifndef max
|
||||
#define max(x, y) ((x) > (y) ? (x) : (y))
|
||||
#define MAX(x, y) ((x) > (y) ? (x) : (y))
|
||||
#endif
|
||||
*/
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(x, y) ((x) > (y) ? (y) : (x))
|
||||
|
|
|
@ -187,7 +187,7 @@ enum DisplayViaMode {
|
|||
};
|
||||
|
||||
|
||||
class BOARD : public EDA_BaseStruct
|
||||
class BOARD : public BOARD_ITEM
|
||||
{
|
||||
public:
|
||||
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_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
|
||||
EQUIPOT* m_Equipots; // pointeur liste zone equipot
|
||||
TRACK* m_Track; // pointeur relatif zone piste
|
||||
|
@ -339,15 +339,19 @@ public:
|
|||
/* Description des elements du PCB */
|
||||
/***********************************/
|
||||
|
||||
class DRAWSEGMENT : public EDA_BaseLineStruct
|
||||
class DRAWSEGMENT : public BOARD_ITEM
|
||||
{
|
||||
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_Type; // numero de sous type ( cotation.. )
|
||||
int m_Angle; // pour les arcs: "longueur" de l'arc en 1/10 deg
|
||||
|
||||
public:
|
||||
DRAWSEGMENT( EDA_BaseStruct* StructFather, DrawStructureType idtype = TYPEDRAWSEGMENT );
|
||||
DRAWSEGMENT( BOARD_ITEM* StructFather, DrawStructureType idtype = TYPEDRAWSEGMENT );
|
||||
~DRAWSEGMENT( void );
|
||||
|
||||
// Read/write data
|
||||
|
@ -405,7 +409,7 @@ public:
|
|||
class EDGE_ZONE : public DRAWSEGMENT
|
||||
{
|
||||
public:
|
||||
EDGE_ZONE( EDA_BaseStruct* StructFather );
|
||||
EDGE_ZONE( BOARD_ITEM* StructFather );
|
||||
EDGE_ZONE( const EDGE_ZONE& edgezone );
|
||||
~EDGE_ZONE( void );
|
||||
};
|
||||
|
@ -415,7 +419,7 @@ public:
|
|||
/* Gestion des marqueurs sur le PCB */
|
||||
/************************************/
|
||||
|
||||
class MARQUEUR : public EDA_BaseStruct
|
||||
class MARQUEUR : public BOARD_ITEM
|
||||
{
|
||||
/* Description d'un marqueur */
|
||||
public:
|
||||
|
@ -426,7 +430,7 @@ public:
|
|||
wxString m_Diag; /* Associated text (comment) */
|
||||
|
||||
public:
|
||||
MARQUEUR( EDA_BaseStruct* StructFather );
|
||||
MARQUEUR( BOARD_ITEM* StructFather );
|
||||
~MARQUEUR( void );
|
||||
void UnLink( void );
|
||||
void Draw( WinEDA_DrawPanel* panel, wxDC* DC, int DrawMode );
|
||||
|
|
|
@ -11,8 +11,6 @@
|
|||
#define eda_global extern
|
||||
#endif
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include <wx/socket.h>
|
||||
#include "wx/log.h"
|
||||
#include "wx/config.h"
|
||||
|
@ -98,6 +96,7 @@ class WinEDA3D_DrawFrame;
|
|||
class PARAM_CFG_BASE;
|
||||
class Ki_PageDescr;
|
||||
class Ki_HotkeyInfo;
|
||||
class ARROWCOLLECTOR;
|
||||
|
||||
|
||||
enum id_librarytype {
|
||||
|
@ -519,9 +518,7 @@ private:
|
|||
wxMenu* m_FilesMenu;
|
||||
|
||||
#if defined(DEBUG)
|
||||
class COLLECTOR;
|
||||
COLLECTOR* m_GeneralCollector; ///< while arrow icon tool
|
||||
COLLECTOR* m_RatsModuleCollector; ///< while find1rats icon tool
|
||||
ARROWCOLLECTOR* m_ArrowCollector; ///< while arrow icon tool
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -448,7 +448,7 @@ int WinEDA_PcbFrame::GenPlaceBoard( void )
|
|||
PtStruct = m_Pcb->m_Drawings;
|
||||
TRACK TmpSegm( NULL );
|
||||
|
||||
TmpSegm.m_Layer = -1;
|
||||
TmpSegm.SetLayer( -1 );
|
||||
TmpSegm.m_NetCode = -1;
|
||||
TmpSegm.m_Width = g_GridRoutingSize / 2;
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext )
|
||||
|
@ -459,7 +459,7 @@ int WinEDA_PcbFrame::GenPlaceBoard( void )
|
|||
{
|
||||
case TYPEDRAWSEGMENT:
|
||||
DrawSegm = (DRAWSEGMENT*) PtStruct;
|
||||
if( DrawSegm->m_Layer != EDGE_N )
|
||||
if( DrawSegm->GetLayer() != EDGE_N )
|
||||
break;
|
||||
|
||||
TmpSegm.m_Start = DrawSegm->m_Start;
|
||||
|
@ -536,9 +536,9 @@ void WinEDA_PcbFrame::GenModuleOnBoard( MODULE* Module )
|
|||
fy = m_Pcb->m_BoundaryBox.GetBottom();
|
||||
|
||||
masque_layer = 0;
|
||||
if( Module->m_Layer == CMP_N )
|
||||
if( Module->GetLayer() == CMP_N )
|
||||
masque_layer = CMP_LAYER;
|
||||
if( Module->m_Layer == CUIVRE_N )
|
||||
if( Module->GetLayer() == CUIVRE_N )
|
||||
masque_layer = CUIVRE_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;
|
||||
masque_otherlayer = CUIVRE_LAYER;
|
||||
if( Module->m_Layer == CUIVRE_N )
|
||||
if( Module->GetLayer() == CUIVRE_N )
|
||||
masque_otherlayer = CMP_LAYER;
|
||||
|
||||
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;
|
||||
|
||||
side = TOP; otherside = BOTTOM;
|
||||
if( Module->m_Layer == CUIVRE_N )
|
||||
if( Module->GetLayer() == CUIVRE_N )
|
||||
{
|
||||
side = BOTTOM; otherside = TOP;
|
||||
}
|
||||
|
@ -1064,7 +1064,7 @@ static void TracePenaliteRectangle( BOARD* Pcb, int ux0, int uy0, int ux1, int u
|
|||
if( trace & 2 )
|
||||
{
|
||||
data = GetDist( row, col, TOP );
|
||||
data = max( data, LocalPenalite );
|
||||
data = MAX( data, LocalPenalite );
|
||||
SetDist( row, col, TOP, data );
|
||||
}
|
||||
}
|
||||
|
@ -1193,7 +1193,7 @@ bool WinEDA_PcbFrame::SetBoardBoundaryBoxFromEdgesOnly( void )
|
|||
{
|
||||
int rayon, cx, cy, d;
|
||||
int xmax, ymax;
|
||||
EDA_BaseStruct* PtStruct;
|
||||
BOARD_ITEM* PtStruct;
|
||||
DRAWSEGMENT* ptr;
|
||||
bool succes = FALSE;
|
||||
|
||||
|
@ -1205,7 +1205,7 @@ bool WinEDA_PcbFrame::SetBoardBoundaryBoxFromEdgesOnly( void )
|
|||
|
||||
/* Analyse des Contours PCB */
|
||||
PtStruct = m_Pcb->m_Drawings;
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext )
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
|
||||
{
|
||||
if( PtStruct->m_StructType != TYPEDRAWSEGMENT )
|
||||
continue;
|
||||
|
@ -1217,21 +1217,21 @@ bool WinEDA_PcbFrame::SetBoardBoundaryBoxFromEdgesOnly( void )
|
|||
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 += d;
|
||||
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 );
|
||||
xmax = max( xmax, cx + rayon );
|
||||
ymax = max( ymax, cy + 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 );
|
||||
xmax = MAX( xmax, cx + rayon );
|
||||
ymax = MAX( ymax, cy + rayon );
|
||||
}
|
||||
else
|
||||
{
|
||||
cx = min( ptr->m_Start.x, ptr->m_End.x );
|
||||
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.y = min( m_Pcb->m_BoundaryBox.m_Pos.y, cy - d );
|
||||
cx = max( ptr->m_Start.x, ptr->m_End.x );
|
||||
cy = max( ptr->m_Start.y, ptr->m_End.y );
|
||||
xmax = max( xmax, cx + d );
|
||||
ymax = max( ymax, cy + d );
|
||||
cx = MIN( ptr->m_Start.x, ptr->m_End.x );
|
||||
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.y = MIN( m_Pcb->m_BoundaryBox.m_Pos.y, cy - d );
|
||||
cx = MAX( ptr->m_Start.x, ptr->m_End.x );
|
||||
cy = MAX( ptr->m_Start.y, ptr->m_End.y );
|
||||
xmax = MAX( xmax, cx + d );
|
||||
ymax = MAX( ymax, cy + d );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -430,7 +430,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
|
|||
* routine d'effacement du block deja selectionne
|
||||
*/
|
||||
{
|
||||
EDA_BaseStruct* PtStruct, * NextS;
|
||||
BOARD_ITEM* PtStruct, * NextS;
|
||||
int masque_layer;
|
||||
|
||||
if( !InstallBlockCmdFrame( this, _( "Delete Block" ) ) )
|
||||
|
@ -448,7 +448,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
|
|||
module = m_Pcb->m_Modules;
|
||||
for( ; module != NULL; module = (MODULE*) NextS )
|
||||
{
|
||||
NextS = module->Pnext;
|
||||
NextS = module->Next();
|
||||
if( IsModuleInBox( GetScreen()->BlockLocate, module ) == NULL )
|
||||
continue;
|
||||
/* le module est ici bon a etre efface */
|
||||
|
@ -467,9 +467,10 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
|
|||
Affiche_Message( _( "Delete tracks" ) );
|
||||
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 ) )
|
||||
{ /* la piste est ici bonne a etre efface */
|
||||
{
|
||||
/* la piste est ici bonne a etre efface */
|
||||
pt_segm->Draw( DrawPanel, DC, GR_XOR );
|
||||
DeleteStructure( pt_segm );
|
||||
}
|
||||
|
@ -487,14 +488,14 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
|
|||
PtStruct = m_Pcb->m_Drawings;
|
||||
for( ; PtStruct != NULL; PtStruct = NextS )
|
||||
{
|
||||
NextS = PtStruct->Pnext;
|
||||
NextS = PtStruct->Next();
|
||||
|
||||
switch( PtStruct->m_StructType )
|
||||
{
|
||||
case TYPEDRAWSEGMENT:
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (DRAWSEGMENT*) PtStruct )
|
||||
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 )
|
||||
if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
|
||||
break;
|
||||
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
|
||||
break;
|
||||
|
@ -517,7 +518,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
|
|||
case TYPEMIRE:
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (MIREPCB*) PtStruct )
|
||||
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 )
|
||||
if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
|
||||
break;
|
||||
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
|
||||
break;
|
||||
|
@ -529,7 +530,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
|
|||
case TYPECOTATION:
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (COTATION*) PtStruct )
|
||||
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 )
|
||||
if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
|
||||
break;
|
||||
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
|
||||
break;
|
||||
|
@ -551,7 +552,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
|
|||
Affiche_Message( _( "Delete zones" ) );
|
||||
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 ) )
|
||||
{ /* la piste est ici bonne a etre efface */
|
||||
pt_segm->Draw( DrawPanel, DC, GR_XOR );
|
||||
|
@ -682,7 +683,7 @@ void WinEDA_BasePcbFrame::Block_Rotate( wxDC* DC )
|
|||
case TYPEDRAWSEGMENT:
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (DRAWSEGMENT*) PtStruct )
|
||||
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 )
|
||||
if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
|
||||
break;
|
||||
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
|
||||
break;
|
||||
|
@ -715,7 +716,7 @@ void WinEDA_BasePcbFrame::Block_Rotate( wxDC* DC )
|
|||
case TYPEMIRE:
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (MIREPCB*) PtStruct )
|
||||
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 )
|
||||
if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
|
||||
break;
|
||||
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
|
||||
break;
|
||||
|
@ -728,7 +729,7 @@ void WinEDA_BasePcbFrame::Block_Rotate( wxDC* DC )
|
|||
case TYPECOTATION:
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (COTATION*) PtStruct )
|
||||
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 )
|
||||
if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
|
||||
break;
|
||||
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
|
||||
break;
|
||||
|
@ -852,7 +853,7 @@ void WinEDA_BasePcbFrame::Block_Invert( wxDC* DC )
|
|||
INVERT( track->m_End.y );
|
||||
if( track->m_StructType != TYPEVIA )
|
||||
{
|
||||
track->m_Layer = ChangeSideNumLayer( track->m_Layer );
|
||||
track->SetLayer( ChangeSideNumLayer( track->GetLayer() ) );
|
||||
}
|
||||
|
||||
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
|
||||
INVERT( track->m_Start.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 = (TRACK*) track->Pnext;
|
||||
|
@ -897,7 +898,7 @@ void WinEDA_BasePcbFrame::Block_Invert( wxDC* DC )
|
|||
case TYPEDRAWSEGMENT:
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (DRAWSEGMENT*) PtStruct )
|
||||
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 )
|
||||
if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
|
||||
break;
|
||||
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
|
||||
break;
|
||||
|
@ -909,7 +910,7 @@ void WinEDA_BasePcbFrame::Block_Invert( wxDC* DC )
|
|||
}
|
||||
INVERT( STRUCT->m_Start.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 );
|
||||
break;
|
||||
|
||||
|
@ -925,11 +926,11 @@ void WinEDA_BasePcbFrame::Block_Invert( wxDC* DC )
|
|||
/* Redessin du Texte */
|
||||
INVERT( STRUCT->m_Pos.y );
|
||||
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_Layer = ChangeSideNumLayer( STRUCT->m_Layer );
|
||||
STRUCT->SetLayer( ChangeSideNumLayer( STRUCT->GetLayer() ) );
|
||||
STRUCT->CreateDrawData();
|
||||
( (TEXTE_PCB*) PtStruct )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_OR );
|
||||
break;
|
||||
|
@ -937,21 +938,21 @@ void WinEDA_BasePcbFrame::Block_Invert( wxDC* DC )
|
|||
case TYPEMIRE:
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (MIREPCB*) PtStruct )
|
||||
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 )
|
||||
if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
|
||||
break;
|
||||
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
|
||||
break;
|
||||
/* l'element est ici bon a etre modifie */
|
||||
( (MIREPCB*) PtStruct )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_XOR );
|
||||
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 );
|
||||
break;
|
||||
|
||||
case TYPECOTATION:
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (COTATION*) PtStruct )
|
||||
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 )
|
||||
if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
|
||||
break;
|
||||
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
|
||||
break;
|
||||
|
@ -982,7 +983,7 @@ void WinEDA_BasePcbFrame::Block_Invert( wxDC* DC )
|
|||
INVERT( STRUCT->FlecheD2_oy );
|
||||
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 );
|
||||
break;
|
||||
|
@ -1111,7 +1112,7 @@ void WinEDA_BasePcbFrame::Block_Move( wxDC* DC )
|
|||
case TYPEDRAWSEGMENT:
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (DRAWSEGMENT*) PtStruct )
|
||||
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 )
|
||||
if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
|
||||
break;
|
||||
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
|
||||
break;
|
||||
|
@ -1139,7 +1140,7 @@ void WinEDA_BasePcbFrame::Block_Move( wxDC* DC )
|
|||
case TYPEMIRE:
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (MIREPCB*) PtStruct )
|
||||
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 )
|
||||
if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
|
||||
break;
|
||||
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
|
||||
break;
|
||||
|
@ -1152,7 +1153,7 @@ void WinEDA_BasePcbFrame::Block_Move( wxDC* DC )
|
|||
case TYPECOTATION:
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (COTATION*) PtStruct )
|
||||
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 )
|
||||
if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
|
||||
break;
|
||||
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
|
||||
break;
|
||||
|
@ -1315,7 +1316,7 @@ void WinEDA_BasePcbFrame::Block_Duplicate( wxDC* DC )
|
|||
{
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (DRAWSEGMENT*) PtStruct )
|
||||
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 )
|
||||
if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
|
||||
break;
|
||||
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
|
||||
break;
|
||||
|
@ -1357,7 +1358,7 @@ void WinEDA_BasePcbFrame::Block_Duplicate( wxDC* DC )
|
|||
{
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (MIREPCB*) PtStruct )
|
||||
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 )
|
||||
if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
|
||||
break;
|
||||
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
|
||||
break;
|
||||
|
@ -1377,7 +1378,7 @@ void WinEDA_BasePcbFrame::Block_Duplicate( wxDC* DC )
|
|||
{
|
||||
#undef STRUCT
|
||||
#define STRUCT ( (COTATION*) PtStruct )
|
||||
if( (g_TabOneLayerMask[STRUCT->m_Layer] & masque_layer) == 0 )
|
||||
if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
|
||||
break;
|
||||
if( IsStructInBox( GetScreen()->BlockLocate, PtStruct ) == NULL )
|
||||
break;
|
||||
|
|
|
@ -395,8 +395,8 @@ void CopyMarkedItems( MODULE* module, wxPoint offset )
|
|||
/* Copy marked items, at new position = old position + offset
|
||||
*/
|
||||
{
|
||||
EDA_BaseStruct* item;
|
||||
EDA_BaseStruct* NewStruct;
|
||||
BOARD_ITEM* item;
|
||||
BOARD_ITEM* NewStruct;
|
||||
|
||||
if( module == NULL )
|
||||
return;
|
||||
|
|
|
@ -186,7 +186,7 @@ void PlaceCells( BOARD* Pcb, int net_code, int flag )
|
|||
TRACK* pt_segm;
|
||||
TEXTE_PCB* PtText;
|
||||
DRAWSEGMENT* DrawSegm;
|
||||
EDA_BaseStruct* PtStruct;
|
||||
BOARD_ITEM* PtStruct;
|
||||
int ux0 = 0, uy0 = 0, ux1, uy1, dx, dy;
|
||||
int marge, via_marge;
|
||||
int masque_layer;
|
||||
|
@ -211,19 +211,19 @@ void PlaceCells( BOARD* Pcb, int net_code, int flag )
|
|||
// Placement des elements de modules sur PCB //
|
||||
///////////////////////////////////////////////
|
||||
PtStruct = Pcb->m_Modules;
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext )
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
|
||||
{
|
||||
EDA_BaseStruct* PtModStruct = ( (MODULE*) PtStruct )->m_Drawings;
|
||||
for( ; PtModStruct != NULL; PtModStruct = PtModStruct->Pnext )
|
||||
BOARD_ITEM* PtModStruct = ( (MODULE*) PtStruct )->m_Drawings;
|
||||
for( ; PtModStruct != NULL; PtModStruct = PtModStruct->Next() )
|
||||
{
|
||||
switch( PtModStruct->m_StructType )
|
||||
{
|
||||
case TYPEEDGEMODULE:
|
||||
{
|
||||
TRACK* TmpSegm = new TRACK( NULL );
|
||||
TmpSegm->m_Layer = ( (EDGE_MODULE*) PtModStruct )->m_Layer;
|
||||
if( TmpSegm->m_Layer == EDGE_N )
|
||||
TmpSegm->m_Layer = -1;
|
||||
TmpSegm->SetLayer( ( (EDGE_MODULE*) PtModStruct )->GetLayer() );
|
||||
if( TmpSegm->GetLayer() == EDGE_N )
|
||||
TmpSegm->SetLayer( -1 );
|
||||
|
||||
TmpSegm->m_Start = ( (EDGE_MODULE*) PtModStruct )->m_Start;
|
||||
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 //
|
||||
////////////////////////////////////////////
|
||||
PtStruct = Pcb->m_Drawings;
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext )
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
|
||||
{
|
||||
switch( PtStruct->m_StructType )
|
||||
{
|
||||
|
@ -258,10 +258,10 @@ void PlaceCells( BOARD* Pcb, int net_code, int flag )
|
|||
int type_cell = HOLE;
|
||||
TRACK* TmpSegm = new TRACK( NULL );
|
||||
DrawSegm = (DRAWSEGMENT*) PtStruct;
|
||||
TmpSegm->m_Layer = DrawSegm->m_Layer;
|
||||
if( DrawSegm->m_Layer == EDGE_N )
|
||||
TmpSegm->SetLayer( DrawSegm->GetLayer() );
|
||||
if( DrawSegm->GetLayer() == EDGE_N )
|
||||
{
|
||||
TmpSegm->m_Layer = -1;
|
||||
TmpSegm->SetLayer( -1 );
|
||||
type_cell |= CELL_is_EDGE;
|
||||
}
|
||||
|
||||
|
@ -293,7 +293,7 @@ void PlaceCells( BOARD* Pcb, int net_code, int flag )
|
|||
ux1 = ux0 + dx; uy1 = 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,
|
||||
(int) (PtText->m_Orient),
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
/* Constructor */
|
||||
BOARD::BOARD( EDA_BaseStruct* parent, WinEDA_BasePcbFrame* frame ) :
|
||||
EDA_BaseStruct( parent, TYPEPCB )
|
||||
BOARD_ITEM( (BOARD_ITEM*) parent, TYPEPCB )
|
||||
{
|
||||
m_PcbFrame = frame;
|
||||
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;
|
||||
rayon = (int) hypot( (double) (ptr->m_End.x - cx), (double) (ptr->m_End.y - cy) );
|
||||
rayon += d;
|
||||
xmin = min( xmin, cx - rayon );
|
||||
ymin = min( ymin, cy - rayon );
|
||||
xmax = max( xmax, cx + rayon );
|
||||
ymax = max( ymax, cy + rayon );
|
||||
xmin = MIN( xmin, cx - rayon );
|
||||
ymin = MIN( ymin, cy - rayon );
|
||||
xmax = MAX( xmax, cx + rayon );
|
||||
ymax = MAX( ymax, cy + rayon );
|
||||
Has_Items = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
cx = min( ptr->m_Start.x, ptr->m_End.x );
|
||||
cy = min( ptr->m_Start.y, ptr->m_End.y );
|
||||
xmin = min( xmin, cx - d );
|
||||
ymin = min( ymin, cy - d );
|
||||
cx = max( ptr->m_Start.x, ptr->m_End.x );
|
||||
cy = max( ptr->m_Start.y, ptr->m_End.y );
|
||||
xmax = max( xmax, cx + d );
|
||||
ymax = max( ymax, cy + d );
|
||||
cx = MIN( ptr->m_Start.x, ptr->m_End.x );
|
||||
cy = MIN( ptr->m_Start.y, ptr->m_End.y );
|
||||
xmin = MIN( xmin, cx - d );
|
||||
ymin = MIN( ymin, cy - d );
|
||||
cx = MAX( ptr->m_Start.x, ptr->m_End.x );
|
||||
cy = MAX( ptr->m_Start.y, ptr->m_End.y );
|
||||
xmax = MAX( xmax, cx + d );
|
||||
ymax = MAX( ymax, cy + d );
|
||||
Has_Items = TRUE;
|
||||
}
|
||||
}
|
||||
|
@ -185,19 +185,19 @@ bool BOARD::ComputeBoundaryBox( void )
|
|||
for( ; module != NULL; module = (MODULE*) module->Pnext )
|
||||
{
|
||||
Has_Items = TRUE;
|
||||
xmin = min( xmin, ( module->m_Pos.x + module->m_BoundaryBox.GetX() ) );
|
||||
ymin = min( ymin, ( module->m_Pos.y + module->m_BoundaryBox.GetY() ) );
|
||||
xmax = max( xmax, module->m_Pos.x + module->m_BoundaryBox.GetRight() );
|
||||
ymax = max( ymax, module->m_Pos.y + module->m_BoundaryBox.GetBottom() );
|
||||
xmin = MIN( xmin, ( module->m_Pos.x + module->m_BoundaryBox.GetX() ) );
|
||||
ymin = MIN( ymin, ( module->m_Pos.y + module->m_BoundaryBox.GetY() ) );
|
||||
xmax = MAX( xmax, module->m_Pos.x + module->m_BoundaryBox.GetRight() );
|
||||
ymax = MAX( ymax, module->m_Pos.y + module->m_BoundaryBox.GetBottom() );
|
||||
|
||||
D_PAD* pt_pad = module->m_Pads;
|
||||
for( ; pt_pad != NULL; pt_pad = (D_PAD*) pt_pad->Pnext )
|
||||
{
|
||||
d = pt_pad->m_Rayon;
|
||||
xmin = min( xmin, pt_pad->m_Pos.x - d );
|
||||
ymin = min( ymin, pt_pad->m_Pos.y - d );
|
||||
xmax = max( xmax, pt_pad->m_Pos.x + d );
|
||||
ymax = max( ymax, pt_pad->m_Pos.y + d );
|
||||
xmin = MIN( xmin, pt_pad->m_Pos.x - d );
|
||||
ymin = MIN( ymin, pt_pad->m_Pos.y - d );
|
||||
xmax = MAX( xmax, pt_pad->m_Pos.x + 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 )
|
||||
{
|
||||
d = (Track->m_Width / 2) + 1;
|
||||
cx = min( Track->m_Start.x, Track->m_End.x );
|
||||
cy = min( Track->m_Start.y, Track->m_End.y );
|
||||
xmin = min( xmin, cx - d );
|
||||
ymin = min( ymin, cy - d );
|
||||
cx = max( Track->m_Start.x, Track->m_End.x );
|
||||
cy = max( Track->m_Start.y, Track->m_End.y );
|
||||
xmax = max( xmax, cx + d );
|
||||
ymax = max( ymax, cy + d );
|
||||
cx = MIN( Track->m_Start.x, Track->m_End.x );
|
||||
cy = MIN( Track->m_Start.y, Track->m_End.y );
|
||||
xmin = MIN( xmin, cx - d );
|
||||
ymin = MIN( ymin, cy - d );
|
||||
cx = MAX( Track->m_Start.x, Track->m_End.x );
|
||||
cy = MAX( Track->m_Start.y, Track->m_End.y );
|
||||
xmax = MAX( xmax, cx + d );
|
||||
ymax = MAX( ymax, cy + d );
|
||||
Has_Items = TRUE;
|
||||
}
|
||||
|
||||
for( Track = m_Zone; Track != NULL; Track = (TRACK*) Track->Pnext )
|
||||
{
|
||||
d = (Track->m_Width / 2) + 1;
|
||||
cx = min( Track->m_Start.x, Track->m_End.x );
|
||||
cy = min( Track->m_Start.y, Track->m_End.y );
|
||||
xmin = min( xmin, cx - d );
|
||||
ymin = min( ymin, cy - d );
|
||||
cx = max( Track->m_Start.x, Track->m_End.x );
|
||||
cy = max( Track->m_Start.y, Track->m_End.y );
|
||||
xmax = max( xmax, cx + d );
|
||||
ymax = max( ymax, cy + d );
|
||||
cx = MIN( Track->m_Start.x, Track->m_End.x );
|
||||
cy = MIN( Track->m_Start.y, Track->m_End.y );
|
||||
xmin = MIN( xmin, cx - d );
|
||||
ymin = MIN( ymin, cy - d );
|
||||
cx = MAX( Track->m_Start.x, Track->m_End.x );
|
||||
cy = MAX( Track->m_Start.y, Track->m_End.y );
|
||||
xmax = MAX( xmax, cx + d );
|
||||
ymax = MAX( ymax, cy + d );
|
||||
Has_Items = TRUE;
|
||||
}
|
||||
|
||||
|
@ -378,7 +378,7 @@ EDA_BaseStruct* BOARD::FindPadOrModule( const wxPoint& refPos, int layer )
|
|||
class PadOrModule : public INSPECTOR
|
||||
{
|
||||
public:
|
||||
EDA_BaseStruct* found;
|
||||
BOARD_ITEM* found;
|
||||
int layer;
|
||||
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 )
|
||||
{
|
||||
BOARD_ITEM* item = (BOARD_ITEM*) testItem;
|
||||
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( layer_mask & pad->m_Masque_Layer )
|
||||
{
|
||||
found = testItem;
|
||||
found = item;
|
||||
return SEARCH_QUIT;
|
||||
}
|
||||
else if( !found )
|
||||
{
|
||||
MODULE* parent = (MODULE*) pad->m_Parent;
|
||||
if( IsModuleLayerVisible( parent->m_Layer ) )
|
||||
found = testItem;
|
||||
if( IsModuleLayerVisible( parent->GetLayer() ) )
|
||||
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
|
||||
if( IsModuleLayerVisible( module->m_Layer ) )
|
||||
if( IsModuleLayerVisible( module->GetLayer() ) )
|
||||
{
|
||||
if( module->HitTest( refPos ) )
|
||||
{
|
||||
if( layer == module->m_Layer )
|
||||
if( layer == module->GetLayer() )
|
||||
{
|
||||
found = testItem;
|
||||
found = item;
|
||||
return SEARCH_QUIT;
|
||||
}
|
||||
|
||||
// layer mismatch, save in case we don't find a
|
||||
// future layer match hit.
|
||||
if( !found )
|
||||
found = testItem;
|
||||
found = item;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
#include "wxstruct.h"
|
||||
|
||||
|
||||
COTATION::COTATION( EDA_BaseStruct* StructFather ) :
|
||||
EDA_BaseStruct( StructFather, TYPECOTATION )
|
||||
COTATION::COTATION( BOARD_ITEM* StructFather ) :
|
||||
BOARD_ITEM( StructFather, TYPECOTATION )
|
||||
{
|
||||
m_Layer = DRAW_LAYER;
|
||||
m_Width = 50;
|
||||
|
@ -24,7 +24,7 @@ COTATION::COTATION( EDA_BaseStruct* StructFather ) :
|
|||
|
||||
|
||||
/* Effacement memoire de la structure */
|
||||
COTATION::~COTATION( void )
|
||||
COTATION::~COTATION()
|
||||
{
|
||||
delete m_Text;
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ void COTATION::UnLink( void )
|
|||
}
|
||||
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_Layer = source->m_Layer;
|
||||
SetLayer( source->GetLayer() );
|
||||
m_Width = source->m_Width;
|
||||
m_Pos = source->m_Pos;
|
||||
m_Shape = source->m_Shape;
|
||||
|
@ -112,15 +112,18 @@ bool COTATION::ReadCotationDescr( FILE* File, int* LineNum )
|
|||
|
||||
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 */
|
||||
if( m_Layer < FIRST_NO_COPPER_LAYER )
|
||||
m_Layer = FIRST_NO_COPPER_LAYER;
|
||||
if( m_Layer > LAST_NO_COPPER_LAYER )
|
||||
m_Layer = LAST_NO_COPPER_LAYER;
|
||||
if( layer < FIRST_NO_COPPER_LAYER )
|
||||
layer = FIRST_NO_COPPER_LAYER;
|
||||
if( layer > LAST_NO_COPPER_LAYER )
|
||||
layer = LAST_NO_COPPER_LAYER;
|
||||
|
||||
m_Text->m_Layer = m_Layer;
|
||||
SetLayer( layer );
|
||||
m_Text->SetLayer( layer );
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
#include "base_struct.h"
|
||||
|
||||
class COTATION : public EDA_BaseStruct
|
||||
class COTATION : public BOARD_ITEM
|
||||
{
|
||||
public:
|
||||
int m_Width;
|
||||
|
@ -25,8 +25,8 @@ public:
|
|||
int FlecheG2_ox, FlecheG2_oy, FlecheG2_fx, FlecheG2_fy;
|
||||
|
||||
public:
|
||||
COTATION( EDA_BaseStruct* StructFather );
|
||||
~COTATION( void );
|
||||
COTATION( BOARD_ITEM* StructFather );
|
||||
~COTATION();
|
||||
|
||||
bool ReadCotationDescr( FILE* File, int* LineNum );
|
||||
bool WriteCotationDescr( FILE* File );
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
/******************************************/
|
||||
|
||||
EDGE_MODULE::EDGE_MODULE( MODULE* parent ) :
|
||||
EDA_BaseLineStruct( parent, TYPEEDGEMODULE )
|
||||
BOARD_ITEM( parent, TYPEEDGEMODULE )
|
||||
{
|
||||
m_Shape = S_SEGMENT;
|
||||
m_Angle = 0;
|
||||
|
@ -91,7 +91,7 @@ void EDGE_MODULE::UnLink( void )
|
|||
}
|
||||
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, 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" ),
|
||||
ReturnPcbLayerName( module->m_Layer ), RED );
|
||||
ReturnPcbLayerName( module->GetLayer() ), RED );
|
||||
|
||||
valeur_param( m_Width, bufcar );
|
||||
Affiche_1_Parametre( frame, 54, _( "Width" ), bufcar, BLUE );
|
||||
|
|
|
@ -7,9 +7,13 @@ class Pcb3D_GLCanvas;
|
|||
|
||||
/* description des contours (empreintes ) et TYPES des CONTOURS : */
|
||||
|
||||
class EDGE_MODULE : public EDA_BaseLineStruct
|
||||
class EDGE_MODULE : public BOARD_ITEM
|
||||
{
|
||||
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"
|
||||
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)
|
||||
|
|
|
@ -22,8 +22,8 @@
|
|||
/*********************************************************/
|
||||
|
||||
/* Constructeur de la classe EQUIPOT */
|
||||
EQUIPOT::EQUIPOT( EDA_BaseStruct* StructFather ) :
|
||||
EDA_BaseStruct( StructFather, PCB_EQUIPOT_STRUCT_TYPE )
|
||||
EQUIPOT::EQUIPOT( BOARD_ITEM* StructFather ) :
|
||||
BOARD_ITEM( StructFather, PCB_EQUIPOT_STRUCT_TYPE )
|
||||
{
|
||||
m_NetCode = 0;
|
||||
m_NbNodes = m_NbLink = m_NbNoconn = 0;
|
||||
|
@ -39,7 +39,7 @@ EQUIPOT::EQUIPOT( EDA_BaseStruct* StructFather ) :
|
|||
|
||||
/* destructeut */
|
||||
|
||||
EQUIPOT::~EQUIPOT( void )
|
||||
EQUIPOT::~EQUIPOT()
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
/* Representation des descriptions des equipotentielles */
|
||||
|
||||
class EQUIPOT : public EDA_BaseStruct
|
||||
class EQUIPOT : public BOARD_ITEM
|
||||
{
|
||||
public:
|
||||
wxString m_Netname; // nom du net
|
||||
|
@ -22,8 +22,8 @@ public:
|
|||
CHEVELU* m_RatsnestStart; // pointeur sur debut de liste ratsnests du net
|
||||
CHEVELU* m_RatsnestEnd; // pointeur sur fin de liste ratsnests du net
|
||||
|
||||
EQUIPOT( EDA_BaseStruct* StructFather );
|
||||
~EQUIPOT( void );
|
||||
EQUIPOT( BOARD_ITEM* StructFather );
|
||||
~EQUIPOT();
|
||||
|
||||
/* Effacement memoire de la structure */
|
||||
void UnLink( void );
|
||||
|
|
|
@ -9,15 +9,15 @@
|
|||
#include "pcbnew.h"
|
||||
|
||||
|
||||
MIREPCB::MIREPCB( EDA_BaseStruct* StructFather ) :
|
||||
EDA_BaseStruct( StructFather, TYPEMIRE )
|
||||
MIREPCB::MIREPCB( BOARD_ITEM* StructFather ) :
|
||||
BOARD_ITEM( StructFather, TYPEMIRE )
|
||||
{
|
||||
m_Shape = 0;
|
||||
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" */
|
||||
{
|
||||
( (BOARD*) Pback )->m_Drawings = Pnext;
|
||||
( (BOARD*) Pback )->m_Drawings = (BOARD_ITEM*) Pnext;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#include "base_struct.h"
|
||||
|
||||
|
||||
class MIREPCB : public EDA_BaseStruct
|
||||
class MIREPCB : public BOARD_ITEM
|
||||
{
|
||||
public:
|
||||
int m_Width;
|
||||
|
@ -16,8 +16,8 @@ public:
|
|||
int m_Size;
|
||||
|
||||
public:
|
||||
MIREPCB( EDA_BaseStruct* StructFather );
|
||||
~MIREPCB( void );
|
||||
MIREPCB( BOARD_ITEM* StructFather );
|
||||
~MIREPCB();
|
||||
|
||||
bool WriteMirePcbDescr( FILE* File );
|
||||
bool ReadMirePcbDescr( FILE* File, int* LineNum );
|
||||
|
|
|
@ -58,7 +58,8 @@ void MODULE::DrawAncre( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset
|
|||
/*************************************************/
|
||||
|
||||
/* 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_Drawings = NULL;
|
||||
|
@ -168,9 +169,9 @@ void MODULE::Copy( MODULE* Module )
|
|||
}
|
||||
|
||||
/* Copy des structures auxiliaires: Drawings */
|
||||
EDA_BaseStruct* OldStruct = (EDA_BaseStruct*) Module->m_Drawings;
|
||||
EDA_BaseStruct* NewStruct, * LastStruct = NULL;
|
||||
for( ; OldStruct; OldStruct = OldStruct->Pnext )
|
||||
BOARD_ITEM* OldStruct = Module->m_Drawings;
|
||||
BOARD_ITEM* NewStruct, * LastStruct = NULL;
|
||||
for( ; OldStruct; OldStruct = OldStruct->Next() )
|
||||
{
|
||||
NewStruct = NULL;
|
||||
|
||||
|
@ -423,7 +424,7 @@ int MODULE::WriteDescr( FILE* File )
|
|||
m_Reference->m_Size.y, m_Reference->m_Size.x,
|
||||
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_Layer,
|
||||
m_Reference->GetLayer(),
|
||||
CONV_TO_UTF8( m_Reference->m_Text ) );
|
||||
NbLigne++;
|
||||
|
||||
|
@ -434,7 +435,7 @@ int MODULE::WriteDescr( FILE* File )
|
|||
m_Value->m_Size.y, m_Value->m_Size.x,
|
||||
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_Layer,
|
||||
m_Value->GetLayer(),
|
||||
CONV_TO_UTF8( m_Value->m_Text ) );
|
||||
NbLigne++;
|
||||
|
||||
|
@ -453,7 +454,7 @@ int MODULE::WriteDescr( FILE* File )
|
|||
PtText->m_Orient + m_Orient, PtText->m_Width,
|
||||
PtText->m_Miroir ? 'N' : 'M',
|
||||
PtText->m_NoShow ? 'I' : 'V',
|
||||
PtText->m_Layer, CONV_TO_UTF8( PtText->m_Text ) );
|
||||
PtText->GetLayer(), CONV_TO_UTF8( PtText->m_Text ) );
|
||||
NbLigne++;
|
||||
break;
|
||||
|
||||
|
@ -720,22 +721,23 @@ int MODULE::ReadDescr( FILE* File, int* LineNum )
|
|||
if( LastModStruct == NULL )
|
||||
{
|
||||
DrawText->Pback = this;
|
||||
m_Drawings = (EDA_BaseStruct*) DrawText;
|
||||
m_Drawings = DrawText;
|
||||
}
|
||||
else
|
||||
{
|
||||
DrawText->Pback = LastModStruct;
|
||||
LastModStruct->Pnext = DrawText;
|
||||
}
|
||||
LastModStruct = (EDA_BaseStruct*) DrawText;
|
||||
LastModStruct = DrawText;
|
||||
}
|
||||
|
||||
int layer;
|
||||
sscanf( Line + 1, "%d %d %d %d %d %d %d %s %s %d",
|
||||
&itmp1,
|
||||
&DrawText->m_Pos0.x, &DrawText->m_Pos0.y,
|
||||
&DrawText->m_Size.y, &DrawText->m_Size.x,
|
||||
&DrawText->m_Orient, &DrawText->m_Width,
|
||||
BufCar1, BufCar2, &DrawText->m_Layer );
|
||||
BufCar1, BufCar2, &layer );
|
||||
|
||||
DrawText->m_Type = itmp1;
|
||||
DrawText->m_Orient -= m_Orient; // m_Orient texte relative au module
|
||||
|
@ -748,10 +750,12 @@ int MODULE::ReadDescr( FILE* File, int* LineNum )
|
|||
else
|
||||
DrawText->m_NoShow = 0;
|
||||
|
||||
if( m_Layer == CUIVRE_N )
|
||||
DrawText->m_Layer = SILKSCREEN_N_CU;
|
||||
if( m_Layer == CMP_N )
|
||||
DrawText->m_Layer = SILKSCREEN_N_CMP;
|
||||
if( layer == CUIVRE_N )
|
||||
layer = SILKSCREEN_N_CU;
|
||||
else if( layer == CMP_N )
|
||||
layer = SILKSCREEN_N_CMP;
|
||||
|
||||
DrawText->SetLayer( layer );
|
||||
|
||||
/* calcul de la position vraie */
|
||||
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;
|
||||
rayon = (int) hypot( (double) (cx - uxf), (double) (cy - uyf) );
|
||||
rayon += width;
|
||||
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 );
|
||||
xmax = max( xmax, cx + rayon );
|
||||
ymax = max( ymax, cy + 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 );
|
||||
xmax = MAX( xmax, cx + rayon );
|
||||
ymax = MAX( ymax, cy + rayon );
|
||||
break;
|
||||
}
|
||||
|
||||
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_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_End0.y - width );
|
||||
xmax = max( xmax, pt_edge_mod->m_Start0.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_End0.y + 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.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 );
|
||||
xmax = MAX( xmax, pt_edge_mod->m_Start0.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_End0.y + width );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -986,10 +990,10 @@ void MODULE::Set_Rectangle_Encadrement( void )
|
|||
{
|
||||
rayon = pad->m_Rayon;
|
||||
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.y = min( m_BoundaryBox.m_Pos.y, cy - rayon );
|
||||
xmax = max( xmax, cx + rayon );
|
||||
ymax = max( ymax, cy + 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 );
|
||||
xmax = MAX( xmax, cx + rayon );
|
||||
ymax = MAX( ymax, cy + rayon );
|
||||
}
|
||||
|
||||
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;
|
||||
rayon = (int) hypot( (double) (cx - uxf), (double) (cy - uyf) );
|
||||
rayon += width;
|
||||
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 );
|
||||
xmax = max( xmax, cx + rayon );
|
||||
ymax = max( ymax, cy + 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 );
|
||||
xmax = MAX( xmax, cx + rayon );
|
||||
ymax = MAX( ymax, cy + rayon );
|
||||
break;
|
||||
}
|
||||
|
||||
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_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_End.y - width );
|
||||
xmax = max( xmax, EdgeMod->m_Start.x + width );
|
||||
xmax = max( xmax, EdgeMod->m_End.x + width );
|
||||
ymax = max( ymax, EdgeMod->m_Start.y + width );
|
||||
ymax = max( ymax, EdgeMod->m_End.y + 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.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 );
|
||||
xmax = MAX( xmax, EdgeMod->m_Start.x + width );
|
||||
xmax = MAX( xmax, EdgeMod->m_End.x + width );
|
||||
ymax = MAX( ymax, EdgeMod->m_Start.y + width );
|
||||
ymax = MAX( ymax, EdgeMod->m_End.y + width );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1060,10 +1064,10 @@ void MODULE::SetRectangleExinscrit( void )
|
|||
{
|
||||
rayon = Pad->m_Rayon;
|
||||
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.y = min( m_RealBoundaryBox.m_Pos.y, cy - rayon );
|
||||
xmax = max( xmax, cx + rayon );
|
||||
ymax = max( ymax, cy + 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 );
|
||||
xmax = MAX( xmax, cx + rayon );
|
||||
ymax = MAX( ymax, cy + rayon );
|
||||
}
|
||||
|
||||
m_RealBoundaryBox.SetWidth( xmax - m_RealBoundaryBox.m_Pos.x );
|
||||
|
|
|
@ -35,12 +35,12 @@ enum Mod_Attribut /* Attributs d'un module */
|
|||
#define MODULE_is_PLACED 0x02 /* In autoplace: module automatically placed */
|
||||
#define MODULE_to_PLACE 0x04 /* In autoplace: module waiting for autoplace */
|
||||
|
||||
class MODULE : public EDA_BaseStruct
|
||||
class MODULE : public BOARD_ITEM
|
||||
{
|
||||
public:
|
||||
wxPoint m_Pos; // Real coord on board
|
||||
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*/
|
||||
TEXTE_MODULE* m_Reference; // texte reference du composant (U34, R18..)
|
||||
TEXTE_MODULE* m_Value; // texte valeur du composant (74LS00, 22K..)
|
||||
|
@ -74,7 +74,7 @@ public:
|
|||
|
||||
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
|
||||
* en coord locales (orient 0 et origine = pos module) */
|
||||
|
|
|
@ -25,7 +25,8 @@
|
|||
/* 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_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 : */
|
||||
if( m_Netname.IsEmpty() && DisplayOpt.DisplayPadNoConn )
|
||||
{
|
||||
dx0 = min( dx0, dy0 );
|
||||
dx0 = MIN( dx0, dy0 );
|
||||
int nc_color = BLUE;
|
||||
if( m_Masque_Layer & CMP_LAYER ) /* Trace forme \ */
|
||||
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 )
|
||||
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 */
|
||||
{
|
||||
wxString buffer;
|
||||
|
|
|
@ -20,7 +20,7 @@ class Pcb3D_GLCanvas;
|
|||
#define PAD_STACK 0x80 // bit 7 de .attrib (flag)
|
||||
|
||||
/* Definition type Structure d'un pad */
|
||||
class D_PAD : public EDA_BaseStruct
|
||||
class D_PAD : public BOARD_ITEM
|
||||
{
|
||||
public:
|
||||
union
|
||||
|
|
|
@ -15,15 +15,15 @@
|
|||
/* class TEXTE_PCB */
|
||||
/*******************/
|
||||
|
||||
TEXTE_PCB::TEXTE_PCB( EDA_BaseStruct* parent ) :
|
||||
EDA_BaseStruct( parent, TYPETEXTE ),
|
||||
TEXTE_PCB::TEXTE_PCB( BOARD_ITEM* parent ) :
|
||||
BOARD_ITEM( parent, TYPETEXTE ),
|
||||
EDA_TextStruct()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/* 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" */
|
||||
{
|
||||
( (BOARD*) Pback )->m_Drawings = Pnext;
|
||||
( (BOARD*) Pback )->m_Drawings = (BOARD_ITEM*) Pnext;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,12 +6,12 @@
|
|||
|
||||
#include "base_struct.h"
|
||||
|
||||
class TEXTE_PCB : public EDA_BaseStruct, public EDA_TextStruct
|
||||
class TEXTE_PCB : public BOARD_ITEM, public EDA_TextStruct
|
||||
{
|
||||
public:
|
||||
TEXTE_PCB(EDA_BaseStruct * parent);
|
||||
TEXTE_PCB( BOARD_ITEM* parent );
|
||||
TEXTE_PCB( TEXTE_PCB* textepcb );
|
||||
~TEXTE_PCB(void);
|
||||
~TEXTE_PCB();
|
||||
|
||||
/* supprime du chainage la structure Struct */
|
||||
void UnLink( void );
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
|
||||
/* Constructeur de TEXTE_MODULE */
|
||||
TEXTE_MODULE::TEXTE_MODULE( MODULE* parent, int text_type ) :
|
||||
EDA_BaseStruct( parent, TYPETEXTEMODULE )
|
||||
BOARD_ITEM( parent, TYPETEXTEMODULE )
|
||||
{
|
||||
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_Miroir = 1; // Mode normal (pas de miroir)
|
||||
m_Unused = 0;
|
||||
m_Layer = SILKSCREEN_N_CMP;
|
||||
|
||||
SetLayer( SILKSCREEN_N_CMP );
|
||||
if( Module && (Module->m_StructType == TYPEMODULE) )
|
||||
{
|
||||
m_Pos = Module->m_Pos;
|
||||
m_Layer = Module->m_Layer;
|
||||
if( Module->m_Layer == CUIVRE_N )
|
||||
m_Layer = SILKSCREEN_N_CU;
|
||||
if( Module->m_Layer == CMP_N )
|
||||
m_Layer = SILKSCREEN_N_CMP;
|
||||
if( (Module->m_Layer == SILKSCREEN_N_CU)
|
||||
|| (Module->m_Layer == ADHESIVE_N_CU) || (Module->m_Layer == CUIVRE_N) )
|
||||
|
||||
int moduleLayer = Module->GetLayer();
|
||||
|
||||
if( moduleLayer == CUIVRE_N )
|
||||
SetLayer( SILKSCREEN_N_CU );
|
||||
else if( moduleLayer == CMP_N )
|
||||
SetLayer( SILKSCREEN_N_CMP );
|
||||
else
|
||||
SetLayer( moduleLayer );
|
||||
|
||||
if( moduleLayer == SILKSCREEN_N_CU
|
||||
|| moduleLayer == ADHESIVE_N_CU
|
||||
|| moduleLayer == CUIVRE_N )
|
||||
{
|
||||
m_Miroir = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
TEXTE_MODULE::~TEXTE_MODULE( void )
|
||||
|
@ -68,7 +77,7 @@ void TEXTE_MODULE::Copy( TEXTE_MODULE* source ) // copy structure
|
|||
return;
|
||||
|
||||
m_Pos = source->m_Pos;
|
||||
m_Layer = source->m_Layer;
|
||||
SetLayer( source->GetLayer() );
|
||||
|
||||
m_Miroir = source->m_Miroir; // vue normale / miroir
|
||||
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" */
|
||||
{
|
||||
( (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 );
|
||||
}
|
||||
|
||||
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;
|
||||
if( Module && Module->m_Layer == CMP_N )
|
||||
|
||||
else if( Module && Module->GetLayer() == CMP_N )
|
||||
color = g_ModuleTextCMPColor;
|
||||
|
||||
if( (color & ITEM_NOT_SHOW) != 0 )
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
#define TEXT_is_DIVERS 2
|
||||
|
||||
|
||||
class TEXTE_MODULE : public EDA_BaseStruct
|
||||
class TEXTE_MODULE : public BOARD_ITEM
|
||||
{
|
||||
public:
|
||||
int m_Width;
|
||||
|
|
|
@ -22,8 +22,8 @@
|
|||
|
||||
/* Constructeur des classes type pistes, vias et zones */
|
||||
|
||||
TRACK::TRACK( EDA_BaseStruct* StructFather, DrawStructureType idtype ) :
|
||||
EDA_BaseLineStruct( StructFather, idtype )
|
||||
TRACK::TRACK( BOARD_ITEM* StructFather, DrawStructureType idtype ) :
|
||||
BOARD_ITEM( StructFather, idtype )
|
||||
{
|
||||
m_Shape = S_SEGMENT;
|
||||
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 )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
SEGVIA::SEGVIA( EDA_BaseStruct* StructFather ) :
|
||||
SEGVIA::SEGVIA( BOARD_ITEM* StructFather ) :
|
||||
TRACK( StructFather, TYPEVIA )
|
||||
{
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ SEGVIA::SEGVIA( EDA_BaseStruct* StructFather ) :
|
|||
|
||||
/* Copy constructor */
|
||||
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_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
|
||||
* les structures arrieres et avant sont chainees directement
|
||||
*/
|
||||
|
|
|
@ -19,12 +19,19 @@
|
|||
|
||||
/***/
|
||||
|
||||
class TRACK : public EDA_BaseLineStruct
|
||||
class TRACK : public BOARD_ITEM
|
||||
{
|
||||
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_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_Sous_Netcode; /* In rastnest routines : for the current net,
|
||||
* block number (number common to the current connected items found) */
|
||||
|
@ -33,15 +40,12 @@ public:
|
|||
int m_Param; // Auxiliary variable ( used in some computations )
|
||||
|
||||
public:
|
||||
TRACK( EDA_BaseStruct* StructFather, DrawStructureType idtype = TYPETRACK );
|
||||
TRACK( BOARD_ITEM* StructFather, DrawStructureType idtype = TYPETRACK );
|
||||
TRACK( const TRACK& track );
|
||||
|
||||
TRACK* Next( void ); // Retourne le chainage avant
|
||||
TRACK* Next() { return (TRACK*) Pnext; }
|
||||
|
||||
TRACK* Back( void ) // Retourne le chainage avant
|
||||
{
|
||||
return (TRACK*) Pback;
|
||||
}
|
||||
TRACK* Back() { return (TRACK*) Pback; }
|
||||
|
||||
|
||||
/* supprime du chainage la structure Struct */
|
||||
|
@ -122,7 +126,7 @@ public:
|
|||
class SEGZONE : public TRACK
|
||||
{
|
||||
public:
|
||||
SEGZONE( EDA_BaseStruct* StructFather );
|
||||
SEGZONE( BOARD_ITEM* StructFather );
|
||||
|
||||
#if defined(DEBUG)
|
||||
/**
|
||||
|
@ -141,7 +145,7 @@ public:
|
|||
class SEGVIA : public TRACK
|
||||
{
|
||||
public:
|
||||
SEGVIA( EDA_BaseStruct* StructFather );
|
||||
SEGVIA( BOARD_ITEM* StructFather );
|
||||
bool IsViaOnLayer( int layer );
|
||||
void SetLayerPair( int top_layer, int bottom_layer );
|
||||
void ReturnLayerPair( int* top_layer, int* bottom_layer );
|
||||
|
|
|
@ -35,7 +35,7 @@ void EDA_BaseStruct::Place( WinEDA_DrawFrame* frame, wxDC* DC )
|
|||
/**********************/
|
||||
|
||||
/* Classe EDGE_ZONE: constructeur */
|
||||
EDGE_ZONE::EDGE_ZONE( EDA_BaseStruct* parent ) :
|
||||
EDGE_ZONE::EDGE_ZONE( BOARD_ITEM* parent ) :
|
||||
DRAWSEGMENT( parent, TYPEEDGEZONE )
|
||||
{
|
||||
}
|
||||
|
@ -52,8 +52,8 @@ EDGE_ZONE:: ~EDGE_ZONE( void )
|
|||
/**********************/
|
||||
|
||||
/* Classe DRAWSEGMENT: constructeur */
|
||||
DRAWSEGMENT::DRAWSEGMENT( EDA_BaseStruct* StructFather, DrawStructureType idtype ) :
|
||||
EDA_BaseLineStruct( StructFather, idtype )
|
||||
DRAWSEGMENT::DRAWSEGMENT( BOARD_ITEM* StructFather, DrawStructureType idtype ) :
|
||||
BOARD_ITEM( StructFather, idtype )
|
||||
{
|
||||
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" */
|
||||
{
|
||||
( (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 */
|
||||
/*******************/
|
||||
|
||||
MARQUEUR::MARQUEUR( EDA_BaseStruct* StructFather ) :
|
||||
EDA_BaseStruct( StructFather, TYPEMARQUEUR )
|
||||
MARQUEUR::MARQUEUR( BOARD_ITEM* StructFather ) :
|
||||
BOARD_ITEM( StructFather, TYPEMARQUEUR )
|
||||
{
|
||||
m_Bitmap = NULL;
|
||||
m_Type = 0;
|
||||
|
@ -291,7 +291,7 @@ void MARQUEUR::UnLink( void )
|
|||
}
|
||||
else /* Le chainage arriere pointe sur la structure "Pere" */
|
||||
{
|
||||
( (BOARD*) Pback )->m_Drawings = Pnext;
|
||||
( (BOARD*) Pback )->m_Drawings = (BOARD_ITEM*) Pnext;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -379,7 +379,7 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC )
|
|||
|
||||
if( PtSegm->m_StructType != pt_aux->m_StructType )
|
||||
continue;
|
||||
if( PtSegm->m_Layer != pt_aux->m_Layer )
|
||||
if( PtSegm->GetLayer() != pt_aux->GetLayer() )
|
||||
continue;
|
||||
if( PtSegm->m_NetCode != pt_aux->m_NetCode )
|
||||
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 */
|
||||
if( Fast_Locate_Pad_Connecte( Pcb, pt_ref->m_Start,
|
||||
g_TabOneLayerMask[pt_ref->m_Layer] ) )
|
||||
g_TabOneLayerMask[pt_ref->GetLayer()] ) )
|
||||
return NULL;
|
||||
|
||||
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 */
|
||||
{
|
||||
/* 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;
|
||||
|
||||
if( pt_ref->m_End == pt_segm->m_Start )
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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,
|
||||
int old_val, int new_val )
|
||||
/*****************************************************************/
|
||||
|
||||
/*
|
||||
Change les num locaux d'equipot old valeur en new valeur
|
||||
retourne le nombre de changements
|
||||
si pt_end_conn = NULL: recherche jusqu'a fin de chaine
|
||||
* Change les num locaux d'equipot old valeur en new valeur
|
||||
* retourne le nombre de changements
|
||||
* si pt_end_conn = NULL: recherche jusqu'a fin de chaine
|
||||
*/
|
||||
{
|
||||
TRACK* pt_conn;
|
||||
int nb_change = 0;
|
||||
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;
|
||||
for( ; pt_conn != NULL; pt_conn = (TRACK*) pt_conn->Pnext )
|
||||
{
|
||||
if( pt_conn->m_Sous_Netcode != old_val )
|
||||
{
|
||||
if(pt_conn == pt_end_conn) break;
|
||||
if( pt_conn == pt_end_conn )
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -70,28 +74,32 @@ D_PAD * pt_pad;
|
|||
if( pt_pad->m_physical_connexion == old_val )
|
||||
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 )
|
||||
/******************************************************************/
|
||||
|
||||
/* balaye la liste des SEGMENTS de PISTE
|
||||
- debut = pt_start_conn
|
||||
- fin = pt_end_conn (pointe le dernier segment a analyser)
|
||||
pour attribuer ou propager un numero d'equipotentielle par
|
||||
blocs de connexions existantes
|
||||
la zone balayee est supposee appartenir au meme net, c'est a dire que
|
||||
les segments de pistes sont tries par net_code
|
||||
* - debut = pt_start_conn
|
||||
* - fin = pt_end_conn (pointe le dernier segment a analyser)
|
||||
* pour attribuer ou propager un numero d'equipotentielle par
|
||||
* blocs de connexions existantes
|
||||
* la zone balayee est supposee appartenir au meme net, c'est a dire que
|
||||
* les segments de pistes sont tries par net_code
|
||||
*/
|
||||
{
|
||||
TRACK* pt_conn;
|
||||
int sous_net_code;
|
||||
D_PAD* pt_pad;
|
||||
TRACK* pt_autre_piste;
|
||||
EDA_BaseStruct * PtStruct;
|
||||
BOARD_ITEM* PtStruct;
|
||||
|
||||
/* Initialisations prealables */
|
||||
pt_conn = pt_start_conn;
|
||||
|
@ -106,9 +114,12 @@ EDA_BaseStruct * PtStruct;
|
|||
if( PtStruct && (PtStruct->m_StructType == TYPEPAD) )
|
||||
( (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 */
|
||||
pt_conn = pt_start_conn;
|
||||
|
@ -127,7 +138,8 @@ EDA_BaseStruct * PtStruct;
|
|||
change_equipot( pt_start_conn, pt_end_conn,
|
||||
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 */
|
||||
{
|
||||
|
@ -137,7 +149,8 @@ EDA_BaseStruct * PtStruct;
|
|||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -155,7 +168,8 @@ EDA_BaseStruct * PtStruct;
|
|||
change_equipot( pt_start_conn, pt_end_conn,
|
||||
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
|
||||
{
|
||||
|
@ -175,7 +189,8 @@ EDA_BaseStruct * PtStruct;
|
|||
/* traitement des connexions entre segments */
|
||||
PtStruct = pt_conn->start;
|
||||
if( PtStruct && (PtStruct->m_StructType != TYPEPAD) )
|
||||
{ /* debut sur une autre piste */
|
||||
{
|
||||
/* debut sur une autre piste */
|
||||
pt_autre_piste = (TRACK*) PtStruct;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
else /* La connexion ne fait partie d'aucun block */
|
||||
{
|
||||
if( pt_autre_piste->m_Sous_Netcode )
|
||||
|
@ -207,8 +221,10 @@ EDA_BaseStruct * PtStruct;
|
|||
|
||||
PtStruct = pt_conn->end;
|
||||
if( PtStruct && (PtStruct->m_StructType != TYPEPAD) )
|
||||
{ /* fin connectee a une autre piste */
|
||||
{
|
||||
/* fin connectee a une autre piste */
|
||||
pt_autre_piste = (TRACK*) PtStruct;
|
||||
|
||||
if( pt_conn->m_Sous_Netcode ) /* La connexion fait deja partie d'un block */
|
||||
{
|
||||
if( pt_autre_piste->m_Sous_Netcode )
|
||||
|
@ -216,7 +232,8 @@ EDA_BaseStruct * PtStruct;
|
|||
change_equipot( pt_start_conn, pt_end_conn,
|
||||
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 */
|
||||
{
|
||||
|
@ -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 )
|
||||
/***************************************************/
|
||||
|
||||
/*
|
||||
Routine recherchant les connexions deja faites et mettant a jour
|
||||
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
|
||||
* Routine recherchant les connexions deja faites et mettant a jour
|
||||
* 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
|
||||
*/
|
||||
{
|
||||
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
|
||||
connexion est du type segment a segment
|
||||
* connexion est du type segment a segment
|
||||
*/
|
||||
|
||||
pt_start_conn = m_Pcb->m_Track;
|
||||
|
@ -279,25 +299,30 @@ int current_net_code;
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************/
|
||||
void WinEDA_BasePcbFrame::Recalcule_all_net_connexion( wxDC* DC )
|
||||
/**************************************************************/
|
||||
|
||||
/*
|
||||
Routine Recalculant les pointeurs sur connexions types piste a piste
|
||||
relatives a tous les nets.
|
||||
Cette routine est utilisee apres reclassement des segments de piste par
|
||||
ordre de net_code, puisque des pointeurs sur connexions deviennent faux
|
||||
( les pointeurs type pad restent bons )
|
||||
* Routine Recalculant les pointeurs sur connexions types piste a piste
|
||||
* relatives a tous les nets.
|
||||
* Cette routine est utilisee apres reclassement des segments de piste par
|
||||
* ordre de net_code, puisque des pointeurs sur connexions deviennent faux
|
||||
* ( les pointeurs type pad restent bons )
|
||||
*/
|
||||
{
|
||||
TRACK* EndConn;
|
||||
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 */
|
||||
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;
|
||||
|
||||
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 )
|
||||
/*************************************************************************/
|
||||
|
||||
/*
|
||||
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;
|
||||
|
@ -318,7 +345,8 @@ int ii, nb_net_noconnect = 0;
|
|||
LISTE_PAD* pt_pad;
|
||||
wxString msg;
|
||||
|
||||
if(net_code == 0) return;
|
||||
if( net_code == 0 )
|
||||
return;
|
||||
|
||||
if( (m_Pcb->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 )
|
||||
Compile_Ratsnest( DC, TRUE );
|
||||
|
@ -327,8 +355,10 @@ wxString msg;
|
|||
for( ii = 0; ii < m_Pcb->m_NbPads; ii++, pt_pad++ )
|
||||
{
|
||||
int pad_net_code = (*pt_pad)->m_NetCode;
|
||||
if(pad_net_code < net_code) continue;
|
||||
if(pad_net_code > net_code) break;
|
||||
if( pad_net_code < net_code )
|
||||
continue;
|
||||
if( pad_net_code > net_code )
|
||||
break;
|
||||
(*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 )
|
||||
/***************************************************************************/
|
||||
|
||||
/* calcule la connexite d'un net constitue de segments de piste consecutifs.
|
||||
Entree:
|
||||
pt_start_conn = adresse du 1er segment ( debut du net )
|
||||
pt_end_conn = adr de fin (dernier segment)
|
||||
Les connexions relatives aux pads doivent etre deja calculees, car elles
|
||||
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
|
||||
* Entree:
|
||||
* pt_start_conn = adresse du 1er segment ( debut du net )
|
||||
* pt_end_conn = adr de fin (dernier segment)
|
||||
* Les connexions relatives aux pads doivent etre deja calculees, car elles
|
||||
* 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
|
||||
*/
|
||||
{
|
||||
TRACK* Track;
|
||||
|
||||
/* Les pointeurs .start et .end sont mis a jour, si la
|
||||
connexion est du type segment a segment.
|
||||
la connexion sur pads est supposee etre deja calculee */
|
||||
* connexion est du type segment a segment.
|
||||
* la connexion sur pads est supposee etre deja calculee */
|
||||
|
||||
/* Raz des pointeurs sur pistes */
|
||||
for( Track = pt_start_conn; Track != NULL; Track = (TRACK*) Track->Pnext )
|
||||
{
|
||||
Track->m_Sous_Netcode = 0;
|
||||
|
||||
if( Track->GetState(BEGIN_ONPAD) == 0 ) Track->start = NULL;
|
||||
if( Track->GetState(END_ONPAD) == 0 ) Track->end = NULL;
|
||||
if( Track->GetState( BEGIN_ONPAD ) == 0 )
|
||||
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 */
|
||||
|
@ -400,17 +433,18 @@ TRACK * Track;
|
|||
for( pt_segm = pt_start_conn; pt_segm != NULL; pt_segm = (TRACK*) pt_segm->Pnext )
|
||||
{
|
||||
int curlayermask = pt_segm->ReturnMaskLayer();
|
||||
if( !pt_segm->start && (pt_segm->m_Start == Track->m_Start) &&
|
||||
( layermask & curlayermask ) )
|
||||
if( !pt_segm->start && (pt_segm->m_Start == Track->m_Start)
|
||||
&& ( layermask & curlayermask ) )
|
||||
{
|
||||
pt_segm->start = Track;
|
||||
}
|
||||
if( !pt_segm->end && (pt_segm->m_End == Track->m_Start) &&
|
||||
(layermask & curlayermask) )
|
||||
if( !pt_segm->end && (pt_segm->m_End == Track->m_Start)
|
||||
&& (layermask & curlayermask) )
|
||||
{
|
||||
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 );
|
||||
}
|
||||
if (Track == pt_end_conn) break;
|
||||
if( Track == pt_end_conn )
|
||||
break;
|
||||
}
|
||||
|
||||
/* Generation des sous equipots du net */
|
||||
propage_equipot( pt_start_conn, pt_end_conn );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/********************************************/
|
||||
/* 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
|
||||
les autres segments sont mis a reference NULLE
|
||||
2 - reattribution des segments restantes a ref NULLE
|
||||
/*
|
||||
* 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
|
||||
* les autres segments sont mis a reference NULLE
|
||||
* 2 - reattribution des segments restantes a ref NULLE
|
||||
*/
|
||||
|
||||
#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,
|
||||
|
@ -471,22 +506,26 @@ D_PAD * pad ;
|
|||
LISTE_PAD* ptr_pad, * lim;
|
||||
int nb_pad = pcb->m_NbPads;
|
||||
int ii;
|
||||
|
||||
lim = pt_liste + (pcb->m_NbPads - 1 );
|
||||
ptr_pad = pt_liste;
|
||||
while( nb_pad )
|
||||
{
|
||||
pad = *ptr_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 */
|
||||
{
|
||||
ptr_pad += nb_pad; if(ptr_pad > lim) ptr_pad = lim;
|
||||
ptr_pad += nb_pad; if( ptr_pad > lim )
|
||||
ptr_pad = lim;
|
||||
continue;
|
||||
}
|
||||
if( pad->m_Pos.x > px ) /* on doit chercher moins loin */
|
||||
{
|
||||
ptr_pad -= nb_pad;
|
||||
if(ptr_pad < pt_liste) ptr_pad = pt_liste;
|
||||
if( ptr_pad < pt_liste )
|
||||
ptr_pad = pt_liste;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -496,50 +535,64 @@ int ii;
|
|||
while( ptr_pad >= pt_liste )
|
||||
{
|
||||
pad = *ptr_pad;
|
||||
if(pad->m_Pos.x == px) ptr_pad--;
|
||||
else break;
|
||||
if( pad->m_Pos.x == px )
|
||||
ptr_pad--;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
ptr_pad++; /* pointe depart de zone a pad->m_Pos.x = px */
|
||||
|
||||
for( ; ; ptr_pad++ )
|
||||
{
|
||||
if(ptr_pad > lim) return(NULL); /* hors zone */
|
||||
if( ptr_pad > lim )
|
||||
return NULL; /* hors zone */
|
||||
pad = *ptr_pad;
|
||||
if( pad->m_Pos.x != px ) return(NULL); /* hors zone */
|
||||
if( pad->m_Pos.y != py ) continue ;
|
||||
if( pad->m_Pos.x != px )
|
||||
return NULL; /* hors zone */
|
||||
if( pad->m_Pos.y != py )
|
||||
continue;
|
||||
/* 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 )
|
||||
|
||||
/* used to Sort a pad list by x coordinate value
|
||||
*/
|
||||
{
|
||||
D_PAD* ref = *(LISTE_PAD*) pt_ref;
|
||||
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 )
|
||||
/****************************************************/
|
||||
|
||||
/* Create a sorted list of pointers to pads.
|
||||
This list is sorted by X ccordinate value.
|
||||
The list must be freed bu user
|
||||
* This list is sorted by X ccordinate value.
|
||||
* The list must be freed bu user
|
||||
*/
|
||||
{
|
||||
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 *) );
|
||||
qsort( pad_list, pcb->m_NbPads, sizeof( D_PAD *),
|
||||
( int( * ) ( const void*, const void* ) )SortPadsByXCoord );
|
||||
return pad_list;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************/
|
||||
void WinEDA_BasePcbFrame::reattribution_reference_piste( int affiche )
|
||||
/******************************************************************/
|
||||
|
@ -549,18 +602,20 @@ TRACK * pt_piste,
|
|||
int a_color;
|
||||
char new_passe_request = 1, flag;
|
||||
LISTE_PAD* pt_mem;
|
||||
EDA_BaseStruct * PtStruct;
|
||||
BOARD_ITEM* PtStruct;
|
||||
int masque_layer;
|
||||
wxString msg;
|
||||
|
||||
if( m_Pcb->m_NbPads == 0 ) return;
|
||||
if( m_Pcb->m_NbPads == 0 )
|
||||
return;
|
||||
a_color = CYAN;
|
||||
if( affiche )
|
||||
Affiche_1_Parametre( this, POS_AFF_CHREF, wxT( "DataBase" ), wxT( "Netcodes" ), a_color );
|
||||
|
||||
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 //
|
||||
|
@ -582,27 +637,33 @@ wxString msg;
|
|||
for( ; pt_piste != NULL; pt_piste = (TRACK*) pt_piste->Pnext )
|
||||
{
|
||||
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 */
|
||||
pt_piste->start = SuperFast_Locate_Pad_Connecte(m_Pcb, pt_mem,
|
||||
pt_piste->m_Start.x, pt_piste->m_Start.y, masque_layer);
|
||||
pt_piste->start = SuperFast_Locate_Pad_Connecte( m_Pcb,
|
||||
pt_mem,
|
||||
pt_piste->m_Start.x,
|
||||
pt_piste->m_Start.y,
|
||||
masque_layer );
|
||||
if( pt_piste->start != NULL )
|
||||
{
|
||||
pt_piste->SetState( BEGIN_ONPAD, ON );
|
||||
pt_piste->m_NetCode = ( (D_PAD*) (pt_piste->start) )->m_NetCode;
|
||||
}
|
||||
|
||||
pt_piste->end = SuperFast_Locate_Pad_Connecte(m_Pcb, pt_mem,
|
||||
pt_piste->m_End.x, pt_piste->m_End.y, masque_layer);
|
||||
pt_piste->end = SuperFast_Locate_Pad_Connecte( m_Pcb,
|
||||
pt_mem,
|
||||
pt_piste->m_End.x,
|
||||
pt_piste->m_End.y,
|
||||
masque_layer );
|
||||
|
||||
if( pt_piste->end != NULL )
|
||||
{
|
||||
pt_piste->SetState( END_ONPAD, ON );
|
||||
pt_piste->m_NetCode = ( (D_PAD*) (pt_piste->end) )->m_NetCode;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
MyFree( pt_mem );
|
||||
|
||||
////////////////////////////////////////////////////
|
||||
|
@ -610,7 +671,7 @@ wxString msg;
|
|||
////////////////////////////////////////////////////
|
||||
|
||||
/* 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 )
|
||||
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 */
|
||||
for( TRACK* via = m_Pcb->m_Track; via != NULL; via = via->Next() )
|
||||
{
|
||||
if ( via->m_StructType != TYPEVIA ) continue;
|
||||
if ( via->m_NetCode > 0 ) continue; // Netcode already known
|
||||
if( via->m_StructType != TYPEVIA )
|
||||
continue;
|
||||
if( via->m_NetCode > 0 )
|
||||
continue; // Netcode already known
|
||||
// Lock for a connection to a track with a known netcode
|
||||
pt_next = m_Pcb->m_Track;
|
||||
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 );
|
||||
}
|
||||
|
@ -671,7 +735,7 @@ wxString msg;
|
|||
for( pt_piste = m_Pcb->m_Track; pt_piste != NULL; pt_piste = pt_piste->Next() )
|
||||
{
|
||||
/* Traitement du point de debut */
|
||||
PtStruct = (EDA_BaseStruct*)pt_piste->start;
|
||||
PtStruct = (BOARD_ITEM*) pt_piste->start;
|
||||
if( PtStruct && (PtStruct->m_StructType != TYPEPAD) )
|
||||
{ // Begin on an other track segment
|
||||
pt_next = (TRACK*) PtStruct;
|
||||
|
@ -683,7 +747,6 @@ wxString msg;
|
|||
pt_next->m_NetCode = pt_piste->m_NetCode;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
if( pt_next->m_NetCode != 0 )
|
||||
|
@ -720,30 +783,34 @@ wxString msg;
|
|||
}
|
||||
|
||||
/* 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 );
|
||||
|
||||
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
|
||||
le tri est fait par numero de net
|
||||
* routine de tri de connexion utilisee par la fonction QSORT
|
||||
* le tri est fait par numero de net
|
||||
*/
|
||||
int tri_par_netcode( TRACK** pt_ref, TRACK** pt_compare )
|
||||
{
|
||||
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 )
|
||||
/*****************************************/
|
||||
|
||||
/* Recalcule le chainage des pistes pour que le chainage soit fait par
|
||||
netcodes croissants
|
||||
* netcodes croissants
|
||||
*/
|
||||
{
|
||||
TRACK* Track, ** Liste;
|
||||
|
@ -751,7 +818,8 @@ int ii, nbsegm;
|
|||
|
||||
/* Count segments */
|
||||
nbsegm = pcb->GetNumSegmTrack();
|
||||
if( pcb->m_Track == NULL ) return;
|
||||
if( pcb->m_Track == NULL )
|
||||
return;
|
||||
|
||||
Liste = (TRACK**) MyZMalloc( (nbsegm + 1) * sizeof(TRACK *) );
|
||||
|
||||
|
@ -778,4 +846,3 @@ int ii, nbsegm;
|
|||
|
||||
MyFree( Liste );
|
||||
}
|
||||
|
||||
|
|
|
@ -147,7 +147,7 @@ WinEDA_CotationPropertiesFrame::WinEDA_CotationPropertiesFrame( WinEDA_PcbFrame*
|
|||
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()->SetSizeHints( this );
|
||||
|
@ -180,8 +180,9 @@ void WinEDA_CotationPropertiesFrame::CotationPropertiesAccept( wxCommandEvent& e
|
|||
CurrentCotation->m_Text->m_Width = CurrentCotation->m_Width =
|
||||
m_TxtWidthCtrl->GetValue();
|
||||
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();
|
||||
|
||||
|
@ -236,7 +237,7 @@ COTATION* WinEDA_PcbFrame::Begin_Cotation( COTATION* Cotation, wxDC* DC )
|
|||
Cotation = new COTATION( m_Pcb );
|
||||
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_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->m_Layer = screen->m_Active_Layer;
|
||||
Cotation->SetLayer( screen->m_Active_Layer );
|
||||
if( status_cotation == 1 )
|
||||
{
|
||||
Cotation->TraitD_ox = pos.x;
|
||||
|
@ -399,7 +400,7 @@ static void Ajuste_Details_Cotation( COTATION* Cotation )
|
|||
wxString msg;
|
||||
|
||||
/* 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 */
|
||||
ii = Cotation->m_Text->m_Size.y +
|
||||
|
|
|
@ -68,7 +68,7 @@ TRACK* WinEDA_PcbFrame::Delete_Segment( wxDC* DC, TRACK* Track )
|
|||
delete Track;
|
||||
g_TrackSegmentCount--;
|
||||
if( g_CurrentTrackSegment && (g_CurrentTrackSegment->m_StructType != TYPEVIA) )
|
||||
previous_layer = g_CurrentTrackSegment->m_Layer;
|
||||
previous_layer = g_CurrentTrackSegment->GetLayer();
|
||||
}
|
||||
|
||||
if( g_CurrentTrackSegment )
|
||||
|
|
|
@ -236,7 +236,7 @@ void WinEDA_ModulePropertiesFrame::BuildPanelModuleProperties( bool FullOptions
|
|||
wxString layer_list[2] = { _( "Component" ), _( "Copper" ) };
|
||||
m_LayerCtrl = new wxRadioBox( m_PanelProperties, -1, _( "Layer" ), wxDefaultPosition,
|
||||
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 );
|
||||
|
||||
bool select = FALSE;
|
||||
|
@ -518,10 +518,10 @@ void WinEDA_ModulePropertiesFrame::ModulePropertiesAccept( wxCommandEvent& event
|
|||
{
|
||||
if( m_LayerCtrl->GetSelection() == 0 ) // layer req = COMPONENT
|
||||
{
|
||||
if( m_CurrentModule->m_Layer == CUIVRE_N )
|
||||
if( m_CurrentModule->GetLayer() == CUIVRE_N )
|
||||
change_layer = TRUE;
|
||||
}
|
||||
else if( m_CurrentModule->m_Layer == CMP_N )
|
||||
else if( m_CurrentModule->GetLayer() == CMP_N )
|
||||
change_layer = TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -200,11 +200,11 @@ void WinEDA_ModuleEditFrame::Edit_Edge_Layer( EDGE_MODULE* Edge, wxDC* DC )
|
|||
{
|
||||
if( Edge->m_StructType != TYPEEDGEMODULE )
|
||||
continue;
|
||||
Edge->m_Layer = new_layer;
|
||||
Edge->SetLayer( new_layer );
|
||||
}
|
||||
}
|
||||
else
|
||||
Edge->m_Layer = new_layer;
|
||||
Edge->SetLayer( new_layer );
|
||||
|
||||
GetScreen()->SetModify();
|
||||
Module->Set_Rectangle_Encadrement();
|
||||
|
@ -336,11 +336,11 @@ EDGE_MODULE* WinEDA_ModuleEditFrame::Begin_Edge_Module( EDGE_MODULE* Edge,
|
|||
if( Edge->m_Shape == S_ARC )
|
||||
Edge->m_Angle = ArcValue;
|
||||
Edge->m_Width = ModuleSegmentWidth;
|
||||
Edge->m_Layer = Module->m_Layer;
|
||||
if( Module->m_Layer == CMP_N )
|
||||
Edge->m_Layer = SILKSCREEN_N_CMP;
|
||||
if( Module->m_Layer == CUIVRE_N )
|
||||
Edge->m_Layer = SILKSCREEN_N_CU;
|
||||
Edge->SetLayer( Module->GetLayer() );
|
||||
if( Module->GetLayer() == CMP_N )
|
||||
Edge->SetLayer( SILKSCREEN_N_CMP );
|
||||
if( Module->GetLayer() == CUIVRE_N )
|
||||
Edge->SetLayer( SILKSCREEN_N_CU );
|
||||
/* Mise a jour du point de depart du segment ou de l'arc */
|
||||
Edge->m_Start = GetScreen()->m_Curseur;
|
||||
/* Mise a jour de la fin du segment , rectangle ou de l'arc*/
|
||||
|
|
|
@ -138,7 +138,7 @@ void WinEDA_PcbFrame::Drawing_SetNewWidth( DRAWSEGMENT* DrawSegm, wxDC* DC )
|
|||
|
||||
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;
|
||||
else
|
||||
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;
|
||||
EDA_BaseStruct* PtStruct, * PtNext;
|
||||
COTATION* Cotation;
|
||||
int layer = Segment->m_Layer;
|
||||
int layer = Segment->GetLayer();
|
||||
|
||||
if( layer <= CMP_N )
|
||||
{
|
||||
|
@ -187,7 +187,7 @@ void WinEDA_PcbFrame::Delete_Drawings_All_Layer( DRAWSEGMENT* Segment, wxDC* DC
|
|||
{
|
||||
case TYPEDRAWSEGMENT:
|
||||
pt_segm = (DRAWSEGMENT*) PtStruct;
|
||||
if( pt_segm->m_Layer == layer )
|
||||
if( pt_segm->GetLayer() == layer )
|
||||
{
|
||||
Trace_DrawSegmentPcb( DrawPanel, DC, pt_segm, GR_XOR );
|
||||
DeleteStructure( PtStruct );
|
||||
|
@ -196,7 +196,7 @@ void WinEDA_PcbFrame::Delete_Drawings_All_Layer( DRAWSEGMENT* Segment, wxDC* DC
|
|||
|
||||
case TYPETEXTE:
|
||||
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 );
|
||||
DeleteStructure( PtStruct );
|
||||
|
@ -206,7 +206,7 @@ void WinEDA_PcbFrame::Delete_Drawings_All_Layer( DRAWSEGMENT* Segment, wxDC* DC
|
|||
|
||||
case TYPECOTATION:
|
||||
Cotation = (COTATION*) PtStruct;
|
||||
if( Cotation->m_Layer == layer )
|
||||
if( Cotation->GetLayer() == layer )
|
||||
{
|
||||
Cotation->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_XOR );
|
||||
DeleteStructure( PtStruct );
|
||||
|
@ -276,7 +276,7 @@ DRAWSEGMENT* WinEDA_PcbFrame::Begin_DrawSegment( DRAWSEGMENT* Segment,
|
|||
{
|
||||
GetScreen()->SetCurItem( Segment = new DRAWSEGMENT( m_Pcb ) );
|
||||
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_Shape = shape;
|
||||
Segment->m_Angle = 900;
|
||||
|
@ -307,7 +307,7 @@ DRAWSEGMENT* WinEDA_PcbFrame::Begin_DrawSegment( DRAWSEGMENT* Segment,
|
|||
GetScreen()->SetCurItem( Segment = new DRAWSEGMENT( m_Pcb ) );
|
||||
|
||||
Segment->m_Flags = IS_NEW;
|
||||
Segment->m_Layer = DrawItem->m_Layer;
|
||||
Segment->SetLayer( DrawItem->GetLayer() );
|
||||
Segment->m_Width = s_large;
|
||||
Segment->m_Shape = DrawItem->m_Shape;
|
||||
Segment->m_Type = DrawItem->m_Type;
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
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;
|
||||
|
@ -118,17 +118,17 @@ void WinEDA_PcbFrame::ExChange_Track_Layer( TRACK* pt_segm, wxDC* DC )
|
|||
continue;
|
||||
|
||||
/* inversion des couches */
|
||||
if( pt_segm->m_Layer == l1 )
|
||||
pt_segm->m_Layer = l2;
|
||||
else if( pt_segm->m_Layer == l2 )
|
||||
pt_segm->m_Layer = l1;
|
||||
if( pt_segm->GetLayer() == l1 )
|
||||
pt_segm->SetLayer( l2 );
|
||||
else if( pt_segm->GetLayer() == l2 )
|
||||
pt_segm->SetLayer( l1 );
|
||||
|
||||
if( (Drc_On) && ( Drc( this, DC, pt_segm, m_Pcb->m_Track, 1 ) == BAD_DRC ) )
|
||||
{ /* Annulation du changement */
|
||||
ii = 0; pt_segm = pt_track;
|
||||
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 );
|
||||
|
@ -178,7 +178,7 @@ void WinEDA_PcbFrame::Other_Layer_Route( TRACK* track, wxDC* DC )
|
|||
}
|
||||
|
||||
/* 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;
|
||||
pt_segm = g_FirstTrackSegment;
|
||||
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_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 (?)
|
||||
|
||||
|
@ -218,19 +218,19 @@ void WinEDA_PcbFrame::Other_Layer_Route( TRACK* track, wxDC* DC )
|
|||
|
||||
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
|
||||
{ // 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
|
||||
Via->m_Layer = 0x0F;
|
||||
Via->SetLayer( 0x0F );
|
||||
|
||||
if( Drc_On &&( Drc( this, DC, Via, m_Pcb->m_Track, 1 ) == BAD_DRC ) )
|
||||
{ /* Via impossible a placer ici */
|
||||
delete Via;
|
||||
GetScreen()->m_Active_Layer = g_CurrentTrackSegment->m_Layer;
|
||||
GetScreen()->m_Active_Layer = g_CurrentTrackSegment->GetLayer();
|
||||
DrawPanel->ManageCurseur( DrawPanel, DC, FALSE );
|
||||
return;
|
||||
}
|
||||
|
@ -240,7 +240,7 @@ void WinEDA_PcbFrame::Other_Layer_Route( TRACK* track, wxDC* DC )
|
|||
g_CurrentTrackSegment->Pnext = Via;
|
||||
g_TrackSegmentCount++;
|
||||
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_TrackSegmentCount++;
|
||||
g_CurrentTrackSegment->Pback = Via;
|
||||
|
|
|
@ -130,7 +130,7 @@ TRACK* WinEDA_PcbFrame::Begin_Route( TRACK* track, wxDC* DC )
|
|||
Hight_Light( DC );
|
||||
|
||||
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_Start = pos;
|
||||
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_TrackSegmentCount++;
|
||||
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;
|
||||
/* Show the new position */
|
||||
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;
|
||||
|
||||
// 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;
|
||||
if( max( abs( dx1 ), abs( dy1 ) ) < (pas_45 * 2) )
|
||||
if( MAX( abs( dx1 ), abs( dy1 ) ) < (pas_45 * 2) )
|
||||
return 0;
|
||||
|
||||
/* 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 */
|
||||
g_CurrentTrackSegment->m_Layer = screen->m_Active_Layer;
|
||||
g_CurrentTrackSegment->SetLayer( screen->m_Active_Layer );
|
||||
g_CurrentTrackSegment->m_Width = g_DesignSettings.m_CurrentTrackWidth;
|
||||
if( g_TwoSegmentTrackBuild )
|
||||
{
|
||||
TRACK* previous_track = (TRACK*) g_CurrentTrackSegment->Pback;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -584,7 +584,7 @@ void Calcule_Coord_Extremite_45( int ox, int oy, int* fx, int* fy )
|
|||
break;
|
||||
|
||||
case 45:
|
||||
deltax = min( deltax, deltay ); deltay = deltax;
|
||||
deltax = MIN( deltax, deltay ); deltay = deltax;
|
||||
/* recalcul des signes de deltax et deltay */
|
||||
if( (ActiveScreen->m_Curseur.x - ox) < 0 )
|
||||
deltax = -deltax;
|
||||
|
@ -666,7 +666,7 @@ void ComputeBreakPoint( TRACK* track, int SegmentCount )
|
|||
break;
|
||||
|
||||
case 45:
|
||||
iDx = min( iDx, iDy );
|
||||
iDx = MIN( iDx, iDy );
|
||||
iDy = iDx;
|
||||
/* recalcul des signes de deltax et deltay */
|
||||
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* oldtrack;
|
||||
int nn = 0;
|
||||
EDA_BaseStruct* LockPoint;
|
||||
BOARD_ITEM* LockPoint;
|
||||
|
||||
if( track == 0 )
|
||||
return NULL;
|
||||
|
|
|
@ -23,8 +23,8 @@ static void CreateShapesSection(FILE * file, BOARD * pcb);
|
|||
static void CreatePadsShapesSection( FILE* file, BOARD* pcb );
|
||||
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( "INNER4" ), wxT( "INNER5" ), wxT( "INNER6" ), wxT("INNER7" ),
|
||||
wxT( "INNER8" ), wxT( "INNER9" ), wxT( "INNER10" ), wxT("INNER11" ),
|
||||
|
@ -43,6 +43,8 @@ static int mapXto(int x)
|
|||
{
|
||||
return x - offsetX;
|
||||
}
|
||||
|
||||
|
||||
static int mapYto( int y )
|
||||
{
|
||||
return offsetY - y;
|
||||
|
@ -52,8 +54,9 @@ static int mapYto(int y)
|
|||
/***********************************************************/
|
||||
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;
|
||||
|
@ -72,7 +75,8 @@ FILE * file;
|
|||
wxFD_SAVE,
|
||||
FALSE
|
||||
);
|
||||
if ( FullFileName == wxEmptyString ) return;
|
||||
if( FullFileName == wxEmptyString )
|
||||
return;
|
||||
|
||||
if( ( file = wxFopen( FullFileName, wxT( "wt" ) ) ) == NULL )
|
||||
{
|
||||
|
@ -86,32 +90,34 @@ FILE * file;
|
|||
offsetX = m_Auxiliary_Axis_Position.x;
|
||||
offsetY = m_Auxiliary_Axis_Position.y;
|
||||
wxClientDC dc( DrawPanel );
|
||||
|
||||
DrawPanel->PrepareGraphicContext( &dc );
|
||||
Compile_Ratsnest( &dc, TRUE );
|
||||
|
||||
/* Mise des modules vus en miroir en position "normale"
|
||||
(necessaire pour decrire les formes sous GenCAD,
|
||||
qui sont decrites en vue normale, orientation 0)) */
|
||||
* (necessaire pour decrire les formes sous GenCAD,
|
||||
* qui sont decrites en vue normale, orientation 0)) */
|
||||
MODULE* module;
|
||||
for( module = m_Pcb->m_Modules; module != NULL; module = module->Next() )
|
||||
{
|
||||
module->flag = 0;
|
||||
if ( module->m_Layer == CUIVRE_N )
|
||||
if( module->GetLayer() == CUIVRE_N )
|
||||
{
|
||||
Change_Side_Module( module, NULL );
|
||||
module->flag = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Creation de l'entete:
|
||||
CreateHeaderInfoData( file, this );
|
||||
CreateBoardSection( file, m_Pcb );
|
||||
|
||||
/* 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 );
|
||||
|
||||
/* Creation de la liste des formes utilisees
|
||||
(formes des composants principalement */
|
||||
* (formes des composants principalement */
|
||||
CreatePadsShapesSection( file, m_Pcb ); // doit etre appele avant CreateShapesSection()
|
||||
CreateShapesSection( file, m_Pcb );
|
||||
|
||||
|
@ -139,8 +145,9 @@ MODULE * module;
|
|||
/**************************************************************************/
|
||||
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;
|
||||
|
@ -148,23 +155,32 @@ int diff;
|
|||
|
||||
padref = *( (D_PAD**) refptr );
|
||||
padcmp = *( (D_PAD**) objptr );
|
||||
if( (diff = padref->m_PadShape - padcmp->m_PadShape) ) return diff;
|
||||
if( (diff = padref->m_Size.x - padcmp->m_Size.x) ) return diff;
|
||||
if( (diff = padref->m_Size.y - padcmp->m_Size.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;
|
||||
if( (diff = padref->m_PadShape - padcmp->m_PadShape) )
|
||||
return diff;
|
||||
if( (diff = padref->m_Size.x - padcmp->m_Size.x) )
|
||||
return diff;
|
||||
if( (diff = padref->m_Size.y - padcmp->m_Size.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;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************/
|
||||
void CreatePadsShapesSection( FILE* file, BOARD* pcb )
|
||||
/*****************************************************/
|
||||
|
||||
/* 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
|
||||
pour les formes de pad PAD1 a PADn
|
||||
* initialise le membre .m_logical_connexion de la struct pad, la valeur 1 ..n
|
||||
* pour les formes de pad PAD1 a PADn
|
||||
*/
|
||||
{
|
||||
D_PAD* pad, ** padlist, ** pad_list_base;
|
||||
|
@ -187,14 +203,14 @@ int pad_name_number;
|
|||
pad = *padlist;
|
||||
pad->m_logical_connexion = pad_name_number;
|
||||
|
||||
if ( old_pad &&
|
||||
(old_pad->m_PadShape == pad->m_PadShape) &&
|
||||
(old_pad->m_Size.x == pad->m_Size.x) &&
|
||||
(old_pad->m_Size.y == pad->m_Size.y) &&
|
||||
(old_pad->m_Offset.x == pad->m_Offset.x) &&
|
||||
(old_pad->m_Offset.y == pad->m_Offset.y) &&
|
||||
(old_pad->m_DeltaSize.x == pad->m_DeltaSize.x) &&
|
||||
(old_pad->m_DeltaSize.y == pad->m_DeltaSize.y)
|
||||
if( old_pad
|
||||
&& (old_pad->m_PadShape == pad->m_PadShape)
|
||||
&& (old_pad->m_Size.x == pad->m_Size.x)
|
||||
&& (old_pad->m_Size.y == pad->m_Size.y)
|
||||
&& (old_pad->m_Offset.x == pad->m_Offset.x)
|
||||
&& (old_pad->m_Offset.y == pad->m_Offset.y)
|
||||
&& (old_pad->m_DeltaSize.x == pad->m_DeltaSize.x)
|
||||
&& (old_pad->m_DeltaSize.y == pad->m_DeltaSize.y)
|
||||
)
|
||||
continue; // Forme deja generee
|
||||
|
||||
|
@ -286,21 +302,22 @@ int pad_name_number;
|
|||
/**************************************************/
|
||||
void CreateShapesSection( FILE* file, BOARD* pcb )
|
||||
/**************************************************/
|
||||
|
||||
/* Creation de la liste des formes des composants.
|
||||
Comme la forme de base (module de librairie peut etre modifiee,
|
||||
une forme est creee par composant
|
||||
La forme est donnee normalisee, c'est a dire orientation 0, position 0 non miroir
|
||||
Il y aura donc des formes indentiques redondantes
|
||||
|
||||
Syntaxe:
|
||||
$SHAPES
|
||||
SHAPE <shape_name>
|
||||
shape_descr (line, arc ..)
|
||||
PIN <pin_name> <pad_name> <x_y_ref> <layer> <rot> <mirror>
|
||||
|
||||
SHAPE <shape_name>
|
||||
..
|
||||
$ENDSHAPES
|
||||
* Comme la forme de base (module de librairie peut etre modifiee,
|
||||
* une forme est creee par composant
|
||||
* La forme est donnee normalisee, c'est a dire orientation 0, position 0 non miroir
|
||||
* Il y aura donc des formes indentiques redondantes
|
||||
*
|
||||
* Syntaxe:
|
||||
* $SHAPES
|
||||
* SHAPE <shape_name>
|
||||
* shape_descr (line, arc ..)
|
||||
* PIN <pin_name> <pad_name> <x_y_ref> <layer> <rot> <mirror>
|
||||
*
|
||||
* SHAPE <shape_name>
|
||||
* ..
|
||||
* $ENDSHAPES
|
||||
*/
|
||||
{
|
||||
MODULE* module;
|
||||
|
@ -320,17 +337,22 @@ char * mirror = "0";
|
|||
layer = "ALL";
|
||||
if( (pad->m_Masque_Layer & ALL_CU_LAYERS) == CUIVRE_LAYER )
|
||||
{
|
||||
if ( module->m_Layer == CMP_N ) layer = "BOTTOM";
|
||||
else layer = "TOP";
|
||||
if( module->GetLayer() == CMP_N )
|
||||
layer = "BOTTOM";
|
||||
else
|
||||
layer = "TOP";
|
||||
}
|
||||
else if( (pad->m_Masque_Layer & ALL_CU_LAYERS) == CMP_LAYER )
|
||||
{
|
||||
if ( module->m_Layer == CMP_N ) layer = "TOP";
|
||||
else layer = "BOTTOM";
|
||||
if( module->GetLayer() == CMP_N )
|
||||
layer = "TOP";
|
||||
else
|
||||
layer = "BOTTOM";
|
||||
}
|
||||
|
||||
pad->ReturnStringPadName( pinname );
|
||||
if( pinname.IsEmpty() ) pinname = wxT("noname");
|
||||
if( pinname.IsEmpty() )
|
||||
pinname = wxT( "noname" );
|
||||
|
||||
orient = pad->m_Orient - module->m_Orient;
|
||||
NORMALIZE_ANGLE_POS( orient );
|
||||
|
@ -338,7 +360,8 @@ char * mirror = "0";
|
|||
CONV_TO_UTF8( pinname ), pad->m_logical_connexion,
|
||||
pad->m_Pos0.x, -pad->m_Pos0.y,
|
||||
layer, orient / 10, mirror );
|
||||
if ( orient % 10 ) fprintf(file, " .%d", orient % 10 );
|
||||
if( orient % 10 )
|
||||
fprintf( file, " .%d", orient % 10 );
|
||||
fprintf( file, "\n" );
|
||||
}
|
||||
}
|
||||
|
@ -346,14 +369,16 @@ char * mirror = "0";
|
|||
fputs( "$ENDSHAPES\n\n", file );
|
||||
}
|
||||
|
||||
|
||||
/******************************************************/
|
||||
void CreateComponentsSection( FILE* file, BOARD* pcb )
|
||||
/******************************************************/
|
||||
|
||||
/* Creation de la section $COMPONENTS (Placement des composants
|
||||
Composants cote CUIVRE:
|
||||
Les formes sont donnees avec l'option "FLIP", c.a.d.:
|
||||
- ils sont decrits en vue normale (comme s'ils etaient sur cote COMPOSANT)
|
||||
- leur orientation est donnée comme s'ils etaient cote composant.
|
||||
* Composants cote CUIVRE:
|
||||
* Les formes sont donnees avec l'option "FLIP", c.a.d.:
|
||||
* - ils sont decrits en vue normale (comme s'ils etaient sur cote COMPOSANT)
|
||||
* - leur orientation est donnée comme s'ils etaient cote composant.
|
||||
*/
|
||||
{
|
||||
MODULE* module = pcb->m_Modules;
|
||||
|
@ -385,7 +410,8 @@ int ii;
|
|||
fprintf( file, "LAYER %s\n", (module->flag) ? "BOTTOM" : "TOP" );
|
||||
|
||||
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 );
|
||||
|
||||
fprintf( file, "SHAPE %s %s %s\n",
|
||||
|
@ -416,22 +442,23 @@ int ii;
|
|||
// commentaire:
|
||||
fprintf( file, "SHEET Part %s %s\n", CONV_TO_UTF8( module->m_Reference->m_Text ),
|
||||
CONV_TO_UTF8( module->m_Value->m_Text ) );
|
||||
|
||||
}
|
||||
|
||||
fputs( "$ENDCOMPONENTS\n\n", file );
|
||||
}
|
||||
|
||||
|
||||
/***************************************************/
|
||||
void CreateSignalsSection( FILE* file, BOARD* pcb )
|
||||
/***************************************************/
|
||||
|
||||
/* Creation de la liste des equipotentielles:
|
||||
$SIGNALS
|
||||
SIGNAL <equipot name>
|
||||
NODE <component name> <pin name>
|
||||
...
|
||||
NODE <component name> <pin name>
|
||||
$ENDSIGNALS
|
||||
* $SIGNALS
|
||||
* SIGNAL <equipot name>
|
||||
* NODE <component name> <pin name>
|
||||
* ...
|
||||
* NODE <component name> <pin name>
|
||||
* $ENDSIGNALS
|
||||
*/
|
||||
{
|
||||
wxString msg;
|
||||
|
@ -460,7 +487,8 @@ int NbNoConn = 1;
|
|||
for( pad = module->m_Pads; pad != NULL; pad = (D_PAD*) pad->Pnext )
|
||||
{
|
||||
wxString padname;
|
||||
if ( pad->m_NetCode != equipot->m_NetCode ) continue;
|
||||
if( pad->m_NetCode != equipot->m_NetCode )
|
||||
continue;
|
||||
pad->ReturnStringPadName( padname );
|
||||
msg.Printf( wxT( "NODE %s %.4s" ),
|
||||
module->m_Reference->m_Text.GetData(), padname.GetData() );
|
||||
|
@ -470,12 +498,13 @@ int NbNoConn = 1;
|
|||
}
|
||||
|
||||
fputs( "$ENDSIGNALS\n\n", file );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************/
|
||||
bool CreateHeaderInfoData( FILE* file, WinEDA_PcbFrame* frame )
|
||||
/*************************************************************/
|
||||
|
||||
/* 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 )
|
||||
/**************************************************************************/
|
||||
|
||||
/*
|
||||
Routine de tri de la liste des piste par netcode,
|
||||
puis par largeur puis par layer
|
||||
* Routine de tri de la liste des piste par netcode,
|
||||
* puis par largeur puis par layer
|
||||
*/
|
||||
{
|
||||
const TRACK* ref, * cmp;
|
||||
|
@ -515,21 +545,27 @@ int diff;
|
|||
|
||||
ref = *( (TRACK**) refptr );
|
||||
cmp = *( (TRACK**) objptr );
|
||||
if( (diff = ref->m_NetCode - cmp->m_NetCode) ) return diff;
|
||||
if( (diff = ref->m_Width - cmp->m_Width) ) return diff;
|
||||
if( (diff = ref->m_Layer - cmp->m_Layer) ) return diff;
|
||||
if( (diff = ref->m_NetCode - cmp->m_NetCode) )
|
||||
return diff;
|
||||
if( (diff = ref->m_Width - cmp->m_Width) )
|
||||
return diff;
|
||||
if( (diff = ref->GetLayer() - cmp->GetLayer()) )
|
||||
return diff;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*************************************************/
|
||||
void CreateRoutesSection( FILE* file, BOARD* pcb )
|
||||
/*************************************************/
|
||||
|
||||
/* Creation de la liste des pistes, vias et zones
|
||||
section:
|
||||
$ROUTE
|
||||
...
|
||||
$ENROUTE
|
||||
Les segments de piste doivent etre regroupes par nets
|
||||
* section:
|
||||
* $ROUTE
|
||||
* ...
|
||||
* $ENROUTE
|
||||
* Les segments de piste doivent etre regroupes par nets
|
||||
*/
|
||||
{
|
||||
TRACK* track, ** tracklist;
|
||||
|
@ -539,20 +575,27 @@ int nbitems, ii;
|
|||
|
||||
// Calcul du nombre de segments a ecrire
|
||||
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 )
|
||||
{
|
||||
if ( track->m_StructType == TYPEZONE ) nbitems++;
|
||||
if( track->m_StructType == TYPEZONE )
|
||||
nbitems++;
|
||||
}
|
||||
|
||||
tracklist = (TRACK**) MyMalloc( (nbitems + 1) * sizeof(TRACK *) );
|
||||
|
||||
nbitems = 0;
|
||||
for( track = pcb->m_Track; track != NULL; track = (TRACK*) track->Pnext )
|
||||
tracklist[nbitems++] = track;
|
||||
|
||||
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;
|
||||
|
||||
qsort( tracklist, nbitems, sizeof(TRACK *), Track_list_Sort_by_Netcode );
|
||||
|
@ -570,7 +613,8 @@ int nbitems, ii;
|
|||
wxString netname;
|
||||
if( equipot && (equipot->m_Netname != wxEmptyString) )
|
||||
netname = equipot->m_Netname;
|
||||
else netname = wxT("_noname_" );
|
||||
else
|
||||
netname = wxT( "_noname_" );
|
||||
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 ( old_layer != track->m_Layer )
|
||||
if( old_layer != track->GetLayer() )
|
||||
{
|
||||
old_layer = track->m_Layer;
|
||||
old_layer = track->GetLayer();
|
||||
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",
|
||||
|
@ -611,8 +655,9 @@ int nbitems, ii;
|
|||
/***************************************************/
|
||||
void CreateDevicesSection( FILE* file, BOARD* pcb )
|
||||
/***************************************************/
|
||||
|
||||
/* 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;
|
||||
|
@ -628,9 +673,12 @@ D_PAD * pad;
|
|||
for( pad = module->m_Pads; pad != NULL; pad = (D_PAD*) pad->Pnext )
|
||||
{
|
||||
fprintf( file, "PINDESCR %.4s", pad->m_Padname );
|
||||
if ( pad->m_Netname == wxEmptyString ) fputs(" NoConn\n", file);
|
||||
else fprintf(file, " %.4s\n", pad->m_Padname);
|
||||
if( pad->m_Netname == wxEmptyString )
|
||||
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 ) );
|
||||
}
|
||||
|
||||
|
@ -641,8 +689,9 @@ D_PAD * pad;
|
|||
/*************************************************/
|
||||
void CreateBoardSection( FILE* file, BOARD* pcb )
|
||||
/*************************************************/
|
||||
|
||||
/* 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 );
|
||||
|
@ -666,15 +715,16 @@ On ne cree ici que le rectangle d'encadrement du Board
|
|||
/****************************************************/
|
||||
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
|
||||
pour une largeur de 120 : nom = "TRACK120".
|
||||
/* 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
|
||||
* pour une largeur de 120 : nom = "TRACK120".
|
||||
*/
|
||||
{
|
||||
TRACK* track;
|
||||
|
@ -692,9 +742,12 @@ int * trackinfo, * ptinfo;
|
|||
ptinfo = (int*) adr_lowmem;
|
||||
while( *ptinfo >= 0 )
|
||||
{
|
||||
if ( *ptinfo != track->m_Width ) ptinfo ++;
|
||||
else break;
|
||||
if( *ptinfo != track->m_Width )
|
||||
ptinfo++;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
trackinfo = ptinfo;
|
||||
if( *ptinfo < 0 )
|
||||
{
|
||||
|
@ -703,6 +756,7 @@ int * trackinfo, * ptinfo;
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
for( track = pcb->m_Zone; track != NULL; track = (TRACK*) track->Pnext )
|
||||
{
|
||||
if( *trackinfo != track->m_Width ) // recherche d'une epaisseur deja utilisee
|
||||
|
@ -710,9 +764,12 @@ int * trackinfo, * ptinfo;
|
|||
ptinfo = (int*) adr_lowmem;
|
||||
while( *ptinfo >= 0 )
|
||||
{
|
||||
if ( *ptinfo != track->m_Width ) ptinfo ++;
|
||||
else break;
|
||||
if( *ptinfo != track->m_Width )
|
||||
ptinfo++;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
trackinfo = ptinfo;
|
||||
if( *ptinfo < 0 )
|
||||
{
|
||||
|
@ -728,6 +785,7 @@ int * trackinfo, * ptinfo;
|
|||
{
|
||||
fprintf( file, "TRACK TRACK%d %d\n", *trackinfo, *trackinfo );
|
||||
}
|
||||
|
||||
fputs( "$ENDTRACKS\n\n", file );
|
||||
|
||||
return (int*) adr_lowmem;
|
||||
|
@ -737,14 +795,15 @@ int * trackinfo, * ptinfo;
|
|||
/***************************************************/
|
||||
void ModuleWriteShape( FILE* file, MODULE* module )
|
||||
/***************************************************/
|
||||
|
||||
/* Sauvegarde de la forme d'un MODULE (section SHAPE)
|
||||
La forme est donnee "normalisee" (Orient 0, vue normale ( non miroir)
|
||||
Syntaxe:
|
||||
SHAPE <shape_name>
|
||||
shape_descr (line, arc ..):
|
||||
LINE startX startY endX endY
|
||||
ARC startX startY endX endY centreX scentreY
|
||||
CIRCLE centreX scentreY radius
|
||||
* La forme est donnee "normalisee" (Orient 0, vue normale ( non miroir)
|
||||
* Syntaxe:
|
||||
* SHAPE <shape_name>
|
||||
* shape_descr (line, arc ..):
|
||||
* LINE startX startY endX endY
|
||||
* ARC startX startY endX endY centreX scentreY
|
||||
* CIRCLE centreX scentreY radius
|
||||
*/
|
||||
{
|
||||
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 )
|
||||
{
|
||||
fprintf( file, "ATTRIBUTE" );
|
||||
if( module->m_Attributs & MOD_CMS ) fprintf(file," SMD");
|
||||
if( module->m_Attributs & MOD_VIRTUAL ) fprintf(file," VIRTUAL");
|
||||
if( module->m_Attributs & MOD_CMS )
|
||||
fprintf( file, " SMD" );
|
||||
if( module->m_Attributs & MOD_VIRTUAL )
|
||||
fprintf( file, " VIRTUAL" );
|
||||
fprintf( file, "\n" );
|
||||
}
|
||||
|
||||
|
@ -776,6 +837,7 @@ int Yaxis_sign = -1; // Controle changement signe axe Y (selon module normal/mir
|
|||
|
||||
case TYPEEDGEMODULE:
|
||||
PtEdge = (EDGE_MODULE*) PtStruct;
|
||||
|
||||
switch( PtEdge->m_Shape )
|
||||
{
|
||||
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_End0.x, Yaxis_sign * PtEdge->m_End0.y );
|
||||
break;
|
||||
|
||||
case S_CIRCLE:
|
||||
{
|
||||
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 );
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
DisplayError( NULL, wxT( "Type Edge Module inconnu" ) );
|
||||
break;
|
||||
} /* Fin switch type edge */
|
||||
}
|
||||
|
||||
/* Fin switch type edge */
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
} /* Fin switch gestion des Items draw */
|
||||
}
|
||||
}
|
||||
|
||||
/* Fin switch gestion des Items draw */
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
/*************************************/
|
||||
|
||||
/*
|
||||
1 - create ascii files for automatic placement of smd components
|
||||
2 - create a module report (pos and module descr) (ascii file)
|
||||
* 1 - create ascii files for automatic placement of smd components
|
||||
* 2 - create a module report (pos and module descr) (ascii file)
|
||||
*/
|
||||
#include "fctsys.h"
|
||||
|
||||
|
@ -30,16 +30,16 @@ static void WriteDrawSegmentPcb(DRAWSEGMENT * PtDrawSegment, FILE * rptfile);
|
|||
/* Routine de tri utilisee par GenereModulesPosition() */
|
||||
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 )
|
||||
/**************************************************************/
|
||||
|
||||
/* 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;
|
||||
|
@ -53,6 +53,7 @@ FILE * LayerCu = NULL, *LayerCmp = NULL;
|
|||
|
||||
/* Calcul des echelles de conversion */
|
||||
conv_unit = 0.0001; /* unites = INCHES */
|
||||
|
||||
// if(IF_DRILL_METRIC) conv_unit = 0.000254; /* unites = mm */
|
||||
|
||||
File_Place_Offset = m_Auxiliary_Axis_Position;
|
||||
|
@ -61,11 +62,15 @@ FILE * LayerCu = NULL, *LayerCmp = NULL;
|
|||
NbMod = 0; Module = m_Pcb->m_Modules;
|
||||
for( ; Module != NULL; Module = (MODULE*) Module->Pnext )
|
||||
{
|
||||
if( Module->m_Attributs & MOD_VIRTUAL ) continue;
|
||||
if( (Module->m_Attributs & MOD_CMS) == 0 ) continue;
|
||||
if( Module->m_Layer == CUIVRE_N) GenCu = TRUE;
|
||||
if( Module->m_Attributs & MOD_VIRTUAL )
|
||||
continue;
|
||||
if( (Module->m_Attributs & MOD_CMS) == 0 )
|
||||
continue;
|
||||
if( Module->GetLayer() == CUIVRE_N )
|
||||
GenCu = TRUE;
|
||||
NbMod++;
|
||||
}
|
||||
|
||||
if( NbMod == 0 )
|
||||
{
|
||||
DisplayError( this, _( "No Modules for Automated Placement" ), 20 ); return;
|
||||
|
@ -117,8 +122,10 @@ FILE * LayerCu = NULL, *LayerCmp = NULL;
|
|||
Module = (MODULE*) m_Pcb->m_Modules;
|
||||
for( ii = 0; Module != NULL; Module = Module->Next() )
|
||||
{
|
||||
if( Module->m_Attributs & MOD_VIRTUAL ) continue;
|
||||
if( (Module->m_Attributs & MOD_CMS) == 0 ) continue;
|
||||
if( Module->m_Attributs & MOD_VIRTUAL )
|
||||
continue;
|
||||
if( (Module->m_Attributs & MOD_CMS) == 0 )
|
||||
continue;
|
||||
|
||||
Liste[ii].m_Module = Module;
|
||||
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",
|
||||
DateAndTime( Buff ) );
|
||||
fputs( Line, LayerCmp );
|
||||
if( GenCu ) fputs(Line,LayerCu);
|
||||
if( GenCu )
|
||||
fputs( Line, LayerCu );
|
||||
|
||||
wxString Title = g_Main_Title + wxT( " " ) + GetBuildVersion();
|
||||
sprintf( Line, "### Printed by PcbNew version %s\n", CONV_TO_UTF8( Title ) );
|
||||
fputs( Line, LayerCmp );
|
||||
if( GenCu ) fputs(Line,LayerCu);
|
||||
if( GenCu )
|
||||
fputs( Line, LayerCu );
|
||||
|
||||
sprintf( Line, "## Unit = inches, Angle = deg.\n" );
|
||||
fputs( Line, LayerCmp );
|
||||
if( GenCu ) fputs(Line,LayerCu);
|
||||
if( GenCu )
|
||||
fputs( Line, LayerCu );
|
||||
|
||||
sprintf( Line, "## Side : Components\n" );
|
||||
fputs( Line, LayerCmp );
|
||||
|
@ -157,7 +167,8 @@ FILE * LayerCu = NULL, *LayerCmp = NULL;
|
|||
sprintf( Line,
|
||||
"# Ref Val PosX PosY Rot Side\n" );
|
||||
fputs( Line, LayerCmp );
|
||||
if( GenCu ) fputs(Line,LayerCu);
|
||||
if( GenCu )
|
||||
fputs( Line, LayerCu );
|
||||
|
||||
/* Generation lignes utiles du fichier */
|
||||
for( ii = 0; ii < NbMod; ii++ )
|
||||
|
@ -177,13 +188,12 @@ FILE * LayerCu = NULL, *LayerCmp = NULL;
|
|||
(float) module_pos.y * conv_unit,
|
||||
(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" );
|
||||
fputs( Line, LayerCmp );
|
||||
}
|
||||
|
||||
else if (Liste[ii].m_Module->m_Layer == CUIVRE_N)
|
||||
else if( Liste[ii].m_Module->GetLayer() == CUIVRE_N )
|
||||
{
|
||||
strcat( Line, "Cu\n" );
|
||||
fputs( Line, LayerCu );
|
||||
|
@ -202,16 +212,17 @@ FILE * LayerCu = NULL, *LayerCmp = NULL;
|
|||
setlocale( LC_NUMERIC, "" ); // revert to the current locale
|
||||
|
||||
msg = wxT( "Cmp File: " ) + NameLayerCmp;
|
||||
if( GenCu ) msg += wxT("\nCu File: ") + NameLayerCu;
|
||||
if( GenCu )
|
||||
msg += wxT( "\nCu File: " ) + NameLayerCu;
|
||||
|
||||
DisplayInfo( this, msg );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**************************************************************/
|
||||
void WinEDA_PcbFrame::GenModuleReport( wxCommandEvent& event )
|
||||
/**************************************************************/
|
||||
|
||||
/* Print a module report.
|
||||
*/
|
||||
{
|
||||
|
@ -225,6 +236,7 @@ wxPoint module_pos;
|
|||
|
||||
/* Calcul des echelles de conversion */
|
||||
conv_unit = 0.0001; /* unites = INCHES */
|
||||
|
||||
// if(IF_DRILL_METRIC) conv_unit = 0.000254; /* unites = mm */
|
||||
|
||||
File_Place_Offset = wxPoint( 0, 0 );
|
||||
|
@ -285,8 +297,10 @@ wxPoint module_pos;
|
|||
fputs( Line, rptfile );
|
||||
|
||||
msg = wxT( "attribut" );
|
||||
if ( Module->m_Attributs & MOD_VIRTUAL ) msg += wxT(" virtual");
|
||||
if ( Module->m_Attributs & MOD_CMS ) msg += wxT(" smd");
|
||||
if( Module->m_Attributs & MOD_VIRTUAL )
|
||||
msg += wxT( " virtual" );
|
||||
if( Module->m_Attributs & MOD_CMS )
|
||||
msg += wxT( " smd" );
|
||||
if( ( Module->m_Attributs & (MOD_VIRTUAL | MOD_CMS) ) == 0 )
|
||||
msg += wxT( " none" );
|
||||
msg += wxT( "\n" );
|
||||
|
@ -301,9 +315,12 @@ wxPoint module_pos;
|
|||
fputs( Line, rptfile );
|
||||
|
||||
sprintf( Line, "orientation %.2f\n", (float) Module->m_Orient / 10 );
|
||||
if (Module->m_Layer == CMP_N) strcat(Line,"layer component\n");
|
||||
else if (Module->m_Layer == CUIVRE_N) strcat(Line,"layer copper\n");
|
||||
else strcat(Line,"layer other\n");
|
||||
if( Module->GetLayer() == CMP_N )
|
||||
strcat( Line, "layer component\n" );
|
||||
else if( Module->GetLayer() == CUIVRE_N )
|
||||
strcat( Line, "layer copper\n" );
|
||||
else
|
||||
strcat( Line, "layer other\n" );
|
||||
fputs( Line, rptfile );
|
||||
|
||||
Module->Write_3D_Descr( rptfile );
|
||||
|
@ -334,23 +351,28 @@ char *shape_name[6] = {"??? ","Circ","Rect","Oval","trap","spec"} ;
|
|||
fputs( Line, rptfile );
|
||||
|
||||
int layer = 0;
|
||||
if(pad->m_Masque_Layer & CUIVRE_LAYER) layer = 1;
|
||||
if(pad->m_Masque_Layer & CMP_LAYER) layer |= 2;
|
||||
if( pad->m_Masque_Layer & CUIVRE_LAYER )
|
||||
layer = 1;
|
||||
if( pad->m_Masque_Layer & CMP_LAYER )
|
||||
layer |= 2;
|
||||
char* layer_name[4] = { "??? ", "copper", "component", "all" };
|
||||
sprintf( Line, "Layer %s\n", layer_name[layer] );
|
||||
fputs( Line, rptfile );
|
||||
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 */
|
||||
EDA_BaseStruct* PtStruct;
|
||||
for( PtStruct = m_Pcb->m_Drawings; PtStruct != NULL; PtStruct = PtStruct->Pnext )
|
||||
{
|
||||
if( PtStruct->m_StructType != TYPEDRAWSEGMENT ) continue;
|
||||
if( ((DRAWSEGMENT *) PtStruct)->m_Layer != EDGE_N ) continue;
|
||||
if( PtStruct->m_StructType != TYPEDRAWSEGMENT )
|
||||
continue;
|
||||
if( ( (DRAWSEGMENT*) PtStruct )->GetLayer() != EDGE_N )
|
||||
continue;
|
||||
WriteDrawSegmentPcb( (DRAWSEGMENT*) PtStruct, rptfile );
|
||||
}
|
||||
|
||||
|
@ -364,11 +386,12 @@ EDA_BaseStruct * PtStruct;
|
|||
/*******************************************************************/
|
||||
void WriteDrawSegmentPcb( DRAWSEGMENT* PtDrawSegment, FILE* rptfile )
|
||||
/*******************************************************************/
|
||||
|
||||
/* Sortie dsur rptfile d'un segment type drawing PCB:
|
||||
Les contours sont de differents type:
|
||||
segment
|
||||
cercle
|
||||
arc
|
||||
* Les contours sont de differents type:
|
||||
* segment
|
||||
* cercle
|
||||
* arc
|
||||
*/
|
||||
{
|
||||
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;
|
||||
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, "centre %.6lf %.6lf\n", ux0, uy0 );
|
||||
sprintf( Line, "start %.6lf %.6lf\n", endx * conv_unit, endy * conv_unit );
|
||||
|
@ -424,4 +451,3 @@ char Line[1024];
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -245,7 +245,7 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
|
|||
Mself.m_Size.x = Mself.m_Size.y / 2;
|
||||
|
||||
// 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 */
|
||||
|
||||
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.y = PtSegm->m_Start.y + Mself.delta;
|
||||
PtSegm->m_Width = Mself.m_Width;
|
||||
PtSegm->m_Layer = Module->m_Layer;
|
||||
PtSegm->SetLayer( Module->GetLayer() );
|
||||
PtSegm->m_Shape = S_SEGMENT;
|
||||
|
||||
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.y = PtPad->m_Pos.y - Module->m_Pos.y;
|
||||
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_PadShape = CIRCLE;
|
||||
PtPad->m_Rayon = PtPad->m_Size.x / 2;
|
||||
|
|
|
@ -915,7 +915,7 @@ wxString msg;
|
|||
float Xscale = (float) (SheetSize.x - (marge*2)) / dX;
|
||||
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) +
|
||||
(int)(BoardCentre.x * scale_x) + marge;
|
||||
|
|
|
@ -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 ) \
|
||||
{ \
|
||||
WriteCell( dy, dx, BOTTOM, color ); \
|
||||
if(Nb_Sides) WriteCell(dy,dx,TOP,color);\
|
||||
if( Nb_Sides ) \
|
||||
WriteCell( dy, dx, TOP, color );\
|
||||
} \
|
||||
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(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 )
|
||||
/******************************************************************************/
|
||||
|
||||
/* 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
|
||||
et la demi largeur de la piste
|
||||
Parametres:
|
||||
pt_pad : pointeur sur la description du pad
|
||||
color : masque a ecrire dans les cellules
|
||||
marge : valeur a ajouter au rayon ou demi cote du pad
|
||||
op_logique: type d'ecriture dans la cellule ( WRITE, OR )
|
||||
* surface du pad pointe par pt_pad, avec la marge reservee pour l'isolement
|
||||
* et la demi largeur de la piste
|
||||
* Parametres:
|
||||
* pt_pad : pointeur sur la description du pad
|
||||
* color : masque a ecrire dans les cellules
|
||||
* marge : valeur a ajouter au rayon ou demi cote du pad
|
||||
* op_logique: type d'ecriture dans la cellule ( WRITE, OR )
|
||||
*/
|
||||
{
|
||||
int dx, dy;
|
||||
|
@ -80,7 +84,6 @@ wxPoint shape_pos = pt_pad->ReturnShapePos();;
|
|||
|
||||
if( (pt_pad->m_Orient % 900) == 0 )
|
||||
{ /* Le pad est un rectangle horizontal ou vertical */
|
||||
|
||||
if( (pt_pad->m_Orient == 900 ) || (pt_pad->m_Orient == 2700) )
|
||||
{ /* orient tournee de 90 deg */
|
||||
EXCHG( dx, dy );
|
||||
|
@ -90,7 +93,6 @@ wxPoint shape_pos = pt_pad->ReturnShapePos();;
|
|||
shape_pos.x + dx, shape_pos.y + dy,
|
||||
pt_pad->m_Masque_Layer, color, op_logique );
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
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,
|
||||
int color, int op_logique )
|
||||
/************************************************************************/
|
||||
|
||||
/* Initialise a la valeur color, les cellules du Board comprises dans la
|
||||
surface du cercle de centre cx,cy.
|
||||
Parametres:
|
||||
rayon : valeur a ajouter au rayon ou demi cote du pad
|
||||
masque_layer = couches occupees
|
||||
color : masque a ecrire dans les cellules
|
||||
op_logique: type d'ecriture dans la cellule ( WRITE, OR )
|
||||
* surface du cercle de centre cx,cy.
|
||||
* Parametres:
|
||||
* rayon : valeur a ajouter au rayon ou demi cote du pad
|
||||
* masque_layer = couches occupees
|
||||
* color : masque a ecrire dans les cellules
|
||||
* op_logique: type d'ecriture dans la cellule ( WRITE, OR )
|
||||
*/
|
||||
{
|
||||
int row, col;
|
||||
|
@ -119,6 +122,7 @@ int ux0 , uy0 , ux1, uy1;
|
|||
int row_max, col_max, row_min, col_min;
|
||||
int trace = 0;
|
||||
float fdistmin, fdistx, fdisty;
|
||||
|
||||
void (*WriteCell)( int, int, int, BoardCell );
|
||||
int tstwrite = 0;
|
||||
int distmin;
|
||||
|
@ -126,7 +130,7 @@ int distmin;
|
|||
/* Determination des couches occupees : */
|
||||
|
||||
/* 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] )
|
||||
trace = 1; /* Trace sur BOTTOM */
|
||||
|
@ -135,16 +139,26 @@ int distmin;
|
|||
if( Nb_Sides )
|
||||
trace |= 2;/* Trace sur TOP */
|
||||
|
||||
if( trace == 0) return;
|
||||
if( trace == 0 )
|
||||
return;
|
||||
|
||||
switch( op_logique )
|
||||
{
|
||||
default:
|
||||
case WRITE_CELL: WriteCell = SetCell; break;
|
||||
case WRITE_OR_CELL: WriteCell = OrCell; break;
|
||||
case WRITE_XOR_CELL: WriteCell = XorCell; break;
|
||||
case WRITE_AND_CELL: WriteCell = AndCell; break;
|
||||
case WRITE_ADD_CELL: WriteCell = AddCell; break;
|
||||
case WRITE_CELL:
|
||||
WriteCell = SetCell; break;
|
||||
|
||||
case WRITE_OR_CELL:
|
||||
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;
|
||||
|
@ -161,14 +175,20 @@ int distmin;
|
|||
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++;
|
||||
|
||||
if( row_min < 0 ) row_min = 0;
|
||||
if( row_max >= (Nrows-1)) row_max = Nrows-1;
|
||||
if( col_min < 0 ) col_min = 0;
|
||||
if( col_max >= (Ncols-1)) col_max = Ncols-1;
|
||||
if( row_min < 0 )
|
||||
row_min = 0;
|
||||
if( row_max >= (Nrows - 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 */
|
||||
if( row_min > row_max ) row_max = row_min;
|
||||
if( col_min > col_max ) col_max = col_min;
|
||||
if( row_min > row_max )
|
||||
row_max = row_min;
|
||||
if( col_min > col_max )
|
||||
col_max = col_min;
|
||||
|
||||
fdistmin = (float) distmin * distmin;
|
||||
|
||||
|
@ -181,18 +201,22 @@ int distmin;
|
|||
fdistx = (float) ( cx - (col * g_GridRoutingSize) );
|
||||
fdistx *= fdistx;
|
||||
|
||||
if( fdistmin <= (fdistx + fdisty) ) continue;
|
||||
if( fdistmin <= (fdistx + fdisty) )
|
||||
continue;
|
||||
|
||||
if(trace & 1) WriteCell(row,col,BOTTOM,color);
|
||||
if(trace & 2) WriteCell(row,col,TOP,color);
|
||||
if( trace & 1 )
|
||||
WriteCell( row, col, BOTTOM, color );
|
||||
if( trace & 2 )
|
||||
WriteCell( row, col, TOP, color );
|
||||
tstwrite = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (tstwrite) return;
|
||||
if( tstwrite )
|
||||
return;
|
||||
|
||||
/* 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;
|
||||
fdistmin = ( (float) distmin * distmin ) * 2; /* = dist centre au point diagonal*/
|
||||
|
@ -206,25 +230,28 @@ if (tstwrite) return;
|
|||
fdistx = (float) ( cx - (col * g_GridRoutingSize) );
|
||||
fdistx *= fdistx;
|
||||
|
||||
if( fdistmin <= (fdistx + fdisty) ) continue;
|
||||
if( fdistmin <= (fdistx + fdisty) )
|
||||
continue;
|
||||
|
||||
if(trace & 1) WriteCell(row,col,BOTTOM,color);
|
||||
if(trace & 2) WriteCell(row,col,TOP,color);
|
||||
if( trace & 1 )
|
||||
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 )
|
||||
/******************************************************************************/
|
||||
|
||||
/* trace un Segment de piste sur le BOARD de routage
|
||||
*/
|
||||
{
|
||||
int demi_pas, demi_largeur;
|
||||
int ux0, uy0, ux1, uy1;
|
||||
int layer = pt_segm->m_Layer;
|
||||
int layer = pt_segm->GetLayer();
|
||||
|
||||
|
||||
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;
|
||||
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) */
|
||||
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
|
||||
DrawSegmentQcq( ux0, uy0, ux1, uy1, demi_largeur, layer, color, op_logique ); //F4EXB 051018-01
|
||||
return; //F4EXB 051018-01
|
||||
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************************/
|
||||
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
|
||||
*/
|
||||
{
|
||||
int dx, dy, lim;
|
||||
int cumul, inc, il, delta;
|
||||
|
||||
void (*WriteCell)( int, int, int, BoardCell );
|
||||
|
||||
switch( op_logique )
|
||||
{
|
||||
default:
|
||||
case WRITE_CELL: WriteCell = SetCell; break;
|
||||
case WRITE_OR_CELL: WriteCell = OrCell; break;
|
||||
case WRITE_XOR_CELL: WriteCell = XorCell; break;
|
||||
case WRITE_AND_CELL: WriteCell = AndCell; break;
|
||||
case WRITE_ADD_CELL: WriteCell = AddCell; break;
|
||||
case WRITE_CELL:
|
||||
WriteCell = SetCell; break;
|
||||
|
||||
case WRITE_OR_CELL:
|
||||
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(y1 < y0 ) EXCHG (y0,y1);
|
||||
if( y1 < y0 )
|
||||
EXCHG( y0, y1 );
|
||||
dy = y0 / g_GridRoutingSize; lim = y1 / g_GridRoutingSize;
|
||||
dx = x0 / g_GridRoutingSize;
|
||||
/* Clipping aux limites du board */
|
||||
if( (dx < 0) || (dx >= Ncols) ) return;
|
||||
if( dy < 0 ) dy = 0;
|
||||
if( lim >= Nrows ) lim = Nrows-1;
|
||||
if( (dx < 0) || (dx >= Ncols) )
|
||||
return;
|
||||
if( dy < 0 )
|
||||
dy = 0;
|
||||
if( lim >= Nrows )
|
||||
lim = Nrows - 1;
|
||||
for( ; dy <= lim; dy++ )
|
||||
{
|
||||
OP_CELL( layer, dy, dx );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
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;
|
||||
dy = y0 / g_GridRoutingSize;
|
||||
/* Clipping aux limites du board */
|
||||
if( (dy < 0) || (dy >= Nrows) ) return;
|
||||
if( dx < 0 ) dx = 0;
|
||||
if( lim >= Ncols ) lim = Ncols-1;
|
||||
if( (dy < 0) || (dy >= Nrows) )
|
||||
return;
|
||||
if( dx < 0 )
|
||||
dx = 0;
|
||||
if( lim >= Ncols )
|
||||
lim = Ncols - 1;
|
||||
for( ; dx <= lim; dx++ )
|
||||
{
|
||||
OP_CELL( layer, dy, dx );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Ici l'angle est quelconque: on utilise l'algorithme de LUCAS */
|
||||
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;
|
||||
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;
|
||||
for( ; dx <= lim; )
|
||||
{
|
||||
if( (dx >= 0) && (dy >= 0) &&
|
||||
(dx < Ncols) && (dy < Nrows) )
|
||||
if( (dx >= 0) && (dy >= 0)
|
||||
&& (dx < Ncols) && (dy < Nrows) )
|
||||
{
|
||||
OP_CELL( layer, dy, dx );
|
||||
}
|
||||
|
@ -350,16 +402,20 @@ void (*WriteCell)(int,int,int,BoardCell);
|
|||
}
|
||||
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;
|
||||
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;
|
||||
for( ; dy <= lim; )
|
||||
{
|
||||
if( (dx >= 0) && (dy >= 0) &&
|
||||
(dx < Ncols) && (dy < Nrows) )
|
||||
if( (dx >= 0) && (dy >= 0)
|
||||
&& (dx < Ncols) && (dy < Nrows) )
|
||||
{
|
||||
OP_CELL( layer, dy, dx );
|
||||
}
|
||||
|
@ -372,23 +428,26 @@ void (*WriteCell)(int,int,int,BoardCell);
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************/
|
||||
void TraceFilledRectangle( BOARD* Pcb,
|
||||
int ux0, int uy0, int ux1, int uy1,
|
||||
int masque_layer, int color, int op_logique )
|
||||
/*****************************************************************/
|
||||
/* Fonction Surchargee.
|
||||
|
||||
Met a la valeur color l'ensemble des cellules du board inscrites dans
|
||||
le rectangle de coord ux0,uy0 ( angle haut a gauche )
|
||||
a ux1,uy1 ( angle bas a droite )
|
||||
Le rectangle est horizontal ( ou vertical )
|
||||
Coordonnees PCB.
|
||||
/* Fonction Surchargee.
|
||||
*
|
||||
* Met a la valeur color l'ensemble des cellules du board inscrites dans
|
||||
* le rectangle de coord ux0,uy0 ( angle haut a gauche )
|
||||
* a ux1,uy1 ( angle bas a droite )
|
||||
* Le rectangle est horizontal ( ou vertical )
|
||||
* Coordonnees PCB.
|
||||
*/
|
||||
{
|
||||
int row, col;
|
||||
int row_min, row_max, col_min, col_max;
|
||||
int trace = 0;
|
||||
|
||||
void (*WriteCell)( int, int, int, BoardCell );
|
||||
|
||||
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 )
|
||||
trace |= 2; /* Trace sur TOP */
|
||||
|
||||
if(trace == 0) return;
|
||||
if( trace == 0 )
|
||||
return;
|
||||
|
||||
switch( op_logique )
|
||||
{
|
||||
default:
|
||||
case WRITE_CELL: WriteCell = SetCell; break;
|
||||
case WRITE_OR_CELL: WriteCell = OrCell; break;
|
||||
case WRITE_XOR_CELL: WriteCell = XorCell; break;
|
||||
case WRITE_AND_CELL: WriteCell = AndCell; break;
|
||||
case WRITE_ADD_CELL: WriteCell = AddCell; break;
|
||||
case WRITE_CELL:
|
||||
WriteCell = SetCell; break;
|
||||
|
||||
case WRITE_OR_CELL:
|
||||
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;
|
||||
|
@ -415,20 +484,28 @@ void (*WriteCell)(int,int,int,BoardCell);
|
|||
/* Calcul des coord limites des cellules appartenant au rectangle */
|
||||
row_max = uy1 / g_GridRoutingSize;
|
||||
col_max = ux1 / g_GridRoutingSize;
|
||||
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++;
|
||||
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++;
|
||||
|
||||
if( row_min < 0 ) row_min = 0;
|
||||
if( row_max >= (Nrows-1)) row_max = Nrows-1;
|
||||
if( col_min < 0 ) col_min = 0;
|
||||
if( col_max >= (Ncols-1)) col_max = Ncols-1;
|
||||
if( row_min < 0 )
|
||||
row_min = 0;
|
||||
if( row_max >= (Nrows - 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( col = col_min; col <= col_max; col++ )
|
||||
{
|
||||
if(trace & 1) WriteCell(row,col,BOTTOM,color);
|
||||
if(trace & 2) WriteCell(row,col,TOP,color);
|
||||
if( trace & 1 )
|
||||
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.
|
||||
|
||||
Met a la valeur color l'ensemble des cellules du board inscrites dans
|
||||
le rectangle de coord ux0,uy0 ( angle haut a droite )
|
||||
a ux1,uy1 ( angle bas a gauche )
|
||||
Le rectangle est tourne de la valeur angle (en 0,1 degres)
|
||||
Coordonnees PCB.
|
||||
*
|
||||
* Met a la valeur color l'ensemble des cellules du board inscrites dans
|
||||
* le rectangle de coord ux0,uy0 ( angle haut a droite )
|
||||
* a ux1,uy1 ( angle bas a gauche )
|
||||
* Le rectangle est tourne de la valeur angle (en 0,1 degres)
|
||||
* Coordonnees PCB.
|
||||
*/
|
||||
{
|
||||
int row, col;
|
||||
|
@ -454,6 +531,7 @@ int rayon; /* rayon du cercle exinscrit */
|
|||
int row_min, row_max, col_min, col_max;
|
||||
int rotrow, rotcol;
|
||||
int trace = 0;
|
||||
|
||||
void (*WriteCell)( int, int, int, BoardCell );
|
||||
|
||||
if( masque_layer & g_TabOneLayerMask[Route_Layer_BOTTOM] )
|
||||
|
@ -463,16 +541,26 @@ void (*WriteCell)(int,int,int,BoardCell);
|
|||
if( Nb_Sides )
|
||||
trace |= 2;/* Trace sur TOP */
|
||||
|
||||
if(trace == 0) return;
|
||||
if( trace == 0 )
|
||||
return;
|
||||
|
||||
switch( op_logique )
|
||||
{
|
||||
default:
|
||||
case WRITE_CELL: WriteCell = SetCell; break;
|
||||
case WRITE_OR_CELL: WriteCell = OrCell; break;
|
||||
case WRITE_XOR_CELL: WriteCell = XorCell; break;
|
||||
case WRITE_AND_CELL: WriteCell = AndCell; break;
|
||||
case WRITE_ADD_CELL: WriteCell = AddCell; break;
|
||||
case WRITE_CELL:
|
||||
WriteCell = SetCell; break;
|
||||
|
||||
case WRITE_OR_CELL:
|
||||
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;
|
||||
|
@ -485,13 +573,19 @@ void (*WriteCell)(int,int,int,BoardCell);
|
|||
/* Calcul des coord limites des cellules appartenant au rectangle */
|
||||
row_max = (cy + rayon) / g_GridRoutingSize;
|
||||
col_max = (cx + rayon) / g_GridRoutingSize;
|
||||
row_min = (cy - rayon) / g_GridRoutingSize; if (uy0 > row_min*g_GridRoutingSize ) row_min++;
|
||||
col_min = (cx - rayon) / g_GridRoutingSize; if (ux0 > col_min*g_GridRoutingSize ) col_min++;
|
||||
row_min = (cy - rayon) / g_GridRoutingSize; if( uy0 > row_min * g_GridRoutingSize )
|
||||
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_max >= (Nrows-1)) row_max = Nrows-1;
|
||||
if( col_min < 0 ) col_min = 0;
|
||||
if( col_max >= (Ncols-1)) col_max = Ncols-1;
|
||||
if( row_min < 0 )
|
||||
row_min = 0;
|
||||
if( row_max >= (Nrows - 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++ )
|
||||
{
|
||||
|
@ -499,31 +593,38 @@ void (*WriteCell)(int,int,int,BoardCell);
|
|||
{
|
||||
rotrow = row * g_GridRoutingSize; rotcol = col * g_GridRoutingSize;
|
||||
RotatePoint( &rotcol, &rotrow, cx, cy, -angle );
|
||||
if( rotrow <= uy0 ) continue;
|
||||
if( rotrow >= uy1 ) continue;
|
||||
if( rotcol <= ux0 ) continue;
|
||||
if( rotcol >= ux1 ) continue;
|
||||
if(trace & 1) WriteCell(row,col,BOTTOM,color);
|
||||
if(trace & 2) WriteCell(row,col,TOP,color);
|
||||
if( rotrow <= uy0 )
|
||||
continue;
|
||||
if( rotrow >= uy1 )
|
||||
continue;
|
||||
if( rotcol <= ux0 )
|
||||
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,
|
||||
int color, int op_logique )
|
||||
/*****************************************************************/
|
||||
|
||||
/* Remplit toutes les cellules du BOARD contenues dans le segment
|
||||
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.
|
||||
* 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.
|
||||
*/
|
||||
{
|
||||
int row, col;
|
||||
int inc;
|
||||
int row_max, col_max, row_min, col_min;
|
||||
int demi_pas;
|
||||
|
||||
void (*WriteCell)( int, int, int, BoardCell );
|
||||
int angle;
|
||||
int cx, cy, dx, dy;
|
||||
|
@ -531,46 +632,71 @@ int cx, cy, dx, dy;
|
|||
switch( op_logique )
|
||||
{
|
||||
default:
|
||||
case WRITE_CELL: WriteCell = SetCell; break;
|
||||
case WRITE_OR_CELL: WriteCell = OrCell; break;
|
||||
case WRITE_XOR_CELL: WriteCell = XorCell; break;
|
||||
case WRITE_AND_CELL: WriteCell = AndCell; break;
|
||||
case WRITE_ADD_CELL: WriteCell = AddCell; break;
|
||||
case WRITE_CELL:
|
||||
WriteCell = SetCell; break;
|
||||
|
||||
case WRITE_OR_CELL:
|
||||
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 */
|
||||
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 */
|
||||
inc = 1; if(uy1 < uy0) inc = -1;
|
||||
inc = 1; if( uy1 < uy0 )
|
||||
inc = -1;
|
||||
|
||||
/* Calcul de l'encadrement : */
|
||||
demi_pas = g_GridRoutingSize / 2;
|
||||
|
||||
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;
|
||||
if (col_max > (Ncols-1) ) col_max = Ncols-1;
|
||||
if( col_max > (Ncols - 1) )
|
||||
col_max = Ncols - 1;
|
||||
|
||||
if( inc > 0 )
|
||||
{
|
||||
row_min = (uy0 - lg) / g_GridRoutingSize;
|
||||
row_max = (uy1 + lg + demi_pas) / g_GridRoutingSize;
|
||||
}
|
||||
else{
|
||||
else
|
||||
{
|
||||
row_min = (uy1 - lg) / g_GridRoutingSize;
|
||||
row_max = (uy0 + lg + demi_pas) / g_GridRoutingSize;
|
||||
}
|
||||
|
||||
if (row_min < 0 ) row_min = 0;
|
||||
if (row_min > (Nrows-1) ) row_min = Nrows-1;
|
||||
if (row_max < 0 ) row_max = 0;
|
||||
if (row_max > (Nrows-1) ) row_max = Nrows-1;
|
||||
if( row_min < 0 )
|
||||
row_min = 0;
|
||||
if( row_min > (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;
|
||||
if (dx) angle = (int)(atan2(dy,dx) * 1800 / M_PI);
|
||||
else { angle = 900; if (dy < 0) angle = -900; }
|
||||
if( dx )
|
||||
angle = (int) (atan2( dy, dx ) * 1800 / M_PI);
|
||||
else
|
||||
{
|
||||
angle = 900; if( dy < 0 )
|
||||
angle = -900;
|
||||
}
|
||||
|
||||
RotatePoint( &dx, &dy, angle ); /* dx = longueur, dy = 0 */
|
||||
for( col = col_min; col <= col_max; col++ )
|
||||
|
@ -582,10 +708,11 @@ int cx, cy, dx, dy;
|
|||
cy = (row * g_GridRoutingSize) - uy0;
|
||||
cx = cxr;
|
||||
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
|
||||
selon l'axe X doit etre testee */
|
||||
* selon l'axe X doit etre testee */
|
||||
if( (cx >= 0) && (cx <= dx) )
|
||||
{
|
||||
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,
|
||||
int color, int op_logique )
|
||||
/********************************************************************/
|
||||
|
||||
/* Draw a horizontal or vertical segment.
|
||||
same as DrawSegmentQcq, but faster
|
||||
* same as DrawSegmentQcq, but faster
|
||||
*/
|
||||
{
|
||||
int row, col;
|
||||
int row_max, col_max, row_min, col_min;
|
||||
|
||||
void (*WriteCell)( int, int, int, BoardCell );
|
||||
|
||||
switch( op_logique )
|
||||
{
|
||||
default:
|
||||
case WRITE_CELL: WriteCell = SetCell; break;
|
||||
case WRITE_OR_CELL: WriteCell = OrCell; break;
|
||||
case WRITE_XOR_CELL: WriteCell = XorCell; break;
|
||||
case WRITE_AND_CELL: WriteCell = AndCell; break;
|
||||
case WRITE_ADD_CELL: WriteCell = AddCell; break;
|
||||
case WRITE_CELL:
|
||||
WriteCell = SetCell; break;
|
||||
|
||||
case WRITE_OR_CELL:
|
||||
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
|
||||
if( uy1 < uy0 ) EXCHG(uy0,uy1) ; // ceci n'est vrai que parce que
|
||||
if( ux1 < ux0 ) EXCHG(ux0,ux1) ; // dx ou dy ou les 2 sonts nuls
|
||||
if( uy1 < uy0 )
|
||||
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.
|
||||
// TODO: traiter correctement les extremites arrondies
|
||||
|
@ -640,6 +781,7 @@ void (*WriteCell)(int,int,int,BoardCell);
|
|||
{
|
||||
ux0 -= demi_largeur; ux1 += demi_largeur;
|
||||
}
|
||||
|
||||
// else // Horizontal segment
|
||||
{
|
||||
uy0 -= demi_largeur; uy1 += demi_largeur;
|
||||
|
@ -650,18 +792,26 @@ void (*WriteCell)(int,int,int,BoardCell);
|
|||
col_max = ux1 / 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;
|
||||
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_max >= (Nrows-1)) row_max = Nrows-1;
|
||||
if( col_min < 0 ) col_min = 0;
|
||||
if( col_max >= (Ncols-1)) col_max = Ncols-1;
|
||||
if( row_min < 0 )
|
||||
row_min = 0;
|
||||
if( row_max >= (Nrows - 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( col_min > col_max ) col_max = col_min;
|
||||
if( row_min > row_max )
|
||||
row_max = row_min;
|
||||
if( col_min > col_max )
|
||||
col_max = col_min;
|
||||
|
||||
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,
|
||||
int color, int op_logique )
|
||||
/*****************************************************************/
|
||||
|
||||
/* 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 .
|
||||
coord en unites PCB (0.1 mil) relatives a l'origine pt_pcb->m_PcbBox.m_Xmin,Y du board.
|
||||
* 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.
|
||||
*/
|
||||
{
|
||||
int rayon, nb_segm;
|
||||
|
@ -690,10 +842,13 @@ int angle;
|
|||
rayon = (int) hypot( (double) (ux1 - ux0), (double) (uy1 - uy0) );
|
||||
|
||||
x0 = x1 = rayon; y0 = y1 = 0;
|
||||
if( lg < 1 ) lg = 1;
|
||||
if( lg < 1 )
|
||||
lg = 1;
|
||||
nb_segm = (2 * rayon) / lg;
|
||||
if(nb_segm < 5) nb_segm = 5;
|
||||
if(nb_segm > 100) nb_segm = 100;
|
||||
if( nb_segm < 5 )
|
||||
nb_segm = 5;
|
||||
if( nb_segm > 100 )
|
||||
nb_segm = 100;
|
||||
for( ii = 1; ii < nb_segm; ii++ )
|
||||
{
|
||||
angle = (3600 * ii) / nb_segm;
|
||||
|
@ -706,15 +861,16 @@ int angle;
|
|||
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,
|
||||
int color, int op_logique )
|
||||
/****************************************************************************/
|
||||
|
||||
/* 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 .
|
||||
coord en unites PCB (0.1 mil) relatives a l'origine
|
||||
pt_pcb->m_PcbBox.m_Xmin,Y du board.
|
||||
* 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
|
||||
* pt_pcb->m_PcbBox.m_Xmin,Y du board.
|
||||
*/
|
||||
{
|
||||
int rayon, nb_segm;
|
||||
|
@ -729,19 +885,25 @@ int angle, StAngle;
|
|||
x0 = ux1 - ux0;
|
||||
y0 = uy1 - uy0;
|
||||
StAngle = ArcTangente( uy1 - uy0, ux1 - ux0 );
|
||||
if( lg < 1 ) lg = 1;
|
||||
if( lg < 1 )
|
||||
lg = 1;
|
||||
nb_segm = (2 * rayon) / lg;
|
||||
nb_segm = ( nb_segm * abs( ArcAngle ) ) / 3600;
|
||||
if(nb_segm < 5) nb_segm = 5;
|
||||
if(nb_segm > 100) nb_segm = 100;
|
||||
if( nb_segm < 5 )
|
||||
nb_segm = 5;
|
||||
if( nb_segm > 100 )
|
||||
nb_segm = 100;
|
||||
|
||||
for( ii = 1; ii <= nb_segm; ii++ )
|
||||
{
|
||||
angle = (ArcAngle * ii) / nb_segm;
|
||||
angle += StAngle;
|
||||
|
||||
while ( angle >= 3600 ) angle -= 3600;
|
||||
while ( angle < 0 ) angle += 3600;
|
||||
while( angle >= 3600 )
|
||||
angle -= 3600;
|
||||
|
||||
while( angle < 0 )
|
||||
angle += 3600;
|
||||
|
||||
x1 = (int) (rayon * fcosinus[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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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 )
|
||||
/*****************************************************************************/
|
||||
{
|
||||
EDA_BaseStruct* PtStruct, * PtNext;
|
||||
BOARD_ITEM* PtStruct;
|
||||
BOARD_ITEM* PtNext;
|
||||
int masque_layer = (~EDGE_LAYER) & 0x1FFF0000;
|
||||
|
||||
if( is_edges )
|
||||
|
@ -244,30 +245,18 @@ void WinEDA_PcbFrame::Erase_Segments_Pcb( wxDC* DC, bool is_edges, bool query )
|
|||
return;
|
||||
}
|
||||
|
||||
PtStruct = (EDA_BaseStruct*) m_Pcb->m_Drawings;
|
||||
PtStruct = m_Pcb->m_Drawings;
|
||||
for( ; PtStruct != NULL; PtStruct = PtNext )
|
||||
{
|
||||
PtNext = PtStruct->Pnext;
|
||||
PtNext = PtStruct->Next();
|
||||
|
||||
switch( PtStruct->m_StructType )
|
||||
{
|
||||
case TYPEDRAWSEGMENT:
|
||||
if( g_TabOneLayerMask[( (DRAWSEGMENT*) PtStruct )->m_Layer] & masque_layer )
|
||||
DeleteStructure( PtStruct );
|
||||
break;
|
||||
|
||||
case TYPETEXTE:
|
||||
if( g_TabOneLayerMask[( (TEXTE_PCB*) PtStruct )->m_Layer] & masque_layer )
|
||||
DeleteStructure( PtStruct );
|
||||
break;
|
||||
|
||||
case TYPECOTATION:
|
||||
if( g_TabOneLayerMask[( (COTATION*) PtStruct )->m_Layer] & masque_layer )
|
||||
DeleteStructure( PtStruct );
|
||||
break;
|
||||
|
||||
case TYPEMIRE:
|
||||
if( g_TabOneLayerMask[( (MIREPCB*) PtStruct )->m_Layer] & masque_layer )
|
||||
if( g_TabOneLayerMask[ PtStruct->GetLayer()] & masque_layer )
|
||||
DeleteStructure( PtStruct );
|
||||
break;
|
||||
|
||||
|
|
|
@ -154,7 +154,8 @@ int WinEDA_BasePcbFrame::ReadListeSegmentDescr( wxDC* DC, FILE* File,
|
|||
&PtSegm->m_TimeStamp, &flags );
|
||||
if( type == 1 )
|
||||
PtSegm->m_StructType = TYPEVIA;
|
||||
PtSegm->m_Layer = layer;
|
||||
|
||||
PtSegm->SetLayer( layer );
|
||||
PtSegm->m_NetCode = net_code; PtSegm->SetState( flags, ON );
|
||||
#ifdef PCBNEW
|
||||
PtSegm->Draw( DrawPanel, DC, GR_OR );
|
||||
|
@ -249,7 +250,7 @@ int WinEDA_BasePcbFrame::ReadGeneralDescrPcb( wxDC* DC, FILE* File, int* LineNum
|
|||
screensize = DrawPanel->GetClientSize();
|
||||
ii = pcbsize.x / screensize.x;
|
||||
jj = pcbsize.y / screensize.y;
|
||||
bestzoom = max( ii, jj );
|
||||
bestzoom = MAX( ii, jj );
|
||||
screen->m_Curseur = m_Pcb->m_BoundaryBox.Centre();
|
||||
|
||||
screen->SetZoom( bestzoom );
|
||||
|
@ -779,7 +780,7 @@ int WinEDA_PcbFrame::ReadPcbFile( wxDC* DC, FILE* File, bool Append )
|
|||
char Line[1024];
|
||||
int LineNum = 0;
|
||||
int nbsegm, nbmod;
|
||||
EDA_BaseStruct* LastStructPcb = NULL, * StructPcb;
|
||||
BOARD_ITEM* LastStructPcb = NULL, * StructPcb;
|
||||
MODULE* LastModule = NULL, * Module;
|
||||
EQUIPOT* LastEquipot = NULL, * Equipot;
|
||||
|
||||
|
@ -803,7 +804,7 @@ int WinEDA_PcbFrame::ReadPcbFile( wxDC* DC, FILE* File, bool Append )
|
|||
}
|
||||
|
||||
LastStructPcb = m_Pcb->m_Drawings;
|
||||
for( ; LastStructPcb != NULL; LastStructPcb = LastStructPcb->Pnext )
|
||||
for( ; LastStructPcb != NULL; LastStructPcb = LastStructPcb->Next() )
|
||||
{
|
||||
if( LastStructPcb->Pnext == NULL )
|
||||
break;
|
||||
|
@ -901,7 +902,7 @@ int WinEDA_PcbFrame::ReadPcbFile( wxDC* DC, FILE* File, bool Append )
|
|||
if( strnicmp( Line, "$TEXTPCB", 8 ) == 0 )
|
||||
{
|
||||
TEXTE_PCB* pcbtxt = new TEXTE_PCB( m_Pcb );
|
||||
StructPcb = (EDA_BaseStruct*) pcbtxt;
|
||||
StructPcb = pcbtxt;
|
||||
pcbtxt->ReadTextePcbDescr( File, &LineNum );
|
||||
if( LastStructPcb == NULL )
|
||||
{
|
||||
|
|
|
@ -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 )
|
||||
/**********************************************************************************/
|
||||
|
||||
/* Used to print the board.
|
||||
Draw the board, but only layers allowed by printmasklayer
|
||||
( printmasklayer is a 32 bits mask: bit n = 1 -> layer n is printed)
|
||||
* Draw the board, but only layers allowed by printmasklayer
|
||||
* ( printmasklayer is a 32 bits mask: bit n = 1 -> layer n is printed)
|
||||
*/
|
||||
{
|
||||
MODULE* Module;
|
||||
EDA_BaseStruct * PtStruct;
|
||||
BOARD_ITEM* PtStruct;
|
||||
int drawmode = GR_COPY;
|
||||
DISPLAY_OPTIONS save_opt;
|
||||
TRACK* pt_piste;
|
||||
|
@ -36,8 +37,10 @@ WinEDA_BasePcbFrame * frame = (WinEDA_BasePcbFrame *) m_Parent;
|
|||
BOARD* Pcb = frame->m_Pcb;
|
||||
|
||||
save_opt = DisplayOpt;
|
||||
if( printmasklayer & ALL_CU_LAYERS ) DisplayOpt.DisplayPadFill = FILLED;
|
||||
else DisplayOpt.DisplayPadFill = SKETCH;
|
||||
if( printmasklayer & ALL_CU_LAYERS )
|
||||
DisplayOpt.DisplayPadFill = FILLED;
|
||||
else
|
||||
DisplayOpt.DisplayPadFill = SKETCH;
|
||||
frame->m_DisplayPadFill = DisplayOpt.DisplayPadFill;
|
||||
frame->m_DisplayPadNum = DisplayOpt.DisplayPadNum = FALSE;
|
||||
DisplayOpt.DisplayPadNoConn = FALSE;
|
||||
|
@ -53,39 +56,41 @@ BOARD * Pcb = frame->m_Pcb;
|
|||
|
||||
/* Draw the pcb graphic items (texts, ...) */
|
||||
PtStruct = Pcb->m_Drawings;
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext )
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
|
||||
{
|
||||
switch( PtStruct->m_StructType )
|
||||
{
|
||||
case TYPEDRAWSEGMENT:
|
||||
if( (g_TabOneLayerMask[((DRAWSEGMENT*)PtStruct)->m_Layer] & printmasklayer) == 0 )
|
||||
if( (g_TabOneLayerMask[ PtStruct->GetLayer()] & printmasklayer) == 0 )
|
||||
break;
|
||||
Trace_DrawSegmentPcb( this, DC, (DRAWSEGMENT*) PtStruct, drawmode );
|
||||
break;
|
||||
|
||||
case TYPECOTATION:
|
||||
if( (g_TabOneLayerMask[((COTATION*)PtStruct)->m_Layer] & printmasklayer) == 0 )
|
||||
if( (g_TabOneLayerMask[ PtStruct->GetLayer()] & printmasklayer) == 0 )
|
||||
break;
|
||||
( (COTATION*) PtStruct )->Draw( this, DC, wxPoint( 0, 0 ), drawmode );
|
||||
break;
|
||||
|
||||
case TYPETEXTE:
|
||||
{
|
||||
if( (g_TabOneLayerMask[((TEXTE_PCB *)PtStruct)->m_Layer] & printmasklayer) == 0 )
|
||||
if( (g_TabOneLayerMask[ PtStruct->GetLayer()] & printmasklayer) == 0 )
|
||||
break;
|
||||
( (TEXTE_PCB*) PtStruct )->Draw( this, DC, wxPoint( 0, 0 ), drawmode );
|
||||
break;
|
||||
}
|
||||
|
||||
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 );
|
||||
break;
|
||||
|
||||
case TYPEMARQUEUR: /* Trace des marqueurs */
|
||||
break;
|
||||
|
||||
default: break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -93,7 +98,8 @@ BOARD * Pcb = frame->m_Pcb;
|
|||
pt_piste = Pcb->m_Track;
|
||||
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 */
|
||||
{
|
||||
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,
|
||||
rayon, 0, color, color );
|
||||
}
|
||||
else pt_piste->Draw(this, DC, drawmode);
|
||||
else
|
||||
pt_piste->Draw( this, DC, drawmode );
|
||||
}
|
||||
|
||||
pt_piste = Pcb->m_Zone;
|
||||
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 );
|
||||
}
|
||||
|
||||
|
@ -126,7 +134,8 @@ BOARD * Pcb = frame->m_Pcb;
|
|||
int color = WHITE;
|
||||
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 */
|
||||
{
|
||||
GRSetDrawMode( DC, drawmode );
|
||||
|
@ -159,22 +168,28 @@ int mlayer;
|
|||
pt_pad = Module->m_Pads;
|
||||
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 );
|
||||
}
|
||||
|
||||
/* draw footprint graphic shapes */
|
||||
PtStruct = Module->m_Drawings;
|
||||
mlayer = g_TabOneLayerMask[Module->m_Layer];
|
||||
if( Module->m_Layer == CUIVRE_N) mlayer = SILKSCREEN_LAYER_CU;
|
||||
if( Module->m_Layer == CMP_N) mlayer = SILKSCREEN_LAYER_CMP;
|
||||
mlayer = g_TabOneLayerMask[Module->GetLayer()];
|
||||
if( Module->GetLayer() == CUIVRE_N )
|
||||
mlayer = SILKSCREEN_LAYER_CU;
|
||||
else if( Module->GetLayer() == CMP_N )
|
||||
mlayer = SILKSCREEN_LAYER_CMP;
|
||||
|
||||
if( mlayer & masklayer )
|
||||
{
|
||||
/* Analyse des autorisations de trace pour les textes VALEUR et REF */
|
||||
bool trace_val, trace_ref;
|
||||
trace_val = trace_ref = TRUE; // les 2 autorisations de tracer sont donnees
|
||||
if(Module->m_Reference->m_NoShow) trace_ref = FALSE;
|
||||
if(Module->m_Value->m_NoShow) trace_val = FALSE;
|
||||
if( Module->m_Reference->m_NoShow )
|
||||
trace_ref = FALSE;
|
||||
if( Module->m_Value->m_NoShow )
|
||||
trace_val = FALSE;
|
||||
|
||||
if( trace_ref )
|
||||
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 );
|
||||
}
|
||||
|
||||
for( ;PtStruct != NULL; PtStruct = PtStruct->Pnext )
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
|
||||
{
|
||||
switch( PtStruct->m_StructType )
|
||||
{
|
||||
case TYPETEXTEMODULE:
|
||||
if( (mlayer & masklayer ) == 0) break;
|
||||
if( (mlayer & masklayer ) == 0 )
|
||||
break;
|
||||
|
||||
TextMod = (TEXTE_MODULE*) PtStruct;
|
||||
TextMod->Draw( panel, DC, wxPoint( 0, 0 ), draw_mode );
|
||||
|
@ -196,13 +212,14 @@ int mlayer;
|
|||
case TYPEEDGEMODULE:
|
||||
{
|
||||
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 );
|
||||
break;
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
Place_Module( Module, NULL );
|
||||
if( Module->m_Layer != CMP_N )
|
||||
if( Module->GetLayer() != CMP_N )
|
||||
Change_Side_Module( Module, NULL );
|
||||
Rotate_Module( NULL, Module, 0, FALSE );
|
||||
m_CurrentScreen->ClrModify();
|
||||
|
|
|
@ -169,7 +169,7 @@ EDA_BaseStruct* WinEDA_BasePcbFrame::Locate( int typeloc, int LayerSearch )
|
|||
MODULE* module = m_Pcb->m_Modules;
|
||||
for( ; module != NULL; module = (MODULE*) module->Pnext )
|
||||
{
|
||||
if( module->m_Layer != LayerSearch )
|
||||
if( module->GetLayer() != LayerSearch )
|
||||
continue;
|
||||
|
||||
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;
|
||||
wxPoint ref_pos;
|
||||
|
||||
masque_layer = g_TabOneLayerMask[ptr_piste->m_Layer];
|
||||
masque_layer = g_TabOneLayerMask[ptr_piste->GetLayer()];
|
||||
if( extr == 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;
|
||||
|
||||
if( (pts->m_Layer != LayerSearch) && (LayerSearch != -1) )
|
||||
if( (pts->GetLayer() != LayerSearch) && (LayerSearch != -1) )
|
||||
continue;
|
||||
|
||||
if( pts->HitTest( ref_pos ) )
|
||||
{
|
||||
// return this hit if layer matches, else remember in
|
||||
// case no layer match is found.
|
||||
if( pts->m_Layer == screen->m_Active_Layer )
|
||||
if( pts->GetLayer() == screen->m_Active_Layer )
|
||||
return pts;
|
||||
|
||||
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(int ref_pos, bool OnlyCurrentLayer)
|
||||
* D_PAD * Locate_Any_Pad( BOARD* Pcb, int typeloc, 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
|
||||
* est sur couche serigr,adhesive cuivre, a la couche cmp si le module
|
||||
* est sur couche serigr,adhesive composant */
|
||||
layer = pt_module->m_Layer;
|
||||
layer = pt_module->GetLayer();
|
||||
|
||||
if( layer==ADHESIVE_N_CU || layer==SILKSCREEN_N_CU )
|
||||
layer = CUIVRE_N;
|
||||
|
@ -538,21 +538,21 @@ MODULE* Locate_Prefered_Module( BOARD* Pcb, int typeloc )
|
|||
|
||||
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 */
|
||||
module = pt_module;
|
||||
min_dim = min( lx, ly );
|
||||
min_dim = MIN( lx, ly );
|
||||
}
|
||||
}
|
||||
else if( !(typeloc & MATCH_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 */
|
||||
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 )
|
||||
{
|
||||
int layer = module->m_Layer;
|
||||
int layer = module->GetLayer();
|
||||
if( layer==ADHESIVE_N_CU || layer==SILKSCREEN_N_CU )
|
||||
layer = CUIVRE_N;
|
||||
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 ) )
|
||||
continue;
|
||||
|
||||
if( (g_DesignSettings.m_LayerColor[Track->m_Layer] & ITEM_NOT_SHOW) )
|
||||
if( (g_DesignSettings.m_LayerColor[Track->GetLayer()] & ITEM_NOT_SHOW) )
|
||||
continue;
|
||||
|
||||
if( Track->m_StructType == TYPEVIA ) /* VIA rencontree */
|
||||
|
@ -828,7 +828,7 @@ TRACK* Locate_Pistes( TRACK* start_adresse, const wxPoint& ref_pos, int MasqueLa
|
|||
else
|
||||
{
|
||||
if( MasqueLayer != -1 )
|
||||
if( (g_TabOneLayerMask[Track->m_Layer] & MasqueLayer) == 0 )
|
||||
if( (g_TabOneLayerMask[Track->GetLayer()] & MasqueLayer) == 0 )
|
||||
continue; /* Segments sur couches differentes */
|
||||
|
||||
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 )
|
||||
{
|
||||
if( (layer != -1) && (Zone->m_Layer != layer) )
|
||||
if( (layer != -1) && (Zone->GetLayer() != layer) )
|
||||
continue;
|
||||
|
||||
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;
|
||||
|
||||
if( pt_txt_pcb->m_Layer == LayerSearch )
|
||||
if( pt_txt_pcb->GetLayer() == LayerSearch )
|
||||
{
|
||||
if( pt_txt_pcb->HitTest( ref ) )
|
||||
{
|
||||
|
@ -1048,7 +1048,7 @@ EDA_BaseStruct* Locate_MirePcb( EDA_BaseStruct* PtStruct, int LayerSearch,
|
|||
continue;
|
||||
|
||||
item = (MIREPCB*) PtStruct;
|
||||
if( LayerSearch != -1 && item->m_Layer != LayerSearch )
|
||||
if( LayerSearch != -1 && item->GetLayer() != LayerSearch )
|
||||
continue;
|
||||
|
||||
if( item->HitTest( ref_pos ) )
|
||||
|
|
|
@ -101,7 +101,8 @@ OBJECTS= $(TARGET).o classpcb.o\
|
|||
gen_modules_placefile.o\
|
||||
modedit.o\
|
||||
export_gencad.o\
|
||||
hotkeys.o
|
||||
hotkeys.o \
|
||||
collectors.o
|
||||
|
||||
setpage.o: ../share/setpage.cpp
|
||||
$(CC) -c $(EDACPPFLAGS) -o $@ ../share/$*.cpp
|
||||
|
@ -289,3 +290,4 @@ dragsegm.o: dragsegm.cpp drag.h $(COMMON)
|
|||
|
||||
router.o: router.cpp $(COMMON)
|
||||
|
||||
collectors.o: collectors.cpp collectors.h $(COMMON)
|
||||
|
|
|
@ -218,7 +218,7 @@ MIREPCB* WinEDA_PcbFrame::Create_Mire( wxDC* DC )
|
|||
m_Pcb->m_Drawings->Pback = MirePcb;
|
||||
m_Pcb->m_Drawings = MirePcb;
|
||||
|
||||
MirePcb->m_Layer = EDGE_N;
|
||||
MirePcb->SetLayer( EDGE_N );
|
||||
MirePcb->m_Width = g_DesignSettings.m_EdgeSegmentWidth;
|
||||
MirePcb->m_Size = MireDefaultSize;
|
||||
MirePcb->m_Pos = GetScreen()->m_Curseur;
|
||||
|
|
|
@ -104,7 +104,7 @@ void WinEDA_PcbFrame::StartMove_Module( MODULE* module, wxDC* DC )
|
|||
m_Pcb->m_Status_Pcb &= ~CHEVELU_LOCAL_OK;
|
||||
module->m_Flags |= IS_MOVED;
|
||||
ModuleInitOrient = module->m_Orient;
|
||||
ModuleInitLayer = module->m_Layer;
|
||||
ModuleInitLayer = module->GetLayer();
|
||||
|
||||
/* Effacement chevelu general si necessaire */
|
||||
if( g_Show_Ratsnest )
|
||||
|
@ -192,7 +192,7 @@ void Exit_Module( WinEDA_DrawPanel* Panel, wxDC* DC )
|
|||
{
|
||||
if( ModuleInitOrient != module->m_Orient )
|
||||
pcbframe->Rotate_Module( NULL, module, ModuleInitOrient, FALSE );
|
||||
if( ModuleInitLayer != module->m_Layer )
|
||||
if( ModuleInitLayer != module->GetLayer() )
|
||||
pcbframe->Change_Side_Module( module, NULL );
|
||||
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 )
|
||||
return;
|
||||
if( (Module->m_Layer != CMP_N) && (Module->m_Layer != CUIVRE_N) )
|
||||
if( (Module->GetLayer() != CMP_N) && (Module->GetLayer() != CUIVRE_N) )
|
||||
return;
|
||||
|
||||
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 */
|
||||
Module->m_Layer = ChangeSideNumLayer( Module->m_Layer );
|
||||
Module->SetLayer( ChangeSideNumLayer( Module->GetLayer() ) );
|
||||
|
||||
/* Inversion miroir de l'orientation */
|
||||
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_Miroir = 1;
|
||||
NEGATE_AND_NORMALIZE_ANGLE_POS( pt_texte->m_Orient );
|
||||
pt_texte->m_Layer = Module->m_Layer;
|
||||
pt_texte->m_Layer = ChangeSideNumLayer( pt_texte->m_Layer );
|
||||
pt_texte->SetLayer( Module->GetLayer() );
|
||||
pt_texte->SetLayer( ChangeSideNumLayer( pt_texte->GetLayer() ) );
|
||||
|
||||
if( Module->m_Layer == CUIVRE_N )
|
||||
pt_texte->m_Layer = SILKSCREEN_N_CU;
|
||||
if( Module->GetLayer() == CUIVRE_N )
|
||||
pt_texte->SetLayer( SILKSCREEN_N_CU );
|
||||
|
||||
if( Module->m_Layer == CMP_N )
|
||||
pt_texte->m_Layer = SILKSCREEN_N_CMP;
|
||||
if( Module->GetLayer() == CMP_N )
|
||||
pt_texte->SetLayer( SILKSCREEN_N_CMP );
|
||||
|
||||
if( (Module->m_Layer == SILKSCREEN_N_CU)
|
||||
|| (Module->m_Layer == ADHESIVE_N_CU) || (Module->m_Layer == CUIVRE_N) )
|
||||
if( (Module->GetLayer() == SILKSCREEN_N_CU)
|
||||
|| (Module->GetLayer() == ADHESIVE_N_CU) || (Module->GetLayer() == CUIVRE_N) )
|
||||
pt_texte->m_Miroir = 0;
|
||||
|
||||
/* 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_Miroir = 1;
|
||||
NEGATE_AND_NORMALIZE_ANGLE_POS( pt_texte->m_Orient );
|
||||
pt_texte->m_Layer = Module->m_Layer;
|
||||
pt_texte->m_Layer = ChangeSideNumLayer( pt_texte->m_Layer );
|
||||
pt_texte->SetLayer( Module->GetLayer() );
|
||||
pt_texte->SetLayer( ChangeSideNumLayer( pt_texte->GetLayer() ) );
|
||||
|
||||
if( Module->m_Layer == CUIVRE_N )
|
||||
pt_texte->m_Layer = SILKSCREEN_N_CU;
|
||||
if( Module->GetLayer() == CUIVRE_N )
|
||||
pt_texte->SetLayer( SILKSCREEN_N_CU );
|
||||
|
||||
if( Module->m_Layer == CMP_N )
|
||||
pt_texte->m_Layer = SILKSCREEN_N_CMP;
|
||||
if( Module->GetLayer() == CMP_N )
|
||||
pt_texte->SetLayer( SILKSCREEN_N_CMP );
|
||||
|
||||
if( (Module->m_Layer == SILKSCREEN_N_CU)
|
||||
|| (Module->m_Layer == ADHESIVE_N_CU) || (Module->m_Layer == CUIVRE_N) )
|
||||
if( (Module->GetLayer() == SILKSCREEN_N_CU)
|
||||
|| (Module->GetLayer() == ADHESIVE_N_CU) || (Module->GetLayer() == CUIVRE_N) )
|
||||
pt_texte->m_Miroir = 0;
|
||||
|
||||
/* 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_Layer = ChangeSideNumLayer( pt_edgmod->m_Layer );
|
||||
pt_edgmod->SetLayer( ChangeSideNumLayer( pt_edgmod->GetLayer() ) );
|
||||
break;
|
||||
|
||||
case TYPETEXTEMODULE:
|
||||
|
@ -466,18 +466,21 @@ void WinEDA_BasePcbFrame::Change_Side_Module( MODULE* Module, wxDC* DC )
|
|||
pt_texte->m_Miroir = 1;
|
||||
NEGATE_AND_NORMALIZE_ANGLE_POS( pt_texte->m_Orient );
|
||||
|
||||
pt_texte->m_Layer = Module->m_Layer;
|
||||
pt_texte->m_Layer = ChangeSideNumLayer( pt_texte->m_Layer );
|
||||
pt_texte->SetLayer( Module->GetLayer() );
|
||||
pt_texte->SetLayer( ChangeSideNumLayer( pt_texte->GetLayer() ) );
|
||||
|
||||
if( Module->m_Layer == CUIVRE_N )
|
||||
pt_texte->m_Layer = SILKSCREEN_N_CU;
|
||||
if( Module->GetLayer() == CUIVRE_N )
|
||||
pt_texte->SetLayer( SILKSCREEN_N_CU );
|
||||
|
||||
if( Module->m_Layer == CMP_N )
|
||||
pt_texte->m_Layer = SILKSCREEN_N_CMP;
|
||||
if( Module->GetLayer() == CMP_N )
|
||||
pt_texte->SetLayer( SILKSCREEN_N_CMP );
|
||||
|
||||
if( (Module->m_Layer == SILKSCREEN_N_CU)
|
||||
|| (Module->m_Layer == ADHESIVE_N_CU) || (Module->m_Layer == CUIVRE_N) )
|
||||
if( Module->GetLayer() == SILKSCREEN_N_CU
|
||||
|| Module->GetLayer() == ADHESIVE_N_CU
|
||||
|| Module->GetLayer() == CUIVRE_N )
|
||||
{
|
||||
pt_texte->m_Miroir = 0;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
|
|
|
@ -815,7 +815,7 @@ bool WinEDA_PcbFrame::PlaceDraggedTrackSegment( TRACK* Track, wxDC* DC )
|
|||
|
||||
/* Test the connections modified by the move
|
||||
* (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->end = Fast_Locate_Pad_Connecte( m_Pcb, Track->m_End, masque_layer );
|
||||
}
|
||||
|
|
|
@ -243,7 +243,7 @@ MODULE* WinEDA_PcbFrame::Create_MuWaveComponent( wxDC* DC, int shape_type )
|
|||
Module->m_Drawings = edge;
|
||||
edge->Pback = Module;
|
||||
edge->m_Shape = S_POLYGON;
|
||||
edge->m_Layer = LAYER_CMP_N;
|
||||
edge->SetLayer( LAYER_CMP_N );
|
||||
edge->m_PolyCount = ii + 3;
|
||||
edge->m_PolyList = (int*) MyMalloc( edge->m_PolyCount * 2 * sizeof(int) );
|
||||
ptr = edge->m_PolyList;
|
||||
|
@ -574,7 +574,7 @@ MODULE* WinEDA_PcbFrame::Create_MuWavePolygonShape( wxDC* DC )
|
|||
Module->m_Drawings = edge;
|
||||
edge->Pback = Module;
|
||||
edge->m_Shape = S_POLYGON;
|
||||
edge->m_Layer = LAYER_CMP_N;
|
||||
edge->SetLayer( LAYER_CMP_N );
|
||||
npoints = PolyEdgesCount;
|
||||
|
||||
switch( PolyShapeType )
|
||||
|
|
|
@ -120,9 +120,7 @@ bool Read_Hotkey_Config( WinEDA_DrawFrame * frame, bool verbose )
|
|||
FullFileName = DEFAULT_HOTKEY_FILENAME_PATH;
|
||||
FullFileName += wxT("module_edit");
|
||||
FullFileName += DEFAULT_HOTKEY_FILENAME_EXT;
|
||||
frame->ReadHotkeyConfigFile(FullFileName, s_module_edit_Hotkey_List, verbose);
|
||||
|
||||
return TRUE;
|
||||
return frame->ReadHotkeyConfigFile(FullFileName, s_module_edit_Hotkey_List, verbose);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "id.h"
|
||||
|
||||
#if defined(DEBUG)
|
||||
#include "class_collector.h"
|
||||
#include "collectors.h"
|
||||
#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;
|
||||
|
||||
#if defined(DEBUG)
|
||||
m_GeneralCollector = NULL;
|
||||
m_RatsModuleCollector = NULL;
|
||||
m_ArrowCollector = new ARROWCOLLECTOR();
|
||||
#endif
|
||||
|
||||
m_DisplayPcbTrackFill = DisplayOpt.DisplayPcbTrackFill;
|
||||
|
@ -313,6 +241,10 @@ WinEDA_PcbFrame::~WinEDA_PcbFrame( void )
|
|||
{
|
||||
m_Parent->m_PcbFrame = NULL;
|
||||
m_CurrentScreen = ScreenPcb;
|
||||
|
||||
#if defined(DEBUG)
|
||||
delete m_ArrowCollector;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -148,7 +148,7 @@ WinEDA_TextPCBPropertiesFrame::WinEDA_TextPCBPropertiesFrame( WinEDA_PcbFrame* p
|
|||
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" ) };
|
||||
|
@ -216,7 +216,7 @@ void WinEDA_TextPCBPropertiesFrame::TextPCBPropertiesAccept( wxCommandEvent& eve
|
|||
CurrentTextPCB->m_Width = m_TxtWidthCtlr->GetValue();
|
||||
CurrentTextPCB->m_Miroir = (m_Mirror->GetSelection() == 0) ? 1 : 0;
|
||||
CurrentTextPCB->m_Orient = m_Orient->GetSelection() * 900;
|
||||
CurrentTextPCB->m_Layer = m_SelLayerBox->GetChoice();
|
||||
CurrentTextPCB->SetLayer( m_SelLayerBox->GetChoice() );
|
||||
CurrentTextPCB->CreateDrawData();
|
||||
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;
|
||||
if( m_Pcb->m_Drawings )
|
||||
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 */
|
||||
TextePcb->m_Flags = IS_NEW;
|
||||
TextePcb->m_Layer = GetScreen()->m_Active_Layer;
|
||||
TextePcb->SetLayer( GetScreen()->m_Active_Layer );
|
||||
TextePcb->m_Miroir = 1;
|
||||
if( TextePcb->m_Layer == CUIVRE_N )
|
||||
if( TextePcb->GetLayer() == CUIVRE_N )
|
||||
TextePcb->m_Miroir = 0;
|
||||
|
||||
TextePcb->m_Size = g_DesignSettings.m_PcbTextSize;
|
||||
|
|
|
@ -203,12 +203,12 @@ wxString msg;
|
|||
trace_val = Sel_Texte_Valeur;
|
||||
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;
|
||||
if(Module->m_Reference->m_NoShow && !Sel_Texte_Invisible)
|
||||
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;
|
||||
if(Module->m_Value->m_NoShow && !Sel_Texte_Invisible)
|
||||
trace_val = FALSE;
|
||||
|
@ -238,7 +238,7 @@ wxString msg;
|
|||
if( !Sel_Texte_Divers ) continue;
|
||||
if( (pt_texte->m_NoShow) && !Sel_Texte_Invisible )
|
||||
continue;
|
||||
if( (g_TabOneLayerMask[pt_texte->m_Layer] & masque_layer) == 0)
|
||||
if( (g_TabOneLayerMask[pt_texte->GetLayer()] & masque_layer) == 0)
|
||||
continue;
|
||||
PlotTextModule(pt_texte);
|
||||
nb_items++ ;
|
||||
|
@ -281,13 +281,13 @@ void PlotCotation( COTATION * Cotation, int format_plot,int masque_layer)
|
|||
{
|
||||
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);
|
||||
|
||||
masque_layer |= EDGE_LAYER;
|
||||
DrawTmp->m_Width = Cotation->m_Width;
|
||||
DrawTmp->m_Layer = Cotation->m_Layer;
|
||||
DrawTmp->SetLayer( Cotation->GetLayer() );
|
||||
|
||||
PlotTextePcb( Cotation->m_Text,format_plot, masque_layer);
|
||||
|
||||
|
@ -330,13 +330,13 @@ void PlotMirePcb( MIREPCB* Mire, int format_plot,int masque_layer)
|
|||
DRAWSEGMENT *DrawTmp;
|
||||
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);
|
||||
|
||||
masque_layer |= EDGE_LAYER;
|
||||
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_End.x = DrawTmp->m_Start.x + (Mire->m_Size / 4);
|
||||
|
@ -384,7 +384,7 @@ wxString msg;
|
|||
for ( ;PtEdge != NULL; PtEdge = (EDGE_MODULE*)PtEdge->Pnext)
|
||||
{
|
||||
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);
|
||||
}
|
||||
/* Affichage du nombre de modules traites */
|
||||
|
@ -488,7 +488,7 @@ wxPoint pos;
|
|||
wxSize size;
|
||||
|
||||
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 :*/
|
||||
size = pt_texte->m_Size;
|
||||
|
@ -615,7 +615,7 @@ wxPoint start, end;
|
|||
int epaisseur;
|
||||
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;
|
||||
if ( Plot_Mode == FILAIRE) epaisseur = g_PlotLine_Width;
|
||||
|
|
|
@ -194,7 +194,7 @@ wxString msg;
|
|||
switch( PtStruct->m_StructType )
|
||||
{
|
||||
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);
|
||||
break;
|
||||
|
||||
|
@ -289,7 +289,7 @@ wxString msg;
|
|||
wxPoint end;
|
||||
|
||||
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;
|
||||
pos = track->m_Start; end = track->m_End;
|
||||
|
@ -308,7 +308,7 @@ wxString msg;
|
|||
{
|
||||
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;
|
||||
pos = track->m_Start; end = track->m_End;
|
||||
|
|
|
@ -52,9 +52,11 @@ bool Center = FALSE;
|
|||
pen_rayon = pen_diam / 2;
|
||||
|
||||
nb_plot_erreur = 0;
|
||||
|
||||
// compute pen_recouvrement (from g_HPGL_Pen_Recouvrement in mils)
|
||||
// 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 )
|
||||
g_HPGL_Pen_Recouvrement = g_HPGL_Pen_Diam - 1;
|
||||
pen_recouvrement = (int) round( g_HPGL_Pen_Recouvrement * 10.0 / Scale_X );
|
||||
|
@ -91,19 +93,21 @@ bool Center = FALSE;
|
|||
float Xscale, Yscale;
|
||||
Xscale = (float) ( SheetSize.x - ( 2 * marge) ) / BoardSize.x;
|
||||
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.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 */
|
||||
marge = (int) (marge * SCALE_HPGL);
|
||||
if( Center )
|
||||
g_PlotOffset.x = (int) (-SheetSize.x / 2 * SCALE_HPGL) +
|
||||
BoardCenter.x + marge;
|
||||
|
||||
switch( g_PlotOrient )
|
||||
{
|
||||
default:
|
||||
|
@ -117,12 +121,15 @@ bool Center = FALSE;
|
|||
case PLOT_MIROIR:
|
||||
if( Center )
|
||||
g_PlotOffset.y = (int) (-SheetSize.y / 2 * SCALE_HPGL) + BoardCenter.y;
|
||||
else g_PlotOffset.y = (int)((- SheetSize.y +
|
||||
m_Pcb->m_BoundaryBox.GetBottom() + m_Pcb->m_BoundaryBox.GetY()) * SCALE_HPGL);
|
||||
else
|
||||
g_PlotOffset.y = (int) ( ( -SheetSize.y +
|
||||
m_Pcb->m_BoundaryBox.GetBottom() +
|
||||
m_Pcb->m_BoundaryBox.GetY() ) * SCALE_HPGL );
|
||||
break;
|
||||
}
|
||||
|
||||
InitPlotParametresHPGL( g_PlotOffset, scale_x, scale_y, g_PlotOrient );
|
||||
|
||||
switch( Layer )
|
||||
{
|
||||
case CUIVRE_N:
|
||||
|
@ -140,7 +147,8 @@ bool Center = FALSE;
|
|||
case LAYER_N_13:
|
||||
case LAYER_N_14:
|
||||
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;
|
||||
|
||||
case SILKSCREEN_N_CU:
|
||||
|
@ -152,8 +160,10 @@ bool Center = FALSE;
|
|||
case SOLDERMASK_N_CMP: /* Trace du vernis epargne */
|
||||
{
|
||||
int tracevia;
|
||||
if (g_DrawViaOnMaskLayer) tracevia = 1;
|
||||
else tracevia = 0;
|
||||
if( g_DrawViaOnMaskLayer )
|
||||
tracevia = 1;
|
||||
else
|
||||
tracevia = 0;
|
||||
Plot_Layer_HPGL( dest, g_TabOneLayerMask[Layer],
|
||||
g_DesignSettings.m_MaskMargin, tracevia, modetrace );
|
||||
}
|
||||
|
@ -168,10 +178,10 @@ bool Center = FALSE;
|
|||
Plot_Serigraphie( PLOT_FORMAT_HPGL, dest, g_TabOneLayerMask[Layer] );
|
||||
break;
|
||||
}
|
||||
|
||||
/* fin */
|
||||
CloseFileHPGL( dest );
|
||||
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
|
||||
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;
|
||||
|
@ -189,14 +199,14 @@ wxPoint start, end;
|
|||
MODULE* Module;
|
||||
D_PAD* PtPad;
|
||||
TRACK* pts;
|
||||
EDA_BaseStruct * PtStruct;
|
||||
BOARD_ITEM* PtStruct;
|
||||
wxString msg;
|
||||
|
||||
masque_layer |= EDGE_LAYER; /* Les elements de la couche EDGE sont tj traces */
|
||||
|
||||
/* trace des elements type Drawings Pcb : */
|
||||
PtStruct = m_Pcb->m_Drawings;
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext )
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
|
||||
{
|
||||
switch( PtStruct->m_StructType )
|
||||
{
|
||||
|
@ -229,7 +239,6 @@ wxString msg;
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/* Trace des Elements des modules autres que pads */
|
||||
nb_items = 0;
|
||||
Affiche_1_Parametre( this, 48, wxT( "DrawMod" ), wxEmptyString, GREEN );
|
||||
|
@ -237,17 +246,18 @@ wxString msg;
|
|||
for( ; Module != NULL; Module = (MODULE*) Module->Pnext )
|
||||
{
|
||||
PtStruct = Module->m_Drawings;
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext )
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
|
||||
{
|
||||
switch( PtStruct->m_StructType )
|
||||
{
|
||||
case TYPEEDGEMODULE:
|
||||
if( masque_layer &
|
||||
g_TabOneLayerMask[((EDGE_MODULE*)PtStruct)->m_Layer] )
|
||||
g_TabOneLayerMask[ PtStruct->GetLayer() ] )
|
||||
Plot_1_EdgeModule( PLOT_FORMAT_HPGL, (EDGE_MODULE*) PtStruct );
|
||||
break;
|
||||
|
||||
default: break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -271,6 +281,7 @@ wxString msg;
|
|||
size.x += garde * 2; size.y += garde * 2;
|
||||
|
||||
nb_items++;
|
||||
|
||||
switch( PtPad->m_PadShape & 0x7F )
|
||||
{
|
||||
case CIRCLE:
|
||||
|
@ -298,6 +309,7 @@ wxString msg;
|
|||
PtPad->m_Orient, modetrace );
|
||||
break;
|
||||
}
|
||||
|
||||
msg.Printf( wxT( "%d" ), nb_items );
|
||||
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 )
|
||||
{
|
||||
if( pts->m_StructType != TYPEVIA ) continue;
|
||||
if( pts->m_StructType != TYPEVIA )
|
||||
continue;
|
||||
SEGVIA* Via = (SEGVIA*) pts;
|
||||
|
||||
/* vias not plotted if not on selected layer, but if layer
|
||||
== SOLDERMASK_LAYER_CU or SOLDERMASK_LAYER_CMP, vias are drawn ,
|
||||
if they are on a external copper layer
|
||||
* == SOLDERMASK_LAYER_CU or SOLDERMASK_LAYER_CMP, vias are drawn ,
|
||||
* if they are on a external copper layer
|
||||
*/
|
||||
int via_mask_layer = Via->ReturnMaskLayer();
|
||||
if ( (via_mask_layer & CUIVRE_LAYER ) ) via_mask_layer |= SOLDERMASK_LAYER_CU;
|
||||
if ( (via_mask_layer & CMP_LAYER ) ) via_mask_layer |= SOLDERMASK_LAYER_CMP;
|
||||
if( (via_mask_layer & masque_layer) == 0 ) continue;
|
||||
if( (via_mask_layer & CUIVRE_LAYER ) )
|
||||
via_mask_layer |= SOLDERMASK_LAYER_CU;
|
||||
if( (via_mask_layer & CMP_LAYER ) )
|
||||
via_mask_layer |= SOLDERMASK_LAYER_CMP;
|
||||
if( (via_mask_layer & masque_layer) == 0 )
|
||||
continue;
|
||||
|
||||
start = Via->m_Start;
|
||||
size.x = Via->m_Width + (garde * 2);
|
||||
|
@ -331,6 +348,7 @@ wxString msg;
|
|||
nb_items++; msg.Printf( wxT( "%d" ), nb_items );
|
||||
Affiche_1_Parametre( this, 56, wxT( "Vias" ), msg, RED );
|
||||
}
|
||||
|
||||
fputs( "PU;\n", dest );
|
||||
}
|
||||
|
||||
|
@ -339,9 +357,11 @@ wxString msg;
|
|||
Affiche_1_Parametre( this, 64, wxT( "Tracks " ), wxEmptyString, YELLOW );
|
||||
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;
|
||||
start = pts->m_Start;
|
||||
|
@ -358,7 +378,7 @@ wxString msg;
|
|||
while( ( size.x -= (int) ( (pen_rayon - pen_recouvrement) * 2 ) ) > 0 )
|
||||
{
|
||||
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 );
|
||||
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;
|
||||
start = pts->m_Start;
|
||||
|
@ -391,7 +411,7 @@ wxString msg;
|
|||
while( ( size.x -= (int) ( (pen_rayon - pen_recouvrement) * 2 ) ) > 0 )
|
||||
{
|
||||
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;
|
||||
|
||||
/* 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 )
|
||||
{
|
||||
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 */
|
||||
rayon = size.x / 2;
|
||||
|
@ -435,7 +456,6 @@ int trace_orient = orient;
|
|||
RotatePoint( &cx, &cy, trace_orient );
|
||||
trace_1_pastille_RONDE_HPGL( wxPoint( cx + pos.x, cy + pos.y ), size.x, modetrace );
|
||||
}
|
||||
|
||||
else /* Trace en mode FILAIRE */
|
||||
{
|
||||
cx = -rayon; cy = -deltaxy / 2;
|
||||
|
@ -490,6 +510,7 @@ int rayon, delta;
|
|||
rayon = 0; nb_plot_erreur++; Affiche_erreur( nb_plot_erreur );
|
||||
}
|
||||
wxSize rsize( rayon, rayon );
|
||||
|
||||
UserToDeviceSize( rsize );
|
||||
|
||||
Plume_HPGL( 'U' );
|
||||
|
@ -511,14 +532,16 @@ int rayon, delta;
|
|||
Plume_HPGL( 'U' ); return;
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************/
|
||||
void PlotRectangularPad_HPGL( wxPoint padpos, wxSize padsize,
|
||||
int orient, int modetrace )
|
||||
/****************************************************************/
|
||||
|
||||
/*
|
||||
Trace 1 pad rectangulaire vertical ou horizontal ( Pad rectangulaire )
|
||||
donne par son centre et ses dimensions X et Y
|
||||
Units are user units
|
||||
* Trace 1 pad rectangulaire vertical ou horizontal ( Pad rectangulaire )
|
||||
* donne par son centre et ses dimensions X et Y
|
||||
* Units are user units
|
||||
*/
|
||||
{
|
||||
wxSize size;
|
||||
|
@ -536,7 +559,9 @@ int ox, oy, fx, fy;
|
|||
{
|
||||
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 */
|
||||
if( size.x == 0 )
|
||||
|
@ -589,7 +614,9 @@ int ox, oy, fx, fy;
|
|||
while( (size.x > 0) && (size.y > 0) )
|
||||
{
|
||||
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;
|
||||
RotatePoint( &ox, &oy, padpos.x, padpos.y, orient );
|
||||
|
@ -609,6 +636,7 @@ int ox, oy, fx, fy;
|
|||
|
||||
Move_Plume_HPGL( wxPoint( ox, oy ), 'D' );
|
||||
}
|
||||
|
||||
Plume_HPGL( 'U' );
|
||||
}
|
||||
|
||||
|
@ -617,22 +645,23 @@ int ox, oy, fx, fy;
|
|||
void trace_1_pad_TRAPEZE_HPGL( wxPoint padpos, wxSize size, wxSize delta,
|
||||
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
|
||||
. .
|
||||
. .
|
||||
. .
|
||||
1 --- 2
|
||||
/*
|
||||
* 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
|
||||
* . .
|
||||
* . .
|
||||
* . .
|
||||
* 1 --- 2
|
||||
*/
|
||||
{
|
||||
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 */
|
||||
int rayon; /* rayon de la plume */
|
||||
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;
|
||||
|
||||
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),
|
||||
(float) (polygone[1].x - polygone[0].x) ) / 2;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
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;
|
||||
|
||||
/* Test de limitation de variation des dimensions :
|
||||
si les sommets se "croisent", il ne faut plus modifier les
|
||||
coordonnees correspondantes */
|
||||
* si les sommets se "croisent", il ne faut plus modifier les
|
||||
* coordonnees correspondantes */
|
||||
if( polygone[0].x > polygone[3].x )
|
||||
{ /* croisement sur axe X des 2 sommets 0 et 3 */
|
||||
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)
|
||||
en mode SKETCH
|
||||
* en mode SKETCH
|
||||
*/
|
||||
{
|
||||
float alpha; /* angle de l'axe du rectangle */
|
||||
wxSize size; /* coord relatives a l'origine du segment de sa fin */
|
||||
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 )*/
|
||||
float sin_alpha, cos_alpha;
|
||||
|
||||
|
@ -802,7 +831,8 @@ float sin_alpha, cos_alpha ;
|
|||
}
|
||||
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_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 */
|
||||
{
|
||||
/* 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
|
||||
de trace par 2 rotations inverses
|
||||
coord : xrot = x*cos + y*sin
|
||||
yrot = y*cos - x*sin
|
||||
|
||||
avec ici yrot = 0 puisque le segment est horizontal dans le nouveau repere
|
||||
Transformee inverse :
|
||||
coord : x = xrot*cos - yrot*sin
|
||||
y = yrot*cos + xrot*sin
|
||||
* a axe x confondu avec l'axe du rect. puis on revient dans le repere
|
||||
* de trace par 2 rotations inverses
|
||||
* coord : xrot = x*cos + y*sin
|
||||
* yrot = y*cos - x*sin
|
||||
*
|
||||
* avec ici yrot = 0 puisque le segment est horizontal dans le nouveau repere
|
||||
* Transformee inverse :
|
||||
* coord : x = xrot*cos - yrot*sin
|
||||
* y = yrot*cos + xrot*sin
|
||||
*/
|
||||
|
||||
int dx0, dy0, dx1, dy1;
|
||||
|
@ -868,6 +898,3 @@ float sin_alpha, cos_alpha ;
|
|||
}
|
||||
Plume_HPGL( 'U' );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
// Routines Locales
|
||||
static void PrintDrillMark( BOARD* Pcb );
|
||||
|
||||
static Ki_PageDescr* SheetPS;
|
||||
|
||||
// variables locales:
|
||||
|
@ -60,6 +61,7 @@ int PlotMarge_in_mils = 0;
|
|||
Center = TRUE; // Echelle != 1 donc trace centree du PCB
|
||||
modetrace = Plot_Mode;
|
||||
scale_format = 1.0;
|
||||
|
||||
// Set default line width
|
||||
if( g_PlotLine_Width < 1 )
|
||||
g_PlotLine_Width = 1;
|
||||
|
@ -83,6 +85,7 @@ int PlotMarge_in_mils = 0;
|
|||
// calcul de l'offset de trace:
|
||||
// calcul du cadrage horizontal du mode paysage ( val algebr. plus grande = decalage a gauche )
|
||||
g_PlotOffset.x = PlotMarge_in_mils * U_PCB;
|
||||
|
||||
// cadrage vertical du mode paysage ( val algebr. plus grande = decalage vers le haut )
|
||||
g_PlotOffset.y = PaperSize.y - PlotMarge_in_mils * U_PCB;
|
||||
|
||||
|
@ -119,7 +122,7 @@ int PlotMarge_in_mils = 0;
|
|||
noprint_size += 500 * U_PCB;
|
||||
Xscale = (float) ( PaperSize.x - noprint_size ) / BoardSize.x;
|
||||
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);
|
||||
|
@ -214,6 +217,7 @@ int PlotMarge_in_mils = 0;
|
|||
Plot_Serigraphie( PLOT_FORMAT_POST, dest, g_TabOneLayerMask[Layer] );
|
||||
break;
|
||||
}
|
||||
|
||||
// fin
|
||||
CloseFilePS( dest );
|
||||
setlocale( LC_NUMERIC, "" );
|
||||
|
@ -233,14 +237,14 @@ wxSize size;
|
|||
MODULE* Module;
|
||||
D_PAD* PtPad;
|
||||
TRACK* pts;
|
||||
EDA_BaseStruct * PtStruct;
|
||||
BOARD_ITEM* PtStruct;
|
||||
wxString msg;
|
||||
|
||||
masque_layer |= EDGE_LAYER; // Les elements de la couche EDGE sont tj traces
|
||||
|
||||
// trace des elements type Drawings Pcb :
|
||||
PtStruct = m_Pcb->m_Drawings;
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext )
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
|
||||
{
|
||||
switch( PtStruct->m_StructType )
|
||||
{
|
||||
|
@ -268,7 +272,8 @@ wxString msg;
|
|||
break;
|
||||
|
||||
default:
|
||||
DisplayError(this, wxT("WinEDA_BasePcbFrame::Plot_Layer_PS() : Unexpected Draw Type"));
|
||||
DisplayError( this,
|
||||
wxT( "WinEDA_BasePcbFrame::Plot_Layer_PS() : Unexpected Draw Type" ) );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -280,12 +285,12 @@ wxString msg;
|
|||
for( ; Module != NULL; Module = (MODULE*) Module->Pnext )
|
||||
{
|
||||
PtStruct = Module->m_Drawings;
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext )
|
||||
for( ; PtStruct != NULL; PtStruct = PtStruct->Next() )
|
||||
{
|
||||
switch( PtStruct->m_StructType )
|
||||
{
|
||||
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 );
|
||||
break;
|
||||
|
||||
|
@ -338,10 +343,12 @@ wxString msg;
|
|||
trace_1_pad_rectangulaire_POST( pos, size, PtPad->m_Orient, modetrace );
|
||||
break;
|
||||
}
|
||||
|
||||
msg.Printf( wxT( "%d" ), nb_items );
|
||||
Affiche_1_Parametre( this, 48, wxT( "Pads" ), msg, GREEN );
|
||||
}
|
||||
}
|
||||
|
||||
// trace des VIAS :
|
||||
if( tracevia )
|
||||
{
|
||||
|
@ -352,6 +359,7 @@ wxString msg;
|
|||
if( pts->m_StructType != TYPEVIA )
|
||||
continue;
|
||||
SEGVIA* Via = (SEGVIA*) pts;
|
||||
|
||||
// vias not plotted if not on selected layer, but if layer
|
||||
// == SOLDERMASK_LAYER_CU or SOLDERMASK_LAYER_CMP, vias are drawn,
|
||||
// if they are on a external copper layer
|
||||
|
@ -371,6 +379,7 @@ wxString msg;
|
|||
Affiche_1_Parametre( this, 56, wxEmptyString, msg, RED );
|
||||
}
|
||||
}
|
||||
|
||||
// trace des pistes et zones:
|
||||
nb_items = 0;
|
||||
Affiche_1_Parametre( this, 64, _( "Tracks" ), wxEmptyString, YELLOW );
|
||||
|
@ -380,7 +389,7 @@ wxString msg;
|
|||
if( pts->m_StructType == TYPEVIA )
|
||||
continue;
|
||||
|
||||
if( (g_TabOneLayerMask[pts->m_Layer] & masque_layer) == 0 )
|
||||
if( (g_TabOneLayerMask[pts->GetLayer()] & masque_layer) == 0 )
|
||||
continue;
|
||||
size.x = size.y = pts->m_Width;
|
||||
pos = pts->m_Start;
|
||||
|
@ -398,7 +407,7 @@ wxString msg;
|
|||
|
||||
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;
|
||||
size.x = size.y = pts->m_Width;
|
||||
pos = pts->m_Start;
|
||||
|
@ -555,6 +564,7 @@ void trace_1_pastille_RONDE_POST(wxPoint centre, int diametre, int modetrace)
|
|||
*/
|
||||
{
|
||||
int rayon, w;
|
||||
|
||||
wxSize diam( diametre, diametre );
|
||||
|
||||
UserToDeviceCoordinate( centre );
|
||||
|
@ -735,6 +745,7 @@ int l_pen; // diam spot (plume)
|
|||
if( modetrace == FILAIRE || Plot_Mode == FILAIRE )
|
||||
{
|
||||
wxSize lsize( g_PlotLine_Width, g_PlotLine_Width );
|
||||
|
||||
UserToDeviceSize( lsize );
|
||||
l_pen = lsize.x;
|
||||
}
|
||||
|
@ -777,4 +788,3 @@ int l_pen; // diam spot (plume)
|
|||
fprintf( dest, "fill " );
|
||||
fprintf( dest, "stroke\n" );
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,7 @@
|
|||
/****************************************/
|
||||
/* EDITEUR de PCB: Menus d'AUTOROUTAGE: */
|
||||
/****************************************/
|
||||
|
||||
// #define ROUTER
|
||||
|
||||
#include "fctsys.h"
|
||||
|
@ -27,7 +28,6 @@ static void ReturnNbViasAndTracks(BOARD * Pcb, int netcode, int * nb_vias, int *
|
|||
static int min_layer, max_layer;
|
||||
|
||||
|
||||
|
||||
/******************************************/
|
||||
void WinEDA_PcbFrame::GlobalRoute( wxDC* DC )
|
||||
/******************************************/
|
||||
|
@ -120,7 +120,8 @@ int net_number;
|
|||
{
|
||||
int dir;
|
||||
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 */
|
||||
}
|
||||
|
||||
|
@ -146,18 +147,20 @@ static void Out_Pads(BOARD * Pcb, FILE * outfile)
|
|||
/************************************************/
|
||||
{
|
||||
D_PAD* pt_pad;
|
||||
|
||||
//MODULE * Module;
|
||||
int netcode, mod_num, nb_pads, plink;
|
||||
LISTE_PAD* pt_liste_pad, * pt_start_liste,
|
||||
* pt_end_liste, * pt_liste_pad_limite;
|
||||
int pin_min_layer, pin_max_layer;
|
||||
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_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;
|
||||
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 */
|
||||
for( pt_end_liste = pt_liste_pad + 1; ; pt_end_liste++ )
|
||||
{
|
||||
if (pt_end_liste >= pt_liste_pad_limite ) break ;
|
||||
if ((*pt_end_liste)->m_NetCode != netcode ) break ;
|
||||
if( pt_end_liste >= pt_liste_pad_limite )
|
||||
break;
|
||||
if( (*pt_end_liste)->m_NetCode != netcode )
|
||||
break;
|
||||
nb_pads++;
|
||||
}
|
||||
|
||||
|
@ -195,7 +200,8 @@ int no_conn = Pcb->m_NbPads+1; /* valeur incrementee pour indiquer
|
|||
netcode = pt_pad->m_NetCode;
|
||||
plink = pt_pad->m_physical_connexion;
|
||||
/* 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 */
|
||||
fprintf( outfile, "u 0" );
|
||||
|
@ -226,8 +232,11 @@ int no_conn = Pcb->m_NbPads+1; /* valeur incrementee pour indiquer
|
|||
case SMD:
|
||||
fprintf( outfile, " %d", 1 );
|
||||
break;
|
||||
case CONN: fprintf(outfile," %d", 2);
|
||||
|
||||
case CONN:
|
||||
fprintf( outfile, " %d", 2 );
|
||||
break;
|
||||
|
||||
case P_HOLE:
|
||||
case MECA:
|
||||
fprintf( outfile, " %d", 4 );
|
||||
|
@ -252,6 +261,7 @@ int no_conn = Pcb->m_NbPads+1; /* valeur incrementee pour indiquer
|
|||
|
||||
/* output layer size record */
|
||||
fprintf( outfile, "q" );
|
||||
|
||||
switch( pt_pad->m_PadShape ) /* out type, dims */
|
||||
{
|
||||
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 lmin = pt_pad->m_Size.y;
|
||||
int angle = pt_pad->m_Orient / 10;
|
||||
while (angle < 0 ) angle += 180;
|
||||
while (angle > 180 ) angle -= 180;
|
||||
while( angle < 0 )
|
||||
angle += 180;
|
||||
|
||||
while( angle > 180 )
|
||||
angle -= 180;
|
||||
|
||||
while( angle > 135 )
|
||||
{
|
||||
angle -= 90;
|
||||
EXCHG( lmax, lmin );
|
||||
}
|
||||
|
||||
fprintf( outfile, " r %d %d %d",
|
||||
angle,
|
||||
lmax / PSCALE, lmin / PSCALE );
|
||||
break;
|
||||
}
|
||||
|
||||
/* layers */
|
||||
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 )
|
||||
{
|
||||
|
@ -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,
|
||||
int* nb_tracks )
|
||||
/**************************************************************************/
|
||||
|
||||
/* calcule le nombre de vias et segments de pistes pour le net netcode
|
||||
*/
|
||||
{
|
||||
|
@ -309,17 +327,23 @@ TRACK * track;
|
|||
*nb_tracks = 0;
|
||||
|
||||
track = Pcb->m_Track;
|
||||
if( track == NULL ) return;
|
||||
if( track == NULL )
|
||||
return;
|
||||
|
||||
for( ; track != NULL; track = (TRACK*) track->Pnext )
|
||||
{
|
||||
if( track->m_NetCode > netcode ) return;
|
||||
if( track->m_NetCode != netcode ) continue;
|
||||
if(track->m_StructType == TYPEVIA ) (*nb_vias)++;
|
||||
if(track->m_StructType == TYPETRACK ) (*nb_tracks)++;
|
||||
if( track->m_NetCode > netcode )
|
||||
return;
|
||||
if( track->m_NetCode != netcode )
|
||||
continue;
|
||||
if( track->m_StructType == TYPEVIA )
|
||||
(*nb_vias)++;
|
||||
if( track->m_StructType == TYPETRACK )
|
||||
(*nb_tracks)++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************/
|
||||
static void GenExistantTracks( BOARD* Pcb, FILE* outfile,
|
||||
int current_net_code, int type )
|
||||
|
@ -332,38 +356,46 @@ TRACK * track;
|
|||
|
||||
|
||||
track = Pcb->m_Track;
|
||||
if( track == NULL ) return;
|
||||
if( track == NULL )
|
||||
return;
|
||||
|
||||
|
||||
for( ; track != NULL; track = (TRACK*) track->Pnext )
|
||||
{
|
||||
netcode = track->m_NetCode;
|
||||
if( netcode > current_net_code ) return;
|
||||
if( netcode != current_net_code ) continue;
|
||||
if( netcode > current_net_code )
|
||||
return;
|
||||
if( netcode != current_net_code )
|
||||
continue;
|
||||
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 )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
track->m_Layer = 0xF;
|
||||
track->SetLayer( 0xF );
|
||||
via_min_layer = 0; via_max_layer = 15;
|
||||
}
|
||||
|
||||
if( via_max_layer < via_min_layer )
|
||||
EXCHG( via_max_layer, via_min_layer );
|
||||
|
||||
if(via_max_layer == CMP_N) via_max_layer = max_layer;
|
||||
else via_max_layer++;
|
||||
if( via_max_layer == CMP_N )
|
||||
via_max_layer = max_layer;
|
||||
else
|
||||
via_max_layer++;
|
||||
|
||||
if(via_min_layer == CUIVRE_N) via_min_layer = min_layer;
|
||||
else via_min_layer++;
|
||||
if( via_min_layer == CUIVRE_N )
|
||||
via_min_layer = min_layer;
|
||||
else
|
||||
via_min_layer++;
|
||||
|
||||
fprintf( outfile, "v 0 " );
|
||||
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_End.x / PSCALE, track->m_End.y / PSCALE );
|
||||
|
||||
if(via_min_layer == CMP_N) via_min_layer = max_layer;
|
||||
else via_min_layer++;
|
||||
if( via_min_layer == CMP_N )
|
||||
via_min_layer = max_layer;
|
||||
else
|
||||
via_min_layer++;
|
||||
fprintf( outfile, " %d", via_min_layer );
|
||||
|
||||
fprintf( outfile, " %d\n", 1 ); /*Number of corners */
|
||||
|
@ -393,11 +427,13 @@ TRACK * track;
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************/
|
||||
static int GenEdges( BOARD* Pcb, FILE* outfile )
|
||||
/***********************************************/
|
||||
|
||||
/* 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
|
||||
|
@ -413,23 +449,27 @@ int NbItems = 0;
|
|||
/* impression des contours */
|
||||
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;
|
||||
if( PtDrawSegment->m_Layer != EDGE_N) continue;
|
||||
if( PtDrawSegment->GetLayer() != EDGE_N )
|
||||
continue;
|
||||
|
||||
fx = PtDrawSegment->m_End.x; ox = PtDrawSegment->m_Start.x;
|
||||
fy = PtDrawSegment->m_End.y; oy = PtDrawSegment->m_Start.y;
|
||||
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,
|
||||
non gérés par l'autorouteur */
|
||||
* non gérés par l'autorouteur */
|
||||
if( (dx != 0) && (dy != 0) && ( abs( dx ) != abs( dy ) ) )
|
||||
continue;
|
||||
|
||||
NbItems++;
|
||||
if( outfile == NULL ) continue; /* car simple decompte des items */
|
||||
if( outfile == NULL )
|
||||
continue; /* car simple decompte des items */
|
||||
|
||||
|
||||
/* generation de la zone interdite */
|
||||
|
@ -540,6 +580,7 @@ int max_layer = m_Pcb->m_BoardSettings->m_CopperLayerCount;
|
|||
while( GetLine( File, Line, &LineNum ) != NULL )
|
||||
{
|
||||
char ident = Line[0];
|
||||
|
||||
switch( ident )
|
||||
{
|
||||
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,
|
||||
&track_start.x, &track_start.y, &via_layer1, &via_layer2 );
|
||||
via_layer1--; via_layer2--;
|
||||
if ( via_layer1 == max_layer-1 ) via_layer1 = CMP_N;
|
||||
if ( via_layer2 == max_layer-1 ) via_layer2 = CMP_N;
|
||||
if( via_layer1 == max_layer - 1 )
|
||||
via_layer1 = CMP_N;
|
||||
if( via_layer2 == max_layer - 1 )
|
||||
via_layer2 = CMP_N;
|
||||
NewVia = new SEGVIA( m_Pcb );
|
||||
|
||||
NewVia->m_Start = NewVia->m_End = track_start;
|
||||
NewVia->m_Width = via_size;
|
||||
NewVia->m_Layer = via_layer1 + (via_layer2<<4);
|
||||
if ( NewVia->m_Layer == 0x0F || NewVia->m_Layer == 0xF0)
|
||||
NewVia->SetLayer( via_layer1 + (via_layer2 << 4) );
|
||||
if( NewVia->GetLayer() == 0x0F || NewVia->GetLayer() == 0xF0 )
|
||||
NewVia->m_Shape = VIA_NORMALE;
|
||||
else NewVia->m_Shape = VIA_ENTERREE;
|
||||
else
|
||||
NewVia->m_Shape = VIA_ENTERREE;
|
||||
NewVia->Insert( m_Pcb, NULL );
|
||||
NbTrack++;
|
||||
break;
|
||||
|
@ -571,20 +616,23 @@ int max_layer = m_Pcb->m_BoardSettings->m_CopperLayerCount;
|
|||
track_layer--;
|
||||
if( (track_layer != CUIVRE_N) && (track_layer == max_layer - 1) )
|
||||
track_layer = CMP_N;
|
||||
|
||||
// Read corners: fmt = C x_pos y_pos
|
||||
for( int ii = 0; ii < track_count; ii++ )
|
||||
{
|
||||
if( GetLine( File, Line, &LineNum ) != NULL )
|
||||
{
|
||||
if ( Line[0] != 'C' ) break;
|
||||
if( Line[0] != 'C' )
|
||||
break;
|
||||
if( ii == 0 )
|
||||
sscanf( Line + 2, "%d %d", &track_start.x, &track_start.y );
|
||||
else
|
||||
{
|
||||
sscanf( Line + 2, "%d %d", &track_end.x, &track_end.y );
|
||||
NewTrack = new TRACK( m_Pcb );
|
||||
|
||||
NewTrack->m_Width = track_width;
|
||||
NewTrack->m_Layer = track_layer;
|
||||
NewTrack->SetLayer( track_layer );
|
||||
NewTrack->m_Start = track_start;
|
||||
NewTrack->m_End = track_end;
|
||||
track_start = track_end;
|
||||
|
@ -592,8 +640,10 @@ int max_layer = m_Pcb->m_BoardSettings->m_CopperLayerCount;
|
|||
NbTrack++;
|
||||
}
|
||||
}
|
||||
else break;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -605,7 +655,8 @@ int max_layer = m_Pcb->m_BoardSettings->m_CopperLayerCount;
|
|||
|
||||
setlocale( LC_NUMERIC, "" );
|
||||
|
||||
if( NbTrack == 0 ) DisplayError(this, wxT("Warning: No tracks"), 10);
|
||||
if( NbTrack == 0 )
|
||||
DisplayError( this, wxT( "Warning: No tracks" ), 10 );
|
||||
else
|
||||
{
|
||||
m_Pcb->m_Status_Pcb = 0;
|
||||
|
@ -613,6 +664,6 @@ int max_layer = m_Pcb->m_BoardSettings->m_CopperLayerCount;
|
|||
}
|
||||
|
||||
Compile_Ratsnest( DC, TRUE );
|
||||
if( NbTrack ) m_CurrentScreen->SetRefreshReq();
|
||||
if( NbTrack )
|
||||
m_CurrentScreen->SetRefreshReq();
|
||||
}
|
||||
|
||||
|
|
387
pcbnew/solve.cpp
387
pcbnew/solve.cpp
|
@ -17,7 +17,8 @@
|
|||
#include "cell.h"
|
||||
|
||||
/* 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 );
|
||||
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 );
|
||||
|
@ -49,8 +50,8 @@ static int Ncurrent; /* measures of progress */
|
|||
*/
|
||||
|
||||
/* for visiting neighbors on the same side: increments/decrements des coord
|
||||
[][0] = row, []{1] = col a ajouter aux coord du point central pour
|
||||
obtenir les coord des 8 points voisins */
|
||||
* [][0] = row, []{1] = col a ajouter aux coord du point central pour
|
||||
* obtenir les coord des 8 points voisins */
|
||||
static int delta[8][2] = {
|
||||
{ 1, -1 }, /* northwest */
|
||||
{ 1, 0 }, /* north */
|
||||
|
@ -114,26 +115,43 @@ static int ndir[8] = { /* for building paths back to source */
|
|||
| SHARP_WtoSW | SHARP_WtoNW \
|
||||
| SHARP_NtoNW | SHARP_StoSW | HOLE )
|
||||
|
||||
struct block {
|
||||
struct block
|
||||
{
|
||||
int r1, c1;
|
||||
long b1;
|
||||
int r2, c2;
|
||||
long b2;
|
||||
};
|
||||
|
||||
static struct block blocking[8] = { /* blocking masks for diagonal traces */
|
||||
{ 0, -1, BLOCK_NORTHEAST, 1, 0, BLOCK_SOUTHWEST },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 0, 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 }
|
||||
};
|
||||
static struct block blocking[8] = /* blocking masks for diagonal traces */
|
||||
{ { 0, -1,
|
||||
BLOCK_NORTHEAST,
|
||||
1, 0,
|
||||
BLOCK_SOUTHWEST },
|
||||
{ 0, 0, 0,
|
||||
0, 0, 0 },
|
||||
{ 1, 0,
|
||||
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 */
|
||||
static struct {
|
||||
static struct
|
||||
{
|
||||
long trace;
|
||||
int present;
|
||||
} selfok2[8] = {
|
||||
|
@ -173,9 +191,9 @@ static long newmask[8] = { /* patterns to mask out in neighbor cells */
|
|||
/********************************************************/
|
||||
|
||||
/* route all traces
|
||||
Return: 1 si OK
|
||||
-1 si Escape (arret en cours de routage) demande
|
||||
-2 si defaut alloc memoire
|
||||
* Return: 1 si OK
|
||||
* -1 si Escape (arret en cours de routage) demande
|
||||
* -2 si defaut alloc memoire
|
||||
*/
|
||||
|
||||
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
|
||||
|
||||
for( ; row_source != ILLEGAL; GetWork( &row_source, &col_source,
|
||||
¤t_net_code, &row_target, &col_target, &pt_cur_ch ))
|
||||
¤t_net_code, &row_target, &col_target,
|
||||
&pt_cur_ch ) )
|
||||
{
|
||||
/* Tst demande d'arret de routage ( key ESCAPE actionnee ) */
|
||||
wxYield();
|
||||
|
@ -213,7 +232,8 @@ wxString msg;
|
|||
stop = TRUE;
|
||||
break;
|
||||
}
|
||||
else DrawPanel->m_AbortRequest = 0;
|
||||
else
|
||||
DrawPanel->m_AbortRequest = 0;
|
||||
}
|
||||
|
||||
Ncurrent++;
|
||||
|
@ -239,6 +259,7 @@ wxString msg;
|
|||
|
||||
success = Route_1_Trace( this, DC, two_sides, row_source, col_source,
|
||||
row_target, col_target, pt_cur_ch );
|
||||
|
||||
switch( success )
|
||||
{
|
||||
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_end->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_AND );
|
||||
|
||||
if ( stop ) break;
|
||||
if( stop )
|
||||
break;
|
||||
}
|
||||
|
||||
DrawPanel->m_AbortEnable = FALSE;
|
||||
|
||||
return(SUCCESS);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**************************/
|
||||
/* int Route_1_Trace(xxx) */
|
||||
/**************************/
|
||||
|
||||
/* Route une piste du BOARD.
|
||||
Parametres:
|
||||
1 face / 2 faces ( 0 / 1)
|
||||
coord source (row,col)
|
||||
coord destination (row,col)
|
||||
net_code
|
||||
pointeur sur le chevelu de reference
|
||||
|
||||
Retourne :
|
||||
SUCCESS si route trouvee
|
||||
TRIVIAL_SUCCESS si pads connectes par superposition ( pas de piste a tirer)
|
||||
NOSUCCESS si echec
|
||||
STOP_FROM_ESC si Escape demande
|
||||
ERR_MEMORY defaut alloc RAM
|
||||
* Parametres:
|
||||
* 1 face / 2 faces ( 0 / 1)
|
||||
* coord source (row,col)
|
||||
* coord destination (row,col)
|
||||
* net_code
|
||||
* pointeur sur le chevelu de reference
|
||||
*
|
||||
* Retourne :
|
||||
* SUCCESS si route trouvee
|
||||
* TRIVIAL_SUCCESS si pads connectes par superposition ( pas de piste a tirer)
|
||||
* NOSUCCESS si echec
|
||||
* STOP_FROM_ESC si Escape demande
|
||||
* ERR_MEMORY defaut alloc RAM
|
||||
*/
|
||||
static int Route_1_Trace( WinEDA_PcbFrame* pcbframe, wxDC* DC,
|
||||
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_layers; /* Masque des 2 couches de routage */
|
||||
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;
|
||||
wxString msg;
|
||||
|
||||
|
@ -343,13 +366,15 @@ wxString msg;
|
|||
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
|
||||
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_e) == 0 ) goto end_of_route;
|
||||
if( (masque_layers & pad_masque_layer_s) == 0 )
|
||||
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
|
||||
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 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 py = pt_cur_ch->pad_start->m_Pos.y;
|
||||
|
||||
if ( ((pt_cur_ch->pad_start->m_Orient/900)&1) != 0 ) EXCHG(dx,dy) ;
|
||||
if ( (abs(cX - px) > dx ) || (abs(cY - py) > dy) ) goto end_of_route;
|
||||
if( ( (pt_cur_ch->pad_start->m_Orient / 900) & 1 ) != 0 )
|
||||
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;
|
||||
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;
|
||||
px = pt_cur_ch->pad_end->m_Pos.x;
|
||||
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 */
|
||||
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;
|
||||
goto end_of_route;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Placement du bit de suppression d'obstacle relative aux 2 pads a relier */
|
||||
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 );
|
||||
|
||||
/* 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;
|
||||
for( ; i > 0; i--, ptr++ )
|
||||
{
|
||||
|
@ -413,7 +442,7 @@ wxString msg;
|
|||
if( SetQueue( row_source, col_source, TOP, 0, apx_dist,
|
||||
row_target, col_target ) == 0 )
|
||||
{
|
||||
return(ERR_MEMORY);
|
||||
return ERR_MEMORY;
|
||||
}
|
||||
}
|
||||
if( pad_masque_layer_s & masque_layer_BOTTOM )
|
||||
|
@ -423,7 +452,7 @@ wxString msg;
|
|||
if( SetQueue( row_source, col_source, BOTTOM, 0, apx_dist,
|
||||
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,
|
||||
row_target, col_target ) == 0 )
|
||||
{
|
||||
return(ERR_MEMORY);
|
||||
return ERR_MEMORY;
|
||||
}
|
||||
}
|
||||
if( pad_masque_layer_s & masque_layer_TOP )
|
||||
|
@ -445,21 +474,19 @@ wxString msg;
|
|||
if( SetQueue( row_source, col_source, TOP, 0, apx_dist,
|
||||
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;
|
||||
|
||||
if( SetQueue( row_source, col_source, BOTTOM, 0, apx_dist,
|
||||
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 ) )
|
||||
{
|
||||
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 */
|
||||
&& ( tab_mask[side] & pad_masque_layer_e) )
|
||||
{
|
||||
/* Efface Liaison */
|
||||
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 */
|
||||
if( Retrace( pcbframe, DC, row_source, col_source,
|
||||
|
@ -485,7 +520,8 @@ wxString msg;
|
|||
break; /* Fin du routage */
|
||||
}
|
||||
/* 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;
|
||||
lastmove = (MoveNodes / 300) * 300;
|
||||
|
@ -505,7 +541,8 @@ wxString msg;
|
|||
for( i = 0; i < 8; i++ )
|
||||
{
|
||||
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 )
|
||||
continue;/* off the edge */
|
||||
|
||||
if (_self == 5 && selfok2[i].present) continue;
|
||||
if( _self == 5 && selfok2[i].present )
|
||||
continue;
|
||||
newcell = GetCell( nr, nc, side );
|
||||
if(newcell & CURRENT_PAD) newcell &= ~HOLE;
|
||||
if( newcell & CURRENT_PAD )
|
||||
newcell &= ~HOLE;
|
||||
|
||||
/* check for non-target hole */
|
||||
if( newcell & HOLE )
|
||||
{
|
||||
if (nr != row_target || nc != col_target) continue;
|
||||
if( nr != row_target || nc != col_target )
|
||||
continue;
|
||||
}
|
||||
|
||||
/* check for traces */
|
||||
else if (newcell & HOLE & ~(newmask[i])) continue;
|
||||
else if( newcell & HOLE & ~(newmask[i]) )
|
||||
continue;
|
||||
|
||||
/* check blocking on corner neighbors */
|
||||
if( delta[i][0] && delta[i][1] )
|
||||
{
|
||||
/* check first buddy */
|
||||
buddy = GetCell( r + blocking[i].r1, c + blocking[i].c1, side );
|
||||
if(buddy & CURRENT_PAD) buddy &= ~HOLE;
|
||||
if (buddy & HOLE) continue;
|
||||
if( buddy & CURRENT_PAD )
|
||||
buddy &= ~HOLE;
|
||||
if( buddy & HOLE )
|
||||
continue;
|
||||
|
||||
// if (buddy & (blocking[i].b1)) continue;
|
||||
/* check second buddy */
|
||||
buddy = GetCell( r + blocking[i].r2, c + blocking[i].c2, side );
|
||||
if(buddy & CURRENT_PAD) buddy &= ~HOLE;
|
||||
if (buddy & HOLE) continue;
|
||||
if( buddy & CURRENT_PAD )
|
||||
buddy &= ~HOLE;
|
||||
if( buddy & HOLE )
|
||||
continue;
|
||||
|
||||
// if (buddy & (blocking[i].b2)) continue;
|
||||
}
|
||||
|
||||
olddir = GetDir( r, c, side );
|
||||
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 */
|
||||
/* found a better path, add it to queue */
|
||||
|
@ -559,10 +607,9 @@ wxString msg;
|
|||
GetApxDist( nr, nc, row_target, col_target ),
|
||||
row_target, col_target ) == 0 )
|
||||
{
|
||||
return(ERR_MEMORY);
|
||||
return ERR_MEMORY;
|
||||
}
|
||||
}
|
||||
|
||||
else if( newdist < GetDist( nr, nc, side ) )
|
||||
{
|
||||
SetDir( nr, nc, side, ndir[i] );
|
||||
|
@ -611,8 +658,8 @@ wxString msg;
|
|||
newdist = d + CalcDist( FROM_OTHERSIDE, olddir, 0, side );
|
||||
|
||||
/* if (a) not visited yet,
|
||||
or (b) we have found a better path,
|
||||
add it to queue */
|
||||
* or (b) we have found a better path,
|
||||
* add it to queue */
|
||||
if( !GetDir( r, c, 1 - side ) )
|
||||
{
|
||||
SetDir( r, c, 1 - side, FROM_OTHERSIDE );
|
||||
|
@ -620,7 +667,7 @@ wxString msg;
|
|||
if( SetQueue( r, c, 1 - side, newdist, apx_dist, row_target,
|
||||
col_target ) == 0 )
|
||||
{
|
||||
return(ERR_MEMORY);
|
||||
return ERR_MEMORY;
|
||||
}
|
||||
}
|
||||
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 );
|
||||
|
||||
AFFICHE_ACTIVITE_ROUTE;
|
||||
return(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
static long bit[8][9] = { /* OT=Otherside */
|
||||
/* N, NE, E, SE, S, SW, W, NW, OT */
|
||||
/* 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) },
|
||||
/* S */ { 0, SHARP_NtoNE, CORNER_NORTHEAST, BENT_NtoSE, LINE_VERTICAL,
|
||||
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) },
|
||||
/* W */ { CORNER_NORTHEAST, SHARP_EtoNE, 0, SHARP_EtoSE, CORNER_SOUTHEAST,
|
||||
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
|
||||
Parametres:
|
||||
start on side target_side, aux coordonnees row_target, col_target.
|
||||
arrivee sur side masque_layer_start, coord row_source, col_source
|
||||
La recherche se fait en sens inverse du routage,
|
||||
c.a.d du point d'arrivee (target) vers le point de depart (source)
|
||||
du routeur.
|
||||
|
||||
target_side = cote (TOP / BOTTOM) de depart
|
||||
mask_layer_source = masque des couches d'arrivee
|
||||
|
||||
Retourne:
|
||||
0 si erreur
|
||||
> 0 si Ok
|
||||
* Parametres:
|
||||
* start on side target_side, aux coordonnees row_target, col_target.
|
||||
* arrivee sur side masque_layer_start, coord row_source, col_source
|
||||
* La recherche se fait en sens inverse du routage,
|
||||
* c.a.d du point d'arrivee (target) vers le point de depart (source)
|
||||
* du routeur.
|
||||
*
|
||||
* target_side = cote (TOP / BOTTOM) de depart
|
||||
* mask_layer_source = masque des couches d'arrivee
|
||||
*
|
||||
* Retourne:
|
||||
* 0 si erreur
|
||||
* > 0 si Ok
|
||||
*/
|
||||
|
||||
static int Retrace( WinEDA_PcbFrame* pcbframe, wxDC* DC,
|
||||
|
@ -705,67 +754,96 @@ long b;
|
|||
/* find where we came from to get here */
|
||||
r2 = r1; c2 = c1; s2 = s1;
|
||||
x = GetDir( r1, c1, s1 );
|
||||
|
||||
switch( x )
|
||||
{
|
||||
case FROM_NORTH: r2++; break;
|
||||
case FROM_EAST: c2++; break;
|
||||
case FROM_SOUTH: r2--; 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;
|
||||
case FROM_NORTH:
|
||||
r2++; break;
|
||||
|
||||
case FROM_EAST:
|
||||
c2++; break;
|
||||
|
||||
case FROM_SOUTH:
|
||||
r2--; 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:
|
||||
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 */
|
||||
if( ( (r1 == row_target) && (c1 == col_target) )
|
||||
|| (s1 != s0) )
|
||||
{
|
||||
int p_dir;
|
||||
|
||||
switch( x )
|
||||
{
|
||||
case FROM_NORTH:
|
||||
p_dir = HOLE_NORTH; break;
|
||||
|
||||
case FROM_EAST:
|
||||
p_dir = HOLE_EAST; break;
|
||||
|
||||
case FROM_SOUTH:
|
||||
p_dir = HOLE_SOUTH; break;
|
||||
|
||||
case FROM_WEST:
|
||||
p_dir = HOLE_WEST; break;
|
||||
|
||||
case FROM_NORTHEAST:
|
||||
p_dir = HOLE_NORTHEAST; break;
|
||||
|
||||
case FROM_SOUTHEAST:
|
||||
p_dir = HOLE_SOUTHEAST; break;
|
||||
|
||||
case FROM_SOUTHWEST:
|
||||
p_dir = HOLE_SOUTHWEST; break;
|
||||
|
||||
case FROM_NORTHWEST:
|
||||
p_dir = HOLE_NORTHWEST; break;
|
||||
|
||||
case FROM_OTHERSIDE:
|
||||
default:
|
||||
DisplayError( pcbframe, wxT( "Retrace: error 1" ) );
|
||||
return(0);
|
||||
}
|
||||
OrCell_Trace(pcbframe->m_Pcb, r1, c1, s1, p_dir, current_net_code );
|
||||
return 0;
|
||||
}
|
||||
|
||||
else {
|
||||
OrCell_Trace( pcbframe->m_Pcb, r1, c1, s1, p_dir, current_net_code );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (y == FROM_NORTH || y == FROM_NORTHEAST
|
||||
|| y == FROM_EAST || y == FROM_SOUTHEAST
|
||||
|| y == FROM_SOUTH || y == FROM_SOUTHWEST
|
||||
|| y == FROM_WEST || y == FROM_NORTHWEST) &&
|
||||
(x == FROM_NORTH || x == FROM_NORTHEAST
|
||||
|| y == FROM_WEST || y == FROM_NORTHWEST)
|
||||
&& (x == FROM_NORTH || x == FROM_NORTHEAST
|
||||
|| x == FROM_EAST || x == FROM_SOUTHEAST
|
||||
|| x == FROM_SOUTH || x == FROM_SOUTHWEST
|
||||
|| x == FROM_WEST || x == FROM_NORTHWEST
|
||||
|| x == FROM_OTHERSIDE) &&
|
||||
((b = bit[y-1][x-1]) != 0) )
|
||||
|| x == FROM_OTHERSIDE)
|
||||
&& ( (b = bit[y - 1][x - 1]) != 0 ) )
|
||||
{
|
||||
OrCell_Trace( pcbframe->m_Pcb, r1, c1, s1, b, current_net_code );
|
||||
if( b & HOLE )
|
||||
|
@ -774,29 +852,46 @@ long b;
|
|||
else
|
||||
{
|
||||
DisplayError( pcbframe, wxT( "Retrace: error 2" ) );
|
||||
return(0);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if( (r2 == row_source) && (c2 == col_source) )
|
||||
{ /* see if source */
|
||||
int p_dir;
|
||||
|
||||
switch( x )
|
||||
{
|
||||
case FROM_NORTH: p_dir = HOLE_SOUTH; break;
|
||||
case FROM_EAST: p_dir = HOLE_WEST; break;
|
||||
case FROM_SOUTH: 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_NORTH:
|
||||
p_dir = HOLE_SOUTH; break;
|
||||
|
||||
case FROM_EAST:
|
||||
p_dir = HOLE_WEST; break;
|
||||
|
||||
case FROM_SOUTH:
|
||||
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:
|
||||
default:
|
||||
DisplayError( pcbframe, wxT( "Retrace: error 3" ) );
|
||||
return(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
OrCell_Trace( pcbframe->m_Pcb, r2, c2, s2, p_dir, current_net_code );
|
||||
}
|
||||
/* move to next cell */
|
||||
|
@ -805,7 +900,7 @@ long b;
|
|||
} while( !( (r2 == row_source) && (c2 == col_source) ) );
|
||||
|
||||
Place_Piste_en_Buffer( pcbframe, DC );
|
||||
return(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -821,36 +916,44 @@ TRACK * NewTrack, *OldTrack;
|
|||
if( orient == HOLE ) /* Placement d'une VIA */
|
||||
{
|
||||
NewTrack = new SEGVIA( pcb );
|
||||
|
||||
g_TrackSegmentCount++;
|
||||
NewTrack->Pback = g_CurrentTrackSegment;
|
||||
if( g_CurrentTrackSegment) g_CurrentTrackSegment->Pnext = NewTrack;
|
||||
else g_FirstTrackSegment = NewTrack;
|
||||
if( g_CurrentTrackSegment )
|
||||
g_CurrentTrackSegment->Pnext = NewTrack;
|
||||
else
|
||||
g_FirstTrackSegment = NewTrack;
|
||||
|
||||
g_CurrentTrackSegment = NewTrack;
|
||||
|
||||
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 =
|
||||
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 =
|
||||
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_Shape = g_DesignSettings.m_CurrentViaType;
|
||||
g_CurrentTrackSegment->m_NetCode = current_net_code;
|
||||
}
|
||||
|
||||
else /* Placement d'un segment standard */
|
||||
{
|
||||
NewTrack = new TRACK( pcb );
|
||||
|
||||
g_TrackSegmentCount++;
|
||||
NewTrack->Pback = g_CurrentTrackSegment;
|
||||
if( g_CurrentTrackSegment) g_CurrentTrackSegment->Pnext = NewTrack;
|
||||
else g_FirstTrackSegment = NewTrack;
|
||||
if( g_CurrentTrackSegment )
|
||||
g_CurrentTrackSegment->Pnext = NewTrack;
|
||||
else
|
||||
g_FirstTrackSegment = NewTrack;
|
||||
|
||||
g_CurrentTrackSegment = NewTrack;
|
||||
|
||||
g_CurrentTrackSegment->m_Layer = Route_Layer_BOTTOM;
|
||||
if (side == TOP) g_CurrentTrackSegment->m_Layer = Route_Layer_TOP;
|
||||
g_CurrentTrackSegment->SetLayer( Route_Layer_BOTTOM );
|
||||
if( side == TOP )
|
||||
g_CurrentTrackSegment->SetLayer( Route_Layer_TOP );
|
||||
|
||||
g_CurrentTrackSegment->SetState( SEGM_AR, ON );
|
||||
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.y = pt_cur_ch->pad_end->m_Pos.y;
|
||||
}
|
||||
|
||||
else /* Creation d'un segment suppl raccord */
|
||||
{
|
||||
NewTrack = g_CurrentTrackSegment->Copy();
|
||||
|
@ -893,14 +995,16 @@ TRACK * NewTrack, *OldTrack;
|
|||
{
|
||||
if( g_CurrentTrackSegment->Pback )
|
||||
{
|
||||
g_CurrentTrackSegment->m_Start.x = ((TRACK*)g_CurrentTrackSegment->Pback)->m_End.x;
|
||||
g_CurrentTrackSegment->m_Start.y = ((TRACK*)g_CurrentTrackSegment->Pback)->m_End.y;
|
||||
g_CurrentTrackSegment->m_Start.x = ( (TRACK*) g_CurrentTrackSegment->Pback )->
|
||||
m_End.x;
|
||||
g_CurrentTrackSegment->m_Start.y = ( (TRACK*) g_CurrentTrackSegment->Pback )->
|
||||
m_End.y;
|
||||
}
|
||||
}
|
||||
g_CurrentTrackSegment->m_Width = g_DesignSettings.m_CurrentTrackWidth;
|
||||
|
||||
if ( (g_CurrentTrackSegment->m_Start.x != g_CurrentTrackSegment->m_End.x) ||
|
||||
(g_CurrentTrackSegment->m_Start.y != g_CurrentTrackSegment->m_End.y) )
|
||||
if( (g_CurrentTrackSegment->m_Start.x != g_CurrentTrackSegment->m_End.x)
|
||||
|| (g_CurrentTrackSegment->m_Start.y != g_CurrentTrackSegment->m_End.y) )
|
||||
{
|
||||
/* Reduction des segments alignes a 1 seul */
|
||||
OldTrack = (TRACK*) g_CurrentTrackSegment->Pback;
|
||||
|
@ -924,13 +1028,14 @@ TRACK * NewTrack, *OldTrack;
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/*******************************************/
|
||||
/* static void Place_Piste_en_Buffer(void) */
|
||||
/*******************************************/
|
||||
|
||||
/* 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
|
||||
au centre des pads corresponadants, meme hors grille
|
||||
* Modifie les points de debut et fin de piste pour qu'ils soient relies
|
||||
* au centre des pads corresponadants, meme hors grille
|
||||
*/
|
||||
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 );
|
||||
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 );
|
||||
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 */
|
||||
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, VIA_IMPOSSIBLE, via_marge, WRITE_OR_CELL );
|
||||
if(pt_track == g_CurrentTrackSegment ) break;
|
||||
if( pt_track == g_CurrentTrackSegment )
|
||||
break;
|
||||
}
|
||||
|
||||
ActiveScreen->SetModify();
|
||||
}
|
||||
|
||||
|
|
|
@ -42,8 +42,8 @@ private:
|
|||
void Sel_Layer( wxCommandEvent& event );
|
||||
void Cancel( wxCommandEvent& event );
|
||||
void Execute( wxCommandEvent& event );
|
||||
DECLARE_EVENT_TABLE()
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
/* Table des evenements pour WinEDA_SwapLayerFrame */
|
||||
BEGIN_EVENT_TABLE( WinEDA_SwapLayerFrame, wxDialog )
|
||||
|
@ -75,39 +75,44 @@ wxSize winsize;
|
|||
{
|
||||
g_Layer_Name_Pair[ii] = ReturnPcbLayerName( ii ) + wxT( " -> " ) + _( "No Change" );
|
||||
}
|
||||
|
||||
pos.x = 5; pos.y = START_Y;
|
||||
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();
|
||||
|
||||
pos.x = m_LayerList->GetRect().GetRight() + 12;
|
||||
Button = new wxButton( this, ID_SWAP_LAYER_CANCEL,
|
||||
_( "Cancel" ), pos );
|
||||
|
||||
Button->SetForegroundColour( *wxRED );
|
||||
winsize.x = MAX( winsize.x, Button->GetRect().GetRight() );
|
||||
|
||||
pos.y += Button->GetSize().y + 5;
|
||||
Button = new wxButton( this, ID_SWAP_LAYER_EXECUTE,
|
||||
_( "OK" ), pos );
|
||||
|
||||
Button->SetForegroundColour( *wxBLUE );
|
||||
winsize.x = MAX( winsize.x, Button->GetRect().GetRight() );
|
||||
|
||||
pos.y += Button->GetSize().y + 15;
|
||||
Button = new wxButton( this, ID_SWAP_LAYER_DESELECT,
|
||||
_( "Deselect" ), pos );
|
||||
|
||||
Button->SetForegroundColour( wxColour( 0, 100, 0 ) );
|
||||
winsize.x = MAX( winsize.x, Button->GetRect().GetRight() );
|
||||
|
||||
pos.y += Button->GetSize().y + 5;
|
||||
Button = new wxButton( this, ID_SWAP_LAYER_BUTTON_SELECT,
|
||||
_( "Select" ), pos );
|
||||
|
||||
Button->SetForegroundColour( wxColour( 0, 100, 100 ) );
|
||||
winsize.x = MAX( winsize.x, Button->GetRect().GetRight() );
|
||||
|
||||
winsize.x += 10; winsize.y += 10;
|
||||
SetClientSize( winsize );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -133,18 +138,21 @@ void WinEDA_SwapLayerFrame::Sel_Layer(wxCommandEvent& event)
|
|||
case ID_SWAP_LAYER_BUTTON_SELECT:
|
||||
case ID_SWAP_LAYER_SELECT:
|
||||
jj = m_Parent->SelectLayer( ii, -1, -1 );
|
||||
if ( (jj < 0) || (jj >= 29) ) return;
|
||||
if( (jj < 0) || (jj >= 29) )
|
||||
return;
|
||||
|
||||
if( ii != jj )
|
||||
{
|
||||
New_Layer[ii] = jj;
|
||||
m_LayerList->SetString( ii,
|
||||
ReturnPcbLayerName(ii) + wxT(" -> ") + ReturnPcbLayerName(jj) );
|
||||
ReturnPcbLayerName( ii ) + wxT( " -> " ) +
|
||||
ReturnPcbLayerName( jj ) );
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************/
|
||||
void WinEDA_SwapLayerFrame::Cancel( wxCommandEvent& event )
|
||||
/*********************************************************/
|
||||
|
@ -152,6 +160,7 @@ void WinEDA_SwapLayerFrame::Cancel(wxCommandEvent& event)
|
|||
EndModal( -1 );
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************/
|
||||
void WinEDA_SwapLayerFrame::Execute( wxCommandEvent& event )
|
||||
/*********************************************************/
|
||||
|
@ -172,12 +181,15 @@ EDA_BaseStruct * PtStruct;
|
|||
|
||||
|
||||
/* 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 );
|
||||
|
||||
ii = frame->ShowModal(); frame->Destroy();
|
||||
|
||||
if ( ii != 1 ) return;
|
||||
if( ii != 1 )
|
||||
return;
|
||||
|
||||
/* Modifications des pistes */
|
||||
pt_segm = (TRACK*) m_Pcb->m_Track;
|
||||
|
@ -187,7 +199,8 @@ WinEDA_SwapLayerFrame * frame = new WinEDA_SwapLayerFrame(this);
|
|||
if( pt_segm->m_StructType == TYPEVIA )
|
||||
{
|
||||
SEGVIA* Via = (SEGVIA*) pt_segm;
|
||||
if ( Via->Shape() == VIA_NORMALE ) continue;
|
||||
if( Via->Shape() == VIA_NORMALE )
|
||||
continue;
|
||||
int top_layer, bottom_layer;
|
||||
Via->ReturnLayerPair( &top_layer, &bottom_layer );
|
||||
if( New_Layer[bottom_layer] >= 0 )
|
||||
|
@ -198,8 +211,9 @@ WinEDA_SwapLayerFrame * frame = new WinEDA_SwapLayerFrame(this);
|
|||
}
|
||||
else
|
||||
{
|
||||
jj = pt_segm->m_Layer;
|
||||
if( New_Layer[jj] >= 0) pt_segm->m_Layer = New_Layer[jj];
|
||||
jj = pt_segm->GetLayer();
|
||||
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 )
|
||||
{
|
||||
m_CurrentScreen->SetModify();
|
||||
jj = pt_segm->m_Layer;
|
||||
if( New_Layer[jj] >= 0) pt_segm->m_Layer = New_Layer[jj];
|
||||
jj = pt_segm->GetLayer();
|
||||
if( New_Layer[jj] >= 0 )
|
||||
pt_segm->SetLayer( New_Layer[jj] );
|
||||
}
|
||||
|
||||
/* Modifications des autres segments */
|
||||
|
@ -220,11 +235,11 @@ WinEDA_SwapLayerFrame * frame = new WinEDA_SwapLayerFrame(this);
|
|||
{
|
||||
m_CurrentScreen->SetModify();
|
||||
pt_drawsegm = (DRAWSEGMENT*) PtStruct;
|
||||
jj = pt_drawsegm->m_Layer;
|
||||
if( New_Layer[jj] >= 0) pt_drawsegm->m_Layer = New_Layer[jj];
|
||||
jj = pt_drawsegm->GetLayer();
|
||||
if( New_Layer[jj] >= 0 )
|
||||
pt_drawsegm->SetLayer( New_Layer[jj] );
|
||||
}
|
||||
}
|
||||
|
||||
DrawPanel->Refresh( TRUE );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -123,13 +123,13 @@ void WinEDA_PcbFrame::Trace_Pcb( wxDC* DC, int mode )
|
|||
|
||||
if( !DisplayOpt.Show_Modules_Cmp )
|
||||
{
|
||||
if( Module->m_Layer == CMP_N )
|
||||
if( Module->GetLayer() == CMP_N )
|
||||
display = FALSE;
|
||||
MaskLay &= ~CMP_LAYER;
|
||||
}
|
||||
if( !DisplayOpt.Show_Modules_Cu )
|
||||
{
|
||||
if( Module->m_Layer == CUIVRE_N )
|
||||
if( Module->GetLayer() == CUIVRE_N )
|
||||
display = FALSE;
|
||||
MaskLay &= ~CUIVRE_LAYER;
|
||||
}
|
||||
|
|
119
pcbnew/track.cpp
119
pcbnew/track.cpp
|
@ -17,8 +17,7 @@ public:
|
|||
TRACK* RefTrack;
|
||||
|
||||
public:
|
||||
TSTSEGM(TRACK * Father)
|
||||
{
|
||||
TSTSEGM( TRACK * Father ) {
|
||||
Pback = Pnext = NULL;
|
||||
RefTrack = Father;
|
||||
}
|
||||
|
@ -38,14 +37,15 @@ TSTSEGM * ListSegm = NULL;
|
|||
TRACK* Marque_Une_Piste( WinEDA_BasePcbFrame* frame, wxDC* DC,
|
||||
TRACK* pt_segm, int* nb_segm, int flagcolor )
|
||||
/****************************************************************************/
|
||||
|
||||
/* Routine de Marquage de 1 piste, a partir du segment pointe par pt_segm.
|
||||
le segment pointe est marque puis les segments connectes
|
||||
jusqu'a un pad ou un point de jonction de plus de 2 segments
|
||||
le marquage est la mise a 1 du bit BUSY
|
||||
Les segments sont ensuite reclasses pour etre contigus en liste chainee
|
||||
Retourne:
|
||||
adresse du 1er segment de la chaine creee
|
||||
nombre de segments
|
||||
* le segment pointe est marque puis les segments connectes
|
||||
* jusqu'a un pad ou un point de jonction de plus de 2 segments
|
||||
* le marquage est la mise a 1 du bit BUSY
|
||||
* Les segments sont ensuite reclasses pour etre contigus en liste chainee
|
||||
* Retourne:
|
||||
* adresse du 1er segment de la chaine creee
|
||||
* nombre de segments
|
||||
*/
|
||||
{
|
||||
int NbSegmBusy, masque_layer;
|
||||
|
@ -53,18 +53,20 @@ TRACK *Track, *FirstTrack, *NextTrack;
|
|||
TSTSEGM* Segm, * NextSegm;
|
||||
|
||||
*nb_segm = 0;
|
||||
if (pt_segm == NULL ) return(NULL) ;
|
||||
if( pt_segm == NULL )
|
||||
return NULL;
|
||||
|
||||
/* 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 );
|
||||
masque_layer = pt_segm->ReturnMaskLayer();
|
||||
ListSegm = new TSTSEGM( pt_segm );
|
||||
|
||||
/* 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 <=2, on doit detecter une piste, si > 2 seule la via est marquee
|
||||
* 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
|
||||
*/
|
||||
if( pt_segm->m_StructType == TYPEVIA )
|
||||
{
|
||||
|
@ -83,7 +85,7 @@ TSTSEGM * Segm, * NextSegm;
|
|||
}
|
||||
if( Segm3 )
|
||||
{
|
||||
*nb_segm = 1; return (pt_segm);
|
||||
*nb_segm = 1; return pt_segm;
|
||||
}
|
||||
if( Segm1 )
|
||||
{
|
||||
|
@ -106,21 +108,24 @@ TSTSEGM * Segm, * NextSegm;
|
|||
for( Segm = ListSegm; Segm != NULL; Segm = Segm->Pnext )
|
||||
{
|
||||
int layer;
|
||||
if( Segm->RefTrack->m_StructType != TYPEVIA ) continue;
|
||||
if( Segm->RefTrack == pt_segm ) continue;
|
||||
if( Segm->RefTrack->m_StructType != TYPEVIA )
|
||||
continue;
|
||||
if( Segm->RefTrack == pt_segm )
|
||||
continue;
|
||||
Segm->RefTrack->SetState( BUSY, ON );
|
||||
masque_layer = Segm->RefTrack->ReturnMaskLayer();
|
||||
Track = Fast_Locate_Piste( frame->m_Pcb->m_Track, NULL,
|
||||
Segm->RefTrack->m_Start,
|
||||
masque_layer );
|
||||
if( Track == NULL ) continue;
|
||||
if( Track == NULL )
|
||||
continue;
|
||||
/* Test des connexions: si via utile: suppression marquage */
|
||||
layer = Track->m_Layer;
|
||||
layer = Track->GetLayer();
|
||||
while( ( Track = Fast_Locate_Piste( (TRACK*) Track->Pnext, NULL,
|
||||
Segm->RefTrack->m_Start,
|
||||
masque_layer ) ) != NULL )
|
||||
{
|
||||
if( layer != Track->m_Layer )
|
||||
if( layer != Track->GetLayer() )
|
||||
{
|
||||
Segm->RefTrack->SetState( BUSY, OFF );
|
||||
break;
|
||||
|
@ -133,6 +138,7 @@ TSTSEGM * Segm, * NextSegm;
|
|||
{
|
||||
NextSegm = Segm->Pnext; delete Segm;
|
||||
}
|
||||
|
||||
ListSegm = NULL;
|
||||
|
||||
/* Reclassement des segments marques en une chaine */
|
||||
|
@ -146,7 +152,7 @@ TSTSEGM * Segm, * NextSegm;
|
|||
}
|
||||
|
||||
/* 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;
|
||||
for( ; Track != NULL; Track = NextTrack )
|
||||
{
|
||||
|
@ -161,22 +167,24 @@ TSTSEGM * Segm, * NextSegm;
|
|||
|
||||
*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 )
|
||||
/********************************************************************************/
|
||||
/*
|
||||
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
|
||||
|
@ -185,29 +193,33 @@ TRACK *pt_segm, // Pointe le segment courant analyse
|
|||
int NbSegm;
|
||||
TSTSEGM* Segm;
|
||||
|
||||
if(Pcb->m_Track == NULL) return;
|
||||
if( Pcb->m_Track == NULL )
|
||||
return;
|
||||
|
||||
/* Marquage de la chaine */
|
||||
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) */
|
||||
pt_via = Fast_Locate_Via( Pcb->m_Track, NULL, ref_pos, masque_layer );
|
||||
if( pt_via )
|
||||
{
|
||||
if(pt_via->GetState(EDIT)) return;
|
||||
if( pt_via->GetState( EDIT ) )
|
||||
return;
|
||||
masque_layer = pt_via->ReturnMaskLayer();
|
||||
Segm = new TSTSEGM( pt_via );
|
||||
|
||||
Segm->Pnext = ListSegm;
|
||||
ListSegm->Pback = Segm;
|
||||
ListSegm = Segm;
|
||||
}
|
||||
|
||||
/* Recherche des segments connectes au point ref_pos
|
||||
si 1 segment: peut etre marque
|
||||
si > 1 segment:
|
||||
le segment ne peut etre marque
|
||||
* si 1 segment: peut etre marque
|
||||
* si > 1 segment:
|
||||
* le segment ne peut etre marque
|
||||
*/
|
||||
pt_segm = Pcb->m_Track; MarqSegm = NULL;
|
||||
NbSegm = 0;
|
||||
|
@ -249,7 +261,8 @@ TSTSEGM * Segm;
|
|||
{
|
||||
ref_pos = MarqSegm->m_End;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
ref_pos = MarqSegm->m_Start;
|
||||
}
|
||||
|
||||
|
@ -257,12 +270,14 @@ TSTSEGM * Segm;
|
|||
|
||||
/* Marquage et mise en liste du segment */
|
||||
Segm = new TSTSEGM( MarqSegm );
|
||||
|
||||
Segm->Pnext = ListSegm;
|
||||
ListSegm->Pback = Segm;
|
||||
ListSegm = Segm;
|
||||
MarqSegm->SetState( BUSY, ON );
|
||||
}
|
||||
else return;
|
||||
else
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -271,12 +286,13 @@ TSTSEGM * Segm;
|
|||
int ReturnEndsTrack( TRACK* RefTrack, int NbSegm,
|
||||
TRACK** StartTrack, TRACK** EndTrack )
|
||||
/**********************************************************/
|
||||
|
||||
/* Calcule les coordonnes des extremites d'une piste
|
||||
retourne 1 si OK, 0 si piste bouclee
|
||||
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 EndTrack->m_End.x, m_End.y contiennent le debut de la piste
|
||||
Les segments sont supposes chaines de facon consecutive
|
||||
* retourne 1 si OK, 0 si piste bouclee
|
||||
* 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 EndTrack->m_End.x, m_End.y contiennent le debut de la piste
|
||||
* Les segments sont supposes chaines de facon consecutive
|
||||
*/
|
||||
{
|
||||
TRACK* Track, * via, * segm, * TrackListEnd;
|
||||
|
@ -285,7 +301,7 @@ int NbEnds, masque_layer, ii, ok = 0;
|
|||
if( NbSegm <= 1 )
|
||||
{
|
||||
*StartTrack = *EndTrack = RefTrack;
|
||||
return(1); /* cas trivial */
|
||||
return 1; /* cas trivial */
|
||||
}
|
||||
|
||||
/* calcul de la limite d'analyse */
|
||||
|
@ -301,7 +317,8 @@ int NbEnds, masque_layer, ii, ok = 0;
|
|||
NbEnds = 0; Track = RefTrack; ii = 0;
|
||||
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();
|
||||
via = Fast_Locate_Via( RefTrack, TrackListEnd,
|
||||
|
@ -316,7 +333,8 @@ int NbEnds, masque_layer, ii, ok = 0;
|
|||
segm = Fast_Locate_Piste( RefTrack, TrackListEnd,
|
||||
Track->m_Start, masque_layer );
|
||||
Track->SetState( BUSY, OFF );
|
||||
if(via) via->SetState(BUSY,OFF);
|
||||
if( via )
|
||||
via->SetState( BUSY, OFF );
|
||||
|
||||
if( segm == NULL )
|
||||
{
|
||||
|
@ -339,7 +357,7 @@ int NbEnds, masque_layer, ii, ok = 0;
|
|||
Track->SetState( BEGIN_ONPAD, ON );
|
||||
EXCHG( Track->m_Start, Track->m_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,
|
||||
Track->m_End, masque_layer );
|
||||
Track->SetState( BUSY, OFF );
|
||||
if (via) via->SetState(BUSY,OFF);
|
||||
if( via )
|
||||
via->SetState( BUSY, OFF );
|
||||
if( segm == NULL )
|
||||
{
|
||||
switch( NbEnds )
|
||||
|
@ -378,22 +397,24 @@ int NbEnds, masque_layer, ii, ok = 0;
|
|||
|
||||
case 1:
|
||||
*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 )
|
||||
/***************************************************************************/
|
||||
|
||||
/* 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 )
|
||||
{
|
||||
Start->SetState( State, onoff );
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
/*********************************************************************************/
|
||||
void Trace_Pistes( WinEDA_DrawPanel* panel, BOARD* Pcb, wxDC* DC, int drawmode )
|
||||
/********************************************************************************/
|
||||
|
||||
/* Draw all tracks and zones.
|
||||
*/
|
||||
{
|
||||
|
@ -35,41 +36,45 @@ TRACK * track;
|
|||
}
|
||||
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
void Trace_Une_Piste( WinEDA_DrawPanel* panel, wxDC* DC, TRACK* Track,
|
||||
int nbsegment, int draw_mode )
|
||||
/************************************************************************/
|
||||
|
||||
/* routine de trace de n segments consecutifs en memoire.
|
||||
Utile pour monter une piste en cours de trace car les segments de cette
|
||||
piste sont alors contigus en memoire
|
||||
Parametres :
|
||||
pt_start_piste = adresse de depart de la liste des segments
|
||||
nbsegment = nombre de segments a tracer
|
||||
draw_mode = mode ( GR_XOR, GR_OR..)
|
||||
ATTENTION:
|
||||
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
|
||||
* Utile pour monter une piste en cours de trace car les segments de cette
|
||||
* piste sont alors contigus en memoire
|
||||
* Parametres :
|
||||
* pt_start_piste = adresse de depart de la liste des segments
|
||||
* nbsegment = nombre de segments a tracer
|
||||
* draw_mode = mode ( GR_XOR, GR_OR..)
|
||||
* ATTENTION:
|
||||
* 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
|
||||
*/
|
||||
{
|
||||
if ( Track == NULL ) return;
|
||||
if( Track == NULL )
|
||||
return;
|
||||
for( ; nbsegment > 0; nbsegment--, Track = (TRACK*) Track->Pnext )
|
||||
{
|
||||
if ( Track == NULL ) break;
|
||||
if( Track == NULL )
|
||||
break;
|
||||
Track->Draw( panel, DC, draw_mode );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************/
|
||||
void Trace_DrawSegmentPcb( WinEDA_DrawPanel* panel, wxDC* DC,
|
||||
DRAWSEGMENT* PtDrawSegment, int draw_mode )
|
||||
/*************************************************************/
|
||||
|
||||
/* Affichage d'un segment type drawing PCB:
|
||||
draw_mode = mode de trace ( GR_OR, GR_XOR, GrAND)
|
||||
Les contours sont de differents type:
|
||||
segment
|
||||
cercle
|
||||
arc
|
||||
* draw_mode = mode de trace ( GR_OR, GR_XOR, GrAND)
|
||||
* Les contours sont de differents type:
|
||||
* segment
|
||||
* cercle
|
||||
* arc
|
||||
*/
|
||||
{
|
||||
int ux0, uy0, dx, dy;
|
||||
|
@ -78,11 +83,14 @@ int color, mode;
|
|||
int zoom;
|
||||
int rayon;
|
||||
|
||||
color = g_DesignSettings.m_LayerColor[PtDrawSegment->m_Layer];
|
||||
if(color & ITEM_NOT_SHOW ) return ;
|
||||
color = g_DesignSettings.m_LayerColor[PtDrawSegment->GetLayer()];
|
||||
if( color & ITEM_NOT_SHOW )
|
||||
return;
|
||||
|
||||
if ( panel ) zoom = panel->GetZoom();
|
||||
else zoom = ActiveScreen->GetZoom();
|
||||
if( panel )
|
||||
zoom = panel->GetZoom();
|
||||
else
|
||||
zoom = ActiveScreen->GetZoom();
|
||||
|
||||
GRSetDrawMode( DC, draw_mode );
|
||||
l_piste = PtDrawSegment->m_Width >> 1; /* l_piste = demi largeur piste */
|
||||
|
@ -96,8 +104,10 @@ int rayon;
|
|||
|
||||
|
||||
mode = DisplayOpt.DisplayDrawItems;
|
||||
if(PtDrawSegment->m_Flags & FORCE_SKETCH) mode = SKETCH;
|
||||
if ( l_piste < (L_MIN_DESSIN * zoom) ) mode = FILAIRE;
|
||||
if( PtDrawSegment->m_Flags & FORCE_SKETCH )
|
||||
mode = SKETCH;
|
||||
if( l_piste < (L_MIN_DESSIN * zoom) )
|
||||
mode = FILAIRE;
|
||||
|
||||
switch( PtDrawSegment->m_Shape )
|
||||
{
|
||||
|
@ -124,7 +134,8 @@ int rayon;
|
|||
rayon = (int) hypot( (double) (dx - ux0), (double) (dy - uy0) );
|
||||
StAngle = (int) ArcTangente( dy - uy0, dx - ux0 );
|
||||
EndAngle = StAngle + PtDrawSegment->m_Angle;
|
||||
if ( StAngle > EndAngle) EXCHG (StAngle, EndAngle);
|
||||
if( StAngle > EndAngle )
|
||||
EXCHG( StAngle, EndAngle );
|
||||
if( mode == FILAIRE )
|
||||
GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, rayon, color );
|
||||
else if( mode == SKETCH )
|
||||
|
@ -158,4 +169,3 @@ int rayon;
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -14,8 +14,7 @@
|
|||
|
||||
/* variables locales */
|
||||
|
||||
enum id_ExchangeModule
|
||||
{
|
||||
enum id_ExchangeModule {
|
||||
ID_EXEC_EXCHANGE_MODULE = 1900,
|
||||
ID_EXEC_EXCHANGE_ID_MODULES,
|
||||
ID_EXEC_EXCHANGE_ID_MODULE_AND_VALUE,
|
||||
|
@ -41,6 +40,7 @@ private:
|
|||
wxTextCtrl* m_WinMsg;
|
||||
|
||||
public:
|
||||
|
||||
// Constructor and destructor
|
||||
WinEDA_ExchangeModuleFrame( WinEDA_BasePcbFrame * parent,
|
||||
MODULE * Module, wxDC * DC, const wxPoint &pos );
|
||||
|
@ -90,53 +90,67 @@ wxButton * Button;
|
|||
m_CurrentModule = Module;
|
||||
|
||||
wxBoxSizer* MainBoxSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
SetSizer( MainBoxSizer );
|
||||
wxBoxSizer* UpperBoxSizer = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
MainBoxSizer->Add( UpperBoxSizer, 0, wxGROW | wxALL, 5 );
|
||||
wxBoxSizer* LeftBoxSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxBoxSizer* RightBoxSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
UpperBoxSizer->Add( LeftBoxSizer, 0, wxGROW | wxALL, 5 );
|
||||
UpperBoxSizer->Add( RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
|
||||
|
||||
/* Creation des boutons de commande */
|
||||
Button = new wxButton( this, ID_EXEC_EXCHANGE_MODULE,
|
||||
_( "Change module" ) );
|
||||
|
||||
Button->SetForegroundColour( *wxBLUE );
|
||||
RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 );
|
||||
|
||||
Button = new wxButton( this, ID_EXEC_EXCHANGE_ID_MODULES,
|
||||
_( "Change same modules" ) );
|
||||
|
||||
Button->SetForegroundColour( *wxRED );
|
||||
RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT, 5 );
|
||||
|
||||
Button = new wxButton( this, ID_EXEC_EXCHANGE_ID_MODULE_AND_VALUE,
|
||||
_( "Ch. same module+value" ) );
|
||||
|
||||
Button->SetForegroundColour( *wxRED );
|
||||
RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT, 5 );
|
||||
|
||||
Button = new wxButton( this, ID_EXEC_EXCHANGE_ALL_MODULES,
|
||||
_( "Change all" ) );
|
||||
|
||||
Button->SetForegroundColour( *wxRED );
|
||||
RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT, 5 );
|
||||
|
||||
Button = new wxButton( this, ID_BROWSE_LIB_MODULES,
|
||||
_( "Browse Libs modules" ) );
|
||||
|
||||
Button->SetForegroundColour( wxColour( 0, 100, 0 ) );
|
||||
RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT, 5 );
|
||||
|
||||
Button = new wxButton( this, ID_CLOSE_EXCHANGE_MODULE,
|
||||
_( "Close" ) );
|
||||
|
||||
Button->SetForegroundColour( *wxBLUE );
|
||||
RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 );
|
||||
|
||||
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 ) );
|
||||
|
||||
m_OldModule->Enable( FALSE );
|
||||
|
||||
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 ) );
|
||||
|
||||
m_OldValue->Enable( FALSE );
|
||||
|
||||
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 ),
|
||||
wxTE_READONLY | wxTE_MULTILINE );
|
||||
|
||||
MainBoxSizer->Add( m_WinMsg, 0, wxGROW | wxALL, 5 );
|
||||
|
||||
GetSizer()->Fit( this );
|
||||
|
@ -158,6 +173,7 @@ void WinEDA_BasePcbFrame::InstallExchangeModuleFrame( MODULE * Module,
|
|||
{
|
||||
WinEDA_ExchangeModuleFrame* frame = new WinEDA_ExchangeModuleFrame( this,
|
||||
Module, DC, pos );
|
||||
|
||||
frame->ShowModal(); frame->Destroy();
|
||||
}
|
||||
|
||||
|
@ -170,20 +186,20 @@ void WinEDA_ExchangeModuleFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
|
|||
}
|
||||
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
int WinEDA_ExchangeModuleFrame::Maj_ListeCmp(
|
||||
const wxString& reference,
|
||||
const wxString& old_name,
|
||||
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.
|
||||
Retoure 1 si erreur
|
||||
/*
|
||||
* 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.
|
||||
* Retoure 1 si erreur
|
||||
*/
|
||||
{
|
||||
wxString FileNameCmp, tmpfile;
|
||||
|
@ -191,12 +207,14 @@ FILE * FichCmp, *NewFile;
|
|||
char Line[1024];
|
||||
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 */
|
||||
if( NetNameBuffer == wxEmptyString )
|
||||
FileNameCmp = m_Parent->m_CurrentScreen->m_FileName;
|
||||
else FileNameCmp = NetNameBuffer;
|
||||
else
|
||||
FileNameCmp = NetNameBuffer;
|
||||
ChangeFileNameExt( FileNameCmp, NetCmpExtBuffer );
|
||||
|
||||
// Modification du fichier .cmp correcpondant
|
||||
|
@ -208,7 +226,7 @@ wxString msg;
|
|||
msg.Printf( _( "file %s not found" ), FileNameCmp.GetData() );
|
||||
m_WinMsg->WriteText( msg );
|
||||
}
|
||||
return(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Analyse du fichier et modif */
|
||||
|
@ -222,7 +240,7 @@ wxString msg;
|
|||
msg.Printf( _( "Unable to create file %s" ), tmpfile.GetData() );
|
||||
m_WinMsg->WriteText( msg );
|
||||
}
|
||||
return(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
fgets( Line, sizeof(Line), FichCmp );
|
||||
|
@ -242,8 +260,8 @@ wxString msg;
|
|||
}
|
||||
}
|
||||
|
||||
if ( (strnicmp( Line, "Begin", 5 ) == 0) ||
|
||||
(strnicmp( Line, "End", 3) == 0) )
|
||||
if( (strnicmp( Line, "Begin", 5 ) == 0)
|
||||
|| (strnicmp( Line, "End", 3 ) == 0) )
|
||||
{
|
||||
start_descr = FALSE;
|
||||
}
|
||||
|
@ -264,26 +282,26 @@ wxString msg;
|
|||
fclose( NewFile );
|
||||
wxRemoveFile( FileNameCmp );
|
||||
wxRenameFile( tmpfile, FileNameCmp );
|
||||
return(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/********************************************************************/
|
||||
void WinEDA_ExchangeModuleFrame::Change_Module( wxCommandEvent& event )
|
||||
/********************************************************************/
|
||||
|
||||
/* Routine de changement d'un module:
|
||||
Change le module pointe par la souris, par un autre en conservant
|
||||
- meme orientation
|
||||
- meme position
|
||||
- memes textes valeur et ref
|
||||
- memes netnames pour pads de meme nom
|
||||
* Change le module pointe par la souris, par un autre en conservant
|
||||
* - meme orientation
|
||||
* - meme position
|
||||
* - memes textes valeur et ref
|
||||
* - memes netnames pour pads de meme nom
|
||||
*/
|
||||
{
|
||||
wxString newmodulename = m_NewModule->GetValue();
|
||||
|
||||
if( newmodulename == wxEmptyString ) return;
|
||||
if( newmodulename == wxEmptyString )
|
||||
return;
|
||||
|
||||
if( Change_1_Module( m_CurrentModule, newmodulename, TRUE ) )
|
||||
{
|
||||
|
@ -292,19 +310,20 @@ wxString newmodulename = m_NewModule->GetValue();
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************************/
|
||||
void WinEDA_ExchangeModuleFrame::Change_ModuleId( wxCommandEvent& event )
|
||||
/**********************************************************************/
|
||||
|
||||
/* Routine de changement de tous les modules de meme nom lib que celui
|
||||
selectionne, en conservant
|
||||
- meme orientation
|
||||
- meme position
|
||||
- memes textes valeur et ref
|
||||
- memes netnames pour pads de meme nom
|
||||
et en remplacant l'ancien module par le noveau module
|
||||
Attention: m_CurrentModule ne pointe plus sur le module de reference
|
||||
puisque celui ci a ete change!!
|
||||
* selectionne, en conservant
|
||||
* - meme orientation
|
||||
* - meme position
|
||||
* - memes textes valeur et ref
|
||||
* - memes netnames pour pads de meme nom
|
||||
* et en remplacant l'ancien module par le noveau module
|
||||
* Attention: m_CurrentModule ne pointe plus sur le module de reference
|
||||
* puisque celui ci a ete change!!
|
||||
*/
|
||||
{
|
||||
wxString msg;
|
||||
|
@ -315,8 +334,10 @@ wxString value, lib_reference; // pour memo Reflib et value de reference
|
|||
bool check_module_value = FALSE;
|
||||
int ShowErr = 5; // Affiche 5 messages d'err maxi
|
||||
|
||||
if( m_Parent->m_Pcb->m_Modules == NULL ) return;
|
||||
if( newmodulename == wxEmptyString ) return;
|
||||
if( m_Parent->m_Pcb->m_Modules == NULL )
|
||||
return;
|
||||
if( newmodulename == wxEmptyString )
|
||||
return;
|
||||
|
||||
lib_reference = m_CurrentModule->m_LibRef;
|
||||
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(),
|
||||
m_CurrentModule->m_Value->m_Text.GetData() );
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
msg.Printf( _( "Change modules <%s> -> <%s> ?" ),
|
||||
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
|
||||
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;
|
||||
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 */
|
||||
|
@ -360,9 +382,12 @@ int ShowErr = 5; // Affiche 5 messages d'err maxi
|
|||
continue;
|
||||
}
|
||||
module = Change_1_Module( PtModule, newmodulename.GetData(), ShowErr );
|
||||
if ( module ) change = TRUE;
|
||||
else if (ShowErr) ShowErr--;
|
||||
if( module )
|
||||
change = TRUE;
|
||||
else if( ShowErr )
|
||||
ShowErr--;
|
||||
}
|
||||
|
||||
if( change )
|
||||
{
|
||||
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 )
|
||||
/***********************************************************************/
|
||||
|
||||
/* Routine de changement de tous les modules par les modules de meme nom lib:
|
||||
en conservant
|
||||
- meme orientation
|
||||
- meme position
|
||||
- memes textes valeur et ref
|
||||
- memes netnames pour pads de meme nom
|
||||
* en conservant
|
||||
* - meme orientation
|
||||
* - meme position
|
||||
* - memes textes valeur et ref
|
||||
* - memes netnames pour pads de meme nom
|
||||
*/
|
||||
{
|
||||
MODULE* PtModule, * PtBack;
|
||||
bool change = FALSE;
|
||||
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
|
||||
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;
|
||||
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 */
|
||||
|
@ -405,7 +435,8 @@ int ShowErr = 5; // Affiche 5 messages d'err maxi
|
|||
PtBack = (MODULE*) PtModule->Pback;
|
||||
if( Change_1_Module( PtModule, PtModule->m_LibRef.GetData(), ShowErr ) )
|
||||
change = TRUE;
|
||||
else if (ShowErr) ShowErr--;
|
||||
else if( ShowErr )
|
||||
ShowErr--;
|
||||
}
|
||||
|
||||
if( change )
|
||||
|
@ -415,26 +446,29 @@ int ShowErr = 5; // Affiche 5 messages d'err maxi
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************/
|
||||
MODULE* WinEDA_ExchangeModuleFrame::Change_1_Module( MODULE* PtModule,
|
||||
const wxString& new_module, bool ShowError )
|
||||
/*******************************************************************/
|
||||
|
||||
/* Routine de changement d'un module:
|
||||
Change le module de numero empr, avec le module de nom new_module
|
||||
- meme orientation
|
||||
- meme position
|
||||
- memes textes valeur et ref
|
||||
- memes netnames pour pads de meme nom
|
||||
Retourne :
|
||||
0 si pas de changement ( si le nouveau module n'est pas en libr)
|
||||
1 si OK
|
||||
* Change le module de numero empr, avec le module de nom new_module
|
||||
* - meme orientation
|
||||
* - meme position
|
||||
* - memes textes valeur et ref
|
||||
* - memes netnames pour pads de meme nom
|
||||
* Retourne :
|
||||
* 0 si pas de changement ( si le nouveau module n'est pas en libr)
|
||||
* 1 si OK
|
||||
*/
|
||||
{
|
||||
wxString namecmp, oldnamecmp;
|
||||
MODULE* NewModule;
|
||||
wxString Line;
|
||||
|
||||
if(PtModule == NULL) return(NULL);
|
||||
if( PtModule == NULL )
|
||||
return NULL;
|
||||
|
||||
wxBusyCursor dummy;
|
||||
|
||||
|
@ -453,10 +487,11 @@ wxBusyCursor dummy;
|
|||
if( NewModule == NULL ) /* Nouveau module NON trouve, reaffichage de l'ancien */
|
||||
{
|
||||
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" ) );
|
||||
|
||||
/* Effacement a l'ecran de l'ancien module */
|
||||
|
@ -469,16 +504,18 @@ wxBusyCursor dummy;
|
|||
|
||||
Maj_ListeCmp( NewModule->m_Reference->m_Text, oldnamecmp, namecmp, ShowError );
|
||||
|
||||
return(NewModule);
|
||||
return NewModule;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************/
|
||||
MODULE* WinEDA_BasePcbFrame::Exchange_Module( wxWindow* winaff,
|
||||
MODULE* OldModule, MODULE* NewModule )
|
||||
/***********************************************************************************/
|
||||
|
||||
/*
|
||||
Remplace le module OldModule par le module NewModule (en conservant position, orientation..)
|
||||
OldModule est supprimé de la memoire.
|
||||
* Remplace le module OldModule par le module NewModule (en conservant position, orientation..)
|
||||
* OldModule est supprimé de la memoire.
|
||||
*/
|
||||
{
|
||||
wxPoint oldpos;/* memorisation temporaire pos curseur */
|
||||
|
@ -499,7 +536,7 @@ D_PAD * pt_pad, * pt_old_pad;
|
|||
m_CurrentScreen->m_Curseur = oldpos;
|
||||
|
||||
/* Changement eventuel de couche */
|
||||
if( OldModule->m_Layer != NewModule->m_Layer)
|
||||
if( OldModule->GetLayer() != NewModule->GetLayer() )
|
||||
{
|
||||
Change_Side_Module( NewModule, NULL );
|
||||
}
|
||||
|
@ -526,7 +563,8 @@ D_PAD * pt_pad, * pt_old_pad;
|
|||
pt_old_pad = OldModule->m_Pads;
|
||||
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_NetCode = pt_old_pad->m_NetCode;
|
||||
|
@ -552,7 +590,10 @@ void WinEDA_ExchangeModuleFrame::Sel_NewMod_By_Liste(wxCommandEvent& event)
|
|||
{
|
||||
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 )
|
||||
m_NewModule->SetValue( newname );
|
||||
}
|
||||
|
@ -577,7 +618,8 @@ wxString msg;
|
|||
/* Calcul nom fichier CMP par changement de l'extension du nom netliste */
|
||||
if( NetNameBuffer == wxEmptyString )
|
||||
FullFileNameCmp = m_CurrentScreen->m_FileName;
|
||||
else FullFileNameCmp = NetNameBuffer;
|
||||
else
|
||||
FullFileNameCmp = NetNameBuffer;
|
||||
ChangeFileNameExt( FullFileNameCmp, NetCmpExtBuffer );
|
||||
|
||||
mask = wxT( "*" ) + NetCmpExtBuffer;
|
||||
|
@ -590,7 +632,8 @@ wxString msg;
|
|||
wxFD_SAVE,
|
||||
FALSE
|
||||
);
|
||||
if ( FullFileNameCmp.IsEmpty() ) return FALSE;
|
||||
if( FullFileNameCmp.IsEmpty() )
|
||||
return FALSE;
|
||||
|
||||
|
||||
FichCmp = wxFopen( FullFileNameCmp, wxT( "wt" ) );
|
||||
|
|
|
@ -683,7 +683,7 @@ EDGE_ZONE* WinEDA_PcbFrame::Begin_Zone( void )
|
|||
newedge->Pback = oldedge;
|
||||
if( oldedge )
|
||||
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_Start = newedge->m_End = GetScreen()->m_Curseur;
|
||||
|
||||
|
@ -702,7 +702,7 @@ EDGE_ZONE* WinEDA_PcbFrame::Begin_Zone( void )
|
|||
oldedge->Pnext = newedge;
|
||||
newedge->m_Flags = IS_NEW | IS_MOVED;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -777,7 +777,7 @@ static void Show_Zone_Edge_While_MoveMouse( WinEDA_DrawPanel* panel, wxDC* DC, b
|
|||
edgezone = PtLim = pcbframe->m_Pcb->m_CurrentLimitZone;
|
||||
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 */
|
||||
|
@ -849,7 +849,7 @@ void WinEDA_PcbFrame::Fill_Zone( wxDC* DC )
|
|||
for( ; PtLim != NULL; PtLim = (EDGE_ZONE*) PtLim->Pback )
|
||||
{
|
||||
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 );
|
||||
}
|
||||
|
||||
|
@ -922,7 +922,7 @@ void WinEDA_PcbFrame::Fill_Zone( wxDC* DC )
|
|||
{
|
||||
if( g_HightLigth_NetCode != pt_segm->m_NetCode )
|
||||
continue;
|
||||
if( pt_segm->m_Layer != GetScreen()->m_Active_Layer )
|
||||
if( pt_segm->GetLayer() != GetScreen()->m_Active_Layer )
|
||||
continue;
|
||||
if( pt_segm->m_StructType != TYPETRACK )
|
||||
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 */
|
||||
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_Width = g_GridRoutingSize;
|
||||
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 */
|
||||
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_NetCode = net_code;
|
||||
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->m_Layer = layer;
|
||||
pt_track->SetLayer( layer );
|
||||
pt_track->m_Width = g_DesignSettings.m_CurrentTrackWidth;
|
||||
pt_track->m_NetCode = g_HightLigth_NetCode;
|
||||
pt_track->start = pt_pad;
|
||||
|
|
Loading…
Reference in New Issue