more DLIST<> work

This commit is contained in:
dickelbeck 2008-12-06 08:21:54 +00:00
parent f966097d5a
commit e574a1b061
21 changed files with 306 additions and 300 deletions

View File

@ -25,7 +25,7 @@
#include "trackball.h"
/**************************************************************************/
void Struct3D_Master::Set_Object_Coords( S3D_Vertex* coord, int nbcoord )
void S3D_MASTER::Set_Object_Coords( S3D_Vertex* coord, int nbcoord )
/**************************************************************************/
{
int ii;

View File

@ -26,7 +26,7 @@ S3D_Vertex::S3D_Vertex()
/**************************************************************************/
S3D_Material::S3D_Material( Struct3D_Master* father, const wxString& name ) :
S3D_MATERIAL::S3D_MATERIAL( S3D_MASTER* father, const wxString& name ) :
EDA_BaseStruct( father, NOT_USED )
/**************************************************************************/
{
@ -40,7 +40,7 @@ S3D_Material::S3D_Material( Struct3D_Master* father, const wxString& name ) :
/***********************************/
void S3D_Material::SetMaterial()
void S3D_MATERIAL::SetMaterial()
/***********************************/
{
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
@ -57,7 +57,7 @@ void S3D_Material::SetMaterial()
/****************************************************/
void Struct3D_Master::Copy( Struct3D_Master* pattern )
void S3D_MASTER::Copy( S3D_MASTER* pattern )
/****************************************************/
{
m_Shape3DName = pattern->m_Shape3DName;
@ -70,7 +70,7 @@ void Struct3D_Master::Copy( Struct3D_Master* pattern )
/***************************************************************/
Struct3D_Master::Struct3D_Master( EDA_BaseStruct* aParent ) :
S3D_MASTER::S3D_MASTER( EDA_BaseStruct* aParent ) :
EDA_BaseStruct( aParent, NOT_USED )
/***************************************************************/
{
@ -81,11 +81,11 @@ Struct3D_Master::Struct3D_Master( EDA_BaseStruct* aParent ) :
/***************************************/
Struct3D_Master:: ~Struct3D_Master()
S3D_MASTER:: ~S3D_MASTER()
/***************************************/
{
Struct3D_Shape* next;
S3D_Material* nextmat;
S3D_MATERIAL* nextmat;
for( ; m_3D_Drawings != NULL; m_3D_Drawings = next )
{

View File

@ -472,7 +472,7 @@ void MODULE::Draw3D( Pcb3D_GLCanvas* glcanvas )
}
/* Draw module shape: 3D shape if exists (or module edge if not exists) */
Struct3D_Master* Struct3D = m_3D_Drawings;
S3D_MASTER* Struct3D = m_3D_Drawings;
bool As3dShape = FALSE;
if( g_Parm_3D_Visu.m_Draw3DModule )
{

View File

@ -20,7 +20,7 @@
/***********************************/
int Struct3D_Master:: ReadData()
int S3D_MASTER:: ReadData()
/************************************/
{
char line[1024], * text;
@ -81,7 +81,7 @@ int Struct3D_Master:: ReadData()
/*********************************************************/
int Struct3D_Master:: ReadMaterial( FILE* file, int* LineNum )
int S3D_MASTER:: ReadMaterial( FILE* file, int* LineNum )
/*********************************************************/
/*
@ -100,7 +100,7 @@ int Struct3D_Master:: ReadMaterial( FILE* file, int* LineNum )
{
char line[512], * text, * command;
wxString mat_name;
S3D_Material* material = NULL;
S3D_MATERIAL* material = NULL;
// Lecture de la commande:
command = strtok( NULL, " \t\n\r" );
@ -123,7 +123,7 @@ int Struct3D_Master:: ReadMaterial( FILE* file, int* LineNum )
if( stricmp( command, "DEF" ) == 0 )
{
material = new S3D_Material( this, mat_name );
material = new S3D_MATERIAL( this, mat_name );
Insert( material );
@ -186,7 +186,7 @@ int Struct3D_Master:: ReadMaterial( FILE* file, int* LineNum )
/**********************************************************/
int Struct3D_Master::ReadChildren( FILE* file, int* LineNum )
int S3D_MASTER::ReadChildren( FILE* file, int* LineNum )
/***********************************************************/
{
char line[1024], * text;
@ -215,7 +215,7 @@ int Struct3D_Master::ReadChildren( FILE* file, int* LineNum )
/********************************************************/
int Struct3D_Master::ReadShape( FILE* file, int* LineNum )
int S3D_MASTER::ReadShape( FILE* file, int* LineNum )
/********************************************************/
{
char line[1024], * text;
@ -250,7 +250,7 @@ int Struct3D_Master::ReadShape( FILE* file, int* LineNum )
/*************************************************************/
int Struct3D_Master::ReadAppearance( FILE* file, int* LineNum )
int S3D_MASTER::ReadAppearance( FILE* file, int* LineNum )
/*************************************************************/
{
char line[1024], * text;
@ -381,7 +381,7 @@ double* ReadCoordsList( FILE* file, char* text_buffer, int* bufsize, int* LineNu
/***********************************************************/
int Struct3D_Master::ReadGeometry( FILE* file, int* LineNum )
int S3D_MASTER::ReadGeometry( FILE* file, int* LineNum )
/***********************************************************/
{
char line[1024], buffer[1024], * text;

View File

@ -13,7 +13,7 @@
#define UNITS3D_TO_UNITSPCB 1000
class Struct3D_Master;
class S3D_MASTER;
class Struct3D_Shape;
class S3D_Color /* This is a 3D color (R, G, G) 3 floats range 0 to 1.0*/
@ -34,7 +34,7 @@ public:
S3D_Vertex();
};
class S3D_Material : public EDA_BaseStruct /* openGL "material" data*/
class S3D_MATERIAL : public EDA_BaseStruct /* openGL "material" data*/
{
public:
wxString m_Name;
@ -46,17 +46,17 @@ public:
float m_Shininess;
public:
S3D_Material( Struct3D_Master * father, const wxString &name );
S3D_MATERIAL( S3D_MASTER * father, const wxString &name );
S3D_Material* Next() const { return (S3D_Material*) Pnext; }
S3D_Material* Back() const { return (S3D_Material*) Pback; }
S3D_MATERIAL* Next() const { return (S3D_MATERIAL*) Pnext; }
S3D_MATERIAL* Back() const { return (S3D_MATERIAL*) Pback; }
void SetMaterial();
};
/*******************************************/
class Struct3D_Master : public EDA_BaseStruct
class S3D_MASTER : public EDA_BaseStruct
/*******************************************/
/* Master structure for a 3D item description */
{
@ -66,23 +66,23 @@ public:
S3D_Vertex m_MatRotation;
S3D_Vertex m_MatPosition;
Struct3D_Shape* m_3D_Drawings;
S3D_Material* m_Materials;
S3D_MATERIAL* m_Materials;
public:
Struct3D_Master( EDA_BaseStruct * aParent );
~Struct3D_Master();
S3D_MASTER( EDA_BaseStruct * aParent );
~S3D_MASTER();
Struct3D_Master* Next() const { return (Struct3D_Master*) Pnext; }
Struct3D_Master* Back() const { return (Struct3D_Master*) Pback; }
S3D_MASTER* Next() const { return (S3D_MASTER*) Pnext; }
S3D_MASTER* Back() const { return (S3D_MASTER*) Pback; }
void Insert( S3D_Material* aMaterial )
void Insert( S3D_MATERIAL* aMaterial )
{
aMaterial->SetNext( m_Materials );
m_Materials = aMaterial;
}
void Copy( Struct3D_Master* pattern );
void Copy( S3D_MASTER* pattern );
int ReadData();
int ReadMaterial( FILE* file, int* LineNum );
int ReadChildren( FILE* file, int* LineNum );

View File

@ -5,6 +5,15 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with
email address.
2008-Dec-5 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
++pcbnew & gerbview
* Renamed Struct3D_Master to S3D_MASTER.
* MODULE::m_3D_Drawings is now a DLIST<>
* Removed AddToChain(), DeleteStructList() and replaced with calls to DLIST<>
members so that list item counting stays accurate.
2008-Dec-05 UPDATE Wayne Stambaugh <stambaughw@verizon.net>
================================================================================
++all

View File

@ -56,37 +56,6 @@ void EDA_BaseStruct::InitVars()
}
/***********************************************************/
void EDA_BaseStruct::DeleteStructList()
/***********************************************************/
{
EDA_BaseStruct* item = this;
EDA_BaseStruct* next;
while( item )
{
next = item->Next();
delete item;
item = next;
}
}
/*********************************************************/
void EDA_BaseStruct::AddToChain( EDA_BaseStruct* laststruct )
/*********************************************************/
/*
* Add "this" to the linked list, after laststruct
*/
{
Pnext = laststruct->Pnext;
Pback = laststruct;
laststruct->Pnext = this;
}
// see base_struct.h
SEARCH_RESULT EDA_BaseStruct::IterateForward( EDA_BaseStruct* listStart,
INSPECTOR* inspector,

View File

@ -45,7 +45,7 @@ bool WinEDA_GerberFrame::Clear_Pcb( bool query )
for( ; g_UnDeleteStackPtr != 0; )
{
g_UnDeleteStackPtr--;
g_UnDeleteStack[ g_UnDeleteStackPtr]->DeleteStructList();
delete g_UnDeleteStack[ g_UnDeleteStackPtr];
}
/* init pointeurs et variables */
@ -89,26 +89,24 @@ void WinEDA_GerberFrame::Erase_Zones( bool query )
void WinEDA_GerberFrame::Erase_Segments_Pcb( bool all_layers, bool query )
/************************************************************************/
{
BOARD_ITEM* PtStruct;
BOARD_ITEM* PtNext;
int layer = GetScreen()->m_Active_Layer;
if( all_layers )
layer = -1;
PtStruct = m_Pcb->m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtNext )
BOARD_ITEM* next;
for( BOARD_ITEM* item = m_Pcb->m_Drawings; item; item = next )
{
PtNext = PtStruct->Next();
next = item->Next();
switch( PtStruct->Type() )
switch( item->Type() )
{
case TYPE_DRAWSEGMENT:
case TYPE_TEXTE:
case TYPE_COTATION:
case TYPE_MIRE:
if( PtStruct->GetLayer() == layer || layer < 0 )
PtStruct->DeleteStructure();
if( item->GetLayer() == layer || layer < 0 )
m_Pcb->Delete( item );
break;
default:

View File

@ -424,24 +424,6 @@ public:
}
/**
* Function DeleteStructList
* deletes each item in a linked list of EDA_BaseStructs, starting with
* "this" object.
*/
void DeleteStructList();
/**
* Function AddToChain
* adds this item just after laststruct in a linked list established
* by the Prev and Back pointers of my base EDA_BaseStruct.
* @deprecated
* @param laststruct The item to add after
*/
void AddToChain( EDA_BaseStruct* laststruct );
#if defined (DEBUG)
/**

View File

@ -192,26 +192,6 @@ wxPoint& BOARD::GetPosition()
}
void BOARD::UnLink()
{
/* Update back link */
if( Back() )
{
if( Back()->Type() == TYPE_PCB )
{
Back()->SetNext( Next() );
}
}
/* Modification du chainage avant */
if( Next() )
Next()->SetBack( Back() );
SetNext( 0 );
SetBack( 0 );
}
void BOARD::Add( BOARD_ITEM* aBoardItem, int aControl )
{
if ( aBoardItem == NULL )
@ -316,6 +296,31 @@ void BOARD::Delete( BOARD_ITEM* aBoardItem )
}
break;
case TYPE_MODULE:
delete m_Modules.Remove( (MODULE*) aBoardItem );
break;
case TYPE_TRACK:
case TYPE_VIA:
delete m_Track.Remove( (TRACK*) aBoardItem );
break;
case TYPE_ZONE:
delete m_Zone.Remove( (SEGZONE*) aBoardItem );
break;
case TYPE_COTATION:
case TYPE_DRAWSEGMENT:
case TYPE_TEXTE:
case TYPE_EDGE_MODULE:
case TYPE_MIRE:
delete m_Drawings.Remove( aBoardItem );
break;
case TYPE_EQUIPOT:
delete m_Equipots.Remove( (EQUIPOT*) aBoardItem );
break;
// other types may use linked list
default:
wxFAIL_MSG( wxT("BOARD::Delete() needs work") );

View File

@ -115,8 +115,6 @@ public:
*/
wxPoint& GetPosition();
/* supprime du chainage la structure Struct */
void UnLink();
/**
* Function Add

View File

@ -57,7 +57,6 @@ void MODULE::DrawAncre( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset
MODULE::MODULE( BOARD* parent ) :
BOARD_ITEM( parent, TYPE_MODULE )
{
m_3D_Drawings = NULL;
m_Attributs = MOD_DEFAULT;
m_Layer = CMP_N;
m_Orient = 0;
@ -74,48 +73,40 @@ MODULE::MODULE( BOARD* parent ) :
m_Value = new TEXTE_MODULE( this, TEXT_is_VALUE );
m_Value->SetBack( this );
m_3D_Drawings = new Struct3D_Master( this );
m_3D_Drawings.PushBack( new S3D_MASTER( this ) );
}
MODULE::~MODULE()
{
EDA_BaseStruct* item;
EDA_BaseStruct* next;
delete m_Reference;
delete m_Value;
for( item = m_3D_Drawings; item; item = next )
{
next = item->Next();
delete item;
}
}
/*********************************/
void MODULE::Copy( MODULE* Module )
void MODULE::Copy( MODULE* aModule )
/*********************************/
{
m_Pos = Module->m_Pos;
m_Layer = Module->m_Layer;
m_LibRef = Module->m_LibRef;
m_Attributs = Module->m_Attributs;
m_Orient = Module->m_Orient;
m_BoundaryBox = Module->m_BoundaryBox;
m_PadNum = Module->m_PadNum;
m_CntRot90 = Module->m_CntRot90;
m_CntRot180 = Module->m_CntRot180;
m_LastEdit_Time = Module->m_LastEdit_Time;
m_Path = Module->m_Path; //is this correct behavior?
m_Pos = aModule->m_Pos;
m_Layer = aModule->m_Layer;
m_LibRef = aModule->m_LibRef;
m_Attributs = aModule->m_Attributs;
m_Orient = aModule->m_Orient;
m_BoundaryBox = aModule->m_BoundaryBox;
m_PadNum = aModule->m_PadNum;
m_CntRot90 = aModule->m_CntRot90;
m_CntRot180 = aModule->m_CntRot180;
m_LastEdit_Time = aModule->m_LastEdit_Time;
m_Path = aModule->m_Path; //is this correct behavior?
m_TimeStamp = GetTimeStamp();
/* Copy des structures auxiliaires: Reference et value */
m_Reference->Copy( Module->m_Reference );
m_Value->Copy( Module->m_Value );
m_Reference->Copy( aModule->m_Reference );
m_Value->Copy( aModule->m_Value );
/* Copie des structures auxiliaires: Pads */
for( D_PAD* pad = Module->m_Pads; pad; pad = pad->Next() )
for( D_PAD* pad = aModule->m_Pads; pad; pad = pad->Next() )
{
D_PAD* newpad = new D_PAD( this );
newpad->Copy( pad );
@ -124,7 +115,7 @@ void MODULE::Copy( MODULE* Module )
}
/* Copy des structures auxiliaires: Drawings */
for( BOARD_ITEM* item = Module->m_Drawings; item; item = item->Next() )
for( BOARD_ITEM* item = aModule->m_Drawings; item; item = item->Next() )
{
switch( item->Type() )
{
@ -148,25 +139,16 @@ void MODULE::Copy( MODULE* Module )
}
}
/* Copy des elements complementaires Drawings 3D */
m_3D_Drawings->Copy( Module->m_3D_Drawings );
Struct3D_Master* Struct3D, * NewStruct3D, * CurrStruct3D;
Struct3D = Module->m_3D_Drawings->Next();
CurrStruct3D = m_3D_Drawings;
for( ; Struct3D != NULL; Struct3D = Struct3D->Next() )
for( S3D_MASTER* item = aModule->m_3D_Drawings; item; item = item->Next() )
{
NewStruct3D = new Struct3D_Master( this );
NewStruct3D->Copy( Struct3D );
CurrStruct3D->SetNext( NewStruct3D );
NewStruct3D->SetBack( CurrStruct3D );
CurrStruct3D = NewStruct3D;
S3D_MASTER* t3d = new S3D_MASTER( this );
t3d->Copy( item );
m_3D_Drawings.PushBack( t3d );
}
/* Copie des elements complementaires */
m_Doc = Module->m_Doc;
m_KeyWord = Module->m_KeyWord;
m_Doc = aModule->m_Doc;
m_KeyWord = aModule->m_KeyWord;
}
@ -360,7 +342,7 @@ int MODULE::Write_3D_Descr( FILE* File ) const
*/
{
char buf[512];
Struct3D_Master* Struct3D = m_3D_Drawings;
S3D_MASTER* Struct3D = m_3D_Drawings;
for( ; Struct3D != NULL; Struct3D = Struct3D->Next() )
{
@ -407,18 +389,16 @@ int MODULE::Read_3D_Descr( FILE* File, int* LineNum )
{
char Line[1024];
char* text = Line + 3;
Struct3D_Master* Struct3D = m_3D_Drawings;
S3D_MASTER* Struct3D = m_3D_Drawings;
if( !Struct3D->m_Shape3DName.IsEmpty() )
{
Struct3D_Master* NewStruct3D;
while( Struct3D->Next() )
Struct3D = Struct3D->Next();
S3D_MASTER* n3D = new S3D_MASTER( this );
NewStruct3D = new Struct3D_Master( this );
Struct3D->SetNext( NewStruct3D );
NewStruct3D->SetBack( Struct3D );
Struct3D = NewStruct3D;
m_3D_Drawings.PushBack( n3D );
Struct3D = n3D;
}
while( GetLine( File, Line, LineNum, sizeof(Line) - 1 ) != NULL )

View File

@ -4,7 +4,7 @@
class Pcb3D_GLCanvas;
class Struct3D_Master;
class S3D_MASTER;
/************************************/
/* Modules (footprints) description */
@ -41,7 +41,7 @@ public:
wxPoint m_Pos; // Real coord on board
DLIST<D_PAD> m_Pads; /* Pad list (linked list) */
DLIST<BOARD_ITEM> m_Drawings; /* Graphic items list (linked list) */
Struct3D_Master* m_3D_Drawings; /* First item of the 3D shapes (linked list)*/
DLIST<S3D_MASTER> m_3D_Drawings; /* First item of the 3D shapes (linked list)*/
TEXTE_MODULE* m_Reference; // Component reference (U34, R18..)
TEXTE_MODULE* m_Value; // Component value (74LS00, 22K..)
wxString m_LibRef; /* Name of the module in library (and the default value when loading amodule from the library) */

View File

@ -100,9 +100,9 @@ void WinEDA_ModulePropertiesFrame::CreateControls()
/* creation des autres formes 3D */
Panel3D_Ctrl* panel3D = m_Panel3D, * nextpanel3D;
Struct3D_Master* draw3D = m_CurrentModule->m_3D_Drawings;
draw3D = (Struct3D_Master*) draw3D->Next();
for( ; draw3D != NULL; draw3D = (Struct3D_Master*) draw3D->Next() )
S3D_MASTER* draw3D = m_CurrentModule->m_3D_Drawings;
draw3D = (S3D_MASTER*) draw3D->Next();
for( ; draw3D != NULL; draw3D = (S3D_MASTER*) draw3D->Next() )
{
nextpanel3D = new Panel3D_Ctrl( this, m_NoteBook, -1, draw3D );
m_NoteBook->AddPage( nextpanel3D, _( "3D settings" ), FALSE );
@ -382,7 +382,7 @@ void WinEDA_ModulePropertiesFrame::BuildPanelModuleProperties( bool FullOptions
/**************************************************************/
Panel3D_Ctrl::Panel3D_Ctrl( WinEDA_ModulePropertiesFrame* parentframe,
wxNotebook* parent,
int id, Struct3D_Master* struct3D ) :
int id, S3D_MASTER* struct3D ) :
wxPanel( parent, id )
/**************************************************************/
@ -594,31 +594,34 @@ void WinEDA_ModulePropertiesFrame::OnOkClick( wxCommandEvent& event )
/* Mise a jour des parametres 3D */
Panel3D_Ctrl* panel3D = m_Panel3D;
Struct3D_Master* draw3D = m_CurrentModule->m_3D_Drawings,
* nextdraw3D;
S3D_MASTER* draw3D = m_CurrentModule->m_3D_Drawings;
S3D_MASTER* nextdraw3D;
for( ; panel3D != NULL; panel3D = panel3D->m_Pnext )
{
draw3D->m_Shape3DName = panel3D->m_3D_ShapeName->GetValue();
draw3D->m_MatScale = panel3D->m_3D_Scale->GetValue();
draw3D->m_MatRotation = panel3D->m_3D_Rotation->GetValue();
draw3D->m_MatPosition = panel3D->m_3D_Offset->GetValue();
if( ( draw3D->m_Shape3DName.IsEmpty() )
&& (draw3D != m_CurrentModule->m_3D_Drawings) )
continue;
if( (draw3D->Next() == NULL) && panel3D->m_Pnext )
{
nextdraw3D = new Struct3D_Master( draw3D );
nextdraw3D->SetBack( draw3D );
draw3D->SetNext( nextdraw3D );
nextdraw3D = new S3D_MASTER( draw3D );
// insert after draw3D, therefore pass ->Next() to insert before the next.
m_CurrentModule->m_3D_Drawings.Insert( nextdraw3D, draw3D->Next() );
}
draw3D = (Struct3D_Master*) draw3D->Next();
draw3D = (S3D_MASTER*) draw3D->Next();
}
for( ; draw3D != NULL; draw3D = nextdraw3D )
{
nextdraw3D = (Struct3D_Master*) draw3D->Next();
(draw3D->Back())->SetNext( NULL );
delete draw3D;
nextdraw3D = (S3D_MASTER*) draw3D->Next();
delete m_CurrentModule->m_3D_Drawings.Remove( draw3D );
}
m_CurrentModule->Set_Rectangle_Encadrement();

View File

@ -90,7 +90,7 @@ public:
WinEDA_VertexCtrl *m_3D_Scale, *m_3D_Offset, *m_3D_Rotation;
public:
Panel3D_Ctrl(WinEDA_ModulePropertiesFrame * parentframe,
wxNotebook * parent, int id, Struct3D_Master * struct3D);
wxNotebook * parent, int id, S3D_MASTER * struct3D);
~Panel3D_Ctrl();
void Browse3DLib(wxCommandEvent& event);
void AddOrRemove3DShape(wxCommandEvent& event);

View File

@ -335,61 +335,75 @@ EDGE_MODULE* WinEDA_ModuleEditFrame::Begin_Edge_Module( EDGE_MODULE* Edge,
* @return the new created edge.
*/
{
MODULE* Module = m_Pcb->m_Modules;
MODULE* module = m_Pcb->m_Modules;
int angle = 0;
if( Module == NULL )
if( module == NULL )
return NULL;
if( Edge == NULL ) /* Start a new edge item */
{
SaveCopyInUndoList( Module );
Edge = new EDGE_MODULE( Module );
SaveCopyInUndoList( module );
Edge = new EDGE_MODULE( module );
MoveVector.x = MoveVector.y = 0;
/* Add the new item to the Drawings list head*/
Module->m_Drawings.PushFront( Edge );
module->m_Drawings.PushFront( Edge );
/* Mise a jour des caracteristiques du segment ou de l'arc */
Edge->m_Flags = IS_NEW;
Edge->m_Angle = angle;
Edge->m_Shape = type_edge;
if( Edge->m_Shape == S_ARC )
Edge->m_Angle = ArcValue;
Edge->m_Width = ModuleSegmentWidth;
Edge->SetLayer( Module->GetLayer() );
if( Module->GetLayer() == CMP_N )
Edge->SetLayer( module->GetLayer() );
if( module->GetLayer() == CMP_N )
Edge->SetLayer( SILKSCREEN_N_CMP );
if( Module->GetLayer() == COPPER_LAYER_N )
if( module->GetLayer() == COPPER_LAYER_N )
Edge->SetLayer( SILKSCREEN_N_CU );
/* Initialise the starting point of the new segment or arc */
Edge->m_Start = GetScreen()->m_Curseur;
/* Initialise the ending point of the new segment or arc */
Edge->m_End = Edge->m_Start;
/* Initialise the relative coordinates */
Edge->m_Start0.x = Edge->m_Start.x - Module->m_Pos.x;
Edge->m_Start0.y = Edge->m_Start.y - Module->m_Pos.y;
RotatePoint( (int*) &(Edge->m_Start0.x),
(int*) &(Edge->m_Start0.y), -Module->m_Orient );
Edge->m_Start0.x = Edge->m_Start.x - module->m_Pos.x;
Edge->m_Start0.y = Edge->m_Start.y - module->m_Pos.y;
RotatePoint( (int*) &Edge->m_Start0.x,
(int*) &Edge->m_Start0.y, -module->m_Orient );
Edge->m_End0 = Edge->m_Start0;
Module->Set_Rectangle_Encadrement();
module->Set_Rectangle_Encadrement();
DrawPanel->ManageCurseur = ShowEdgeModule;
DrawPanel->ForceCloseManageCurseur = Exit_EditEdge_Module;
}
else /* trace en cours : les coord du point d'arrivee ont ete mises
* a jour par la routine Montre_Position_New_Edge_Module*/
/* trace en cours : les coord du point d'arrivee ont ete mises
* a jour par la routine Montre_Position_New_Edge_Module
*/
else
{
if( type_edge == S_SEGMENT )
{
if( (Edge->m_Start0.x) != (Edge->m_End0.x)
|| (Edge->m_Start0.y) != (Edge->m_End0.y) )
if( Edge->m_Start0 != Edge->m_End0 )
{
Edge->Draw( DrawPanel, DC, GR_OR );
EDGE_MODULE* newedge = new EDGE_MODULE( Module );
EDGE_MODULE* newedge = new EDGE_MODULE( module );
newedge->Copy( Edge );
newedge->AddToChain( Edge );
// insert _after_ Edge, which is the same as inserting _before_ Edge->Next()
module->m_Drawings.Insert( newedge, Edge->Next() );
Edge->m_Flags = 0;
Edge = newedge;
@ -399,14 +413,16 @@ EDGE_MODULE* WinEDA_ModuleEditFrame::Begin_Edge_Module( EDGE_MODULE* Edge,
Edge->m_End = Edge->m_Start;
/* Mise a jour des coord relatives */
Edge->m_Start0.x = Edge->m_Start.x - Module->m_Pos.x;
Edge->m_Start0.y = Edge->m_Start.y - Module->m_Pos.y;
RotatePoint( (int*) &(Edge->m_Start0.x),
(int*) &(Edge->m_Start0.y), -Module->m_Orient );
Edge->m_Start0.x = Edge->m_Start.x - module->m_Pos.x;
Edge->m_Start0.y = Edge->m_Start.y - module->m_Pos.y;
RotatePoint( (int*) &Edge->m_Start0.x,
(int*) &Edge->m_Start0.y, -module->m_Orient );
Edge->m_End0 = Edge->m_Start0;
Module->Set_Rectangle_Encadrement();
Module->m_LastEdit_Time = time( NULL );
module->Set_Rectangle_Encadrement();
module->m_LastEdit_Time = time( NULL );
GetScreen()->SetModify();
}
}

View File

@ -301,16 +301,21 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
newedge = new EDGE_MODULE( Module );
newedge->Copy( PtSegm );
newedge->AddToChain( PtSegm );
Module->m_Drawings.Insert( newedge, PtSegm->Next() );
PtSegm = newedge;
PtSegm->m_Start = PtSegm->m_End;
PtSegm = gen_arc( PtSegm, PtSegm->m_End.x - Mself.rayon, PtSegm->m_End.y, -900 );
if( lextbrin )
{
newedge = new EDGE_MODULE( Module );
newedge->Copy( PtSegm );
newedge->AddToChain( PtSegm );
Module->m_Drawings.Insert( newedge, PtSegm->Next() );
PtSegm = newedge;
PtSegm->m_Start = PtSegm->m_End;
PtSegm->m_End.x -= lextbrin;
@ -322,7 +327,9 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
int arc_angle;
newedge = new EDGE_MODULE( Module );
newedge->Copy( PtSegm );
newedge->AddToChain( PtSegm );
Module->m_Drawings.Insert( newedge, PtSegm->Next() );
PtSegm = newedge;
PtSegm->m_Start = PtSegm->m_End;
@ -338,7 +345,9 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
{
newedge = new EDGE_MODULE( Module );
newedge->Copy( PtSegm );
newedge->AddToChain( PtSegm );
Module->m_Drawings.Insert( newedge, PtSegm->Next() );
PtSegm = newedge;
PtSegm->m_Start = PtSegm->m_End;
if( ii & 1 )
@ -356,7 +365,9 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
{
newedge = new EDGE_MODULE( Module );
newedge->Copy( PtSegm );
newedge->AddToChain( PtSegm );
Module->m_Drawings.Insert( newedge, PtSegm->Next() );
PtSegm = newedge;
PtSegm->m_Start = PtSegm->m_End;
PtSegm->m_End.x -= lextbrin;
@ -364,7 +375,8 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
newedge = new EDGE_MODULE( Module );
newedge->Copy( PtSegm );
newedge->AddToChain( PtSegm );
Module->m_Drawings.Insert( newedge, PtSegm->Next() );
PtSegm = newedge;
PtSegm->m_Start.x = PtSegm->m_End.x; PtSegm->m_Start.y = PtSegm->m_End.y;
PtSegm = gen_arc( PtSegm, PtSegm->m_End.x, PtSegm->m_End.y + Mself.rayon, 900 );
@ -375,14 +387,17 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
{
newedge = new EDGE_MODULE( Module );
newedge->Copy( PtSegm );
newedge->AddToChain( PtSegm );
Module->m_Drawings.Insert( newedge, PtSegm->Next() );
PtSegm = newedge;
PtSegm->m_Start = PtSegm->m_End;
PtSegm->m_End.x += lextbrin;
}
newedge = new EDGE_MODULE( Module );
newedge->Copy( PtSegm );
newedge->AddToChain( PtSegm );
Module->m_Drawings.Insert( newedge, PtSegm->Next() );
PtSegm = newedge;
PtSegm->m_Start = PtSegm->m_End;
PtSegm = gen_arc( PtSegm, PtSegm->m_End.x, PtSegm->m_End.y + Mself.rayon, -900 );
@ -390,7 +405,7 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
newedge = new EDGE_MODULE( Module );
newedge->Copy( PtSegm );
newedge->AddToChain( PtSegm );
Module->m_Drawings.Insert( newedge, PtSegm->Next() );
PtSegm = newedge;
PtSegm->m_Start = PtSegm->m_End;
PtSegm->m_End = Mself.m_End;
@ -420,9 +435,11 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
Module->m_Pads.PushFront( PtPad );
PtPad->SetPadName( wxT( "1" ) );
PtPad->m_Pos.x = LastSegm->m_End.x; PtPad->m_Pos.y = LastSegm->m_End.y;
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_Pos = LastSegm->m_End;
PtPad->m_Pos0 = PtPad->m_Pos - Module->m_Pos;
PtPad->m_Size.x = PtPad->m_Size.y = LastSegm->m_Width;
PtPad->m_Masque_Layer = g_TabOneLayerMask[LastSegm->GetLayer()];
PtPad->m_Attribut = PAD_SMD;
@ -431,12 +448,15 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
D_PAD* newpad = new D_PAD( Module );
newpad->Copy( PtPad );
newpad->AddToChain( PtPad );
Module->m_Pads.Insert( newpad, PtPad->Next() );
PtPad = newpad;
PtPad->SetPadName( wxT( "2" ) );
PtPad->m_Pos.x = FirstSegm->m_Start.x; PtPad->m_Pos.y = FirstSegm->m_Start.y;
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_Pos = FirstSegm->m_Start;
PtPad->m_Pos0 = PtPad->m_Pos - Module->m_Pos;
/* Modif des positions textes */
Module->Display_Infos( this );
@ -446,20 +466,19 @@ MODULE* WinEDA_PcbFrame::Genere_Self( wxDC* DC )
LastSegm->m_End.y ) / 2;
Module->m_Reference->m_Pos.y -= Module->m_Reference->m_Size.y;
Module->m_Value->m_Pos.y += Module->m_Value->m_Size.y;
Module->m_Reference->m_Pos0.x = Module->m_Reference->m_Pos.x - Module->m_Pos.x;
Module->m_Reference->m_Pos0.y = Module->m_Reference->m_Pos.y - Module->m_Pos.y;
Module->m_Value->m_Pos0.x = Module->m_Value->m_Pos.x - Module->m_Pos.x;
Module->m_Value->m_Pos0.y = Module->m_Value->m_Pos.y - Module->m_Pos.y;
Module->m_Reference->m_Pos0 = Module->m_Reference->m_Pos - Module->m_Pos;
Module->m_Value->m_Pos0 = Module->m_Value->m_Pos - Module->m_Pos;
/* Init des Coord locales des segments */
for( PtSegm = FirstSegm; PtSegm != NULL; PtSegm = (EDGE_MODULE*) PtSegm->Next() )
for( PtSegm = FirstSegm; PtSegm; PtSegm = PtSegm->Next() )
{
PtSegm->m_Start0.x = PtSegm->m_Start.x - Module->m_Pos.x;
PtSegm->m_Start0.y = PtSegm->m_Start.y - Module->m_Pos.y;
PtSegm->m_End0.x = PtSegm->m_End.x - Module->m_Pos.x;
PtSegm->m_End0.y = PtSegm->m_End.y - Module->m_Pos.y;
PtSegm->m_Start0 = PtSegm->m_Start - Module->m_Pos;
PtSegm->m_End0 = PtSegm->m_End - Module->m_Pos;
}
Module->Set_Rectangle_Encadrement();
@ -487,11 +506,17 @@ static EDGE_MODULE* gen_arc( EDGE_MODULE* PtSegm, int cX, int cY, int angle )
int x0, xr0, y0, yr0;
EDGE_MODULE* newedge;
// m_Drawings in the board
DLIST<BOARD_ITEM>* list = (DLIST<BOARD_ITEM>*) PtSegm->GetList();
wxASSERT( list );
angle = -angle;
y0 = PtSegm->m_Start.x - cX; x0 = PtSegm->m_Start.y - cY;
nb_seg = ( abs( angle ) ) / 225; if( nb_seg == 0 )
nb_seg = 1;
alpha = ( (float) angle * 3.14159 / 1800 ) / nb_seg;
for( ii = 1; ii <= nb_seg; ii++ )
@ -501,9 +526,12 @@ static EDGE_MODULE* gen_arc( EDGE_MODULE* PtSegm, int cX, int cY, int angle )
newedge = new EDGE_MODULE( (MODULE*) NULL );
newedge->Copy( PtSegm );
newedge->SetParent( PtSegm->GetParent() );
newedge->AddToChain( PtSegm );
list->Insert( newedge, PtSegm->Next() );
PtSegm = newedge;
PtSegm->m_Start.x = PtSegm->m_End.x; PtSegm->m_Start.y = PtSegm->m_End.y;
PtSegm->m_Start = PtSegm->m_End;
}
beta = (alpha * ii);
@ -511,7 +539,9 @@ static EDGE_MODULE* gen_arc( EDGE_MODULE* PtSegm, int cX, int cY, int angle )
xr0 = (int) (x0 * fcos + y0 * fsin);
yr0 = (int) (y0 * fcos - x0 * fsin);
PtSegm->m_End.x = cX + yr0; PtSegm->m_End.y = cY + xr0;
PtSegm->m_End.x = cX + yr0;
PtSegm->m_End.y = cY + xr0;
}
return PtSegm;

View File

@ -134,7 +134,8 @@ bool WinEDA_BasePcbFrame::Clear_Pcb( bool query )
while( g_UnDeleteStackPtr > 0 )
{
g_UnDeleteStackPtr--;
g_UnDeleteStack[g_UnDeleteStackPtr]->DeleteStructList();
delete g_UnDeleteStack[g_UnDeleteStackPtr];
}
/* init pointeurs et variables */
@ -214,7 +215,7 @@ void WinEDA_PcbFrame::Erase_Segments_Pcb( bool is_edges, bool query )
case TYPE_COTATION:
case TYPE_MIRE:
if( g_TabOneLayerMask[ PtStruct->GetLayer()] & masque_layer )
PtStruct->DeleteStructure();
m_Pcb->Delete( PtStruct );
break;
default:

View File

@ -76,10 +76,15 @@ void WinEDA_ModuleEditFrame::GetComponentFromUndoList()
GetScreen()->AddItemToRedoList( m_Pcb->m_Modules.PopFront() );
m_Pcb->Add( (MODULE*) GetScreen()->GetItemFromUndoList() );
MODULE* module = (MODULE*) GetScreen()->GetItemFromUndoList();
if( module )
m_Pcb->Add( module, ADD_APPEND );
/* Add() calls PushBack(), no need for this
if( m_Pcb->m_Modules )
m_Pcb->m_Modules->SetNext( NULL );
*/
GetScreen()->SetModify();
SetCurItem( NULL );;
ReCreateHToolbar();

View File

@ -239,8 +239,13 @@ MODULE* WinEDA_BasePcbFrame::Copie_Module( MODULE* module )
m_Pcb->m_Status_Pcb = 0;
newmodule = new MODULE( m_Pcb );
newmodule->Copy( module );
/* no, Add() below does this
newmodule->SetParent( m_Pcb );
newmodule->AddToChain( module );
*/
m_Pcb->Add( newmodule, ADD_APPEND );
newmodule->m_Flags = IS_NEW;
build_liste_pads();

View File

@ -45,6 +45,7 @@ public:
int timestamp,
const wxString& path );
~MODULEtoLOAD() { };
MODULEtoLOAD* Next() const { return (MODULEtoLOAD*) Pnext; }
};
@ -1027,7 +1028,8 @@ void LoadListeModules( WinEDA_PcbFrame* aPcbFrame, wxDC* DC )
for( ii = 0; ii < s_NbNewModules; ii++, cmp = cmp->Next() )
{
if( (ii == 0) || ( ref->m_LibName != cmp->m_LibName) )
{ /* New footprint : must be loaded from a library */
{
/* New footprint : must be loaded from a library */
Module = aPcbFrame->Get_Librairie_Module( NULL, wxEmptyString, cmp->m_LibName, FALSE );
ref = cmp;
if( Module == NULL )
@ -1051,9 +1053,12 @@ void LoadListeModules( WinEDA_PcbFrame* aPcbFrame, wxDC* DC )
MODULE* newmodule;
if( Module == NULL )
continue; /* module non existant en libr */
newmodule = new MODULE( aPcbFrame->m_Pcb );
newmodule->Copy( Module );
newmodule->AddToChain( Module );
aPcbFrame->m_Pcb->Add( newmodule, ADD_APPEND );
Module = newmodule;
Module->m_Reference->m_Text = cmp->m_CmpName;
Module->m_TimeStamp = cmp->m_TimeStamp;