From e574a1b061b94d08d6a8f7abb30bccf34904237e Mon Sep 17 00:00:00 2001 From: dickelbeck Date: Sat, 6 Dec 2008 08:21:54 +0000 Subject: [PATCH] more DLIST<> work --- 3d-viewer/3d_aux.cpp | 2 +- 3d-viewer/3d_class.cpp | 12 ++-- 3d-viewer/3d_draw.cpp | 2 +- 3d-viewer/3d_read_mesh.cpp | 16 ++--- 3d-viewer/3d_struct.h | 26 +++---- change_log.txt | 9 +++ common/base_struct.cpp | 31 -------- gerbview/initpcb.cpp | 18 +++-- include/base_struct.h | 18 ----- pcbnew/class_board.cpp | 45 ++++++------ pcbnew/class_board.h | 2 - pcbnew/class_module.cpp | 82 ++++++++------------- pcbnew/class_module.h | 4 +- pcbnew/dialog_edit_module.cpp | 29 ++++---- pcbnew/dialog_edit_module.h | 130 +++++++++++++++++----------------- pcbnew/edgemod.cpp | 66 ++++++++++------- pcbnew/gen_self.h | 86 ++++++++++++++-------- pcbnew/initpcb.cpp | 5 +- pcbnew/modedit_undo_redo.cpp | 7 +- pcbnew/modules.cpp | 7 +- pcbnew/netlist.cpp | 9 ++- 21 files changed, 306 insertions(+), 300 deletions(-) diff --git a/3d-viewer/3d_aux.cpp b/3d-viewer/3d_aux.cpp index d563f8b643..8dfbcec2d4 100644 --- a/3d-viewer/3d_aux.cpp +++ b/3d-viewer/3d_aux.cpp @@ -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; diff --git a/3d-viewer/3d_class.cpp b/3d-viewer/3d_class.cpp index cedf78efff..b826d7e711 100644 --- a/3d-viewer/3d_class.cpp +++ b/3d-viewer/3d_class.cpp @@ -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 ) { diff --git a/3d-viewer/3d_draw.cpp b/3d-viewer/3d_draw.cpp index 28c3d35f66..d234e3d854 100644 --- a/3d-viewer/3d_draw.cpp +++ b/3d-viewer/3d_draw.cpp @@ -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 ) { diff --git a/3d-viewer/3d_read_mesh.cpp b/3d-viewer/3d_read_mesh.cpp index c2bc4327c7..bddf9c0af2 100644 --- a/3d-viewer/3d_read_mesh.cpp +++ b/3d-viewer/3d_read_mesh.cpp @@ -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; diff --git a/3d-viewer/3d_struct.h b/3d-viewer/3d_struct.h index 66107f4e4c..c5327d52f7 100644 --- a/3d-viewer/3d_struct.h +++ b/3d-viewer/3d_struct.h @@ -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 ); diff --git a/change_log.txt b/change_log.txt index 4c65887f3f..c5339c48cd 100644 --- a/change_log.txt +++ b/change_log.txt @@ -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 +================================================================================ +++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 ================================================================================ ++all diff --git a/common/base_struct.cpp b/common/base_struct.cpp index 48fb47677f..0cd7187094 100644 --- a/common/base_struct.cpp +++ b/common/base_struct.cpp @@ -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, diff --git a/gerbview/initpcb.cpp b/gerbview/initpcb.cpp index 903706fa32..711a09cd36 100644 --- a/gerbview/initpcb.cpp +++ b/gerbview/initpcb.cpp @@ -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; + 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: diff --git a/include/base_struct.h b/include/base_struct.h index 3844d12e31..63ea1e7889 100644 --- a/include/base_struct.h +++ b/include/base_struct.h @@ -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) /** diff --git a/pcbnew/class_board.cpp b/pcbnew/class_board.cpp index 5eb9eb9e43..6745f97bfb 100644 --- a/pcbnew/class_board.cpp +++ b/pcbnew/class_board.cpp @@ -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") ); diff --git a/pcbnew/class_board.h b/pcbnew/class_board.h index f1bd6d5a0e..1fbeb6b7f6 100644 --- a/pcbnew/class_board.h +++ b/pcbnew/class_board.h @@ -115,8 +115,6 @@ public: */ wxPoint& GetPosition(); - /* supprime du chainage la structure Struct */ - void UnLink(); /** * Function Add diff --git a/pcbnew/class_module.cpp b/pcbnew/class_module.cpp index 53aee0069b..fd6a5ecb97 100644 --- a/pcbnew/class_module.cpp +++ b/pcbnew/class_module.cpp @@ -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() ) { @@ -406,19 +388,17 @@ int MODULE::Read_3D_Descr( FILE* File, int* LineNum ) */ { char Line[1024]; - char* text = Line + 3; - Struct3D_Master* Struct3D = m_3D_Drawings; + char* text = Line + 3; + + 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 ) diff --git a/pcbnew/class_module.h b/pcbnew/class_module.h index 44c1eb5af7..9cbfd729c9 100644 --- a/pcbnew/class_module.h +++ b/pcbnew/class_module.h @@ -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 m_Pads; /* Pad list (linked list) */ DLIST m_Drawings; /* Graphic items list (linked list) */ - Struct3D_Master* m_3D_Drawings; /* First item of the 3D shapes (linked list)*/ + DLIST 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) */ diff --git a/pcbnew/dialog_edit_module.cpp b/pcbnew/dialog_edit_module.cpp index 6a63d8604f..cfd926c882 100644 --- a/pcbnew/dialog_edit_module.cpp +++ b/pcbnew/dialog_edit_module.cpp @@ -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(); diff --git a/pcbnew/dialog_edit_module.h b/pcbnew/dialog_edit_module.h index 9c8ad2bfb3..19db8f3588 100644 --- a/pcbnew/dialog_edit_module.h +++ b/pcbnew/dialog_edit_module.h @@ -1,78 +1,78 @@ - /************************************************/ - /* Module editor: Dialog box for editing module */ - /* properties and carateristics */ - /************************************************/ + /************************************************/ + /* Module editor: Dialog box for editing module */ + /* properties and carateristics */ + /************************************************/ enum id_Module_properties { - ID_GOTO_MODULE_EDITOR =1900, - ID_MODULE_PROPERTIES_EXCHANGE, - ID_MODULE_EDIT_ADD_TEXT, - ID_MODULE_EDIT_EDIT_TEXT, - ID_MODULE_EDIT_DELETE_TEXT, - ID_MODULE_LISTBOX_SELECT, - ID_LISTBOX_ORIENT_SELECT, - ID_BROWSE_3D_LIB, - ID_ADD_3D_SHAPE, - ID_REMOVE_3D_SHAPE, - ID_NOTEBOOK, - ID_MODULE_EDIT_X_POSITION, - ID_MODULE_EDIT_Y_POSITION + ID_GOTO_MODULE_EDITOR =1900, + ID_MODULE_PROPERTIES_EXCHANGE, + ID_MODULE_EDIT_ADD_TEXT, + ID_MODULE_EDIT_EDIT_TEXT, + ID_MODULE_EDIT_DELETE_TEXT, + ID_MODULE_LISTBOX_SELECT, + ID_LISTBOX_ORIENT_SELECT, + ID_BROWSE_3D_LIB, + ID_ADD_3D_SHAPE, + ID_REMOVE_3D_SHAPE, + ID_NOTEBOOK, + ID_MODULE_EDIT_X_POSITION, + ID_MODULE_EDIT_Y_POSITION }; class Panel3D_Ctrl; - /**************************************/ - /* class WinEDA_ModulePropertiesFrame */ - /**************************************/ + /**************************************/ + /* class WinEDA_ModulePropertiesFrame */ + /**************************************/ class WinEDA_ModulePropertiesFrame: public wxDialog { private: - WinEDA_BasePcbFrame * m_Parent; - wxDC * m_DC; - MODULE * m_CurrentModule; - wxNotebook* m_NoteBook; - wxPanel * m_PanelProperties; - Panel3D_Ctrl * m_Panel3D; - WinEDAChoiceBox * m_TextListBox; - wxRadioBox * m_LayerCtrl; - wxRadioBox * m_OrientCtrl; - wxTextCtrl * m_OrientValue; - wxRadioBox * m_AttributsCtrl; - wxRadioBox * m_AutoPlaceCtrl; - wxSlider * m_CostRot90Ctrl, * m_CostRot180Ctrl; - wxButton * m_DeleteFieddButton; - wxTextCtrl *m_Doc, *m_Keyword; - wxBoxSizer * m_GeneralBoxSizer; + WinEDA_BasePcbFrame * m_Parent; + wxDC * m_DC; + MODULE * m_CurrentModule; + wxNotebook* m_NoteBook; + wxPanel * m_PanelProperties; + Panel3D_Ctrl * m_Panel3D; + WinEDAChoiceBox * m_TextListBox; + wxRadioBox * m_LayerCtrl; + wxRadioBox * m_OrientCtrl; + wxTextCtrl * m_OrientValue; + wxRadioBox * m_AttributsCtrl; + wxRadioBox * m_AutoPlaceCtrl; + wxSlider * m_CostRot90Ctrl, * m_CostRot180Ctrl; + wxButton * m_DeleteFieddButton; + wxTextCtrl *m_Doc, *m_Keyword; + wxBoxSizer * m_GeneralBoxSizer; wxBoxSizer* m_PanelPropertiesBoxSizer; wxTextCtrl *m_ModPositionX, *m_ModPositionY; wxString *m_ModPosXStr, *m_ModPosYStr; public: - // Constructor and destructor - WinEDA_ModulePropertiesFrame(WinEDA_BasePcbFrame *parent, - MODULE * Module, wxDC * DC, const wxPoint & pos); - ~WinEDA_ModulePropertiesFrame() - { - } + // Constructor and destructor + WinEDA_ModulePropertiesFrame(WinEDA_BasePcbFrame *parent, + MODULE * Module, wxDC * DC, const wxPoint & pos); + ~WinEDA_ModulePropertiesFrame() + { + } private: void CreateControls(); - void OnCancelClick(wxCommandEvent& event); - void OnOkClick(wxCommandEvent& event); - void CreateTextModule(wxCommandEvent& event); - void EditOrDelTextModule(wxCommandEvent& event); - void SelectTextListBox(wxCommandEvent& event); - void ReCreateFieldListBox(); - void SetTextListButtons(); - void BuildPanelModuleProperties(bool FullOptions); - void ModuleOrientEvent(wxCommandEvent& event); - void ExchangeModule(wxCommandEvent& event); - void GotoModuleEditor(wxCommandEvent& event); - DECLARE_EVENT_TABLE() + void OnCancelClick(wxCommandEvent& event); + void OnOkClick(wxCommandEvent& event); + void CreateTextModule(wxCommandEvent& event); + void EditOrDelTextModule(wxCommandEvent& event); + void SelectTextListBox(wxCommandEvent& event); + void ReCreateFieldListBox(); + void SetTextListButtons(); + void BuildPanelModuleProperties(bool FullOptions); + void ModuleOrientEvent(wxCommandEvent& event); + void ExchangeModule(wxCommandEvent& event); + void GotoModuleEditor(wxCommandEvent& event); + DECLARE_EVENT_TABLE() }; @@ -82,18 +82,18 @@ class Panel3D_Ctrl: public wxPanel /* panel d'entree des caract 3D */ { public: - Panel3D_Ctrl * m_Pnext, * m_Pback; // Chainage - wxNotebook * m_Parent; - WinEDA_ModulePropertiesFrame * m_ParentFrame; + Panel3D_Ctrl * m_Pnext, * m_Pback; // Chainage + wxNotebook * m_Parent; + WinEDA_ModulePropertiesFrame * m_ParentFrame; wxBoxSizer* m_Panel3DBoxSizer; - wxTextCtrl * m_3D_ShapeName; - WinEDA_VertexCtrl *m_3D_Scale, *m_3D_Offset, *m_3D_Rotation; + wxTextCtrl * m_3D_ShapeName; + WinEDA_VertexCtrl *m_3D_Scale, *m_3D_Offset, *m_3D_Rotation; public: - Panel3D_Ctrl(WinEDA_ModulePropertiesFrame * parentframe, - wxNotebook * parent, int id, Struct3D_Master * struct3D); - ~Panel3D_Ctrl(); - void Browse3DLib(wxCommandEvent& event); - void AddOrRemove3DShape(wxCommandEvent& event); - DECLARE_EVENT_TABLE() + Panel3D_Ctrl(WinEDA_ModulePropertiesFrame * parentframe, + wxNotebook * parent, int id, S3D_MASTER * struct3D); + ~Panel3D_Ctrl(); + void Browse3DLib(wxCommandEvent& event); + void AddOrRemove3DShape(wxCommandEvent& event); + DECLARE_EVENT_TABLE() }; diff --git a/pcbnew/edgemod.cpp b/pcbnew/edgemod.cpp index a73142238d..61f8f28e13 100644 --- a/pcbnew/edgemod.cpp +++ b/pcbnew/edgemod.cpp @@ -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(); } } diff --git a/pcbnew/gen_self.h b/pcbnew/gen_self.h index b709660dd4..12ea5190cd 100644 --- a/pcbnew/gen_self.h +++ b/pcbnew/gen_self.h @@ -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* list = (DLIST*) 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; diff --git a/pcbnew/initpcb.cpp b/pcbnew/initpcb.cpp index ae42e38812..9109de59df 100644 --- a/pcbnew/initpcb.cpp +++ b/pcbnew/initpcb.cpp @@ -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: diff --git a/pcbnew/modedit_undo_redo.cpp b/pcbnew/modedit_undo_redo.cpp index d12c9dcf29..2f19578542 100644 --- a/pcbnew/modedit_undo_redo.cpp +++ b/pcbnew/modedit_undo_redo.cpp @@ -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(); diff --git a/pcbnew/modules.cpp b/pcbnew/modules.cpp index 0ff3f9e970..fe4711d9c2 100644 --- a/pcbnew/modules.cpp +++ b/pcbnew/modules.cpp @@ -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(); diff --git a/pcbnew/netlist.cpp b/pcbnew/netlist.cpp index e135faa344..81fe8a8e7b 100644 --- a/pcbnew/netlist.cpp +++ b/pcbnew/netlist.cpp @@ -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;