7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2025-04-19 09:41:41 +00:00

DeleteStructure() & DeleteStructList() consolidation

This commit is contained in:
dickelbeck 2007-10-03 15:21:13 +00:00
parent e9921a71fc
commit d985f2d640
50 changed files with 969 additions and 919 deletions

View File

@ -5,6 +5,16 @@ Please add newer entries at the top, list the date and your name with
email address.
2007-Oct-3 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+ pcbnew
made BOARD_ITEM::UnLink() virtual
added BOARD_ITEM::DeleteStructure().
added EDA_BaseStruct::DeleteStructList()
deleted gerbview/struct.cpp, pcbnew/struct.cpp,
BOARD::~BOARD() now deletes objects that it owns.
2007-Oct-2 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+ all

View File

@ -73,6 +73,23 @@ void EDA_BaseStruct::SetState( int type, int state )
}
/***********************************************************/
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 )
/*********************************************************/

View File

@ -18,80 +18,79 @@
/* Construction de la table des evenements pour WinEDA_DrawFrame */
/*****************************************************************/
BEGIN_EVENT_TABLE(WinEDA_DisplayFrame, wxFrame)
BEGIN_EVENT_TABLE( WinEDA_DisplayFrame, wxFrame )
COMMON_EVENTS_DRAWFRAME
EVT_CLOSE(WinEDA_DisplayFrame::OnCloseWindow)
EVT_SIZE(WinEDA_DrawFrame::OnSize)
EVT_TOOL_RANGE(ID_ZOOM_PLUS_BUTT, ID_ZOOM_PAGE_BUTT,
WinEDA_DisplayFrame::Process_Zoom)
EVT_TOOL(ID_OPTIONS_SETUP, WinEDA_DisplayFrame::InstallOptionsDisplay)
EVT_TOOL(ID_CVPCB_SHOW3D_FRAME, WinEDA_BasePcbFrame::Show3D_Frame)
COMMON_EVENTS_DRAWFRAME EVT_CLOSE( WinEDA_DisplayFrame::OnCloseWindow )
EVT_SIZE( WinEDA_DrawFrame::OnSize )
EVT_TOOL_RANGE( ID_ZOOM_PLUS_BUTT, ID_ZOOM_PAGE_BUTT,
WinEDA_DisplayFrame::Process_Zoom )
EVT_TOOL( ID_OPTIONS_SETUP, WinEDA_DisplayFrame::InstallOptionsDisplay )
EVT_TOOL( ID_CVPCB_SHOW3D_FRAME, WinEDA_BasePcbFrame::Show3D_Frame )
END_EVENT_TABLE()
/*********************************************************************/
/* Constructeur de WinEDA_DisplayFrame: la fenetre de visu du composant */
/*********************************************************************/
/*********************************************************************/
/* Constructeur de WinEDA_DisplayFrame: la fenetre de visu du composant */
/*********************************************************************/
WinEDA_DisplayFrame::WinEDA_DisplayFrame( wxWindow * father, WinEDA_App *parent,
const wxString & title,
const wxPoint& pos, const wxSize& size):
WinEDA_BasePcbFrame(father, parent, CVPCB_DISPLAY_FRAME, title, pos, size)
WinEDA_DisplayFrame::WinEDA_DisplayFrame( wxWindow* father, WinEDA_App* parent,
const wxString& title,
const wxPoint& pos, const wxSize& size ) :
WinEDA_BasePcbFrame( father, parent, CVPCB_DISPLAY_FRAME, title, pos, size )
{
m_FrameName = wxT("CmpFrame");
m_Draw_Axis = TRUE; // TRUE pour avoir les axes dessines
m_Draw_Grid = TRUE; // TRUE pour avoir la axes dessinee
m_Draw_Sheet_Ref = FALSE; // TRUE pour avoir le cartouche dessiné
m_FrameName = wxT( "CmpFrame" );
m_Draw_Axis = TRUE; // TRUE pour avoir les axes dessines
m_Draw_Grid = TRUE; // TRUE pour avoir la axes dessinee
m_Draw_Sheet_Ref = FALSE; // TRUE pour avoir le cartouche dessiné
SetIcon(wxIcon( wxT("icon_cvpcb"))); // Give an icon
SetTitle(title);
SetIcon( wxIcon( wxT( "icon_cvpcb" ) ) ); // Give an icon
SetTitle( title );
m_Pcb = new BOARD(NULL, this);
m_CurrentScreen = new PCB_SCREEN(CVPCB_DISPLAY_FRAME);
GetSettings();
SetSize(m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y);
ReCreateHToolbar();
ReCreateVToolbar();
Show(TRUE);
m_Pcb = new BOARD( NULL, this );
m_CurrentScreen = new PCB_SCREEN( CVPCB_DISPLAY_FRAME );
GetSettings();
SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y );
ReCreateHToolbar();
ReCreateVToolbar();
Show( TRUE );
}
/*****************************************/
/* Fonctions de base de WinEDA_DisplayFrame */
/*****************************************/
/*****************************************/
/* Fonctions de base de WinEDA_DisplayFrame */
/*****************************************/
// Destructeur
WinEDA_DisplayFrame::~WinEDA_DisplayFrame()
{
if ( m_Pcb->m_Modules ) DeleteStructure( m_Pcb->m_Modules );
m_Pcb->m_Modules = NULL;
delete m_CurrentScreen;
delete m_Pcb;
m_Parent->m_CvpcbFrame->DrawFrame = NULL;
delete m_CurrentScreen;
delete m_Pcb;
m_Parent->m_CvpcbFrame->DrawFrame = NULL;
}
/************************************************************/
void WinEDA_DisplayFrame::OnCloseWindow(wxCloseEvent& event)
void WinEDA_DisplayFrame::OnCloseWindow( wxCloseEvent& event )
/************************************************************/
/* Fermeture par icone ou systeme
*/
*/
{
wxPoint pos;
wxSize size;
wxPoint pos;
wxSize size;
size = GetSize();
pos = GetPosition();
size = GetSize();
pos = GetPosition();
SaveSettings();
Destroy();
SaveSettings();
Destroy();
}
/************************************************/
void WinEDA_DisplayFrame::ReCreateVToolbar()
/************************************************/
@ -103,36 +102,38 @@ void WinEDA_DisplayFrame::ReCreateVToolbar()
void WinEDA_DisplayFrame::ReCreateHToolbar()
/************************************************/
{
if ( m_HToolBar != NULL ) return;
if( m_HToolBar != NULL )
return;
m_HToolBar = new WinEDA_Toolbar(TOOLBAR_MAIN, this, ID_H_TOOLBAR, TRUE);
SetToolBar(m_HToolBar);
m_HToolBar = new WinEDA_Toolbar( TOOLBAR_MAIN, this, ID_H_TOOLBAR, TRUE );
m_HToolBar->AddTool(ID_OPTIONS_SETUP, wxEmptyString,
BITMAP(display_options_xpm),
_("Display Options"));
SetToolBar( m_HToolBar );
m_HToolBar->AddSeparator();
m_HToolBar->AddTool( ID_OPTIONS_SETUP, wxEmptyString,
BITMAP( display_options_xpm ),
_( "Display Options" ) );
m_HToolBar->AddTool(ID_ZOOM_PLUS_BUTT, wxEmptyString, BITMAP(zoom_in_xpm),
_("zoom + (F1)"));
m_HToolBar->AddSeparator();
m_HToolBar->AddTool(ID_ZOOM_MOINS_BUTT, wxEmptyString, BITMAP(zoom_out_xpm),
_("zoom - (F2)"));
m_HToolBar->AddTool( ID_ZOOM_PLUS_BUTT, wxEmptyString, BITMAP( zoom_in_xpm ),
_( "zoom + (F1)" ) );
m_HToolBar->AddTool(ID_ZOOM_REDRAW_BUTT, wxEmptyString, BITMAP(repaint_xpm),
_("redraw (F3)"));
m_HToolBar->AddTool( ID_ZOOM_MOINS_BUTT, wxEmptyString, BITMAP( zoom_out_xpm ),
_( "zoom - (F2)" ) );
m_HToolBar->AddTool(ID_ZOOM_PAGE_BUTT, wxEmptyString, BITMAP(zoom_optimal_xpm),
_("1:1 zoom"));
m_HToolBar->AddTool( ID_ZOOM_REDRAW_BUTT, wxEmptyString, BITMAP( repaint_xpm ),
_( "redraw (F3)" ) );
m_HToolBar->AddSeparator();
m_HToolBar->AddTool(ID_CVPCB_SHOW3D_FRAME, wxEmptyString, BITMAP(show_3d_xpm),
_("1:1 zoom"));
m_HToolBar->AddTool( ID_ZOOM_PAGE_BUTT, wxEmptyString, BITMAP( zoom_optimal_xpm ),
_( "1:1 zoom" ) );
// after adding the buttons to the toolbar, must call Realize() to reflect
// the changes
m_HToolBar->Realize();
m_HToolBar->AddSeparator();
m_HToolBar->AddTool( ID_CVPCB_SHOW3D_FRAME, wxEmptyString, BITMAP( show_3d_xpm ),
_( "1:1 zoom" ) );
// after adding the buttons to the toolbar, must call Realize() to reflect
// the changes
m_HToolBar->Realize();
}
@ -143,145 +144,154 @@ void WinEDA_DisplayFrame::SetToolbars()
}
void WinEDA_DisplayFrame::OnLeftClick(wxDC * DC, const wxPoint& MousePos)
void WinEDA_DisplayFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
{
}
void WinEDA_DisplayFrame::OnLeftDClick(wxDC * DC, const wxPoint& MousePos)
void WinEDA_DisplayFrame::OnLeftDClick( wxDC* DC, const wxPoint& MousePos )
{
}
void WinEDA_DisplayFrame::OnRightClick(const wxPoint& MousePos, wxMenu * PopMenu)
void WinEDA_DisplayFrame::OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu )
{
}
/****************************************************************/
void WinEDA_BasePcbFrame::GeneralControle(wxDC *DC, wxPoint Mouse)
void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse )
/****************************************************************/
{
wxSize delta;
int flagcurseur = 0;
int zoom = m_CurrentScreen->GetZoom();
wxPoint curpos, oldpos;
wxSize delta;
int flagcurseur = 0;
int zoom = m_CurrentScreen->GetZoom();
wxPoint curpos, oldpos;
curpos = DrawPanel->CursorRealPosition(Mouse);
oldpos = m_CurrentScreen->m_Curseur;
curpos = DrawPanel->CursorRealPosition( Mouse );
oldpos = m_CurrentScreen->m_Curseur;
delta.x = m_CurrentScreen->GetGrid().x / zoom;
delta.y = m_CurrentScreen->GetGrid().y / zoom;
if( delta.x <= 0 ) delta.x = 1;
if( delta.y <= 0 ) delta.y = 1;
delta.x = m_CurrentScreen->GetGrid().x / zoom;
delta.y = m_CurrentScreen->GetGrid().y / zoom;
if( delta.x <= 0 )
delta.x = 1;
if( delta.y <= 0 )
delta.y = 1;
if( g_KeyPressed)
{
switch( g_KeyPressed )
{
case WXK_F1 :
OnZoom(ID_ZOOM_PLUS_KEY);
flagcurseur = 2;
curpos = m_CurrentScreen->m_Curseur;
break;
case WXK_F2 :
OnZoom(ID_ZOOM_MOINS_KEY);
flagcurseur = 2;
curpos = m_CurrentScreen->m_Curseur;
break;
case WXK_F3 :
OnZoom(ID_ZOOM_REDRAW_KEY);
flagcurseur = 2;
break;
case WXK_F4 :
OnZoom(ID_ZOOM_CENTER_KEY);
flagcurseur = 2;
curpos = m_CurrentScreen->m_Curseur;
break;
if( g_KeyPressed )
{
switch( g_KeyPressed )
{
case WXK_F1:
OnZoom( ID_ZOOM_PLUS_KEY );
flagcurseur = 2;
curpos = m_CurrentScreen->m_Curseur;
break;
case ' ':
m_CurrentScreen->m_O_Curseur = m_CurrentScreen->m_Curseur;
break;
case WXK_F2:
OnZoom( ID_ZOOM_MOINS_KEY );
flagcurseur = 2;
curpos = m_CurrentScreen->m_Curseur;
break;
case WXK_NUMPAD8: /* Deplacement curseur vers le haut */
case WXK_UP :
DrawPanel->CalcScrolledPosition(Mouse.x, Mouse.y - delta.y,
&Mouse.x, &Mouse.y);
GRMouseWarp(DrawPanel, Mouse);
break ;
case WXK_F3:
OnZoom( ID_ZOOM_REDRAW_KEY );
flagcurseur = 2;
break;
case WXK_NUMPAD2: /* Deplacement curseur vers le bas */
case WXK_DOWN:
DrawPanel->CalcScrolledPosition(Mouse.x, Mouse.y + delta.y,
&Mouse.x, &Mouse.y);
GRMouseWarp(DrawPanel, Mouse);
break ;
case WXK_F4:
OnZoom( ID_ZOOM_CENTER_KEY );
flagcurseur = 2;
curpos = m_CurrentScreen->m_Curseur;
break;
case WXK_NUMPAD4: /* Deplacement curseur vers la gauche */
case WXK_LEFT :
DrawPanel->CalcScrolledPosition(Mouse.x - delta.x, Mouse.y,
&Mouse.x, &Mouse.y);
GRMouseWarp(DrawPanel, Mouse);
break ;
case WXK_NUMPAD6: /* Deplacement curseur vers la droite */
case WXK_RIGHT :
DrawPanel->CalcScrolledPosition(Mouse.x + delta.x, Mouse.y,
&Mouse.x, &Mouse.y);
GRMouseWarp(DrawPanel, Mouse);
break ;
}
}
case ' ':
m_CurrentScreen->m_O_Curseur = m_CurrentScreen->m_Curseur;
break;
/* Recalcul de la position du curseur schema */
m_CurrentScreen->m_Curseur = curpos;
/* Placement sur la grille generale */
PutOnGrid( & m_CurrentScreen->m_Curseur);
case WXK_NUMPAD8: /* Deplacement curseur vers le haut */
case WXK_UP:
DrawPanel->CalcScrolledPosition( Mouse.x, Mouse.y - delta.y,
&Mouse.x, &Mouse.y );
GRMouseWarp( DrawPanel, Mouse );
break;
if( m_CurrentScreen->IsRefreshReq() )
{
flagcurseur = 2;
RedrawActiveWindow(DC, TRUE);
}
case WXK_NUMPAD2: /* Deplacement curseur vers le bas */
case WXK_DOWN:
DrawPanel->CalcScrolledPosition( Mouse.x, Mouse.y + delta.y,
&Mouse.x, &Mouse.y );
GRMouseWarp( DrawPanel, Mouse );
break;
if ( (oldpos.x != m_CurrentScreen->m_Curseur.x) ||
(oldpos.y != m_CurrentScreen->m_Curseur.y) )
{
if ( flagcurseur != 2 )
{
curpos = m_CurrentScreen->m_Curseur;
m_CurrentScreen->m_Curseur = oldpos;
DrawPanel->CursorOff(DC);
case WXK_NUMPAD4: /* Deplacement curseur vers la gauche */
case WXK_LEFT:
DrawPanel->CalcScrolledPosition( Mouse.x - delta.x, Mouse.y,
&Mouse.x, &Mouse.y );
GRMouseWarp( DrawPanel, Mouse );
break;
m_CurrentScreen->m_Curseur = curpos;
DrawPanel->CursorOn(DC);
}
case WXK_NUMPAD6: /* Deplacement curseur vers la droite */
case WXK_RIGHT:
DrawPanel->CalcScrolledPosition( Mouse.x + delta.x, Mouse.y,
&Mouse.x, &Mouse.y );
GRMouseWarp( DrawPanel, Mouse );
break;
}
}
if(DrawPanel->ManageCurseur)
{
DrawPanel->ManageCurseur(DrawPanel, DC, 0);
}
}
/* Recalcul de la position du curseur schema */
m_CurrentScreen->m_Curseur = curpos;
/* Placement sur la grille generale */
PutOnGrid( &m_CurrentScreen->m_Curseur );
Affiche_Status_Box(); /* Affichage des coord curseur */
if( m_CurrentScreen->IsRefreshReq() )
{
flagcurseur = 2;
RedrawActiveWindow( DC, TRUE );
}
if( (oldpos.x != m_CurrentScreen->m_Curseur.x)
|| (oldpos.y != m_CurrentScreen->m_Curseur.y) )
{
if( flagcurseur != 2 )
{
curpos = m_CurrentScreen->m_Curseur;
m_CurrentScreen->m_Curseur = oldpos;
DrawPanel->CursorOff( DC );
m_CurrentScreen->m_Curseur = curpos;
DrawPanel->CursorOn( DC );
}
if( DrawPanel->ManageCurseur )
{
DrawPanel->ManageCurseur( DrawPanel, DC, 0 );
}
}
Affiche_Status_Box(); /* Affichage des coord curseur */
}
/*************************************************************************/
void WinEDA_DisplayFrame::Process_Special_Functions(wxCommandEvent& event)
void WinEDA_DisplayFrame::Process_Special_Functions( wxCommandEvent& event )
/*************************************************************************/
/* Traite les selections d'outils et les commandes appelees du menu POPUP
*/
*/
{
int id = event.GetId();
wxClientDC dc(DrawPanel);
int id = event.GetId();
DrawPanel->PrepareGraphicContext(&dc);
wxClientDC dc( DrawPanel );
switch ( id )
{
default:
wxMessageBox( wxT("WinEDA_DisplayFrame::Process_Special_Functions error"));
break;
}
DrawPanel->PrepareGraphicContext( &dc );
SetToolbars();
switch( id )
{
default:
wxMessageBox( wxT( "WinEDA_DisplayFrame::Process_Special_Functions error" ) );
break;
}
SetToolbars();
}

View File

@ -34,10 +34,6 @@ void Set_Rectangle_Encadrement(MODULE * PtModule);
/* Mise a jour du rectangle d'encadrement du module
Entree : pointeur sur module */
void DeleteStructure( void * GenericStructure );
/* Supprime de la liste chainee la stucture pointee par GenericStructure
et libere la memoire correspondante */
/**************/
/* MEMOIRE.CC */
/**************/

View File

@ -16,51 +16,60 @@
/*******************************************/
void WinEDA_CvpcbFrame::CreateScreenCmp()
/*******************************************/
/* Creation de la fenetre d'affichage du composant
*/
*/
{
wxString msg, FootprintName;
bool IsNew = FALSE;
wxString msg, FootprintName;
bool IsNew = FALSE;
FootprintName = m_FootprintList->GetSelectedFootprint();
FootprintName = m_FootprintList->GetSelectedFootprint();
if ( DrawFrame == NULL)
{
DrawFrame = new WinEDA_DisplayFrame(this, m_Parent, _("Module"),
wxPoint(0,0) , wxSize(600,400) );
IsNew = TRUE;
}
else DrawFrame->Maximize(FALSE);
if( DrawFrame == NULL )
{
DrawFrame = new WinEDA_DisplayFrame( this, m_Parent, _( "Module" ),
wxPoint( 0, 0 ), wxSize( 600, 400 ) );
DrawFrame->SetFocus(); /* Active entree clavier */
DrawFrame->Show(TRUE);
IsNew = TRUE;
}
else
DrawFrame->Maximize( FALSE );
if( ! FootprintName.IsEmpty() )
{
msg = _("Footprint: ") + FootprintName;
DrawFrame->SetTitle(msg);
STOREMOD * Module = GetModuleDescrByName(FootprintName);
msg = _("Lib: ");
if ( Module ) msg += Module->m_LibName;
else msg += wxT("???");
DrawFrame->SetStatusText(msg, 0);
if ( DrawFrame->m_Pcb->m_Modules )
{
DeleteStructure( DrawFrame->m_Pcb->m_Modules );
DrawFrame->m_Pcb->m_Modules = NULL;
}
DrawFrame->m_Pcb->m_Modules = DrawFrame->Get_Module(FootprintName);
DrawFrame->Zoom_Automatique(FALSE);
if ( DrawFrame->m_Draw3DFrame )
DrawFrame->m_Draw3DFrame->NewDisplay();
}
DrawFrame->SetFocus(); /* Active entree clavier */
DrawFrame->Show( TRUE );
else if ( !IsNew )
{
DrawFrame->ReDrawPanel();
if ( DrawFrame->m_Draw3DFrame )
DrawFrame->m_Draw3DFrame->NewDisplay();
}
if( !FootprintName.IsEmpty() )
{
msg = _( "Footprint: " ) + FootprintName;
DrawFrame->SetTitle( msg );
STOREMOD* Module = GetModuleDescrByName( FootprintName );
msg = _( "Lib: " );
if( Module )
msg += Module->m_LibName;
else
msg += wxT( "???" );
DrawFrame->SetStatusText( msg, 0 );
if( DrawFrame->m_Pcb->m_Modules )
{
// there is only one module in the list
DrawFrame->m_Pcb->m_Modules->DeleteStructure();
DrawFrame->m_Pcb->m_Modules = NULL;
}
DrawFrame->m_Pcb->m_Modules = DrawFrame->Get_Module( FootprintName );
DrawFrame->Zoom_Automatique( FALSE );
if( DrawFrame->m_Draw3DFrame )
DrawFrame->m_Draw3DFrame->NewDisplay();
}
else if( !IsNew )
{
DrawFrame->ReDrawPanel();
if( DrawFrame->m_Draw3DFrame )
DrawFrame->m_Draw3DFrame->NewDisplay();
}
}

View File

@ -1,6 +1,6 @@
/************************************************/
/* Routines de visualisation du module courant */
/************************************************/
/************************************************/
/* Routines de visualisation du module courant */
/************************************************/
#include "fctsys.h"
@ -17,160 +17,28 @@
/*******************************************************************/
void WinEDA_DisplayFrame::RedrawActiveWindow(wxDC * DC, bool EraseBg)
void WinEDA_DisplayFrame::RedrawActiveWindow( wxDC* DC, bool EraseBg )
/*******************************************************************/
/* Affiche le module courant */
{
if (! m_Pcb ) return;
MODULE * Module= m_Pcb->m_Modules;
if( !m_Pcb )
return;
ActiveScreen = (PCB_SCREEN *) GetScreen();
MODULE* Module = m_Pcb->m_Modules;
if ( EraseBg ) DrawPanel->EraseScreen(DC);
ActiveScreen = (PCB_SCREEN*) GetScreen();
DrawPanel->DrawBackGround(DC);
if( EraseBg )
DrawPanel->EraseScreen( DC );
if( Module )
{
Module->Draw(DrawPanel, DC, wxPoint(0,0), GR_COPY);
Module->Display_Infos(this);
}
DrawPanel->DrawBackGround( DC );
Affiche_Status_Box();
DrawPanel->Trace_Curseur(DC);
if( Module )
{
Module->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_COPY );
Module->Display_Infos( this );
}
Affiche_Status_Box();
DrawPanel->Trace_Curseur( DC );
}
/***********************************************/
void DeleteStructure( void * GenericStructure )
/***********************************************/
/* Supprime de la liste chainee la stucture pointee par GenericStructure
et libere la memoire correspondante
*/
{
EDA_BaseStruct * PtStruct, *PtNext, *PtBack;
int IsDeleted;
int typestruct;
wxString msg;
PtStruct = (EDA_BaseStruct *) GenericStructure;
if( PtStruct == NULL) return ;
typestruct = (int)PtStruct->Type();
IsDeleted = PtStruct->GetState(DELETED);
PtNext = PtStruct->Pnext;
PtBack = PtStruct->Pback;
switch( typestruct )
{
case TYPE_NOT_INIT:
DisplayError(NULL, wxT("DeleteStruct: Type Structure Non Initialise"));
break;
case PCB_EQUIPOT_STRUCT_TYPE:
#undef Struct
#define Struct ((EQUIPOT*)PtStruct)
Struct->UnLink();
delete Struct;
break;
case TYPEMODULE:
#undef Struct
#define Struct ((MODULE*)PtStruct)
Struct->UnLink();
delete Struct;
break;
case TYPEPAD:
#undef Struct
#define Struct ((D_PAD*)PtStruct)
Struct->UnLink();
delete Struct;
break;
case TYPECOTATION:
#undef Struct
#define Struct ((COTATION*)PtStruct)
Struct->UnLink();
delete Struct;
break;
case TYPEMIRE:
#undef Struct
#define Struct ((MIREPCB*)PtStruct)
Struct->UnLink();
delete Struct;
break;
case TYPEDRAWSEGMENT:
#undef Struct
#define Struct ((DRAWSEGMENT*)PtStruct)
Struct->UnLink();
delete Struct;
break;
case TYPETEXTE:
#undef Struct
#define Struct ((TEXTE_PCB*)PtStruct)
Struct->UnLink();
delete Struct;
break;
case TYPETEXTEMODULE:
#undef Struct
#define Struct ((TEXTE_MODULE*)PtStruct)
Struct->UnLink();
delete Struct;
break;
case TYPEEDGEMODULE:
#undef Struct
#define Struct ((EDGE_MODULE*)PtStruct)
Struct->UnLink();
delete Struct;
break;
case TYPETRACK:
#undef Struct
#define Struct ((TRACK*)PtStruct)
Struct->UnLink();
delete Struct;
break;
case TYPEVIA:
#undef Struct
#define Struct ((SEGVIA*)PtStruct)
Struct->UnLink();
delete Struct;
break;
case TYPEZONE:
#undef Struct
#define Struct ((SEGZONE*)PtStruct)
Struct->UnLink();
delete Struct;
break;
case TYPEMARQUEUR:
#undef Struct
#define Struct ((MARQUEUR*)PtStruct)
Struct->UnLink();
delete Struct;
break;
case TYPEPCB:
default:
msg.Printf( wxT(" DeleteStructure: Type %d Inattendu"),
PtStruct->Type());
DisplayError(NULL, msg);
break;
}
}

View File

@ -277,9 +277,10 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
{
NextS = pt_segm->Next();
if( IsSegmentInBox( GetScreen()->BlockLocate, pt_segm ) )
{ /* la piste est ici bonne a etre efface */
{
/* la piste est ici bonne a etre efface */
pt_segm->Draw( DrawPanel, DC, GR_XOR );
DeleteStructure( pt_segm );
pt_segm->DeleteStructure();
}
}
@ -288,9 +289,10 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
{
NextS = pt_segm->Next();
if( IsSegmentInBox( GetScreen()->BlockLocate, pt_segm ) )
{ /* la piste est ici bonne a etre efface */
{
/* la piste est ici bonne a etre efface */
pt_segm->Draw( DrawPanel, DC, GR_XOR );
DeleteStructure( pt_segm );
pt_segm->DeleteStructure();
}
}

View File

@ -36,21 +36,21 @@ bool WinEDA_GerberFrame::Clear_Pcb( wxDC* DC, bool query )
}
}
DeleteStructList( m_Pcb->m_Drawings );
m_Pcb->m_Drawings->DeleteStructList();
m_Pcb->m_Drawings = NULL;
DeleteStructList( m_Pcb->m_Track );
m_Pcb->m_Track->DeleteStructList();
m_Pcb->m_Track = NULL;
m_Pcb->m_NbSegmTrack = 0;
DeleteStructList( m_Pcb->m_Zone );
m_Pcb->m_Zone->DeleteStructList();
m_Pcb->m_Zone = NULL;
m_Pcb->m_NbSegmZone = 0;
for( ; g_UnDeleteStackPtr != 0; )
{
g_UnDeleteStackPtr--;
DeleteStructList( g_UnDeleteStack[ g_UnDeleteStackPtr] );
g_UnDeleteStack[ g_UnDeleteStackPtr]->DeleteStructList();
}
/* init pointeurs et variables */
@ -90,7 +90,7 @@ void WinEDA_GerberFrame::Erase_Zones( wxDC* DC, bool query )
if( m_Pcb->m_Zone )
{
DeleteStructList( m_Pcb->m_Zone );
m_Pcb->m_Zone->DeleteStructList( );
m_Pcb->m_Zone = NULL;
m_Pcb->m_NbSegmZone = 0;
}
@ -122,7 +122,7 @@ void WinEDA_GerberFrame::Erase_Segments_Pcb( wxDC* DC,
case TYPECOTATION:
case TYPEMIRE:
if( PtStruct->GetLayer() == layer || layer < 0 )
DeleteStructure( PtStruct );
PtStruct->DeleteStructure();
break;
default:
@ -158,7 +158,7 @@ void WinEDA_GerberFrame::Erase_Pistes( wxDC* DC, int masque_type,
PtNext = pt_segm->Next();
if( pt_segm->GetState( SEGM_FIXE | SEGM_AR ) & masque_type )
continue;
DeleteStructure( pt_segm );
pt_segm->DeleteStructure();
}
ScreenPcb->SetModify();
@ -180,7 +180,7 @@ void WinEDA_GerberFrame::Erase_Textes_Pcb( wxDC* DC, bool query )
{
PtNext = PtStruct->Next();
if( PtStruct->Type() == TYPETEXTE )
DeleteStructure( PtStruct );
PtStruct->DeleteStructure();
}
ScreenPcb->SetModify();
@ -206,7 +206,7 @@ void WinEDA_GerberFrame::Erase_Current_Layer( wxDC* DC, bool query )
PtNext = pt_segm->Next();
if( pt_segm->GetLayer() != layer )
continue;
DeleteStructure( pt_segm );
pt_segm->DeleteStructure();
}
ScreenPcb->SetModify();

View File

@ -41,7 +41,6 @@ OBJECTS= \
dcode.o\
undelete.o\
infospgm.o \
struct.o \
files.o\
block.o\
controle.o\
@ -173,8 +172,6 @@ ioascii.o: ioascii.cpp $(COMMON)
chrono.o: chrono.cpp pcbnew.h
struct.o: struct.cpp $(COMMON)
coordbox.o: coordbox.cpp $(COMMON)
mirepcb.o: mirepcb.cpp $(COMMON)

View File

@ -1,6 +1,6 @@
/****************************************/
/* traitement des textes sur empreintes */
/****************************************/
/****************************************/
/* traitement des textes sur empreintes */
/****************************************/
#include "fctsys.h"
@ -14,386 +14,414 @@
/* Fonctions externe: */
/* Routines Locales */
static void Move_Texte_Pcb(WinEDA_DrawPanel * panel, wxDC * DC, int flag) ;
static void Exit_Texte_Pcb(WinEDA_DrawFrame * frame, wxDC *DC) ;
static void Move_Texte_Pcb( WinEDA_DrawPanel* panel, wxDC* DC, int flag );
static void Exit_Texte_Pcb( WinEDA_DrawFrame* frame, wxDC* DC );
/* variables exportees */
int Angle_Rot_Fin = 50; /* Valeur par defaut de l'angle de rotation fine */
int Angle_Rot_Fin = 50;/* Valeur par defaut de l'angle de rotation fine */
/* Variables locales : */
static int LocalOrient;
static int LocalDimH;
static int LocalDimV;
static int LocalWidth;
static int LocalOrient;
static int LocalDimH;
static int LocalDimV;
static int LocalWidth;
static wxPoint old_pos; // position originelle du texte selecte
static wxPoint old_pos; // position originelle du texte selecte
/**************************************/
/* void Exit_Texte_Pcb(COMMAND * Cmd) */
/**************************************/
/**************************************/
/* void Exit_Texte_Pcb(COMMAND * Cmd) */
/**************************************/
/*
Routine de sortie du menu edit texte Pcb
Si un texte est selectionne, ses coord initiales sont regenerees
*/
void Exit_Texte_Pcb(WinEDA_DrawFrame * frame, wxDC * DC)
* Routine de sortie du menu edit texte Pcb
* Si un texte est selectionne, ses coord initiales sont regenerees
*/
void Exit_Texte_Pcb( WinEDA_DrawFrame* frame, wxDC* DC )
{
TEXTE_PCB * TextePcb;
TEXTE_PCB* TextePcb;
TextePcb = (TEXTE_PCB *) frame->CurrentScreen->m_CurrentPcbItem;
TextePcb = (TEXTE_PCB*) frame->CurrentScreen->m_CurrentPcbItem;
if ( TextePcb )
{
Trace_1_texte_pcb(frame->DrawPanel, DC, TextePcb, 0, 0, GR_XOR) ;
TextePcb->m_Pos = old_pos;
Trace_1_texte_pcb(frame->DrawPanel, DC, TextePcb, 0, 0, GR_OR) ;
}
if( TextePcb )
{
Trace_1_texte_pcb( frame->DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
TextePcb->m_Pos = old_pos;
Trace_1_texte_pcb( frame->DrawPanel, DC, TextePcb, 0, 0, GR_OR );
}
frame->CurrentScreen->ManageCurseur = NULL;
frame->CurrentScreen->ForceCloseManageCurseur = NULL;
frame->CurrentScreen->m_CurrentPcbItem = NULL;
frame->CurrentScreen->ManageCurseur = NULL;
frame->CurrentScreen->ForceCloseManageCurseur = NULL;
frame->CurrentScreen->m_CurrentPcbItem = NULL;
}
/******************************************/
/* void Place_Texte_Pcb(MTOOL_EDA * Menu) */
/******************************************/
/******************************************/
/* void Place_Texte_Pcb(MTOOL_EDA * Menu) */
/******************************************/
/* Routine de placement du texte en cours de deplacement
*/
void WinEDA_PcbFrame::Place_Texte_Pcb(TEXTE_PCB * TextePcb, wxDC * DC)
*/
void WinEDA_PcbFrame::Place_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC )
{
if( TextePcb == NULL )
return;
if( TextePcb == NULL ) return;
Trace_1_texte_pcb(DrawPanel, DC, TextePcb,0, 0, GR_XOR) ;
TextePcb->m_Layer = CurrentScreen->m_Active_Layer;
Trace_1_texte_pcb(DrawPanel, DC, TextePcb,0, 0, GR_OR) ;
CurrentScreen->ManageCurseur = NULL;
CurrentScreen->ForceCloseManageCurseur = NULL;
CurrentScreen->m_CurrentPcbItem = NULL;
CurrentScreen->SetModify();
Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
TextePcb->m_Layer = CurrentScreen->m_Active_Layer;
Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_OR );
CurrentScreen->ManageCurseur = NULL;
CurrentScreen->ForceCloseManageCurseur = NULL;
CurrentScreen->m_CurrentPcbItem = NULL;
CurrentScreen->SetModify();
}
/*****************************************/
/* void StartMoveTextePcb(COMMAND * Cmd) */
/*****************************************/
/*****************************************/
/* void StartMoveTextePcb(COMMAND * Cmd) */
/*****************************************/
/* Routine de preparation du deplacement d'un texte
*/
*/
void WinEDA_PcbFrame::StartMoveTextePcb(TEXTE_PCB * TextePcb, wxDC * DC)
void WinEDA_PcbFrame::StartMoveTextePcb( TEXTE_PCB* TextePcb, wxDC* DC )
{
if( TextePcb == NULL ) return;
if( TextePcb == NULL )
return;
old_pos = TextePcb->m_Pos;
Affiche_Infos_PCB_Texte(this, TextePcb);
CurrentScreen->ManageCurseur = Move_Texte_Pcb;
CurrentScreen->ForceCloseManageCurseur = Exit_Texte_Pcb;
CurrentScreen->m_CurrentPcbItem = TextePcb;
old_pos = TextePcb->m_Pos;
Affiche_Infos_PCB_Texte( this, TextePcb );
CurrentScreen->ManageCurseur = Move_Texte_Pcb;
CurrentScreen->ForceCloseManageCurseur = Exit_Texte_Pcb;
CurrentScreen->m_CurrentPcbItem = TextePcb;
}
/*****************************/
/* void Move_Texte_Pcb() */
/*****************************/
/*****************************/
/* void Move_Texte_Pcb() */
/*****************************/
/* Routine deplacant le texte PCB suivant le curseur de la souris */
static void Move_Texte_Pcb(WinEDA_DrawPanel * panel, wxDC *DC, int flag )
static void Move_Texte_Pcb( WinEDA_DrawPanel* panel, wxDC* DC, int flag )
{
TEXTE_PCB * TextePcb = (TEXTE_PCB *)
panel->m_Parent->CurrentScreen->m_CurrentPcbItem;
TEXTE_PCB* TextePcb = (TEXTE_PCB*)
panel->m_Parent->CurrentScreen->m_CurrentPcbItem;
if (TextePcb == NULL ) return ;
if( TextePcb == NULL )
return;
/* effacement du texte : */
if ( flag == CURSEUR_MOVED)
Trace_1_texte_pcb(panel, DC, TextePcb,0, 0, GR_XOR) ;
/* effacement du texte : */
TextePcb->m_Pos = panel->m_Parent->CurrentScreen->m_Curseur;
TextePcb->m_Layer = panel->m_Parent->CurrentScreen->m_Active_Layer;
if( flag == CURSEUR_MOVED )
Trace_1_texte_pcb( panel, DC, TextePcb, 0, 0, GR_XOR );
/* Redessin du Texte */
Trace_1_texte_pcb(panel, DC, TextePcb,0, 0, GR_XOR) ;
}
TextePcb->m_Pos = panel->m_Parent->CurrentScreen->m_Curseur;
TextePcb->m_Layer = panel->m_Parent->CurrentScreen->m_Active_Layer;
/********************************/
/* void Delete_Texte_Pcb(COMMAND * Cmd) */
/********************************/
void WinEDA_PcbFrame::Delete_Texte_Pcb(TEXTE_PCB * TextePcb, wxDC * DC)
{
if( TextePcb == NULL ) return;
Trace_1_texte_pcb(DrawPanel, DC, TextePcb,0, 0, GR_XOR);
/* Suppression du texte en Memoire*/
DeleteStructure(TextePcb);
CurrentScreen->ManageCurseur = NULL;
CurrentScreen->ForceCloseManageCurseur = NULL;
CurrentScreen->m_CurrentPcbItem = NULL;
/* Redessin du Texte */
Trace_1_texte_pcb( panel, DC, TextePcb, 0, 0, GR_XOR );
}
/****************************/
/* void Add_Texte_Pcb(COMMAND * Cmd) */
/****************************/
/********************************/
/* void Delete_Texte_Pcb(COMMAND * Cmd) */
/********************************/
TEXTE_PCB * WinEDA_PcbFrame::Create_Texte_Pcb( wxDC * DC)
void WinEDA_PcbFrame::Delete_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC )
{
char buf_new_texte[256];
TEXTE_PCB * TextePcb;
if( TextePcb == NULL )
return;
buf_new_texte[0]= 0 ;
Get_Message("Texte:",buf_new_texte, this);
if(*buf_new_texte <=' ') return NULL;
Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
CurrentScreen->SetModify();
/* placement du texte en memoire */
TextePcb = new TEXTE_PCB(pt_pcb);
/* Chainage de la nouvelle structure en debut de liste */
TextePcb->Pnext = pt_pcb->m_Drawings;
TextePcb->Pback = (EDA_BaseStruct * )pt_pcb;
if( pt_pcb->m_Drawings) pt_pcb->m_Drawings->Pback = (EDA_BaseStruct*) TextePcb;
pt_pcb->m_Drawings = (EDA_BaseStruct*) TextePcb;
/* Mise a jour des caracteristiques */
TextePcb->m_Layer = CurrentScreen->m_Active_Layer;
TextePcb->m_Miroir = 1;
if(CurrentScreen->m_Active_Layer == CUIVRE_N) TextePcb->m_Miroir = 0;
TextePcb->m_Size.y = Texte_Pcb_DimV ;
TextePcb->m_Size.x = Texte_Pcb_DimH ;
TextePcb->m_Pos = CurrentScreen->m_Curseur;
TextePcb->m_Width = Texte_Segment_Largeur;
TextePcb->m_Layer = CurrentScreen->m_Active_Layer;
/* Copie du texte */
TextePcb->SetText(buf_new_texte);
/* Dessin du Texte */
Trace_1_texte_pcb(DrawPanel, DC, TextePcb,0, 0, GR_XOR) ;
Affiche_Infos_PCB_Texte(this, TextePcb);
StartMoveTextePcb(TextePcb, DC);
return TextePcb;
/* Suppression du texte en Memoire*/
TextePcb->DeleteStructure();
CurrentScreen->ManageCurseur = NULL;
CurrentScreen->ForceCloseManageCurseur = NULL;
CurrentScreen->m_CurrentPcbItem = NULL;
}
/*******************************/
/* void Rotate_Texte_Pcb(COMMAND * Cmd) */
/*******************************/
void WinEDA_PcbFrame::Rotate_Texte_Pcb(TEXTE_PCB * TextePcb, wxDC * DC)
/****************************/
/* void Add_Texte_Pcb(COMMAND * Cmd) */
/****************************/
TEXTE_PCB* WinEDA_PcbFrame::Create_Texte_Pcb( wxDC* DC )
{
int angle = 900;
int drawmode = GR_XOR;
char buf_new_texte[256];
TEXTE_PCB* TextePcb;
if( TextePcb == NULL ) return;
buf_new_texte[0] = 0;
Get_Message( "Texte:", buf_new_texte, this );
if( *buf_new_texte <=' ' )
return NULL;
/* effacement du texte : */
Trace_1_texte_pcb(DrawPanel, DC, TextePcb,0, 0, GR_XOR) ;
CurrentScreen->SetModify();
/* placement du texte en memoire */
TextePcb = new TEXTE_PCB( pt_pcb );
/* Chainage de la nouvelle structure en debut de liste */
TextePcb->Pnext = pt_pcb->m_Drawings;
TextePcb->Pback = (EDA_BaseStruct*) pt_pcb;
if( pt_pcb->m_Drawings )
pt_pcb->m_Drawings->Pback = (EDA_BaseStruct*) TextePcb;
pt_pcb->m_Drawings = (EDA_BaseStruct*) TextePcb;
TextePcb->m_Orient += angle;
if(TextePcb->m_Orient >= 3600) TextePcb->m_Orient -= 3600 ;
if(TextePcb->m_Orient < 0) TextePcb->m_Orient += 3600 ;
/* Mise a jour des caracteristiques */
TextePcb->m_Layer = CurrentScreen->m_Active_Layer;
TextePcb->m_Miroir = 1;
if( CurrentScreen->m_Active_Layer == CUIVRE_N )
TextePcb->m_Miroir = 0;
/* Redessin du Texte */
Trace_1_texte_pcb(DrawPanel, DC, TextePcb, 0, 0, drawmode);
Affiche_Infos_PCB_Texte(this, TextePcb);
TextePcb->m_Size.y = Texte_Pcb_DimV;
TextePcb->m_Size.x = Texte_Pcb_DimH;
TextePcb->m_Pos = CurrentScreen->m_Curseur;
TextePcb->m_Width = Texte_Segment_Largeur;
TextePcb->m_Layer = CurrentScreen->m_Active_Layer;
CurrentScreen->SetModify();
/* Copie du texte */
TextePcb->SetText( buf_new_texte );
/* Dessin du Texte */
Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
Affiche_Infos_PCB_Texte( this, TextePcb );
StartMoveTextePcb( TextePcb, DC );
return TextePcb;
}
/***************************************************************/
/* void Trace_1_texte(char * ptr,int ox,int oy),int mode_color */
/***************************************************************/
/*******************************/
/* void Rotate_Texte_Pcb(COMMAND * Cmd) */
/*******************************/
void WinEDA_PcbFrame::Rotate_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC )
{
int angle = 900;
int drawmode = GR_XOR;
if( TextePcb == NULL )
return;
/* effacement du texte : */
Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
TextePcb->m_Orient += angle;
if( TextePcb->m_Orient >= 3600 )
TextePcb->m_Orient -= 3600;
if( TextePcb->m_Orient < 0 )
TextePcb->m_Orient += 3600;
/* Redessin du Texte */
Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, drawmode );
Affiche_Infos_PCB_Texte( this, TextePcb );
CurrentScreen->SetModify();
}
/***************************************************************/
/* void Trace_1_texte(char * ptr,int ox,int oy),int mode_color */
/***************************************************************/
/*
Trace de 1 texte :
ptr = pointeur sur le debut de la description du texte
ox, oy = Offsets de trace
mode_color = GR_OR, GR_XOR..
*/
* Trace de 1 texte :
* ptr = pointeur sur le debut de la description du texte
* ox, oy = Offsets de trace
* mode_color = GR_OR, GR_XOR..
*/
void Trace_1_texte_pcb(WinEDA_DrawPanel * panel, wxDC * DC,
TEXTE_PCB * pt_texte,int ox,int oy, int DrawMode)
void Trace_1_texte_pcb( WinEDA_DrawPanel* panel, wxDC* DC,
TEXTE_PCB* pt_texte, int ox, int oy, int DrawMode )
{
int zoom = panel->m_Parent->CurrentScreen->GetZoom();
int cX, cY;
int screen_epais, gcolor ;
int size_h , size_v , width ;
char *ptr;
int orient;
int zoom = panel->m_Parent->CurrentScreen->GetZoom();
int cX, cY;
int screen_epais, gcolor;
int size_h, size_v, width;
char* ptr;
int orient;
if( pt_texte->GetText() == NULL ) return;
if( pt_texte->GetText() == NULL )
return;
/* lecture des caracteristiques du texte */
size_h = pt_texte->m_Size.x; size_v = pt_texte->m_Size.y ;
orient = pt_texte->m_Orient;
width = pt_texte->m_Width;
screen_epais = width / zoom;
/* lecture des caracteristiques du texte */
size_h = pt_texte->m_Size.x; size_v = pt_texte->m_Size.y;
orient = pt_texte->m_Orient;
width = pt_texte->m_Width;
screen_epais = width / zoom;
if( (DisplayOpt.DisplayDrawItems == FILAIRE) || ( screen_epais < L_MIN_DESSIN) )
width = 0;
if( (DisplayOpt.DisplayDrawItems == FILAIRE) || ( screen_epais < L_MIN_DESSIN) )
width = 0;
/* calcul de la position du texte */
cX = pt_texte->m_Pos.x - ox;
cY = pt_texte->m_Pos.y - oy;
/* calcul de la position du texte */
cX = pt_texte->m_Pos.x - ox;
cY = pt_texte->m_Pos.y - oy;
if ( pt_texte->m_Miroir == 0 ) size_h = -size_h;
if( pt_texte->m_Miroir == 0 )
size_h = -size_h;
/* choix de la couleur du texte : */
gcolor = color_layer[pt_texte->m_Layer];
/* choix de la couleur du texte : */
gcolor = color_layer[pt_texte->m_Layer];
ptr = pt_texte->GetText(); /* ptr pointe 1er caractere du texte */
ptr = pt_texte->GetText(); /* ptr pointe 1er caractere du texte */
GRSetDrawMode(DC, DrawMode);
/* trace ancre du texte */
if((E_ancre_color&ITEM_NON_VISIBLE) == 0 )
{
GRLine(panel, DC, cX - (2*zoom), cY,
cX + (2*zoom), cY, E_ancre_color);
GRLine(panel, DC, cX, cY - (2*zoom) ,
cX, cY + (2*zoom) , E_ancre_color);
}
GRSetDrawMode( DC, DrawMode );
/* trace ancre du texte */
if( (E_ancre_color & ITEM_NON_VISIBLE) == 0 )
{
GRLine( panel, DC, cX - (2 * zoom), cY,
cX + (2 * zoom), cY, E_ancre_color );
GRLine( panel, DC, cX, cY - (2 * zoom),
cX, cY + (2 * zoom), E_ancre_color );
}
/* trace du texte */
Display_1_Texte(panel, DC, ptr, strlen(ptr), cX, cY,
size_h, size_v, width, orient, gcolor);
/* trace du texte */
Display_1_Texte( panel, DC, ptr, strlen( ptr ), cX, cY,
size_h, size_v, width, orient, gcolor );
}
/*********************************************/
/* void InstallEditCaractMenu(COMMAND * Cmd) */
/*********************************************/
static void InstallEditCaractMenu(COMMAND * Cmd)
/*********************************************/
/* void InstallEditCaractMenu(COMMAND * Cmd) */
/*********************************************/
static void InstallEditCaractMenu( COMMAND* Cmd )
{
#if 0
TEXTE_PCB * TextePcb = PtTextePcbSelecte;
wxDC * DC = Cmd->DC;
TEXTE_PCB* TextePcb = PtTextePcbSelecte;
wxDC* DC = Cmd->DC;
if( TextePcb == NULL )
{
TextePcb = (TEXTE_PCB*)pt_pcb->Drawings;
while( (TextePcb = Locate_Texte_Pcb(TextePcb,CURSEUR_OFF_GRILLE)) != 0 )
{
if( TextePcb->Layer == CurrentScreen->Active_Layer ) break;
// le Texte n'est pas sur la couche active
TextePcb = (TEXTE_PCB*) TextePcb->Pnext;
}
}
if( TextePcb == NULL )
{
TextePcb = (TEXTE_PCB*) pt_pcb->Drawings;
while( ( TextePcb = Locate_Texte_Pcb( TextePcb, CURSEUR_OFF_GRILLE ) ) != 0 )
{
if( TextePcb->Layer == CurrentScreen->Active_Layer )
break;
TextePcbEdite = TextePcb;
// le Texte n'est pas sur la couche active
TextePcb = (TEXTE_PCB*) TextePcb->Pnext;
}
}
if( TextePcb == NULL )
{
DisplayError("Texte non trouve sur cette couche",10);
Cmd->Menu->State = WAIT; DisplayMenu(DC, Cmd->Menu, NULL, ON);
return;
}
TextePcbEdite = TextePcb;
Affiche_Infos_PCB_Texte(Cmd, TextePcb);
if( TextePcb == NULL )
{
DisplayError( "Texte non trouve sur cette couche", 10 );
Cmd->Menu->State = WAIT; DisplayMenu( DC, Cmd->Menu, NULL, ON );
return;
}
if(TextePcb->orient >= 3600) TextePcb->orient -= 3600 ;
if(TextePcb->orient < 0) TextePcb->orient += 3600 ;
Affiche_Infos_PCB_Texte( Cmd, TextePcb );
/* Init des variables */
strncpy(BufNameTxt.s, TextePcb->GetText(), sizeof(BufNameTxt.s) - 1);
if( TextePcb->miroir ) Texte_Pcb_Miroir_Item.State = WAIT;
else Texte_Pcb_Miroir_Item.State = RUN;
if( TextePcb->orient >= 3600 )
TextePcb->orient -= 3600;
if( TextePcb->orient < 0 )
TextePcb->orient += 3600;
* (int*) Param_OrientText.param = TextePcb->orient;
* (int*) Param_DimHText.param = TextePcb->Size.x;
* (int*) Param_DimVText.param = TextePcb->Size.y;
* (int*) Param_EpaisText.param = TextePcb->width;
/* Init des variables */
strncpy( BufNameTxt.s, TextePcb->GetText(), sizeof(BufNameTxt.s) - 1 );
if( TextePcb->miroir )
Texte_Pcb_Miroir_Item.State = WAIT;
else
Texte_Pcb_Miroir_Item.State = RUN;
InstallNewList(Cmd);
*(int*) Param_OrientText.param = TextePcb->orient;
*(int*) Param_DimHText.param = TextePcb->Size.x;
*(int*) Param_DimVText.param = TextePcb->Size.y;
*(int*) Param_EpaisText.param = TextePcb->width;
InstallNewList( Cmd );
#endif
}
/*****************************************/
/* void ChangeCaractTexte(COMMAND * Cmd) */
/*****************************************/
/*****************************************/
/* void ChangeCaractTexte(COMMAND * Cmd) */
/*****************************************/
/* Change les caracteristiques du texte en cours d'edition
*/
void WinEDA_PcbFrame::EditTextePcb(TEXTE_PCB * TextePcb, wxDC * DC)
*/
void WinEDA_PcbFrame::EditTextePcb( TEXTE_PCB* TextePcb, wxDC* DC )
{
int drawmode = GR_OR;
char buf_new_texte[1024];
int drawmode = GR_OR;
char buf_new_texte[1024];
if( TextePcb == NULL) return;
if( TextePcb == NULL )
return;
if( PtTextePcbSelecte ) drawmode = GR_XOR;
if( PtTextePcbSelecte )
drawmode = GR_XOR;
buf_new_texte[0]= 0 ;
Get_Message("Texte:",buf_new_texte, this);
if(*buf_new_texte <=' ') return;
buf_new_texte[0] = 0;
Get_Message( "Texte:", buf_new_texte, this );
if( *buf_new_texte <=' ' )
return;
/* effacement du texte : */
Trace_1_texte_pcb(DrawPanel, DC, TextePcb, 0, 0, GR_XOR) ;
/* effacement du texte : */
Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, GR_XOR );
if( strcmp( TextePcb->GetText(), buf_new_texte) && strlen(buf_new_texte) )
{
TextePcb->SetText(buf_new_texte);
CurrentScreen->SetModify();
}
if( strcmp( TextePcb->GetText(), buf_new_texte ) && strlen( buf_new_texte ) )
{
TextePcb->SetText( buf_new_texte );
CurrentScreen->SetModify();
}
while(LocalOrient >= 3600) LocalOrient -= 3600 ;
while(LocalOrient < 0) LocalOrient += 3600 ;
while( LocalOrient >= 3600 )
LocalOrient -= 3600;
if( CurrentScreen->m_Active_Layer != TextePcb->m_Layer )
{
TextePcb->m_Layer = CurrentScreen->m_Active_Layer;
CurrentScreen->SetModify();
}
while( LocalOrient < 0 )
LocalOrient += 3600;
if( LocalOrient != TextePcb->m_Orient )
{
TextePcb->m_Orient = LocalOrient;
CurrentScreen->SetModify();
}
if( CurrentScreen->m_Active_Layer != TextePcb->m_Layer )
{
TextePcb->m_Layer = CurrentScreen->m_Active_Layer;
CurrentScreen->SetModify();
}
if( LocalDimV != TextePcb->m_Size.y )
{
TextePcb->m_Size.y = LocalDimV;
CurrentScreen->SetModify();
}
if( LocalDimH != TextePcb->m_Size.x )
{
TextePcb->m_Size.x = LocalDimH;
CurrentScreen->SetModify();
}
if( LocalOrient != TextePcb->m_Orient )
{
TextePcb->m_Orient = LocalOrient;
CurrentScreen->SetModify();
}
if( LocalWidth != TextePcb->m_Width )
{
TextePcb->m_Width = LocalWidth;
CurrentScreen->SetModify();
}
if( LocalDimV != TextePcb->m_Size.y )
{
TextePcb->m_Size.y = LocalDimV;
CurrentScreen->SetModify();
}
if( LocalDimH != TextePcb->m_Size.x )
{
TextePcb->m_Size.x = LocalDimH;
CurrentScreen->SetModify();
}
if( LocalWidth != TextePcb->m_Width )
{
TextePcb->m_Width = LocalWidth;
CurrentScreen->SetModify();
}
/* if( (Texte_Pcb_Miroir_Item.State == WAIT) && (TextePcb->miroir == 0) )
{
TextePcb->miroir = 1;
CurrentScreen->SetModify();
}
* {
* TextePcb->miroir = 1;
* CurrentScreen->SetModify();
* }
*
* if( (Texte_Pcb_Miroir_Item.State == RUN) && TextePcb->miroir )
* {
* TextePcb->miroir = 0;
* CurrentScreen->SetModify();
* }
*/
if( (Texte_Pcb_Miroir_Item.State == RUN) && TextePcb->miroir )
{
TextePcb->miroir = 0;
CurrentScreen->SetModify();
}
*/
/* Redessin du Texte */
Trace_1_texte_pcb( DrawPanel, DC, TextePcb, 0, 0, drawmode );
/* Redessin du Texte */
Trace_1_texte_pcb(DrawPanel, DC, TextePcb, 0, 0, drawmode);
Affiche_Infos_PCB_Texte(this, TextePcb);
Affiche_Infos_PCB_Texte( this, TextePcb );
}

View File

@ -126,12 +126,6 @@ void Trace_1_texte_pcb(WinEDA_DrawPanel * panel, wxDC * DC,
void Affiche_DCodes_Pistes(WinEDA_DrawPanel * panel, wxDC * DC,
BOARD * Pcb, int drawmode);
/**************/
/* struct.cpp */
/**************/
void DeleteStructure(EDA_BaseStruct * Struct);
void DeleteStructList( EDA_BaseStruct * Struct);
/*************/
/* dcode.cpp */
/*************/

View File

@ -10,6 +10,8 @@
/* Variables locales */
#if 0
/***************************************************/
void DeleteStructure( EDA_BaseStruct * PtStruct )
/***************************************************/
@ -91,3 +93,5 @@ EDA_BaseStruct *PtNext;
}
}
#endif

View File

@ -75,7 +75,7 @@ BOARD_ITEM* SaveItemEfface( BOARD_ITEM* PtItem, int nbitems )
if( g_UnDeleteStackPtr >= UNDELETE_STACK_SIZE )
{
/* Delete last deleted item, and shift stack. */
DeleteStructure( g_UnDeleteStack[0] );
g_UnDeleteStack[0]->DeleteStructure();
for( ii = 0; ii < (g_UnDeleteStackPtr - 1); ii++ )
{
g_UnDeleteStack[ii] = g_UnDeleteStack[ii + 1];

View File

@ -185,7 +185,10 @@ public:
KICAD_T Type() const { return m_StructType; }
EDA_BaseStruct* Next() const { return Pnext; }
EDA_BaseStruct* Next() const { return (EDA_BaseStruct*) Pnext; }
EDA_BaseStruct* Back() const { return (EDA_BaseStruct*) Pback; }
EDA_BaseStruct* GetParent() const { return (EDA_BaseStruct*) m_Parent; }
/* Gestion de l'etat (status) de la structure (active, deleted..) */
int GetState( int type );
@ -284,6 +287,14 @@ public:
}
/**
* Function DeleteStructList
* deletes each item in a linked list of EDA_BaseStructs, starting with
* "this" object.
*/
void DeleteStructList();
#if defined(DEBUG)
/**
@ -403,7 +414,6 @@ public:
BOARD_ITEM* Next() const { return (BOARD_ITEM*) Pnext; }
BOARD_ITEM* Back() const { return (BOARD_ITEM*) Pback; }
BOARD_ITEM* GetParent() const { return (BOARD_ITEM*) m_Parent; }
/**
@ -443,6 +453,24 @@ public:
return false; // only MODULEs can be locked at this time.
}
/**
* Function UnLink
* detaches this object from its owner.
*/
virtual void UnLink() = 0;
/**
* Function DeleteStructure
* deletes this object after UnLink()ing it from its owner.
*/
void DeleteStructure()
{
UnLink();
delete this;
}
/**
* Function MenuText

View File

@ -465,7 +465,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
/* le module est ici bon a etre efface */
module->m_Flags = 0;
module->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_XOR );
DeleteStructure( module );
module->DeleteStructure();
m_Pcb->m_Status_Pcb = 0;
}
}
@ -483,7 +483,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
{
/* la piste est ici bonne a etre efface */
pt_segm->Draw( DrawPanel, DC, GR_XOR );
DeleteStructure( pt_segm );
pt_segm->DeleteStructure();
}
}
}
@ -512,7 +512,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
break;
/* l'element est ici bon a etre efface */
Trace_DrawSegmentPcb( DrawPanel, DC, (DRAWSEGMENT*) PtStruct, GR_XOR );
DeleteStructure( PtStruct );
PtStruct->DeleteStructure();
break;
case TYPETEXTE:
@ -523,7 +523,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
/* le texte est ici bon a etre efface */
( (TEXTE_PCB*) PtStruct )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_XOR );
/* Suppression du texte en Memoire*/
DeleteStructure( PtStruct );
PtStruct->DeleteStructure();
break;
case TYPEMIRE:
@ -535,7 +535,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
break;
/* l'element est ici bon a etre efface */
( (MIREPCB*) PtStruct )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_XOR );
DeleteStructure( PtStruct );
PtStruct->DeleteStructure();
break;
case TYPECOTATION:
@ -547,7 +547,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
break;
/* l'element est ici bon a etre efface */
( (COTATION*) PtStruct )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_XOR );
DeleteStructure( PtStruct );
PtStruct->DeleteStructure();
break;
default:
@ -565,9 +565,10 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
{
NextS = pt_segm->Next();
if( IsSegmentInBox( GetScreen()->BlockLocate, pt_segm ) )
{ /* la piste est ici bonne a etre efface */
{
/* la piste est ici bonne a etre efface */
pt_segm->Draw( DrawPanel, DC, GR_XOR );
DeleteStructure( pt_segm );
PtStruct->DeleteStructure();
}
}
}

