Commit 5289c220 authored by Wayne Stambaugh's avatar Wayne Stambaugh

Pcbnew object improvements.

* Remove unnecessary copy constructors from board and module library
  objects.
* Add doClone() method to board and library objects.
* Add comment to class definitions where the default copy constructor
  generated by the compiler was adequate.
* Replace copy method with clone method where applicable.
* Remove DuplicateStruct() function.
* Remove track object copy function.
parent 742486dc
......@@ -68,7 +68,9 @@ EDA_ITEM::EDA_ITEM( const EDA_ITEM& base )
m_Parent = base.m_Parent;
m_Son = base.m_Son;
m_Flags = base.m_Flags;
SetTimeStamp( base.m_TimeStamp );
// A copy of an item cannot have the same time stamp as the original item.
SetTimeStamp( GetNewTimeStamp() );
m_Status = base.m_Status;
}
......@@ -214,13 +216,11 @@ bool EDA_ITEM::operator<( const EDA_ITEM& aItem ) const
EDA_ITEM& EDA_ITEM::operator=( const EDA_ITEM& aItem )
{
wxCHECK_MSG( Type() == aItem.Type(), *this,
wxT( "Cannot assign object type " ) + aItem.GetClass() + wxT( " to type " ) +
GetClass() );
if( &aItem != this )
{
// Do not assign the linked list pointers.
m_StructType = aItem.Type();
Pnext = aItem.Pnext;
Pback = aItem.Pback;
m_StructType = aItem.m_StructType;
m_Parent = aItem.m_Parent;
m_Son = aItem.m_Son;
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_board_item.h
* @brief Classes BOARD_ITEM and BOARD_CONNECTED_ITEM.
......@@ -59,12 +83,7 @@ public:
{
}
BOARD_ITEM( const BOARD_ITEM& src ) :
EDA_ITEM( src.m_Parent, src.Type() )
, m_Layer( src.m_Layer )
{
m_Flags = src.m_Flags;
}
// Do not create a copy constructor. The one generated by the compiler is adequate.
/**
* A value of wxPoint(0,0) which can be passed to the Draw() functions.
......
......@@ -44,7 +44,6 @@
#include "class_board.h"
#include "class_module.h"
extern BOARD_ITEM* DuplicateStruct( BOARD_ITEM* aItem );
typedef enum {
FIXE_MODULE,
......@@ -265,7 +264,7 @@ void PCB_EDIT_FRAME::AutoMoveModulesOnPcb( bool PlaceModulesHorsPcb )
}
// Undo: add copy of old Module to undo
picker.m_Link = DuplicateStruct( Module );
picker.m_Link = Module->Clone();
picker.m_PickedItemType = Module->Type();
if( current.x > (Xsize_allowed + start.x) )
......
......@@ -843,86 +843,13 @@ void PCB_EDIT_FRAME::Block_Duplicate()
for( unsigned ii = 0; ii < itemsList->GetCount(); ii++ )
{
BOARD_ITEM* item = (BOARD_ITEM*) itemsList->GetPickedItem( ii );
newitem = NULL;
switch( item->Type() )
{
case PCB_MODULE_T:
{
MODULE* module = (MODULE*) item;
MODULE* new_module;
m_Pcb->m_Status_Pcb = 0;
module->ClearFlags();
newitem = new_module = new MODULE( m_Pcb );
new_module->Copy( module );
new_module->SetTimeStamp( GetNewTimeStamp() );
m_Pcb->m_Modules.PushFront( new_module );
}
break;
case PCB_TRACE_T:
case PCB_VIA_T:
{
TRACK* track = (TRACK*) item;
m_Pcb->m_Status_Pcb = 0;
TRACK* new_track = track->Copy();
newitem = new_track;
m_Pcb->m_Track.PushFront( new_track );
}
break;
case PCB_ZONE_T: // SEG_ZONE items are now deprecated
break;
case PCB_ZONE_AREA_T:
{
ZONE_CONTAINER* new_zone = new ZONE_CONTAINER( (BOARD*) item->GetParent() );
new_zone->Copy( (ZONE_CONTAINER*) item );
new_zone->SetTimeStamp( GetNewTimeStamp() );
newitem = new_zone;
m_Pcb->Add( new_zone );
}
break;
case PCB_LINE_T:
{
DRAWSEGMENT* new_drawsegment = new DRAWSEGMENT( m_Pcb );
new_drawsegment->Copy( (DRAWSEGMENT*) item );
m_Pcb->Add( new_drawsegment );
newitem = new_drawsegment;
}
break;
case PCB_TEXT_T:
{
TEXTE_PCB* new_pcbtext = new TEXTE_PCB( m_Pcb );
new_pcbtext->Copy( (TEXTE_PCB*) item );
m_Pcb->Add( new_pcbtext );
newitem = new_pcbtext;
}
break;
newitem = (BOARD_ITEM*)item->Clone();
case PCB_TARGET_T:
{
PCB_TARGET* target = new PCB_TARGET( m_Pcb );
target->Copy( (PCB_TARGET*) item );
m_Pcb->Add( target );
newitem = target;
}
break;
case PCB_DIMENSION_T:
{
DIMENSION* new_cotation = new DIMENSION( m_Pcb );
new_cotation->Copy( (DIMENSION*) item );
m_Pcb->Add( new_cotation );
newitem = new_cotation;
}
break;
if( item->Type() == PCB_MODULE_T )
m_Pcb->m_Status_Pcb = 0;
default:
wxMessageBox( wxT( "PCB_EDIT_FRAME::Block_Duplicate( ) error: unexpected type" ) );
break;
}
m_Pcb->Add( newitem );
if( newitem )
{
......
......@@ -401,12 +401,14 @@ void CopyMarkedItems( MODULE* module, wxPoint offset )
continue;
pad->ClearFlags( SELECTED );
D_PAD* NewPad = new D_PAD( module );
NewPad->Copy( pad );
D_PAD* NewPad = new D_PAD( *pad );
NewPad->SetParent( module );
NewPad->SetFlags( SELECTED );
module->m_Pads.PushFront( NewPad );
}
BOARD_ITEM* newItem;
for( BOARD_ITEM* item = module->m_Drawings; item; item = item->Next() )
{
if( !item->IsSelected() )
......@@ -414,28 +416,10 @@ void CopyMarkedItems( MODULE* module, wxPoint offset )
item->ClearFlags( SELECTED );
switch( item->Type() )
{
case PCB_MODULE_TEXT_T:
TEXTE_MODULE * textm;
textm = new TEXTE_MODULE( module );
textm->Copy( (TEXTE_MODULE*) item );
textm->SetFlags( SELECTED );
module->m_Drawings.PushFront( textm );
break;
case PCB_MODULE_EDGE_T:
EDGE_MODULE * edge;
edge = new EDGE_MODULE( module );
edge->Copy( (EDGE_MODULE*) item );
edge->SetFlags( SELECTED );
module->m_Drawings.PushFront( edge );
break;
default:
DisplayError( NULL, wxT( "CopyMarkedItems: type undefined" ) );
break;
}
newItem = (BOARD_ITEM*)item->Clone();
newItem->SetParent( module );
newItem->SetFlags( SELECTED );
module->m_Drawings.PushFront( newItem );
}
MoveMarkedItems( module, offset );
......
......@@ -72,8 +72,6 @@
*
*/
BOARD_ITEM* DuplicateStruct( BOARD_ITEM* aItem );
/**
* Function TestForExistingItem
......@@ -186,7 +184,7 @@ void SwapData( BOARD_ITEM* aItem, BOARD_ITEM* aImage )
{
case PCB_MODULE_T:
{
MODULE* tmp = (MODULE*) DuplicateStruct( aImage );
MODULE* tmp = (MODULE*) aImage->Clone();
( (MODULE*) aImage )->Copy( (MODULE*) aItem );
( (MODULE*) aItem )->Copy( tmp );
delete tmp;
......@@ -195,7 +193,7 @@ void SwapData( BOARD_ITEM* aItem, BOARD_ITEM* aImage )
case PCB_ZONE_AREA_T:
{
ZONE_CONTAINER* tmp = (ZONE_CONTAINER*) DuplicateStruct( aImage );
ZONE_CONTAINER* tmp = (ZONE_CONTAINER*) aImage->Clone();
( (ZONE_CONTAINER*) aImage )->Copy( (ZONE_CONTAINER*) aItem );
( (ZONE_CONTAINER*) aItem )->Copy( tmp );
delete tmp;
......@@ -290,98 +288,6 @@ void SwapData( BOARD_ITEM* aItem, BOARD_ITEM* aImage )
}
/* Routine to create a new copy of given struct.
* The new object is not put in list (not linked)
*/
BOARD_ITEM* DuplicateStruct( BOARD_ITEM* aItem )
{
if( aItem == NULL )
{
wxMessageBox( wxT( "DuplicateStruct() error: NULL aItem" ) );
return NULL;
}
switch( aItem->Type() )
{
case PCB_MODULE_T:
{
MODULE* new_module;
new_module = new MODULE( (BOARD*) aItem->GetParent() );
new_module->Copy( (MODULE*) aItem );
return new_module;
}
case PCB_TRACE_T:
{
TRACK* new_track = ( (TRACK*) aItem )->Copy();
return new_track;
}
case PCB_VIA_T:
{
SEGVIA* new_via = (SEGVIA*)( (SEGVIA*) aItem )->Copy();
return new_via;
}
case PCB_ZONE_T:
{
SEGZONE* new_segzone = (SEGZONE*)( (SEGZONE*) aItem )->Copy();
return new_segzone;
}
case PCB_ZONE_AREA_T:
{
ZONE_CONTAINER* new_zone = new ZONE_CONTAINER( (BOARD*) aItem->GetParent() );
new_zone->Copy( (ZONE_CONTAINER*) aItem );
return new_zone;
}
case PCB_LINE_T:
{
DRAWSEGMENT* new_drawsegment = new DRAWSEGMENT( aItem->GetParent() );
new_drawsegment->Copy( (DRAWSEGMENT*) aItem );
return new_drawsegment;
}
break;
case PCB_TEXT_T:
{
TEXTE_PCB* new_pcbtext = new TEXTE_PCB( aItem->GetParent() );
new_pcbtext->Copy( (TEXTE_PCB*) aItem );
return new_pcbtext;
}
break;
case PCB_TARGET_T:
{
PCB_TARGET* target = new PCB_TARGET( aItem->GetParent() );
target->Copy( (PCB_TARGET*) aItem );
return target;
}
break;
case PCB_DIMENSION_T:
{
DIMENSION* new_cotation = new DIMENSION( aItem->GetParent() );
new_cotation->Copy( (DIMENSION*) aItem );
return new_cotation;
}
break;
default:
{
wxString msg;
msg << wxT( "DuplicateStruct error: unexpected StructType " ) <<
aItem->Type() << wxT( " " ) << aItem->GetClass();
wxMessageBox( msg );
}
break;
}
return NULL;
}
/*
* Function SaveCopyInUndoList
* Create a copy of the current board item, and put it in the undo list.
......@@ -412,9 +318,11 @@ void PCB_EDIT_FRAME::SaveCopyInUndoList( BOARD_ITEM* aItem,
{
case UR_CHANGED: /* Create a copy of schematic */
if( itemWrapper.m_Link == NULL ) // When not null, the copy is already done
itemWrapper.m_Link = DuplicateStruct( aItem );;
itemWrapper.m_Link = aItem->Clone();;
if( itemWrapper.m_Link )
commandToUndo->PushItem( itemWrapper );
break;
case UR_NEW:
......@@ -444,7 +352,9 @@ void PCB_EDIT_FRAME::SaveCopyInUndoList( BOARD_ITEM* aItem,
GetScreen()->ClearUndoORRedoList( GetScreen()->m_RedoList );
}
else
{
delete commandToUndo;
}
}
......@@ -478,6 +388,7 @@ void PCB_EDIT_FRAME::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList,
}
wxASSERT( item );
switch( command )
{
case UR_CHANGED:
......@@ -487,9 +398,11 @@ void PCB_EDIT_FRAME::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList,
* If this link is not null, the copy is already done
*/
if( commandToUndo->GetPickedItemLink( ii ) == NULL )
commandToUndo->SetPickedItemLink( DuplicateStruct( item ), ii );
commandToUndo->SetPickedItemLink( item->Clone(), ii );
if( commandToUndo->GetPickedItemLink( ii ) == NULL )
wxMessageBox( wxT( "SaveCopyInUndoList() in UR_CHANGED mode: NULL link" ) );
break;
case UR_MOVED:
......@@ -506,7 +419,9 @@ void PCB_EDIT_FRAME::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList,
msg.Printf( wxT( "SaveCopyInUndoList() error (unknown code %X)" ), command );
wxMessageBox( msg );
}
break;
}
}
......
......@@ -2123,7 +2123,7 @@ TRACK* BOARD::CreateLockPoint( wxPoint& aPosition, TRACK* aSegment, PICKED_ITEMS
newPoint.x += aSegment->m_Start.x;
newPoint.y += aSegment->m_Start.y;
TRACK* newTrack = aSegment->Copy();
TRACK* newTrack = (TRACK*)aSegment->Clone();
if( aList )
{
......@@ -2139,7 +2139,7 @@ TRACK* BOARD::CreateLockPoint( wxPoint& aPosition, TRACK* aSegment, PICKED_ITEMS
if( aList )
{
ITEM_PICKER picker( aSegment, UR_CHANGED );
picker.m_Link = aSegment->Copy();
picker.m_Link = aSegment->Clone();
aList->PushItem( picker );
}
......
......@@ -19,10 +19,12 @@ BOARD_CONNECTED_ITEM::BOARD_CONNECTED_ITEM( BOARD_ITEM* aParent, KICAD_T idtype
}
BOARD_CONNECTED_ITEM::BOARD_CONNECTED_ITEM( const BOARD_CONNECTED_ITEM& src ) :
BOARD_ITEM( src )
BOARD_CONNECTED_ITEM::BOARD_CONNECTED_ITEM( const BOARD_CONNECTED_ITEM& aItem ) :
BOARD_ITEM( aItem )
{
m_Layer = src.m_Layer;
m_NetCode = aItem.m_NetCode;
m_Subnet = aItem.m_Subnet;
m_ZoneSubnet = aItem.m_ZoneSubnet;
}
......
......@@ -41,7 +41,8 @@ private:
public:
BOARD_CONNECTED_ITEM( BOARD_ITEM* aParent, KICAD_T idtype );
BOARD_CONNECTED_ITEM( const BOARD_CONNECTED_ITEM& src );
BOARD_CONNECTED_ITEM( const BOARD_CONNECTED_ITEM& aItem );
/**
* Function GetNet
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_dimension.cpp
*/
......@@ -575,3 +600,9 @@ wxString DIMENSION::GetSelectMenuText() const
return text;
}
EDA_ITEM* DIMENSION::doClone() const
{
return new DIMENSION( *this );
}
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_dimension.h
* @brief DIMENSION class definition.
......@@ -35,6 +60,9 @@ public:
public:
DIMENSION( BOARD_ITEM* aParent );
// Do not create a copy constructor. The one generated by the compiler is adequate.
~DIMENSION();
const wxPoint GetPosition() const { return m_Pos; }
......@@ -160,6 +188,8 @@ public:
void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override
#endif
private:
virtual EDA_ITEM* doClone() const;
};
#endif // DIMENSION_H_
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_drawsegment.cpp
* @brief Class and functions to handle a graphic segments.
......@@ -75,10 +100,12 @@ void DRAWSEGMENT::Flip( const wxPoint& aCentre )
{
m_Start.y = aCentre.y - (m_Start.y - aCentre.y);
m_End.y = aCentre.y - (m_End.y - aCentre.y);
if( m_Shape == S_ARC )
{
NEGATE( m_Angle );
}
SetLayer( ChangeSideNumLayer( GetLayer() ) );
}
......@@ -497,6 +524,12 @@ wxString DRAWSEGMENT::GetSelectMenuText() const
}
EDA_ITEM* DRAWSEGMENT::doClone() const
{
return new DRAWSEGMENT( *this );
}
#if defined(DEBUG)
void DRAWSEGMENT::Show( int nestLevel, std::ostream& os ) const
{
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_drawsegment.h
* @brief Class to handle a graphic segment.
......@@ -34,6 +59,9 @@ protected:
public:
DRAWSEGMENT( BOARD_ITEM* aParent = NULL, KICAD_T idtype = PCB_LINE_T );
// Do not create a copy constructor. The one generated by the compiler is adequate.
~DRAWSEGMENT();
/// skip the linked list stuff, and parent
......@@ -247,6 +275,9 @@ public:
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const; // overload
#endif
private:
virtual EDA_ITEM* doClone() const;
};
#endif // CLASS_DRAWSEGMENT_H_
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_edge_mod.cpp
* @brief EDGE_MODULE class definition.
......@@ -21,10 +46,6 @@
#include "class_edge_mod.h"
/*********************/
/* class EDGE_MODULE */
/*********************/
EDGE_MODULE::EDGE_MODULE( MODULE* parent, STROKE_T aShape ) :
DRAWSEGMENT( parent, PCB_MODULE_EDGE_T )
{
......@@ -71,14 +92,6 @@ void EDGE_MODULE::SetDrawCoord()
}
/* Draw EDGE_MODULE:
* Entry: offset = offset trace
* Draw_mode mode = trace (GR_OR, GR_XOR, GR_AND)
* The contours are of different types:
* - Segment
* - Circles
* - Arcs
*/
void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, int draw_mode, const wxPoint& offset )
{
int ux0, uy0, dx, dy, radius, StAngle, EndAngle;
......@@ -246,6 +259,12 @@ wxString EDGE_MODULE::GetSelectMenuText() const
}
EDA_ITEM* EDGE_MODULE::doClone() const
{
return new EDGE_MODULE( *this );
}
#if defined(DEBUG)
void EDGE_MODULE::Show( int nestLevel, std::ostream& os ) const
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_edge_mod.h
* @brief EDGE_MODULE class definition.
......@@ -23,7 +48,9 @@ public:
public:
EDGE_MODULE( MODULE* parent, STROKE_T aShape = S_SEGMENT );
EDGE_MODULE( EDGE_MODULE* edge );
// Do not create a copy constructor. The one generated by the compiler is adequate.
~EDGE_MODULE();
EDGE_MODULE* Next() const { return (EDGE_MODULE*) Pnext; }
......@@ -83,6 +110,9 @@ public:
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const; // overload
#endif
private:
virtual EDA_ITEM* doClone() const;
};
#endif // CLASS_EDGE_MOD_H_
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_mire.cpp
* MIRE class definition (targets for photo plots)
......@@ -198,3 +223,9 @@ wxString PCB_TARGET::GetSelectMenuText() const
return text;
}
EDA_ITEM* PCB_TARGET::doClone() const
{
return new PCB_TARGET( *this );
}
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_mire.h
* @brief PCB_TARGET class definition. (targets for photo plots).
......@@ -24,6 +49,9 @@ class PCB_TARGET : public BOARD_ITEM
public:
PCB_TARGET( BOARD_ITEM* aParent );
// Do not create a copy constructor. The one generated by the compiler is adequate.
PCB_TARGET( BOARD_ITEM* aParent, int aShape, int aLayer,
const wxPoint& aPos, int aSize, int aWidth );
......@@ -116,6 +144,9 @@ public:
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override
#endif
private:
virtual EDA_ITEM* doClone() const;
};
......
......@@ -78,6 +78,88 @@ MODULE::MODULE( BOARD* parent ) :
}
MODULE::MODULE( const MODULE& aModule ) :
BOARD_ITEM( aModule )
{
BOARD_ITEM* newItem;
m_Pos = aModule.m_Pos;
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_Link = aModule.m_Link;
m_Path = aModule.m_Path; //is this correct behavior?
m_LocalClearance = aModule.m_LocalClearance;
m_LocalSolderMaskMargin = aModule.m_LocalSolderMaskMargin;
m_LocalSolderPasteMargin = aModule.m_LocalSolderPasteMargin;
m_LocalSolderPasteMarginRatio = aModule.m_LocalSolderPasteMarginRatio;
/* Copy reference and value. */
m_Reference = new TEXTE_MODULE( *aModule.m_Reference );
m_Reference->SetParent( this );
m_Value = new TEXTE_MODULE( *aModule.m_Value );
m_Value->SetParent( this );
/* Copy auxiliary data: Pads */
m_Pads.DeleteAll();
for( D_PAD* pad = aModule.m_Pads; pad; pad = pad->Next() )
{
D_PAD* newpad = new D_PAD( *pad );
newpad->SetParent( this );
m_Pads.PushBack( newpad );
}
/* Copy auxiliary data: Drawings */
m_Drawings.DeleteAll();
for( BOARD_ITEM* item = aModule.m_Drawings; item; item = item->Next() )
{
switch( item->Type() )
{
case PCB_MODULE_TEXT_T:
case PCB_MODULE_EDGE_T:
newItem = (BOARD_ITEM*)item->Clone();
newItem->SetParent( this );
m_Drawings.PushBack( newItem );
break;
default:
wxMessageBox( wxT( "MODULE::Copy() Internal Err: unknown type" ) );
break;
}
}
/* Copy auxiliary data: 3D_Drawings info */
m_3D_Drawings.DeleteAll();
for( S3D_MASTER* item = aModule.m_3D_Drawings; item; item = item->Next() )
{
if( item->m_Shape3DName.IsEmpty() ) // do not copy empty shapes.
continue;
S3D_MASTER* t3d = m_3D_Drawings;
t3d = new S3D_MASTER( this );
t3d->Copy( item );
m_3D_Drawings.PushBack( t3d );
}
// Ensure there is at least one item in m_3D_Drawings.
if( m_3D_Drawings.GetCount() == 0 )
m_3D_Drawings.PushBack( new S3D_MASTER( this ) ); // push a void item
m_Doc = aModule.m_Doc;
m_KeyWord = aModule.m_KeyWord;
}
MODULE::~MODULE()
{
delete m_Reference;
......@@ -563,6 +645,12 @@ wxString MODULE::GetSelectMenuText() const
}
EDA_ITEM* MODULE::doClone() const
{
return new MODULE( *this );
}
#if defined(DEBUG)
void MODULE::Show( int nestLevel, std::ostream& os ) const
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_module.h
* @brief Module description (excepted pads)
......@@ -104,7 +129,9 @@ public:
public:
MODULE( BOARD* parent );
MODULE( MODULE* module );
MODULE( const MODULE& aModule );
~MODULE();
MODULE* Next() const { return (MODULE*) Pnext; }
......@@ -377,6 +404,9 @@ public:
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const; // overload
#endif
private:
virtual EDA_ITEM* doClone() const;
};
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_pad.cpp
* D_PAD class implementation.
......@@ -735,6 +759,12 @@ wxString D_PAD::GetSelectMenuText() const
return text;
}
EDA_ITEM* D_PAD::doClone() const
{
return new D_PAD( *this );
}
#if defined(DEBUG)
void D_PAD::Show( int nestLevel, std::ostream& os ) const
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_pad.h
* @brief Pad object description
......@@ -139,7 +163,9 @@ public:
public:
D_PAD( MODULE* parent );
D_PAD( D_PAD* pad );
// Do not create a copy constructor. The one generated by the compiler is adequate.
~D_PAD();
void Copy( D_PAD* source );
......@@ -452,6 +478,9 @@ public:
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const; // overload
#endif
private:
virtual EDA_ITEM* doClone() const;
};
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_pcb_text.cpp
* @brief Class TEXTE_PCB texts on copper or technical layers implementation
......@@ -160,6 +184,12 @@ wxString TEXTE_PCB::GetSelectMenuText() const
}
EDA_ITEM* TEXTE_PCB::doClone() const
{
return new TEXTE_PCB( *this );
}
#if defined(DEBUG)
void TEXTE_PCB::Show( int nestLevel, std::ostream& os ) const
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_pcb_text.h
* @brief TEXTE_PCB class definition.
......@@ -18,7 +42,9 @@ class TEXTE_PCB : public BOARD_ITEM, public EDA_TEXT
{
public:
TEXTE_PCB( BOARD_ITEM* parent );
TEXTE_PCB( TEXTE_PCB* textepcb );
// Do not create a copy constructor. The one generated by the compiler is adequate.
~TEXTE_PCB();
const wxPoint GetPosition() const // is an overload
......@@ -140,6 +166,9 @@ public:
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const;
#endif
private:
virtual EDA_ITEM* doClone() const;
};
#endif // #define CLASS_PCB_TEXT_H
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_module.cpp
* @brief TEXT_MODULE class implementation.
......@@ -23,11 +47,13 @@
TEXTE_MODULE::TEXTE_MODULE( MODULE* parent, int text_type ) :
BOARD_ITEM( parent, PCB_MODULE_TEXT_T ), EDA_TEXT()
BOARD_ITEM( parent, PCB_MODULE_TEXT_T ),
EDA_TEXT()
{
MODULE* Module = (MODULE*) m_Parent;
m_Type = text_type; /* Reference */
if( (m_Type != TEXT_is_REFERENCE) && (m_Type != TEXT_is_VALUE) )
m_Type = TEXT_is_DIVERS;
......@@ -36,6 +62,7 @@ TEXTE_MODULE::TEXTE_MODULE( MODULE* parent, int text_type ) :
m_Thickness = 120; /* Set default dimension to a reasonable value. */
SetLayer( SILKSCREEN_N_FRONT );
if( Module && ( Module->Type() == PCB_MODULE_T ) )
{
m_Pos = Module->m_Pos;
......@@ -85,13 +112,13 @@ void TEXTE_MODULE::Copy( TEXTE_MODULE* source )
}
int TEXTE_MODULE:: GetLength() const
int TEXTE_MODULE::GetLength() const
{
return m_Text.Len();
}
// Update draw coordinates
void TEXTE_MODULE:: SetDrawCoord()
void TEXTE_MODULE::SetDrawCoord()
{
MODULE* Module = (MODULE*) m_Parent;
......@@ -110,7 +137,7 @@ void TEXTE_MODULE:: SetDrawCoord()
// Update "local" coordinates (coordinates relatives to the footprint
// anchor point)
void TEXTE_MODULE:: SetLocalCoord()
void TEXTE_MODULE::SetLocalCoord()
{
MODULE* Module = (MODULE*) m_Parent;
......@@ -453,6 +480,12 @@ wxString TEXTE_MODULE::GetSelectMenuText() const
}
EDA_ITEM* TEXTE_MODULE::doClone() const
{
return new TEXTE_MODULE( *this );
}
#if defined(DEBUG)
void TEXTE_MODULE::Show( int nestLevel, std::ostream& os ) const
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_text_mod.h
* @brief Footprint text class description.
......@@ -44,6 +68,8 @@ class TEXTE_MODULE : public BOARD_ITEM, public EDA_TEXT
public:
TEXTE_MODULE( MODULE* parent, int text_type = TEXT_is_DIVERS );
// Do not create a copy constructor. The one generated by the compiler is adequate.
~TEXTE_MODULE();
TEXTE_MODULE* Next() const { return (TEXTE_MODULE*) Pnext; }
......@@ -190,6 +216,9 @@ public:
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const; // overload
#endif
private:
virtual EDA_ITEM* doClone() const;
};
#endif // TEXT_MODULE_H_
......@@ -130,6 +130,12 @@ TRACK::TRACK( BOARD_ITEM* aParent, KICAD_T idtype ) :
}
EDA_ITEM* TRACK::doClone() const
{
return new TRACK( *this );
}
wxString TRACK::ShowWidth() const
{
wxString msg;
......@@ -146,6 +152,12 @@ SEGZONE::SEGZONE( BOARD_ITEM* aParent ) :
}
EDA_ITEM* SEGZONE::doClone() const
{
return new SEGZONE( *this );
}
wxString SEGZONE::GetSelectMenuText() const
{
wxString text;
......@@ -178,6 +190,12 @@ SEGVIA::SEGVIA( BOARD_ITEM* aParent ) :
}
EDA_ITEM* SEGVIA::doClone() const
{
return new SEGVIA( *this );
}
wxString SEGVIA::GetSelectMenuText() const
{
wxString text;
......@@ -222,40 +240,6 @@ wxString SEGVIA::GetSelectMenuText() const
}
// Copy constructor
TRACK::TRACK( const TRACK& Source ) :
BOARD_CONNECTED_ITEM( Source )
{
m_Shape = Source.m_Shape;
SetNet( Source.GetNet() );
m_Flags = Source.m_Flags;
SetTimeStamp( Source.m_TimeStamp );
SetStatus( Source.GetStatus() );
m_Start = Source.m_Start;
m_End = Source.m_End;
m_Width = Source.m_Width;
m_Drill = Source.m_Drill;
SetSubNet( Source.GetSubNet() );
m_Param = Source.m_Param;
}
TRACK* TRACK::Copy() const
{
if( Type() == PCB_TRACE_T )
return new TRACK( *this );
if( Type() == PCB_VIA_T )
return new SEGVIA( (const SEGVIA &) * this );
if( Type() == PCB_ZONE_T )
return new SEGZONE( (const SEGZONE &) * this );
return NULL; // should never happen
}
int TRACK::GetClearance( BOARD_CONNECTED_ITEM* aItem ) const
{
// Currently tracks have no specific clearance parameter on a per track or per
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_track.h
* @brief Definitions for tracks, vias and zones.
......@@ -67,26 +91,10 @@ public:
double m_Param; // Auxiliary variable ( used in some computations )
protected:
TRACK( const TRACK& track ); // protected so Copy() is used instead.
public:
TRACK( BOARD_ITEM* aParent, KICAD_T idtype = PCB_TRACE_T );
/**
* Function Copy
* will copy this object whether it is a TRACK or a SEGVIA returning
* the corresponding type.
* Because of the way SEGVIA and SEGZONE are derived from TRACK and because there are
* virtual functions being used, we can no longer simply copy a TRACK and
* expect it to be a via or zone. We must construct a true SEGVIA or SEGZONE so its
* constructor can initialize the virtual function table properly. This factory type
* of function called Copy() can duplicate either a TRACK, SEGVIA, or SEGZONE.
*
* @return - TRACK*, SEGVIA*, or SEGZONE*, declared as the least common
* denominator: TRACK
*/
TRACK* Copy() const;
// Do not create a copy constructor. The one generated by the compiler is adequate.
TRACK* Next() const { return (TRACK*) Pnext; }
TRACK* Back() const { return (TRACK*) Pback; }
......@@ -396,6 +404,9 @@ public:
static wxString ShowState( int stateBits );
#endif
private:
virtual EDA_ITEM* doClone() const;
};
......@@ -404,6 +415,8 @@ class SEGZONE : public TRACK
public:
SEGZONE( BOARD_ITEM* aParent );
// Do not create a copy constructor. The one generated by the compiler is adequate.
/**
* Function GetClass
* returns the class name.
......@@ -420,6 +433,9 @@ public:
virtual wxString GetSelectMenuText() const;
virtual BITMAP_DEF GetMenuImage() const { return add_zone_xpm; }
private:
virtual EDA_ITEM* doClone() const;
};
......@@ -428,11 +444,7 @@ class SEGVIA : public TRACK
public:
SEGVIA( BOARD_ITEM* aParent );
SEGVIA( const SEGVIA& source ) :
TRACK( source )
{
}
// Do not create a copy constructor. The one generated by the compiler is adequate.
void Draw( EDA_DRAW_PANEL* panel, wxDC* DC, int aDrawMode,
const wxPoint& aOffset = ZeroOffset );
......@@ -491,6 +503,9 @@ public:
#if defined (DEBUG)
void Show( int nestLevel, std::ostream& os ) const; // overload
#endif
private:
virtual EDA_ITEM* doClone() const;
};
......
......@@ -65,6 +65,27 @@ ZONE_CONTAINER::ZONE_CONTAINER( BOARD* parent ) :
}
ZONE_CONTAINER::ZONE_CONTAINER( const ZONE_CONTAINER& aZone ) :
BOARD_CONNECTED_ITEM( aZone )
{
// Should the copy be on the same net?
SetNet( aZone.GetNet() );
m_Poly = new CPolyLine( *aZone.m_Poly );
// For corner moving, corner index to drag, or -1 if no selection
m_CornerSelection = -1;
m_ZoneClearance = aZone.m_ZoneClearance; // clearance value
m_ZoneMinThickness = aZone.m_ZoneMinThickness;
m_FillMode = aZone.m_FillMode; // Filling mode (segments/polygons)
m_ArcToSegmentsCount = aZone.m_ArcToSegmentsCount;
m_PadOption = aZone.m_PadOption;
m_ThermalReliefGap = aZone.m_ThermalReliefGap;
m_ThermalReliefCopperBridge = aZone.m_ThermalReliefCopperBridge;
m_FilledPolysList = aZone.m_FilledPolysList;
m_FillSegmList = aZone.m_FillSegmList;
}
ZONE_CONTAINER::~ZONE_CONTAINER()
{
delete m_Poly;
......@@ -72,6 +93,12 @@ ZONE_CONTAINER::~ZONE_CONTAINER()
}
EDA_ITEM* ZONE_CONTAINER::doClone() const
{
return new ZONE_CONTAINER( *this );
}
bool ZONE_CONTAINER::UnFill()
{
bool change = ( m_FilledPolysList.size() > 0 ) || ( m_FillSegmList.size() > 0 );
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file class_zone.h
* @brief Classes to handle copper zones
......@@ -103,6 +127,9 @@ private:
public:
ZONE_CONTAINER( BOARD* parent );
ZONE_CONTAINER( const ZONE_CONTAINER& aZone );
~ZONE_CONTAINER();
bool Save( FILE* aFile ) const;
......@@ -234,7 +261,10 @@ public:
void SetThermalReliefGap( int aThermalReliefGap ) { m_ThermalReliefGap = aThermalReliefGap; }
int GetThermalReliefGap() const { return m_ThermalReliefGap; }
void SetThermalReliefCopperBridge( int aThermalReliefCopperBridge ) { m_ThermalReliefCopperBridge = aThermalReliefCopperBridge; }
void SetThermalReliefCopperBridge( int aThermalReliefCopperBridge )
{
m_ThermalReliefCopperBridge = aThermalReliefCopperBridge;
}
int GetThermalReliefCopperBridge() const { return m_ThermalReliefCopperBridge; }
void SetArcSegCount( int aArcSegCount ) { m_ArcToSegmentsCount = aArcSegCount; }
......@@ -500,6 +530,9 @@ public:
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override
#endif
private:
virtual EDA_ITEM* doClone() const;
};
......
......@@ -797,7 +797,7 @@ static void ConnectDanglingEndToVia( BOARD* pcb )
if( other->m_End != via->GetPosition() && via->HitTest( other->m_Start )
&& !other->start )
{
TRACK* newTrack = other->Copy();
TRACK* newTrack = (TRACK*)other->Clone();
pcb->m_Track.Insert( newTrack, other->Next() );
......@@ -821,7 +821,7 @@ static void ConnectDanglingEndToVia( BOARD* pcb )
else if( other->m_Start != via->GetPosition() && via->HitTest( other->m_End )
&& !other->end )
{
TRACK* newTrack = other->Copy();
TRACK* newTrack = (TRACK*)other->Clone();
pcb->m_Track.Insert( newTrack, other->Next() );
......@@ -874,7 +874,7 @@ void ConnectDanglingEndToPad( PCB_EDIT_FRAME* aFrame )
{
if( segment->GetTrace( aFrame->GetBoard()->m_Track, NULL, START ) == NULL )
{
TRACK* newTrack = segment->Copy();
TRACK* newTrack = (TRACK*)segment->Clone();
aFrame->GetBoard()->m_Track.Insert( newTrack, segment->Next() );
......@@ -896,7 +896,7 @@ void ConnectDanglingEndToPad( PCB_EDIT_FRAME* aFrame )
{
if( segment->GetTrace( aFrame->GetBoard()->m_Track, NULL, END ) == NULL )
{
TRACK* newTrack = segment->Copy();
TRACK* newTrack = (TRACK*)segment->Clone();
aFrame->GetBoard()->m_Track.Insert( newTrack, segment->Next() );
......
......@@ -374,8 +374,7 @@ EDGE_MODULE* FOOTPRINT_EDIT_FRAME::Begin_Edge_Module( EDGE_MODULE* Edge,
{
Edge->Draw( m_canvas, DC, GR_OR );
EDGE_MODULE* newedge = new EDGE_MODULE( module );
newedge->Copy( Edge );
EDGE_MODULE* newedge = new EDGE_MODULE( *Edge );
// insert _after_ Edge, which is the same as inserting before Edge->Next()
module->m_Drawings.Insert( newedge, Edge->Next() );
......
......@@ -100,7 +100,7 @@ bool PCB_EDIT_FRAME::SetTrackSegmentWidth( TRACK* aTrackItem,
{
aTrackItem->m_Width = initial_width;
ITEM_PICKER picker( aTrackItem, UR_CHANGED );
picker.m_Link = aTrackItem->Copy();
picker.m_Link = aTrackItem->Clone();
aItemsListPicker->PushItem( picker );
aTrackItem->m_Width = new_width;
......
......@@ -183,7 +183,7 @@ bool PCB_EDIT_FRAME::Other_Layer_Route( TRACK* aTrack, wxDC* DC )
* it will become the new current segment (from via to the mouse cursor)
*/
TRACK* track = lastNonVia->Copy();
TRACK* track = (TRACK*)lastNonVia->Clone();
/* the above creates a new segment from the last entered segment, with the
* current width, flags, netcode, etc... values.
......@@ -204,7 +204,7 @@ bool PCB_EDIT_FRAME::Other_Layer_Route( TRACK* aTrack, wxDC* DC )
if( g_TwoSegmentTrackBuild )
{
// Create a second segment (we must have 2 track segments to adjust)
g_CurrentTrackList.PushBack( g_CurrentTrackSegment->Copy() );
g_CurrentTrackList.PushBack( (TRACK*)g_CurrentTrackSegment->Clone() );
}
m_canvas->CallMouseCapture( DC, wxDefaultPosition, false );
......
......@@ -186,7 +186,7 @@ TRACK* PCB_EDIT_FRAME::Begin_Route( TRACK* aTrack, wxDC* aDC )
if( g_TwoSegmentTrackBuild )
{
// Create 2nd segment
g_CurrentTrackList.PushBack( g_CurrentTrackSegment->Copy() );
g_CurrentTrackList.PushBack( (TRACK*)g_CurrentTrackSegment->Clone() );
D( g_CurrentTrackList.VerifyListIntegrity(); );
......@@ -254,7 +254,7 @@ TRACK* PCB_EDIT_FRAME::Begin_Route( TRACK* aTrack, wxDC* aDC )
TRACK* previousTrack = g_CurrentTrackSegment;
TRACK* newTrack = g_CurrentTrackSegment->Copy();
TRACK* newTrack = (TRACK*)g_CurrentTrackSegment->Clone();
g_CurrentTrackList.PushBack( newTrack );
newTrack->SetFlags( IS_NEW );
......@@ -327,7 +327,7 @@ bool PCB_EDIT_FRAME::Add45DegreeSegment( wxDC* aDC )
return false;
/* Create a new segment and connect it with the previous 2 segments. */
TRACK* newTrack = curTrack->Copy();
TRACK* newTrack = (TRACK*)curTrack->Clone();
newTrack->m_Start = prevTrack->m_End;
newTrack->m_End = curTrack->m_Start;
......@@ -1079,7 +1079,7 @@ void EnsureEndTrackOnPad( D_PAD* Pad )
if( !g_CurrentTrackSegment->IsNull() )
{
/* Must create a new segment, from track end to pad center */
g_CurrentTrackList.PushBack( lasttrack->Copy() );
g_CurrentTrackList.PushBack( (TRACK*)lasttrack->Clone() );
lasttrack->end = g_CurrentTrackSegment;
}
......
......@@ -76,8 +76,8 @@ bool FOOTPRINT_EDIT_FRAME::Load_Module_From_BOARD( MODULE* aModule )
Clear_Pcb( false );
GetBoard()->m_Status_Pcb = 0;
newModule = new MODULE( GetBoard() );
newModule->Copy( aModule );
newModule = new MODULE( *aModule );
newModule->SetParent( GetBoard() );
newModule->m_Link = aModule->GetTimeStamp();
aModule = newModule;
......
......@@ -309,8 +309,8 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
}
// Create the "new" module
MODULE* newmodule = new MODULE( mainpcb );
newmodule->Copy( module_in_edit );
MODULE* newmodule = new MODULE( *module_in_edit );
newmodule->SetParent( mainpcb );
newmodule->m_Link = 0;
// Put the footprint in the main pcb linked list.
......
......@@ -22,8 +22,7 @@ void FOOTPRINT_EDIT_FRAME::SaveCopyInUndoList( BOARD_ITEM* aItem,
MODULE* CopyItem;
PICKED_ITEMS_LIST* lastcmd;
CopyItem = new MODULE( GetBoard() );
CopyItem->Copy( (MODULE*) aItem );
CopyItem = new MODULE( *( (MODULE*) aItem ) );
CopyItem->SetParent( GetBoard() );
lastcmd = new PICKED_ITEMS_LIST();
......
......@@ -99,8 +99,8 @@ void PCB_EDIT_FRAME::StartMove_Module( MODULE* module, wxDC* DC )
s_PickedList.ClearItemsList(); // Should be empty, but...
// Creates a copy of the current module, for abort and undo commands
s_ModuleInitialCopy = new MODULE( GetBoard() );
s_ModuleInitialCopy->Copy( module );
s_ModuleInitialCopy = (MODULE*)module->Clone();
s_ModuleInitialCopy->SetParent( GetBoard() );
s_ModuleInitialCopy->ClearFlags();
SetCurItem( module );
......@@ -122,7 +122,7 @@ void PCB_EDIT_FRAME::StartMove_Module( MODULE* module, wxDC* DC )
{
TRACK* segm = g_DragSegmentList[ii].m_Segm;
itemWrapper.m_PickedItem = segm;
itemWrapper.m_Link = segm->Copy();
itemWrapper.m_Link = segm->Clone();
itemWrapper.m_Link->SetState( IN_EDIT, OFF );
s_PickedList.PushItem( itemWrapper );
}
......
......@@ -758,14 +758,14 @@ void PCB_EDIT_FRAME::StartMoveOneNodeOrSegment( TRACK* aTrack, wxDC* aDC, int aC
// Prepare the Undo command
ITEM_PICKER picker( aTrack, UR_CHANGED );
picker.m_Link = aTrack->Copy();
picker.m_Link = aTrack->Clone();
s_ItemsListPicker.PushItem( picker );
for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ )
{
TRACK* draggedtrack = g_DragSegmentList[ii].m_Segm;
picker.m_PickedItem = draggedtrack;
picker.m_Link = draggedtrack->Copy();
picker.m_Link = draggedtrack->Clone();
s_ItemsListPicker.PushItem( picker );
draggedtrack = (TRACK*) picker.m_Link;
draggedtrack->SetStatus( 0 );
......@@ -980,7 +980,7 @@ void PCB_EDIT_FRAME::Start_DragTrackSegmentAndKeepSlope( TRACK* track, wxDC* DC
{
TRACK* draggedtrack = g_DragSegmentList[ii].m_Segm;
picker.m_PickedItem = draggedtrack;
picker.m_Link = draggedtrack->Copy();
picker.m_Link = draggedtrack->Clone();
s_ItemsListPicker.PushItem( picker );
draggedtrack = (TRACK*) picker.m_Link;
draggedtrack->SetStatus( 0 );
......
......@@ -267,8 +267,7 @@ MODULE* PCB_EDIT_FRAME::Genere_Self( wxDC* DC )
PtPad->m_PadShape = PAD_CIRCLE;
PtPad->ComputeShapeMaxRadius();
D_PAD* newpad = new D_PAD( module );
newpad->Copy( PtPad );
D_PAD* newpad = new D_PAD( *PtPad );
module->m_Pads.Insert( newpad, PtPad->Next() );
......
......@@ -1165,8 +1165,8 @@ bool NETLIST_READER::loadNewModules()
if( Module == NULL )
continue; // Module does not exist in library.
MODULE* newmodule = new MODULE( pcb );
newmodule->Copy( Module );
MODULE* newmodule = new MODULE( *Module );
newmodule->SetParent( pcb );
pcb->Add( newmodule, ADD_APPEND );
......
......@@ -1219,7 +1219,7 @@ static void OrCell_Trace( BOARD* pcb, int col, int row,
{
g_CurrentTrackSegment->m_Start = pt_cur_ch->m_PadEnd->GetPosition();
newTrack = g_CurrentTrackSegment->Copy();
newTrack = (TRACK*)g_CurrentTrackSegment->Clone();
newTrack->m_Start = g_CurrentTrackSegment->m_End;
g_CurrentTrackList.PushBack( newTrack );
......@@ -1292,7 +1292,7 @@ static void AddNewTrace( PCB_EDIT_FRAME* pcbframe, wxDC* DC )
}
else
{
TRACK* newTrack = g_CurrentTrackSegment->Copy();
TRACK* newTrack = (TRACK*)g_CurrentTrackSegment->Clone();
newTrack->m_End = pt_cur_ch->m_PadStart->GetPosition();
newTrack->m_Start = g_CurrentTrackSegment->m_End;
......
......@@ -132,8 +132,8 @@ int SaveCopyOfZones( PICKED_ITEMS_LIST& aPickList, BOARD* aPcb, int aNetCode, in
if( aLayer >= 0 && aLayer != zone->GetLayer() )
continue;
ZONE_CONTAINER* zoneDup = new ZONE_CONTAINER( aPcb );
zoneDup->Copy( zone );
ZONE_CONTAINER* zoneDup = new ZONE_CONTAINER( *zone );
zoneDup->SetParent( aPcb );
ITEM_PICKER picker( zone, UR_CHANGED );
picker.m_Link = zoneDup;
picker.m_PickedItemType = zone->Type();
......@@ -211,7 +211,8 @@ void UpdateCopyOfZonesList( PICKED_ITEMS_LIST& aPickList,
else
wxMessageBox( wxT( "UpdateCopyOfZonesList() error: link = NULL" ) );
aPickList.SetPickedItemLink( NULL, kk ); // the copy was deleted; the link does not exists now
// the copy was deleted; the link does not exists now.
aPickList.SetPickedItemLink( NULL, kk );
delete zcopy;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment