KiCad PCB EDA Suite
netlist_exporter_orcadpcb2.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 1992-2013 jp.charras at wanadoo.fr
5  * Copyright (C) 2013 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
6  * Copyright (C) 1992-2017 KiCad Developers, see AUTHORS.TXT for contributors.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, you may find one here:
20  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21  * or you may search the http://www.gnu.org website for the version 2 license,
22  * or you may write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24  */
25 
26 #include <fctsys.h>
27 #include <build_version.h>
28 #include <confirm.h>
29 
30 #include <schframe.h>
31 #include <sch_reference_list.h>
32 #include <class_library.h>
33 #include <class_netlist_object.h>
34 #include <symbol_lib_table.h>
35 
36 #include <netlist.h>
38 
39 
40 bool NETLIST_EXPORTER_ORCADPCB2::WriteNetlist( const wxString& aOutFileName,
41  unsigned aNetlistOptions )
42 {
43  (void)aNetlistOptions; //unused
44  FILE* f = NULL;
45  wxString field;
46  wxString footprint;
47  int ret = 0; // zero now, OR in the sign bit on error
48  wxString netName;
49 
50 
51  if( ( f = wxFopen( aOutFileName, wxT( "wt" ) ) ) == NULL )
52  {
53  wxString msg;
54  msg.Printf( _( "Failed to create file '%s'" ),
55  GetChars( aOutFileName ) );
56  DisplayError( NULL, msg );
57  return false;
58  }
59 
60  std::vector< SCH_REFERENCE > cmpList;
61 
62  ret |= fprintf( f, "( { %s created %s }\n",
64 
65  // Prepare list of nets generation
66  for( unsigned ii = 0; ii < m_masterList->size(); ii++ )
67  m_masterList->GetItem( ii )->m_Flag = 0;
68 
69  // Create netlist module section
71 
72  SCH_SHEET_LIST sheetList( g_RootSheet );
73 
74  for( unsigned i = 0; i < sheetList.size(); i++ )
75  {
76  for( EDA_ITEM* item = sheetList[i].LastDrawList(); item; item = item->Next() )
77  {
78  SCH_COMPONENT* comp = findNextComponentAndCreatePinList( item, &sheetList[i] );
79 
80  if( !comp )
81  break;
82 
83  item = comp;
84 
85  PART_SPTR part = comp->GetPartRef().lock();
86 
87  if( part )
88  {
89  if( part->GetFootPrints().GetCount() != 0 ) // Put in list
90  {
91  cmpList.push_back( SCH_REFERENCE( comp, part.get(), sheetList[i] ) );
92  }
93  }
94 
95  if( !comp->GetField( FOOTPRINT )->IsVoid() )
96  {
97  footprint = comp->GetField( FOOTPRINT )->GetText();
98  footprint.Replace( wxT( " " ), wxT( "_" ) );
99  }
100  else
101  footprint = wxT( "$noname" );
102 
103  field = comp->GetRef( &sheetList[i] );
104 
105  ret |= fprintf( f, " ( %s %s",
106  TO_UTF8( comp->GetPath( &sheetList[i] ) ),
107  TO_UTF8( footprint ) );
108 
109  ret |= fprintf( f, " %s", TO_UTF8( field ) );
110 
111  field = comp->GetField( VALUE )->GetText();
112  field.Replace( wxT( " " ), wxT( "_" ) );
113  ret |= fprintf( f, " %s", TO_UTF8( field ) );
114 
115  ret |= fprintf( f, "\n" );
116 
117  // Write pin list:
118  for( unsigned ii = 0; ii < m_SortedComponentPinList.size(); ii++ )
119  {
121 
122  if( !pin )
123  continue;
124 
125  sprintPinNetName( netName, wxT( "N-%.6d" ), pin );
126 
127  if( netName.IsEmpty() )
128  netName = wxT( "?" );
129 
130  netName.Replace( wxT( " " ), wxT( "_" ) );
131 
132  ret |= fprintf( f, " ( %4.4s %s )\n", (char*) &pin->m_PinNum,
133  TO_UTF8( netName ) );
134  }
135 
136  ret |= fprintf( f, " )\n" );
137  }
138  }
139 
140  ret |= fprintf( f, ")\n*\n" );
141 
142  fclose( f );
143 
144  m_SortedComponentPinList.clear();
145  return ret >= 0;
146 }
Class SCH_SHEET_LIST.
#define NETLIST_HEAD_STRING
Definition: netlist.h:50
PART_REF & GetPartRef()
wxString GetPath(const SCH_SHEET_PATH *sheet) const
UNIQUE_STRINGS m_ReferencesAlreadyFound
Used for "multi parts per package" components, avoids processing a lib component more than once...
NETLIST_OBJECT * GetItem(unsigned aIdx) const
Acces to an item in list.
This file is part of the common library.
static void sprintPinNetName(wxString &aResult, const wxString &aNetNameFormat, NETLIST_OBJECT *aPin, bool aUseNetcodeAsNetName=false)
Function sprintPinNetName formats the net name for aPin using aNetNameFormat into aResult...
bool IsVoid() const
Function IsVoid returns true if the field is either empty or holds "~".
Definition: sch_field.h:116
void Clear()
Function Clear erases the record.
NETLIST_OBJECT_LIST * m_masterList
Field Name Module PCB, i.e. "16DIP300".
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes...
Definition: macros.h:47
SCH_SHEET * g_RootSheet
Definition: eeschema.cpp:55
SCH_FIELD * GetField(int aFieldNdx) const
Returns a field in this symbol.
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:130
std::shared_ptr< LIB_PART > PART_SPTR
shared pointer to LIB_PART
SCH_COMPONENT * findNextComponentAndCreatePinList(EDA_ITEM *aItem, SCH_SHEET_PATH *aSheetPath)
Function findNextComponentAndCreatePinList finds a component from the DrawList and builds its pin lis...
const wxString GetRef(const SCH_SHEET_PATH *aSheet)
Return the reference for the given sheet path.
Definition of the NETLIST_OBJECT class.
Field Value of part, i.e. "3.3K".
NETLIST_OBJECTS m_SortedComponentPinList
yes ownership, connected items flat list
static const wxChar * GetChars(const wxString &s)
Function GetChars returns a wxChar* to the actual wxChar* data within a wxString, and is helpful for ...
Definition: macros.h:92
Class SCH_COMPONENT describes a real schematic component.
Definition: sch_component.h:69
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:165
Definition for part library class.
void DisplayError(wxWindow *parent, const wxString &text, int displaytime)
Function DisplayError displays an error or warning message box with aMessage.
Definition: confirm.cpp:73
Class SCH_REFERENCE is used as a helper to define a component's reference designator in a schematic...
wxString DateAndTime()
Function DateAndTime.
Definition: string.cpp:229
bool WriteNetlist(const wxString &aOutFileName, unsigned aNetlistOptions) override
Function WriteNetlist writes to specified output file.