View File

@ -533,7 +533,7 @@ void DeleteMarkedItems( MODULE* module )
next_pad = pad->Next();
if( pad->m_Selected == 0 )
continue;
DeleteStructure( pad );
pad->DeleteStructure();
}
item = module->m_Drawings;
@ -542,7 +542,7 @@ void DeleteMarkedItems( MODULE* module )
next_item = item->Next();
if( item->m_Selected == 0 )
continue;
DeleteStructure( item );
item->DeleteStructure();
}
}

View File

@ -48,6 +48,32 @@ BOARD::BOARD( EDA_BaseStruct* parent, WinEDA_BasePcbFrame* frame ) :
/***************/
BOARD::~BOARD()
{
m_Drawings->DeleteStructList();
m_Drawings = 0;
m_Modules->DeleteStructList();
m_Modules = 0;
m_Equipots->DeleteStructList();
m_Equipots = 0;
m_Track->DeleteStructList();
m_Track = 0;
m_Zone->DeleteStructList();
m_Zone = 0;
m_CurrentLimitZone->DeleteStructList();
m_CurrentLimitZone = 0;
MyFree( m_Pads );
m_Pads = 0;
MyFree( m_Ratsnest );
m_Ratsnest = 0;
MyFree( m_LocalRatsnest );
m_LocalRatsnest = 0;
}

