start of new search stuff, beautification
This commit is contained in:
parent
abd187e318
commit
6f7209aa73
|
@ -5,6 +5,12 @@ Please add newer entries at the top, list the date and your name with
|
||||||
email address.
|
email address.
|
||||||
|
|
||||||
|
|
||||||
|
2007-Aug-06 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||||
|
================================================================================
|
||||||
|
+ pcbnew & common
|
||||||
|
Started sketching out a new search architecture. To learn more:
|
||||||
|
look for "INSPECTOR" text in base_struct.h.
|
||||||
|
|
||||||
|
|
||||||
2007-Aug-05 UPDATE Dick Hollenbeck <dick@softplc.com>
|
2007-Aug-05 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||||
================================================================================
|
================================================================================
|
||||||
|
|
|
@ -224,10 +224,46 @@ void EDA_BaseStruct::Show( int nestLevel, std::ostream& os )
|
||||||
std::ostream& EDA_BaseStruct::NestedSpace( int nestLevel, std::ostream& os )
|
std::ostream& EDA_BaseStruct::NestedSpace( int nestLevel, std::ostream& os )
|
||||||
{
|
{
|
||||||
for( int i=0; i<nestLevel; ++i )
|
for( int i=0; i<nestLevel; ++i )
|
||||||
os << ' '; // number of spaces here controls indent per nest level
|
os << " "; // number of spaces here controls indent per nest level
|
||||||
return os;
|
return os;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// see base_struct.h
|
||||||
|
SEARCH_RESULT EDA_BaseStruct::IterateForward( EDA_BaseStruct* listStart,
|
||||||
|
INSPECTOR* inspector, void* testData, const KICAD_T scanTypes[] )
|
||||||
|
{
|
||||||
|
EDA_BaseStruct* p = listStart;
|
||||||
|
for( ; p; p = p->Pnext )
|
||||||
|
{
|
||||||
|
if( SEARCH_QUIT == p->Traverse( inspector, testData, scanTypes ) )
|
||||||
|
return SEARCH_QUIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SEARCH_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// see base_struct.h
|
||||||
|
SEARCH_RESULT EDA_BaseStruct::Traverse( INSPECTOR* inspector, void* testData,
|
||||||
|
const KICAD_T scanTypes[] )
|
||||||
|
{
|
||||||
|
KICAD_T stype;
|
||||||
|
|
||||||
|
for( const KICAD_T* p = scanTypes; (stype=*p) != EOT; ++p )
|
||||||
|
{
|
||||||
|
// If caller wants to inspect my type
|
||||||
|
if( stype == m_StructType )
|
||||||
|
{
|
||||||
|
if( SEARCH_QUIT == inspector->Inspect( this, testData ) )
|
||||||
|
return SEARCH_QUIT;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return SEARCH_CONTINUE;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,9 @@
|
||||||
|
|
||||||
/* Id for class identification, at run time */
|
/* Id for class identification, at run time */
|
||||||
enum DrawStructureType {
|
enum DrawStructureType {
|
||||||
|
|
||||||
|
EOT = 0, // search types array terminator (End Of Types)
|
||||||
|
|
||||||
TYPE_NOT_INIT = 0,
|
TYPE_NOT_INIT = 0,
|
||||||
TYPEPCB,
|
TYPEPCB,
|
||||||
|
|
||||||
|
@ -70,6 +73,49 @@ enum DrawStructureType {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(DEBUG) // new searching technique incubator
|
||||||
|
enum SEARCH_RESULT {
|
||||||
|
SEARCH_QUIT,
|
||||||
|
SEARCH_CONTINUE
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef DrawStructureType KICAD_T; // shorter name
|
||||||
|
|
||||||
|
class EDA_BaseStruct;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class INSPECTOR
|
||||||
|
* is an abstract class that is used to inspect and possibly collect the
|
||||||
|
* (search) results of Iterating over a list or tree of KICAD_T objects.
|
||||||
|
* Extend from this class and implment the Inspect function and provide for
|
||||||
|
* a way for the extension to collect the results of the search/scan data and
|
||||||
|
* provide them to the caller.
|
||||||
|
*/
|
||||||
|
class INSPECTOR
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~INSPECTOR() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Inspect
|
||||||
|
* is the function type that can be passed to the Iterate function,
|
||||||
|
* used primarily for searching, but not exclusively.
|
||||||
|
* @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 virtual Inspect( EDA_BaseStruct* testItem,
|
||||||
|
void* testData ) = 0;
|
||||||
|
|
||||||
|
// derived classes add more functions for collecting and subsequent
|
||||||
|
// retrieval here.
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/********************************************************************/
|
/********************************************************************/
|
||||||
/* Classes de base: servent a deriver les classes reellement utiles */
|
/* Classes de base: servent a deriver les classes reellement utiles */
|
||||||
/********************************************************************/
|
/********************************************************************/
|
||||||
|
@ -139,6 +185,7 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void Show( int nestLevel, std::ostream& os );
|
virtual void Show( int nestLevel, std::ostream& os );
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function NestedSpace
|
* Function NestedSpace
|
||||||
* outputs nested space for pretty indenting.
|
* outputs nested space for pretty indenting.
|
||||||
|
@ -147,6 +194,60 @@ public:
|
||||||
* @return std::ostream& - for continuation.
|
* @return std::ostream& - for continuation.
|
||||||
**/
|
**/
|
||||||
static std::ostream& NestedSpace( int nestLevel, std::ostream& os );
|
static std::ostream& NestedSpace( int nestLevel, std::ostream& os );
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function IterateForward
|
||||||
|
* walks through the object tree calling the testFunc on each object
|
||||||
|
* type requested in structTypes.
|
||||||
|
*
|
||||||
|
* @param listStart The first in a list of EDA_BaseStructs to iterate over.
|
||||||
|
* @param inspector Is an INSPECTOR to call on each object that is of one of
|
||||||
|
* the requested itemTypes.
|
||||||
|
* @param testData Is an aid to testFunc, and should be sufficient to
|
||||||
|
* allow it to fully determine if an item meets the match criteria, but it
|
||||||
|
* may also be used to collect output.
|
||||||
|
* @param scanTypes Is a char array of KICAD_T that is EOT
|
||||||
|
* terminated, and provides both the order and interest level of of
|
||||||
|
* the types of objects to be iterated over.
|
||||||
|
* @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
|
||||||
|
* else SCAN_CONTINUE;
|
||||||
|
*/
|
||||||
|
static SEARCH_RESULT IterateForward( EDA_BaseStruct* listStart,
|
||||||
|
INSPECTOR* inspector, void* testData, const KICAD_T scanTypes[] );
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Traverse
|
||||||
|
* should be re-implemented for each derrived class in order to handle
|
||||||
|
* all the types given by its member data. Implementations should call
|
||||||
|
* inspector->Inspect() on types in scanTypes[], and may use IterateForward()
|
||||||
|
* to do so on lists of such data.
|
||||||
|
* @param inspector An INSPECTOR instance to use in the inspection.
|
||||||
|
* @param testData Arbitrary data used by the inspector.
|
||||||
|
* @param scanTypes Which KICAD_T types are of interest and the order
|
||||||
|
* is significant too, terminated by EOT.
|
||||||
|
* @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
|
||||||
|
* else SCAN_CONTINUE;
|
||||||
|
*/
|
||||||
|
virtual SEARCH_RESULT Traverse( INSPECTOR* inspector, void* testData,
|
||||||
|
const KICAD_T scanTypes[] );
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function ListHas
|
||||||
|
* scans the given array and detects if the given type t is present.
|
||||||
|
* @param list An array of KICAD_T, terminated with EOT.
|
||||||
|
* @param t A KICAD_T to check for.
|
||||||
|
* @return bool - true if present, else false.
|
||||||
|
*/
|
||||||
|
static bool ListHas( const KICAD_T list[], KICAD_T t )
|
||||||
|
{
|
||||||
|
for( const KICAD_T* p = list; *p != EOT; ++p )
|
||||||
|
if( *p == t )
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -242,6 +242,16 @@ public:
|
||||||
* @param os The ostream& to output to.
|
* @param os The ostream& to output to.
|
||||||
*/
|
*/
|
||||||
virtual void Show( int nestLevel, std::ostream& os );
|
virtual void Show( int nestLevel, std::ostream& os );
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function FindModuleOrPad
|
||||||
|
* searches for either a module or a pad, giving precedence to pads.
|
||||||
|
* @param refPos The wxPoint to hit-test.
|
||||||
|
* @return EDA_BaseStruct* - if a direct hit, else NULL.
|
||||||
|
*/
|
||||||
|
EDA_BaseStruct* FindModuleOrPad( const wxPoint& refPos );
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -286,4 +286,62 @@ void BOARD::Show( int nestLevel, std::ostream& os )
|
||||||
|
|
||||||
NestedSpace( nestLevel, os ) << "</" << ReturnClassName().mb_str() << ">\n";
|
NestedSpace( nestLevel, os ) << "</" << ReturnClassName().mb_str() << ">\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class ModuleOrPad : public INSPECTOR
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
EDA_BaseStruct* found;
|
||||||
|
|
||||||
|
ModuleOrPad() :
|
||||||
|
found(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
SEARCH_RESULT Inspect( EDA_BaseStruct* testItem, void* testData )
|
||||||
|
{
|
||||||
|
const wxPoint* refPos = (const wxPoint*) testData;
|
||||||
|
|
||||||
|
if( testItem->m_StructType == TYPEMODULE )
|
||||||
|
{
|
||||||
|
/* not finished
|
||||||
|
if( testItem->HitTest( &refPos ) )
|
||||||
|
{
|
||||||
|
found = testItem;
|
||||||
|
return SEARCH_QUIT;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
else if( testItem->m_StructType == TYPEPAD )
|
||||||
|
{
|
||||||
|
/* not finished
|
||||||
|
if( testItem->HitTest( &refPos ) )
|
||||||
|
{
|
||||||
|
found = testItem;
|
||||||
|
return SEARCH_QUIT;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
return SEARCH_CONTINUE;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// see pcbstruct.h
|
||||||
|
EDA_BaseStruct* BOARD::FindModuleOrPad( const wxPoint& refPos )
|
||||||
|
{
|
||||||
|
ModuleOrPad inspector;
|
||||||
|
|
||||||
|
static const KICAD_T scanTypes[] = { TYPEMODULE, TYPEPAD, EOT };
|
||||||
|
|
||||||
|
if( SEARCH_QUIT == IterateForward( m_Modules, &inspector, (void*) &refPos, scanTypes ) )
|
||||||
|
return inspector.found;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************/
|
/****************************************************/
|
||||||
/* class_module.cpp : fonctions de la classe MODULE */
|
/* class_module.cpp : fonctions de la classe MODULE */
|
||||||
/****************************************************/
|
/****************************************************/
|
||||||
|
|
||||||
#include "fctsys.h"
|
#include "fctsys.h"
|
||||||
#include "gr_basic.h"
|
#include "gr_basic.h"
|
||||||
|
@ -24,11 +24,12 @@
|
||||||
|
|
||||||
#define MAX_WIDTH 10000 // Epaisseur (en 1/10000 ") max raisonnable des traits, textes...
|
#define MAX_WIDTH 10000 // Epaisseur (en 1/10000 ") max raisonnable des traits, textes...
|
||||||
|
|
||||||
/******************************************/
|
/******************************************/
|
||||||
/* class EDGE_MODULE ( contour de module ) */
|
/* class EDGE_MODULE ( contour de module ) */
|
||||||
/******************************************/
|
/******************************************/
|
||||||
|
|
||||||
EDGE_MODULE::EDGE_MODULE(MODULE * parent): EDA_BaseLineStruct( parent, TYPEEDGEMODULE)
|
EDGE_MODULE::EDGE_MODULE( MODULE* parent ) :
|
||||||
|
EDA_BaseLineStruct( parent, TYPEEDGEMODULE )
|
||||||
{
|
{
|
||||||
m_Shape = S_SEGMENT;
|
m_Shape = S_SEGMENT;
|
||||||
m_Angle = 0;
|
m_Angle = 0;
|
||||||
|
@ -37,18 +38,22 @@ EDGE_MODULE::EDGE_MODULE(MODULE * parent): EDA_BaseLineStruct( parent, TYPEEDGEM
|
||||||
m_PolyList = NULL; // For polygons: coord list (1 point = 2 coord)
|
m_PolyList = NULL; // For polygons: coord list (1 point = 2 coord)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EDGE_MODULE::~EDGE_MODULE()
|
EDGE_MODULE::~EDGE_MODULE()
|
||||||
{
|
{
|
||||||
if ( m_PolyList ) free (m_PolyList);
|
if( m_PolyList )
|
||||||
|
free( m_PolyList );
|
||||||
m_PolyList = NULL;
|
m_PolyList = NULL;
|
||||||
m_PolyCount = 0;
|
m_PolyCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/********************************************/
|
/********************************************/
|
||||||
void EDGE_MODULE:: Copy(EDGE_MODULE * source) // copy structure
|
void EDGE_MODULE:: Copy( EDGE_MODULE* source ) // copy structure
|
||||||
/********************************************/
|
/********************************************/
|
||||||
{
|
{
|
||||||
if (source == NULL) return;
|
if( source == NULL )
|
||||||
|
return;
|
||||||
|
|
||||||
m_Start = source->m_Start;
|
m_Start = source->m_Start;
|
||||||
m_End = source->m_End;
|
m_End = source->m_End;
|
||||||
|
@ -58,18 +63,18 @@ void EDGE_MODULE:: Copy(EDGE_MODULE * source) // copy structure
|
||||||
m_Angle = source->m_Angle; // pour les arcs de cercle: longueur de l'arc en 0,1 degres
|
m_Angle = source->m_Angle; // pour les arcs de cercle: longueur de l'arc en 0,1 degres
|
||||||
m_Layer = source->m_Layer;
|
m_Layer = source->m_Layer;
|
||||||
m_Width = source->m_Width;
|
m_Width = source->m_Width;
|
||||||
if ( m_PolyList ) free (m_PolyList);
|
if( m_PolyList )
|
||||||
|
free( m_PolyList );
|
||||||
m_PolyCount = 0;
|
m_PolyCount = 0;
|
||||||
m_PolyList = NULL;
|
m_PolyList = NULL;
|
||||||
if ( source->m_PolyCount && source->m_PolyList )
|
if( source->m_PolyCount && source->m_PolyList )
|
||||||
{
|
{
|
||||||
int size;
|
int size;
|
||||||
m_PolyCount = source->m_PolyCount; // For polygons : number of points
|
m_PolyCount = source->m_PolyCount; // For polygons : number of points
|
||||||
size = m_PolyCount * 2 * sizeof(int); // For polygons: 1 point = 2 coord
|
size = m_PolyCount * 2 * sizeof(int); // For polygons: 1 point = 2 coord
|
||||||
m_PolyList = (int*) MyMalloc( size );
|
m_PolyList = (int*) MyMalloc( size );
|
||||||
memcpy (m_PolyList, source->m_PolyList, size);
|
memcpy( m_PolyList, source->m_PolyList, size );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -80,36 +85,37 @@ void EDGE_MODULE::UnLink( void )
|
||||||
/* Modification du chainage arriere */
|
/* Modification du chainage arriere */
|
||||||
if( Pback )
|
if( Pback )
|
||||||
{
|
{
|
||||||
if( Pback->m_StructType != TYPEMODULE)
|
if( Pback->m_StructType != TYPEMODULE )
|
||||||
{
|
{
|
||||||
Pback->Pnext = Pnext;
|
Pback->Pnext = Pnext;
|
||||||
}
|
}
|
||||||
|
|
||||||
else /* Le chainage arriere pointe sur la structure "Pere" */
|
else /* Le chainage arriere pointe sur la structure "Pere" */
|
||||||
{
|
{
|
||||||
((MODULE*) Pback)->m_Drawings = Pnext;
|
( (MODULE*) Pback )->m_Drawings = Pnext;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Modification du chainage avant */
|
/* Modification du chainage avant */
|
||||||
if( Pnext) Pnext->Pback = Pback;
|
if( Pnext )
|
||||||
|
Pnext->Pback = Pback;
|
||||||
|
|
||||||
Pnext = Pback = NULL;
|
Pnext = Pback = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************/
|
/***********************************/
|
||||||
void EDGE_MODULE::SetDrawCoord(void)
|
void EDGE_MODULE::SetDrawCoord( void )
|
||||||
/***********************************/
|
/***********************************/
|
||||||
{
|
{
|
||||||
MODULE * Module = (MODULE*) m_Parent;
|
MODULE* Module = (MODULE*) m_Parent;
|
||||||
|
|
||||||
m_Start = m_Start0;
|
m_Start = m_Start0;
|
||||||
m_End = m_End0;
|
m_End = m_End0;
|
||||||
|
|
||||||
if ( Module )
|
if( Module )
|
||||||
{
|
{
|
||||||
RotatePoint( &m_Start.x, &m_Start.y, Module->m_Orient);
|
RotatePoint( &m_Start.x, &m_Start.y, Module->m_Orient );
|
||||||
RotatePoint( &m_End.x, &m_End.y, Module->m_Orient);
|
RotatePoint( &m_End.x, &m_End.y, Module->m_Orient );
|
||||||
m_Start.x += Module->m_Pos.x;
|
m_Start.x += Module->m_Pos.x;
|
||||||
m_Start.y += Module->m_Pos.y;
|
m_Start.y += Module->m_Pos.y;
|
||||||
m_End.x += Module->m_Pos.x;
|
m_End.x += Module->m_Pos.x;
|
||||||
|
@ -119,105 +125,112 @@ MODULE * Module = (MODULE*) m_Parent;
|
||||||
|
|
||||||
|
|
||||||
/********************************************************************************/
|
/********************************************************************************/
|
||||||
void EDGE_MODULE::Draw(WinEDA_DrawPanel * panel, wxDC * DC,
|
void EDGE_MODULE::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
|
||||||
const wxPoint & offset, int draw_mode)
|
const wxPoint& offset, int draw_mode )
|
||||||
/********************************************************************************/
|
/********************************************************************************/
|
||||||
|
|
||||||
/* Affichage d'un segment contour de module :
|
/* Affichage d'un segment contour de module :
|
||||||
Entree : ox, oy = offset de trace
|
* Entree : ox, oy = offset de trace
|
||||||
draw_mode = mode de trace ( GR_OR, GR_XOR, GR_AND)
|
* draw_mode = mode de trace ( GR_OR, GR_XOR, GR_AND)
|
||||||
Les contours sont de differents type:
|
* Les contours sont de differents type:
|
||||||
- Segment
|
* - Segment
|
||||||
- Cercles
|
* - Cercles
|
||||||
- Arcs
|
* - Arcs
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
int ux0, uy0, dx, dy,rayon, StAngle, EndAngle;
|
int ux0, uy0, dx, dy, rayon, StAngle, EndAngle;
|
||||||
int color , type_trace;
|
int color, type_trace;
|
||||||
int zoom;
|
int zoom;
|
||||||
int typeaff;
|
int typeaff;
|
||||||
PCB_SCREEN * screen;
|
PCB_SCREEN* screen;
|
||||||
WinEDA_BasePcbFrame * frame;
|
WinEDA_BasePcbFrame* frame;
|
||||||
MODULE * Module = NULL;
|
MODULE* Module = NULL;
|
||||||
|
|
||||||
if ( m_Parent && (m_Parent->m_StructType == TYPEMODULE) )
|
if( m_Parent && (m_Parent->m_StructType == TYPEMODULE) )
|
||||||
Module = (MODULE*) m_Parent;
|
Module = (MODULE*) m_Parent;
|
||||||
|
|
||||||
color = g_DesignSettings.m_LayerColor[m_Layer];
|
color = g_DesignSettings.m_LayerColor[m_Layer];
|
||||||
if ( (color & ITEM_NOT_SHOW) != 0 ) return;
|
if( (color & ITEM_NOT_SHOW) != 0 )
|
||||||
|
return;
|
||||||
|
|
||||||
if ( panel ) screen = (PCB_SCREEN *) panel->m_Parent->m_CurrentScreen;
|
if( panel )
|
||||||
else screen = (PCB_SCREEN *) ActiveScreen;
|
screen = (PCB_SCREEN*) panel->m_Parent->m_CurrentScreen;
|
||||||
|
else
|
||||||
|
screen = (PCB_SCREEN*) ActiveScreen;
|
||||||
|
|
||||||
frame = ( WinEDA_BasePcbFrame * ) panel->m_Parent;
|
frame = (WinEDA_BasePcbFrame*) panel->m_Parent;
|
||||||
|
|
||||||
zoom = screen->GetZoom();
|
zoom = screen->GetZoom();
|
||||||
|
|
||||||
type_trace = m_Shape;
|
type_trace = m_Shape;
|
||||||
ux0 = m_Start.x - offset.x; uy0 = m_Start.y - offset.y;
|
ux0 = m_Start.x - offset.x; uy0 = m_Start.y - offset.y;
|
||||||
dx = m_End.x - offset.x ;
|
dx = m_End.x - offset.x;
|
||||||
dy = m_End.y - offset.y ;
|
dy = m_End.y - offset.y;
|
||||||
|
|
||||||
GRSetDrawMode(DC, draw_mode);
|
GRSetDrawMode( DC, draw_mode );
|
||||||
typeaff = frame->m_DisplayModEdge;
|
typeaff = frame->m_DisplayModEdge;
|
||||||
if( m_Layer <= CMP_N )
|
if( m_Layer <= CMP_N )
|
||||||
{
|
{
|
||||||
typeaff = frame->m_DisplayPcbTrackFill;
|
typeaff = frame->m_DisplayPcbTrackFill;
|
||||||
if ( ! typeaff ) typeaff = SKETCH;
|
if( !typeaff )
|
||||||
|
typeaff = SKETCH;
|
||||||
}
|
}
|
||||||
if( (m_Width /zoom) < L_MIN_DESSIN ) typeaff = FILAIRE;
|
if( (m_Width / zoom) < L_MIN_DESSIN )
|
||||||
|
typeaff = FILAIRE;
|
||||||
|
|
||||||
switch (type_trace )
|
switch( type_trace )
|
||||||
{
|
{
|
||||||
case S_SEGMENT:
|
case S_SEGMENT:
|
||||||
if( typeaff == FILAIRE)
|
if( typeaff == FILAIRE )
|
||||||
GRLine(&panel->m_ClipBox, DC, ux0, uy0, dx, dy, 0, color);
|
GRLine( &panel->m_ClipBox, DC, ux0, uy0, dx, dy, 0, color );
|
||||||
else if( typeaff == FILLED)
|
else if( typeaff == FILLED )
|
||||||
GRLine(&panel->m_ClipBox, DC, ux0, uy0, dx, dy, m_Width, color) ;
|
GRLine( &panel->m_ClipBox, DC, ux0, uy0, dx, dy, m_Width, color );
|
||||||
else // SKETCH Mode
|
else
|
||||||
GRCSegm(&panel->m_ClipBox, DC, ux0, uy0, dx, dy, m_Width, color) ;
|
// SKETCH Mode
|
||||||
break ;
|
GRCSegm( &panel->m_ClipBox, DC, ux0, uy0, dx, dy, m_Width, color );
|
||||||
|
break;
|
||||||
|
|
||||||
case S_CIRCLE:
|
case S_CIRCLE:
|
||||||
rayon = (int)hypot((double)(dx-ux0),(double)(dy-uy0) );
|
rayon = (int) hypot( (double) (dx - ux0), (double) (dy - uy0) );
|
||||||
if( typeaff == FILAIRE)
|
if( typeaff == FILAIRE )
|
||||||
{
|
{
|
||||||
GRCircle(&panel->m_ClipBox, DC, ux0, uy0, rayon, color) ;
|
GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon, color );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(typeaff == FILLED )
|
if( typeaff == FILLED )
|
||||||
{
|
{
|
||||||
GRCircle(&panel->m_ClipBox, DC, ux0, uy0, rayon, m_Width, color);
|
GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon, m_Width, color );
|
||||||
}
|
}
|
||||||
else // SKETCH Mode
|
else // SKETCH Mode
|
||||||
{
|
{
|
||||||
GRCircle(&panel->m_ClipBox, DC, ux0, uy0, rayon + (m_Width/2), color) ;
|
GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon + (m_Width / 2), color );
|
||||||
GRCircle(&panel->m_ClipBox, DC, ux0, uy0, rayon - (m_Width/2), color) ;
|
GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon - (m_Width / 2), color );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_ARC:
|
case S_ARC:
|
||||||
rayon = (int)hypot((double)(dx-ux0),(double)(dy-uy0) );
|
rayon = (int) hypot( (double) (dx - ux0), (double) (dy - uy0) );
|
||||||
StAngle = (int)ArcTangente( dy-uy0, dx-ux0 );
|
StAngle = (int) ArcTangente( dy - uy0, dx - ux0 );
|
||||||
EndAngle = StAngle + m_Angle;
|
EndAngle = StAngle + m_Angle;
|
||||||
if ( StAngle > EndAngle) EXCHG (StAngle, EndAngle);
|
if( StAngle > EndAngle )
|
||||||
if( typeaff == FILAIRE)
|
EXCHG( StAngle, EndAngle );
|
||||||
|
if( typeaff == FILAIRE )
|
||||||
{
|
{
|
||||||
GRArc(&panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, rayon, color) ;
|
GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, rayon, color );
|
||||||
}
|
}
|
||||||
else if(typeaff == FILLED )
|
else if( typeaff == FILLED )
|
||||||
{
|
{
|
||||||
GRArc(&panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, rayon,
|
GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, rayon,
|
||||||
m_Width, color);
|
m_Width, color );
|
||||||
}
|
}
|
||||||
else // SKETCH Mode
|
else // SKETCH Mode
|
||||||
{
|
{
|
||||||
GRArc(&panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
|
GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
|
||||||
rayon + (m_Width/2), color) ;
|
rayon + (m_Width / 2), color );
|
||||||
GRArc(&panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
|
GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
|
||||||
rayon - (m_Width/2), color) ;
|
rayon - (m_Width / 2), color );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -228,13 +241,13 @@ MODULE * Module = NULL;
|
||||||
int ii, * source, * ptr, * ptr_base;
|
int ii, * source, * ptr, * ptr_base;
|
||||||
ptr = ptr_base = (int*) MyMalloc( 2 * m_PolyCount * sizeof(int) );
|
ptr = ptr_base = (int*) MyMalloc( 2 * m_PolyCount * sizeof(int) );
|
||||||
source = m_PolyList;
|
source = m_PolyList;
|
||||||
for (ii = 0; ii < m_PolyCount; ii++ )
|
for( ii = 0; ii < m_PolyCount; ii++ )
|
||||||
{
|
{
|
||||||
int x, y;
|
int x, y;
|
||||||
x = *source; source++; y = *source; source++;
|
x = *source; source++; y = *source; source++;
|
||||||
if ( Module )
|
if( Module )
|
||||||
{
|
{
|
||||||
RotatePoint (&x, &y, Module->m_Orient);
|
RotatePoint( &x, &y, Module->m_Orient );
|
||||||
x += Module->m_Pos.x;
|
x += Module->m_Pos.x;
|
||||||
y += Module->m_Pos.y;
|
y += Module->m_Pos.y;
|
||||||
}
|
}
|
||||||
|
@ -242,9 +255,10 @@ MODULE * Module = NULL;
|
||||||
y += m_Start0.y - offset.y;
|
y += m_Start0.y - offset.y;
|
||||||
*ptr = x; ptr++; *ptr = y; ptr++;
|
*ptr = x; ptr++; *ptr = y; ptr++;
|
||||||
}
|
}
|
||||||
GRPoly(&panel->m_ClipBox, DC, m_PolyCount, ptr_base,
|
|
||||||
TRUE, m_Width, color, color);
|
GRPoly( &panel->m_ClipBox, DC, m_PolyCount, ptr_base,
|
||||||
free ( ptr_base);
|
TRUE, m_Width, color, color );
|
||||||
|
free( ptr_base );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -252,158 +266,187 @@ MODULE * Module = NULL;
|
||||||
|
|
||||||
|
|
||||||
/*****************************************/
|
/*****************************************/
|
||||||
int EDGE_MODULE::WriteDescr( FILE * File )
|
int EDGE_MODULE::WriteDescr( FILE* File )
|
||||||
/*****************************************/
|
/*****************************************/
|
||||||
/* Write one EDGE_MODULE description
|
|
||||||
File must be opened.
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
int NbLigne = 0, ii, *ptr;
|
|
||||||
|
|
||||||
switch(m_Shape )
|
/* Write one EDGE_MODULE description
|
||||||
|
* File must be opened.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
int NbLigne = 0, ii, * ptr;
|
||||||
|
|
||||||
|
switch( m_Shape )
|
||||||
{
|
{
|
||||||
case S_SEGMENT:
|
case S_SEGMENT:
|
||||||
fprintf(File,"DS %d %d %d %d %d %d\n",
|
fprintf( File, "DS %d %d %d %d %d %d\n",
|
||||||
m_Start0.x, m_Start0.y,
|
m_Start0.x, m_Start0.y,
|
||||||
m_End0.x, m_End0.y,
|
m_End0.x, m_End0.y,
|
||||||
m_Width, m_Layer);
|
m_Width, m_Layer );
|
||||||
NbLigne++;
|
NbLigne++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_CIRCLE:
|
case S_CIRCLE:
|
||||||
fprintf(File,"DC %d %d %d %d %d %d\n",
|
fprintf( File, "DC %d %d %d %d %d %d\n",
|
||||||
m_Start0.x, m_Start0.y,
|
m_Start0.x, m_Start0.y,
|
||||||
m_End0.x, m_End0.y,
|
m_End0.x, m_End0.y,
|
||||||
m_Width, m_Layer);
|
m_Width, m_Layer );
|
||||||
NbLigne++;
|
NbLigne++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_ARC:
|
case S_ARC:
|
||||||
fprintf(File,"DA %d %d %d %d %d %d %d\n",
|
fprintf( File, "DA %d %d %d %d %d %d %d\n",
|
||||||
m_Start0.x, m_Start0.y,
|
m_Start0.x, m_Start0.y,
|
||||||
m_End0.x, m_End0.y,
|
m_End0.x, m_End0.y,
|
||||||
m_Angle,
|
m_Angle,
|
||||||
m_Width, m_Layer);
|
m_Width, m_Layer );
|
||||||
NbLigne++;
|
NbLigne++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_POLYGON:
|
case S_POLYGON:
|
||||||
fprintf(File,"DP %d %d %d %d %d %d %d\n",
|
fprintf( File, "DP %d %d %d %d %d %d %d\n",
|
||||||
m_Start0.x, m_Start0.y,
|
m_Start0.x, m_Start0.y,
|
||||||
m_End0.x, m_End0.y,
|
m_End0.x, m_End0.y,
|
||||||
m_PolyCount,
|
m_PolyCount,
|
||||||
m_Width, m_Layer);
|
m_Width, m_Layer );
|
||||||
NbLigne++;
|
NbLigne++;
|
||||||
for ( ii = 0, ptr = m_PolyList; ii < m_PolyCount; ii++ )
|
for( ii = 0, ptr = m_PolyList; ii < m_PolyCount; ii++ )
|
||||||
{
|
{
|
||||||
fprintf(File,"Dl %d %d\n",
|
fprintf( File, "Dl %d %d\n",
|
||||||
*ptr, *(ptr+1));
|
*ptr, *(ptr + 1) );
|
||||||
NbLigne++; ptr += 2;
|
NbLigne++; ptr += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
DisplayError(NULL, wxT("Type Edge Module inconnu") );
|
DisplayError( NULL, wxT( "Type Edge Module inconnu" ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return(NbLigne);
|
return NbLigne;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************/
|
/****************************************************************/
|
||||||
int EDGE_MODULE::ReadDescr(char * Line, FILE * File,
|
int EDGE_MODULE::ReadDescr( char* Line, FILE* File,
|
||||||
int * LineNum)
|
int* LineNum )
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
|
|
||||||
/* Read a description line like:
|
/* Read a description line like:
|
||||||
DS 2600 0 2600 -600 120 21
|
* DS 2600 0 2600 -600 120 21
|
||||||
this description line is in Line
|
* this description line is in Line
|
||||||
EDGE_MODULE type can be:
|
* EDGE_MODULE type can be:
|
||||||
- Circle,
|
* - Circle,
|
||||||
- Segment (line)
|
* - Segment (line)
|
||||||
- Arc
|
* - Arc
|
||||||
- Polygon
|
* - Polygon
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
int ii, *ptr;
|
int ii, * ptr;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
char Buf[1024];
|
char Buf[1024];
|
||||||
|
|
||||||
|
|
||||||
switch ( Line[1] )
|
switch( Line[1] )
|
||||||
{
|
{
|
||||||
case 'S':
|
case 'S':
|
||||||
m_Shape = S_SEGMENT;
|
m_Shape = S_SEGMENT;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'C':
|
case 'C':
|
||||||
m_Shape = S_CIRCLE;
|
m_Shape = S_CIRCLE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'A':
|
case 'A':
|
||||||
m_Shape = S_ARC;
|
m_Shape = S_ARC;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'P':
|
case 'P':
|
||||||
m_Shape = S_POLYGON;
|
m_Shape = S_POLYGON;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
wxString msg;
|
wxString msg;
|
||||||
msg.Printf( wxT("Unknown EDGE_MODULE type <%s>") , Line);
|
msg.Printf( wxT( "Unknown EDGE_MODULE type <%s>" ), Line );
|
||||||
DisplayError(NULL, msg);
|
DisplayError( NULL, msg );
|
||||||
error = 1;
|
error = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ( m_Shape )
|
switch( m_Shape )
|
||||||
{
|
{
|
||||||
case S_ARC:
|
case S_ARC:
|
||||||
sscanf(Line+3,"%d %d %d %d %d %d %d",
|
sscanf( Line + 3, "%d %d %d %d %d %d %d",
|
||||||
&m_Start0.x, &m_Start0.y,
|
&m_Start0.x, &m_Start0.y,
|
||||||
&m_End0.x, &m_End0.y,
|
&m_End0.x, &m_End0.y,
|
||||||
&m_Angle, &m_Width, &m_Layer);
|
&m_Angle, &m_Width, &m_Layer );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_SEGMENT:
|
case S_SEGMENT:
|
||||||
case S_CIRCLE:
|
case S_CIRCLE:
|
||||||
sscanf(Line+3,"%d %d %d %d %d %d",
|
sscanf( Line + 3, "%d %d %d %d %d %d",
|
||||||
&m_Start0.x, &m_Start0.y,
|
&m_Start0.x, &m_Start0.y,
|
||||||
&m_End0.x, &m_End0.y,
|
&m_End0.x, &m_End0.y,
|
||||||
&m_Width, &m_Layer);
|
&m_Width, &m_Layer );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_POLYGON:
|
case S_POLYGON:
|
||||||
sscanf(Line+3,"%d %d %d %d %d %d %d",
|
sscanf( Line + 3, "%d %d %d %d %d %d %d",
|
||||||
&m_Start0.x, &m_Start0.y,
|
&m_Start0.x, &m_Start0.y,
|
||||||
&m_End0.x, &m_End0.y,
|
&m_End0.x, &m_End0.y,
|
||||||
&m_PolyCount, &m_Width, &m_Layer);
|
&m_PolyCount, &m_Width, &m_Layer );
|
||||||
(*LineNum)++;
|
(*LineNum)++;
|
||||||
m_PolyList = (int*) MyZMalloc( 2 * m_PolyCount * sizeof(int) );
|
m_PolyList = (int*) MyZMalloc( 2 * m_PolyCount * sizeof(int) );
|
||||||
for ( ii = 0, ptr = m_PolyList; ii < m_PolyCount; ii++ )
|
for( ii = 0, ptr = m_PolyList; ii < m_PolyCount; ii++ )
|
||||||
{
|
{
|
||||||
if( GetLine(File, Buf, LineNum , sizeof(Buf) -1) != NULL )
|
if( GetLine( File, Buf, LineNum, sizeof(Buf) - 1 ) != NULL )
|
||||||
{
|
{
|
||||||
if( strncmp(Buf, "Dl", 2) != 0 ) { error = 1; break;}
|
if( strncmp( Buf, "Dl", 2 ) != 0 )
|
||||||
sscanf(Buf+3,"%d %d\n", ptr, ptr+1);
|
{
|
||||||
|
error = 1; break;
|
||||||
|
}
|
||||||
|
sscanf( Buf + 3, "%d %d\n", ptr, ptr + 1 );
|
||||||
(*LineNum)++; ptr += 2;
|
(*LineNum)++; ptr += 2;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
error = 1; break;
|
error = 1; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
sscanf(Line+3,"%d %d %d %d %d %d",
|
sscanf( Line + 3, "%d %d %d %d %d %d",
|
||||||
&m_Start0.x, &m_Start0.y,
|
&m_Start0.x, &m_Start0.y,
|
||||||
&m_End0.x, &m_End0.y,
|
&m_End0.x, &m_End0.y,
|
||||||
&m_Width, &m_Layer);
|
&m_Width, &m_Layer );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Controle d'epaisseur raisonnable:
|
// Controle d'epaisseur raisonnable:
|
||||||
if( m_Width <= 1 ) m_Width = 1;
|
if( m_Width <= 1 )
|
||||||
if( m_Width > MAX_WIDTH ) m_Width = MAX_WIDTH;
|
m_Width = 1;
|
||||||
|
if( m_Width > MAX_WIDTH )
|
||||||
|
m_Width = MAX_WIDTH;
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(DEBUG)
|
||||||
|
/**
|
||||||
|
* Function Show
|
||||||
|
* is used to output the object tree, currently for debugging only.
|
||||||
|
* @param nestLevel An aid to prettier tree indenting, and is the level
|
||||||
|
* of nesting of this object within the overall tree.
|
||||||
|
* @param os The ostream& to output to.
|
||||||
|
*/
|
||||||
|
void EDGE_MODULE::Show( int nestLevel, std::ostream& os )
|
||||||
|
{
|
||||||
|
// for now, make it look like XML:
|
||||||
|
NestedSpace( nestLevel, os ) << '<' << ReturnClassName().mb_str() << "/>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -1,43 +1,55 @@
|
||||||
/**************************************************************/
|
/**************************************************************/
|
||||||
/* class_edge_module.h : description des contours d'un module */
|
/* class_edge_module.h : description des contours d'un module */
|
||||||
/**************************************************************/
|
/**************************************************************/
|
||||||
|
|
||||||
class Pcb3D_GLCanvas;
|
class Pcb3D_GLCanvas;
|
||||||
|
|
||||||
|
|
||||||
/* description des contours (empreintes ) et TYPES des CONTOURS : */
|
/* description des contours (empreintes ) et TYPES des CONTOURS : */
|
||||||
|
|
||||||
class EDGE_MODULE: public EDA_BaseLineStruct
|
class EDGE_MODULE : public EDA_BaseLineStruct
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
int m_Shape ; // voir "enum Track_Shapes"
|
int m_Shape; // voir "enum Track_Shapes"
|
||||||
wxPoint m_Start0; // coord relatives a l'ancre du point de depart(Orient 0)
|
wxPoint m_Start0; // coord relatives a l'ancre du point de depart(Orient 0)
|
||||||
wxPoint m_End0; // coord relatives a l'ancre du point de fin (Orient 0)
|
wxPoint m_End0; // coord relatives a l'ancre du point de fin (Orient 0)
|
||||||
int m_Angle; // pour les arcs de cercle: longueur de l'arc en 0,1 degres
|
|
||||||
int m_PolyCount; // For polygons : number of points (> 2)
|
|
||||||
int * m_PolyList; // For polygons: coord list (1 point = 2 coord)
|
|
||||||
// Coord are relative to Origine, orient 0
|
|
||||||
|
|
||||||
public:
|
int m_Angle; // pour les arcs de cercle: longueur de l'arc en 0,1 degres
|
||||||
EDGE_MODULE(MODULE * parent );
|
|
||||||
EDGE_MODULE(EDGE_MODULE * edge );
|
int m_PolyCount; // For polygons : number of points (> 2)
|
||||||
|
int* m_PolyList; // For polygons: coord list (1 point = 2 coord)
|
||||||
|
// Coord are relative to Origin, orient 0
|
||||||
|
|
||||||
|
public:
|
||||||
|
EDGE_MODULE( MODULE* parent );
|
||||||
|
EDGE_MODULE( EDGE_MODULE* edge );
|
||||||
~EDGE_MODULE();
|
~EDGE_MODULE();
|
||||||
|
|
||||||
/* supprime du chainage la structure Struct */
|
/* supprime du chainage la structure Struct */
|
||||||
void UnLink( void );
|
void UnLink( void );
|
||||||
|
|
||||||
void Copy(EDGE_MODULE * source); // copy structure
|
void Copy( EDGE_MODULE* source ); // copy structure
|
||||||
|
|
||||||
/* Readind and writing data on files */
|
/* Reading and writing data on files */
|
||||||
int WriteDescr( FILE * File );
|
int WriteDescr( FILE* File );
|
||||||
int ReadDescr( char * Line, FILE * File, int * LineNum = NULL);
|
int ReadDescr( char* Line, FILE* File, int* LineNum = NULL );
|
||||||
|
|
||||||
// Mise a jour des coordonées pour l'affichage
|
// Mise a jour des coordon<6F>s pour l'affichage
|
||||||
void SetDrawCoord(void);
|
void SetDrawCoord( void );
|
||||||
|
|
||||||
/* drawing functions */
|
/* drawing functions */
|
||||||
void Draw(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & offset,
|
void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset,
|
||||||
int draw_mode);
|
int draw_mode );
|
||||||
void Draw3D(Pcb3D_GLCanvas * glcanvas);
|
void Draw3D( Pcb3D_GLCanvas* glcanvas );
|
||||||
};
|
|
||||||
|
|
||||||
|
#if defined(DEBUG)
|
||||||
|
/**
|
||||||
|
* Function Show
|
||||||
|
* is used to output the object tree, currently for debugging only.
|
||||||
|
* @param nestLevel An aid to prettier tree indenting, and is the level
|
||||||
|
* of nesting of this object within the overall tree.
|
||||||
|
* @param os The ostream& to output to.
|
||||||
|
*/
|
||||||
|
virtual void Show( int nestLevel, std::ostream& os );
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
|
@ -208,7 +208,9 @@ void MODULE::Copy( MODULE* Module )
|
||||||
|
|
||||||
/* Copy des elements complementaires Drawings 3D */
|
/* Copy des elements complementaires Drawings 3D */
|
||||||
m_3D_Drawings->Copy( Module->m_3D_Drawings );
|
m_3D_Drawings->Copy( Module->m_3D_Drawings );
|
||||||
|
|
||||||
Struct3D_Master* Struct3D, * NewStruct3D, * CurrStruct3D;
|
Struct3D_Master* Struct3D, * NewStruct3D, * CurrStruct3D;
|
||||||
|
|
||||||
Struct3D = (Struct3D_Master*) Module->m_3D_Drawings->Pnext;
|
Struct3D = (Struct3D_Master*) Module->m_3D_Drawings->Pnext;
|
||||||
CurrStruct3D = m_3D_Drawings;
|
CurrStruct3D = m_3D_Drawings;
|
||||||
for( ; Struct3D != NULL; Struct3D = (Struct3D_Master*) Struct3D->Pnext )
|
for( ; Struct3D != NULL; Struct3D = (Struct3D_Master*) Struct3D->Pnext )
|
||||||
|
@ -370,6 +372,7 @@ int MODULE::WriteDescr( FILE* File )
|
||||||
StringStat[0] = 'F';
|
StringStat[0] = 'F';
|
||||||
else
|
else
|
||||||
StringStat[0] = '~';
|
StringStat[0] = '~';
|
||||||
|
|
||||||
if( m_ModuleStatus & MODULE_is_PLACED )
|
if( m_ModuleStatus & MODULE_is_PLACED )
|
||||||
StringStat[1] = 'P';
|
StringStat[1] = 'P';
|
||||||
else
|
else
|
||||||
|
@ -649,9 +652,9 @@ int MODULE::ReadDescr( FILE* File, int* LineNum )
|
||||||
Read_3D_Descr( File, LineNum );
|
Read_3D_Descr( File, LineNum );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if( strlen( Line ) < 4 )
|
if( strlen( Line ) < 4 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
PtLine = Line + 3;
|
PtLine = Line + 3;
|
||||||
|
|
||||||
/* Pointe 1er code utile de la ligne */
|
/* Pointe 1er code utile de la ligne */
|
||||||
|
@ -811,13 +814,16 @@ void MODULE::SetPosition( const wxPoint& newpos )
|
||||||
int deltaY = newpos.y - m_Pos.y;
|
int deltaY = newpos.y - m_Pos.y;
|
||||||
|
|
||||||
/* deplacement de l'ancre */
|
/* deplacement de l'ancre */
|
||||||
m_Pos.x += deltaX; m_Pos.y += deltaY;
|
m_Pos.x += deltaX;
|
||||||
|
m_Pos.y += deltaY;
|
||||||
|
|
||||||
/* deplacement de la reference */
|
/* deplacement de la reference */
|
||||||
m_Reference->m_Pos.x += deltaX; m_Reference->m_Pos.y += deltaY;
|
m_Reference->m_Pos.x += deltaX;
|
||||||
|
m_Reference->m_Pos.y += deltaY;
|
||||||
|
|
||||||
/* deplacement de la Valeur */
|
/* deplacement de la Valeur */
|
||||||
m_Value->m_Pos.x += deltaX; m_Value->m_Pos.y += deltaY;
|
m_Value->m_Pos.x += deltaX;
|
||||||
|
m_Value->m_Pos.y += deltaY;
|
||||||
|
|
||||||
/* deplacement des pastilles */
|
/* deplacement des pastilles */
|
||||||
D_PAD* pad = m_Pads;
|
D_PAD* pad = m_Pads;
|
||||||
|
@ -1153,22 +1159,70 @@ void MODULE::Show( int nestLevel, std::ostream& os )
|
||||||
// for now, make it look like XML, expand on this later.
|
// for now, make it look like XML, expand on this later.
|
||||||
|
|
||||||
NestedSpace( nestLevel, os ) << '<' << ReturnClassName().mb_str() <<
|
NestedSpace( nestLevel, os ) << '<' << ReturnClassName().mb_str() <<
|
||||||
" ref=\"" << m_Reference->m_Text.mb_str() <<
|
// " ref=\"" << m_Reference->m_Text.mb_str() <<
|
||||||
|
// "\" value=\"" << m_Value->m_Text.mb_str() << '"' <<
|
||||||
|
">\n";
|
||||||
|
|
||||||
"\" value=\"" << m_Value->m_Text.mb_str() <<
|
EDA_BaseStruct* p;
|
||||||
"\">\n";
|
|
||||||
|
|
||||||
EDA_BaseStruct* p = m_Drawings;
|
p = m_Reference;
|
||||||
for( ; p; p = p->Pnext )
|
for( ; p; p = p->Pnext )
|
||||||
p->Show( nestLevel+1, os );
|
p->Show( nestLevel+1, os );
|
||||||
|
|
||||||
EDA_BaseStruct* kid = m_Son;
|
p = m_Value;
|
||||||
for( ; kid; kid = kid->Pnext )
|
for( ; p; p = p->Pnext )
|
||||||
|
p->Show( nestLevel+1, os );
|
||||||
|
|
||||||
|
p = m_Drawings;
|
||||||
|
for( ; p; p = p->Pnext )
|
||||||
|
p->Show( nestLevel+1, os );
|
||||||
|
|
||||||
|
p = m_Son;
|
||||||
|
for( ; p; p = p->Pnext )
|
||||||
{
|
{
|
||||||
kid->Show( nestLevel+1, os );
|
p->Show( nestLevel+1, os );
|
||||||
}
|
}
|
||||||
|
|
||||||
NestedSpace( nestLevel, os ) << "</" << ReturnClassName().mb_str() << ">\n";
|
NestedSpace( nestLevel, os ) << "</" << ReturnClassName().mb_str() << ">\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// see class_module.h
|
||||||
|
SEARCH_RESULT MODULE::Traverse( INSPECTOR* inspector, void* testData,
|
||||||
|
const KICAD_T scanTypes[] )
|
||||||
|
{
|
||||||
|
KICAD_T stype;
|
||||||
|
|
||||||
|
for( const KICAD_T* p = scanTypes; (stype=*p) != EOT; ++p )
|
||||||
|
{
|
||||||
|
// If caller wants to inspect my type
|
||||||
|
if( stype == m_StructType )
|
||||||
|
{
|
||||||
|
if( SEARCH_QUIT == inspector->Inspect( this, testData ) )
|
||||||
|
return SEARCH_QUIT;
|
||||||
|
}
|
||||||
|
else if( stype == TYPEEDGEMODULE )
|
||||||
|
{
|
||||||
|
// iterate over m_Drawings
|
||||||
|
if( SEARCH_QUIT == IterateForward( m_Drawings, inspector,
|
||||||
|
testData, scanTypes ) )
|
||||||
|
return SEARCH_QUIT;
|
||||||
|
}
|
||||||
|
else if( stype == TYPETEXTEMODULE )
|
||||||
|
{
|
||||||
|
// iterate over m_Reference
|
||||||
|
if( SEARCH_QUIT == IterateForward( m_Reference, inspector,
|
||||||
|
testData, scanTypes ) )
|
||||||
|
return SEARCH_QUIT;
|
||||||
|
|
||||||
|
// iterate over m_Value
|
||||||
|
if( SEARCH_QUIT == IterateForward( m_Value, inspector,
|
||||||
|
testData, scanTypes ) )
|
||||||
|
return SEARCH_QUIT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return SEARCH_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -142,6 +142,24 @@ public:
|
||||||
* @param os The ostream& to output to.
|
* @param os The ostream& to output to.
|
||||||
*/
|
*/
|
||||||
virtual void Show( int nestLevel, std::ostream& os );
|
virtual void Show( int nestLevel, std::ostream& os );
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Traverse
|
||||||
|
* should be re-implemented for each derrived class in order to handle
|
||||||
|
* all the types given by its member data. Implementations should call
|
||||||
|
* inspector->Inspect() on types in scanTypes[], and may use IterateForward()
|
||||||
|
* to do so on lists of such data.
|
||||||
|
* @param inspector An INSPECTOR instance to use in the inspection.
|
||||||
|
* @param testData Arbitrary data used by the inspector.
|
||||||
|
* @param scanTypes Which KICAD_T types are of interest and the order
|
||||||
|
* is significant too, terminated by EOT.
|
||||||
|
* @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
|
||||||
|
* else SCAN_CONTINUE;
|
||||||
|
*/
|
||||||
|
virtual SEARCH_RESULT Traverse( INSPECTOR* inspector, void* testData,
|
||||||
|
const KICAD_T scanTypes[] );
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**********************************/
|
/**********************************/
|
||||||
/* class_pad.h : Pads description */
|
/* class_pad.h : Pads description */
|
||||||
/**********************************/
|
/**********************************/
|
||||||
|
|
||||||
class Pcb3D_GLCanvas;
|
class Pcb3D_GLCanvas;
|
||||||
|
|
||||||
|
@ -20,66 +20,77 @@ class Pcb3D_GLCanvas;
|
||||||
#define PAD_STACK 0x80 // bit 7 de .attrib (flag)
|
#define PAD_STACK 0x80 // bit 7 de .attrib (flag)
|
||||||
|
|
||||||
/* Definition type Structure d'un pad */
|
/* Definition type Structure d'un pad */
|
||||||
class D_PAD: public EDA_BaseStruct
|
class D_PAD : public EDA_BaseStruct
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
union {
|
union
|
||||||
|
{
|
||||||
unsigned long m_NumPadName;
|
unsigned long m_NumPadName;
|
||||||
char m_Padname[4] ; /* nom (numero) de la pastille (assimilable a un long)*/
|
char m_Padname[4]; /* nom (numero) de la pastille (assimilable a un long)*/
|
||||||
};
|
};
|
||||||
|
|
||||||
wxString m_Netname; /* Net Name */
|
wxString m_Netname; /* Net Name */
|
||||||
|
|
||||||
int m_Masque_Layer; // (Bit a Bit :1= cuivre, 15= cmp,
|
int m_Masque_Layer; // (Bit a Bit :1= cuivre, 15= cmp,
|
||||||
// 2..14 = interne
|
// 2..14 = interne
|
||||||
// 16 .. 31 = couches non cuivre
|
// 16 .. 31 = couches non cuivre
|
||||||
|
|
||||||
int m_PadShape; // forme CERCLE, RECT, OVALE, TRAPEZE ou libre
|
int m_PadShape; // forme CERCLE, RECT, OVALE, TRAPEZE ou libre
|
||||||
int m_DrillShape; // forme CERCLE, OVAL
|
int m_DrillShape; // forme CERCLE, OVAL
|
||||||
|
|
||||||
wxPoint m_Pos; // Position de reference du pad
|
wxPoint m_Pos; // Position de reference du pad
|
||||||
|
|
||||||
wxSize m_Drill; // Drill diam (drill shape = CIRCLE) or drill size(shape = OVAL)
|
wxSize m_Drill; // Drill diam (drill shape = CIRCLE) or drill size(shape = OVAL)
|
||||||
// for drill shape = CIRCLE, drill diam = m_Drill.x
|
// for drill shape = CIRCLE, drill diam = m_Drill.x
|
||||||
|
|
||||||
wxSize m_Offset; // Offset de la forme (pastilles excentrees)
|
wxSize m_Offset; // Offset de la forme (pastilles excentrees)
|
||||||
wxSize m_Size; // Dimensions X et Y ( si orient 0 x = axe X
|
wxSize m_Size; // Dimensions X et Y ( si orient 0 x = axe X
|
||||||
// y = axe Y
|
// y = axe Y
|
||||||
|
|
||||||
wxSize m_DeltaSize; // delta sur formes rectangle -> trapezes
|
wxSize m_DeltaSize; // delta sur formes rectangle -> trapezes
|
||||||
|
|
||||||
wxPoint m_Pos0; // Coord relatives a l'ancre du pad en orientation 0
|
wxPoint m_Pos0; // Coord relatives a l'ancre du pad en orientation 0
|
||||||
|
|
||||||
int m_Rayon; // rayon du cercle exinscrit du pad
|
int m_Rayon; // rayon du cercle exinscrit du pad
|
||||||
int m_Attribut; // NORMAL, SMD, CONN, Bit 7 = STACK
|
int m_Attribut; // NORMAL, SMD, CONN, Bit 7 = STACK
|
||||||
int m_Orient ; // en 1/10 degres
|
int m_Orient; // en 1/10 degres
|
||||||
|
|
||||||
int m_NetCode; /* Numero de net pour comparaisons rapides */
|
int m_NetCode; /* Numero de net pour comparaisons rapides */
|
||||||
int m_logical_connexion; // variable utilisee lors du calcul du chevelu:
|
int m_logical_connexion; // variable utilisee lors du calcul du chevelu:
|
||||||
// contient de numero de block pour une connexion type ratsnet
|
// contient de numero de block pour une connexion type ratsnet
|
||||||
int m_physical_connexion; // variable utilisee lors du calcul de la connexité:
|
|
||||||
|
int m_physical_connexion; // variable utilisee lors du calcul de la connexit<69>
|
||||||
// contient de numero de block pour une connexion type piste
|
// contient de numero de block pour une connexion type piste
|
||||||
|
|
||||||
public:
|
public:
|
||||||
D_PAD(MODULE * parent);
|
D_PAD( MODULE* parent );
|
||||||
D_PAD(D_PAD * pad);
|
D_PAD( D_PAD* pad );
|
||||||
~D_PAD(void);
|
~D_PAD( void );
|
||||||
|
|
||||||
void Copy(D_PAD * source);
|
void Copy( D_PAD* source );
|
||||||
D_PAD * Next(void)
|
|
||||||
{ return (D_PAD *) Pnext; }
|
D_PAD* Next( void ) { return (D_PAD*) Pnext; }
|
||||||
|
|
||||||
/* supprime du chainage la structure Struct */
|
/* supprime du chainage la structure Struct */
|
||||||
void UnLink( void );
|
void UnLink( void );
|
||||||
|
|
||||||
/* Readind and writing data on files */
|
/* Readind and writing data on files */
|
||||||
int ReadDescr( FILE * File, int * LineNum = NULL);
|
int ReadDescr( FILE* File, int* LineNum = NULL );
|
||||||
int WriteDescr( FILE * File );
|
int WriteDescr( FILE* File );
|
||||||
|
|
||||||
/* drawing functions */
|
/* drawing functions */
|
||||||
void Draw(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & offset, int draw_mode);
|
void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode );
|
||||||
void Draw3D(Pcb3D_GLCanvas * glcanvas);
|
void Draw3D( Pcb3D_GLCanvas* glcanvas );
|
||||||
|
|
||||||
// autres
|
// autres
|
||||||
void SetPadName(const wxString & name); // Change pade name
|
void SetPadName( const wxString& name ); // Change pade name
|
||||||
wxString ReturnStringPadName(void); // Return pad name as string in a wxString
|
wxString ReturnStringPadName( void ); // Return pad name as string in a wxString
|
||||||
void ReturnStringPadName(wxString & text); // Return pad name as string in a buffer
|
void ReturnStringPadName( wxString& text ); // Return pad name as string in a buffer
|
||||||
void ComputeRayon(void); // met a jour m_Rayon, rayon du cercle exinscrit
|
void ComputeRayon( void ); // met a jour m_Rayon, rayon du cercle exinscrit
|
||||||
const wxPoint ReturnShapePos(void); // retourne la position
|
const wxPoint ReturnShapePos( void ); // retourne la position
|
||||||
|
|
||||||
// de la forme (pastilles excentrees)
|
// de la forme (pastilles excentrees)
|
||||||
void Display_Infos(WinEDA_BasePcbFrame * frame);
|
void Display_Infos( WinEDA_BasePcbFrame* frame );
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef class D_PAD * LISTE_PAD;
|
typedef class D_PAD * LISTE_PAD;
|
||||||
|
|
||||||
|
|
|
@ -294,3 +294,23 @@ int TEXTE_MODULE::GetDrawRotation( void )
|
||||||
|
|
||||||
return rotation;
|
return rotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(DEBUG)
|
||||||
|
/**
|
||||||
|
* Function Show
|
||||||
|
* is used to output the object tree, currently for debugging only.
|
||||||
|
* @param nestLevel An aid to prettier tree indenting, and is the level
|
||||||
|
* of nesting of this object within the overall tree.
|
||||||
|
* @param os The ostream& to output to.
|
||||||
|
*/
|
||||||
|
void TEXTE_MODULE::Show( int nestLevel, std::ostream& os )
|
||||||
|
{
|
||||||
|
// for now, make it look like XML, expand on this later.
|
||||||
|
|
||||||
|
NestedSpace( nestLevel, os ) << '<' << ReturnClassName().mb_str() << ">\n";
|
||||||
|
|
||||||
|
NestedSpace( nestLevel+1, os ) << m_Text.mb_str() << '\n';
|
||||||
|
|
||||||
|
NestedSpace( nestLevel, os ) << "</" << ReturnClassName().mb_str() << ">\n";
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -58,4 +58,16 @@ public:
|
||||||
* @return bool - true if a hit, else false
|
* @return bool - true if a hit, else false
|
||||||
*/
|
*/
|
||||||
bool HitTest( const wxPoint& posref );
|
bool HitTest( const wxPoint& posref );
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(DEBUG)
|
||||||
|
/**
|
||||||
|
* Function Show
|
||||||
|
* is used to output the object tree, currently for debugging only.
|
||||||
|
* @param nestLevel An aid to prettier tree indenting, and is the level
|
||||||
|
* of nesting of this object within the overall tree.
|
||||||
|
* @param os The ostream& to output to.
|
||||||
|
*/
|
||||||
|
virtual void Show( int nestLevel, std::ostream& os );
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
|
@ -935,6 +935,7 @@ TRACK* Locate_Piste_Connectee( TRACK* PtRefSegm, TRACK* pt_base,
|
||||||
{
|
{
|
||||||
if( (PtSegmN == NULL) && (PtSegmB == NULL) )
|
if( (PtSegmN == NULL) && (PtSegmB == NULL) )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if( PtSegmN )
|
if( PtSegmN )
|
||||||
{
|
{
|
||||||
if( PtSegmN->GetState( BUSY | DELETED ) )
|
if( PtSegmN->GetState( BUSY | DELETED ) )
|
||||||
|
@ -1054,6 +1055,7 @@ TRACK* Locate_Pistes( TRACK* start_adresse, const wxPoint& ref_pos, int MasqueLa
|
||||||
continue;
|
continue;
|
||||||
if( (g_DesignSettings.m_LayerColor[Track->m_Layer] & ITEM_NOT_SHOW) )
|
if( (g_DesignSettings.m_LayerColor[Track->m_Layer] & ITEM_NOT_SHOW) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* calcul des coordonnees du segment teste */
|
/* calcul des coordonnees du segment teste */
|
||||||
l_piste = Track->m_Width >> 1; /* l_piste = demi largeur piste */
|
l_piste = Track->m_Width >> 1; /* l_piste = demi largeur piste */
|
||||||
ux0 = Track->m_Start.x; uy0 = Track->m_Start.y; /* coord de depart */
|
ux0 = Track->m_Start.x; uy0 = Track->m_Start.y; /* coord de depart */
|
||||||
|
@ -1074,7 +1076,8 @@ TRACK* Locate_Pistes( TRACK* start_adresse, const wxPoint& ref_pos, int MasqueLa
|
||||||
|
|
||||||
if( MasqueLayer != -1 )
|
if( MasqueLayer != -1 )
|
||||||
if( (g_TabOneLayerMask[Track->m_Layer] & MasqueLayer) == 0 )
|
if( (g_TabOneLayerMask[Track->m_Layer] & MasqueLayer) == 0 )
|
||||||
continue;/* Segments sur couches differentes */
|
continue; /* Segments sur couches differentes */
|
||||||
|
|
||||||
if( distance( l_piste ) )
|
if( distance( l_piste ) )
|
||||||
return Track;
|
return Track;
|
||||||
}
|
}
|
||||||
|
@ -1100,7 +1103,6 @@ TRACK* Locate_Pistes( TRACK* start_adresse, const wxPoint& ref_pos, int MasqueLa
|
||||||
*
|
*
|
||||||
* La recherche commence a l'adresse start_adresse
|
* La recherche commence a l'adresse start_adresse
|
||||||
*/
|
*/
|
||||||
|
|
||||||
TRACK* Locate_Zone( TRACK* start_adresse, int layer, int typeloc )
|
TRACK* Locate_Zone( TRACK* start_adresse, int layer, int typeloc )
|
||||||
{
|
{
|
||||||
wxPoint ref_pos = RefPos( typeloc );
|
wxPoint ref_pos = RefPos( typeloc );
|
||||||
|
@ -1287,6 +1289,7 @@ int distance( int seuil )
|
||||||
|
|
||||||
angle = (int) ( atan2( (float) segY, (float) segX ) * 1800 / M_PI);
|
angle = (int) ( atan2( (float) segY, (float) segX ) * 1800 / M_PI);
|
||||||
cXrot = pointX; cYrot = pointY;
|
cXrot = pointX; cYrot = pointY;
|
||||||
|
|
||||||
RotatePoint( &cXrot, &cYrot, angle ); /* Rotation du point a tester */
|
RotatePoint( &cXrot, &cYrot, angle ); /* Rotation du point a tester */
|
||||||
RotatePoint( &segX, &segY, angle ); /* Rotation du segment */
|
RotatePoint( &segX, &segY, angle ); /* Rotation du segment */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue