Commit c8584436 authored by dickelbeck's avatar dickelbeck

specctra import work

parent cf460637
......@@ -119,7 +119,7 @@ bool WinEDA_BasePcbFrame::Clear_Pcb( bool query )
if( query && GetScreen()->IsModify() )
{
if( m_Pcb->m_Drawings ||m_Pcb->m_Modules
if( m_Pcb->m_Drawings || m_Pcb->m_Modules
|| m_Pcb->m_Track || m_Pcb->m_Zone )
{
if( !IsOK( this, _( "Current Board will be lost ?" ) ) )
......
......@@ -844,6 +844,7 @@ int WinEDA_PcbFrame::ReadPcbFile( wxDC* DC, FILE* File, bool Append )
ZONE_CONTAINER * zone_descr = new ZONE_CONTAINER(m_Pcb);
zone_descr->ReadDescr( File, &LineNum );
m_Pcb->Add(zone_descr);
continue;
}
if( strnicmp( Line, "$MODULE", 7 ) == 0 )
......
......@@ -1782,6 +1782,7 @@ public:
i->Format( out, nestLevel );
}
};
typedef boost::ptr_vector<COMPONENT> COMPONENTS;
class PLACEMENT : public ELEM
......@@ -1792,7 +1793,6 @@ class PLACEMENT : public ELEM
DSN_T flip_style;
typedef boost::ptr_vector<COMPONENT> COMPONENTS;
COMPONENTS components;
public:
......@@ -3812,6 +3812,17 @@ public:
* @param aBoard The BOARD to convert to a PCB.
*/
void FromBOARD( BOARD* aBoard );
/**
* Function FromSESSION
* adds the entire SESSION info to a BOARD but does not write it out. The
* the BOARD given to this function will have all its tracks and via's replaced,
* and all its components are subject to being moved.
*
* @param aBoard The BOARD to merge the SESSION information into.
*/
void FromSESSION( BOARD* aBoard ) throw( IOError );
/**
......
......@@ -63,13 +63,6 @@ void WinEDA_PcbFrame::ExportToSpecctra( wxCommandEvent& event )
if( fullFileName == wxEmptyString )
return;
// prepare the EQUIPOTs
if( !( m_Pcb->m_Status_Pcb & NET_CODES_OK ) )
{
//m_Pcb->m_Status_Pcb &= ~(LISTE_PAD_OK);
recalcule_pad_net_code();
}
SPECCTRA_DB db;
bool ok = true;
wxString errorText;
......@@ -172,8 +165,8 @@ static POINT mapPt( const wxPoint& pt )
/**
* Function findPOINT
* searches the list of POINT_PAIRS for a matching end to the given POINT.
* @return int - 0 if no match, or + one based index of a POINT_PAIR with a matching ".start",
* or a - one based index of a POINT_PAIR with a matching ".end".
* @return int - 0 if no match, or positive one based index of a POINT_PAIR with a matching ".start",
* or a negated one based index of a POINT_PAIR with a matching ".end".
*/
static int findPOINT( const POINT& pt, const POINT_PAIR source[], int count )
{
......
......@@ -34,17 +34,113 @@
#include "specctra.h"
#include "common.h" // IsOK() & EDA_FileSelector()
using namespace DSN;
void WinEDA_PcbFrame::ImportSpecctraDesign( wxCommandEvent& event )
{
if( !Clear_Pcb( true ) )
return;
}
void WinEDA_PcbFrame::ImportSpecctraSession( wxCommandEvent& event )
{
if( GetScreen()->IsModify() )
{
if( !IsOK( this, _( "Board Modified: Continue ?" ) ) )
return;
}
wxString sessionExt( wxT( ".ses" ) );
wxString fileName = GetScreen()->m_FileName;
wxString mask = wxT( "*" ) + sessionExt;
ChangeFileNameExt( fileName, sessionExt );
fileName = EDA_FileSelector( _( "Merge Specctra Session file:" ),
wxEmptyString,
fileName,
sessionExt,
mask,
this,
wxFD_OPEN,
FALSE );
if( fileName == wxEmptyString )
return;
SPECCTRA_DB db;
try
{
db.LoadSESSION( fileName );
db.FromSESSION( m_Pcb );
}
catch( IOError ioe )
{
DisplayError( this, ioe.errorText );
return;
}
m_SelTrackWidthBox_Changed = TRUE;
m_SelViaSizeBox_Changed = TRUE;
GetScreen()->SetModify();
m_Pcb->m_Status_Pcb = 0;
Affiche_Message( wxString( _("Session file imported and merged OK.")) );
DrawPanel->Refresh( TRUE );
}
namespace DSN {
// no UI code in this function, throw exception to report problems to the
// UI handler: void WinEDA_PcbFrame::ImportSpecctraSession( wxCommandEvent& event )
void SPECCTRA_DB::FromSESSION( BOARD* aBoard ) throw( IOError )
{
wxASSERT( session );
// delete all the old tracks and vias
aBoard->m_Track->DeleteStructList();
aBoard->m_Track = NULL;
aBoard->m_NbSegmTrack = 0;
aBoard->DeleteMARKERs();
if( !session->placement )
ThrowIOError( _("Session file is missing the \"placement\" section") );
if( !session->route )
ThrowIOError( _("Session file is missing the \"routes\" section") );
if( !session->route->library )
ThrowIOError( _("Session file is missing the \"library_out\" section") );
// Walk the PLACEMENT object's components list.
COMPONENTS& components = session->placement->components;
for( COMPONENTS::iterator i=components.begin(); i!=components.end(); ++i )
{
// reposition and re-orient each component and put on correct side of the board.
}
// Walk the NET_OUTs and create tracks and vias anew.
NET_OUTS& net_outs = session->route->net_outs;
for( NET_OUTS::iterator i=net_outs.begin(); i!=net_outs.end(); ++i )
{
// create a track or via and position it.
}
}
} // namespace DSN
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