View File

@ -279,3 +279,4 @@ const char** BOARD_ITEM::MenuIcon() const
return (const char**) xpm;
}

View File

@ -300,7 +300,7 @@ static void suppression_piste_non_connectee( WinEDA_PcbFrame* frame, wxDC* DC )
/* Suppression du segment */
PtSegm->Draw( frame->DrawPanel, DC, GR_XOR );
DeleteStructure( PtSegm );
PtSegm->DeleteStructure();
if( NextS == NULL )
break;
}
@ -340,7 +340,7 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC )
/* Lenght segment = 0; delete it */
PtSegm->Draw( frame->DrawPanel, DC, GR_XOR );
DeleteStructure( PtSegm );
PtSegm->DeleteStructure();
nbpoints_supprimes++;
msg.Printf( wxT( " %d" ), nbpoints_supprimes );
@ -402,7 +402,7 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC )
{
ii--;
pt_aux->Draw( frame->DrawPanel, DC, GR_OR );
DeleteStructure( pt_aux );
pt_aux->DeleteStructure();
nbpoints_supprimes++;
msg.Printf( wxT( " %d" ), nbpoints_supprimes );
@ -482,7 +482,7 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC )
if( pt_segm_delete )
{
nbpoints_supprimes++; no_inc = 1;
DeleteStructure( pt_segm_delete );
pt_segm_delete->DeleteStructure();
}
}
@ -519,7 +519,7 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC )
if( pt_segm_delete )
{
nbpoints_supprimes++; no_inc = 1;
DeleteStructure( pt_segm_delete );
pt_segm_delete->DeleteStructure();
}
}

View File

@ -128,7 +128,7 @@ wxDC * DC = Cmd->DC;
for ( ; ii > 0; ii --, pt_track = NextS)
{
NextS = (TRACK*) pt_track->Pnext;
DeleteStructure(pt_track);
pt_track->DeleteStructure();
}
test_1_net_connexion(DC, old_net_code );
}

Some files were not shown because too many files have changed in this diff Show More