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-2018 jp.charras at wanadoo.fr
5  * Copyright (C) 2013 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
6  * Copyright (C) 1992-2018 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 <sch_edit_frame.h>
31 #include <sch_reference_list.h>
32 #include <class_library.h>
33 #include <symbol_lib_table.h>
34 
35 #include <netlist.h>
37 
38 
39 bool NETLIST_EXPORTER_ORCADPCB2::WriteNetlist( const wxString& aOutFileName,
40  unsigned aNetlistOptions )
41 {
42  (void)aNetlistOptions; //unused
43  FILE* f = NULL;
44  wxString field;
45  wxString footprint;
46  int ret = 0; // zero now, OR in the sign bit on error
47  wxString netName;
48 
49 
50  if( ( f = wxFopen( aOutFileName, wxT( "wt" ) ) ) == NULL )
51  {
52  wxString msg;
53  msg.Printf( _( "Failed to create file \"%s\"" ),
54  GetChars( aOutFileName ) );
55  DisplayError( NULL, msg );
56  return false;
57  }
58 
59  std::vector< SCH_REFERENCE > cmpList;
60 
61  ret |= fprintf( f, "( { %s created %s }\n",
63 
64  // Prepare list of nets generation
65  for( unsigned ii = 0; ii < m_masterList->size(); ii++ )
66  m_masterList->GetItem( ii )->m_Flag = 0;
67 
68  // Create netlist module section
70 
71  SCH_SHEET_LIST sheetList( g_RootSheet );
72 
73  for( unsigned i = 0; i < sheetList.size(); i++ )
74  {
75  for( EDA_ITEM* item = sheetList[i].LastDrawList(); item; item = item->Next() )
76  {
77  SCH_COMPONENT* comp = findNextComponentAndCreatePinList( item, &sheetList[i] );
78 
79  if( !comp )
80  break;
81 
82  item = comp;
83 
84  PART_SPTR part = comp->GetPartRef().lock();
85 
86  if( part )
87  {
88  if( part->GetFootprints().GetCount() != 0 ) // Put in list
89  {
90  cmpList.push_back( SCH_REFERENCE( comp, part.get(), sheetList[i] ) );
91  }
92  }
93 
94  if( !comp->GetField( FOOTPRINT )->IsVoid() )
95  {
96  footprint = comp->GetField( FOOTPRINT )->GetText();
97  footprint.Replace( wxT( " " ), wxT( "_" ) );
98  }
99  else
100  footprint = wxT( "$noname" );
101 
102  field = comp->GetRef( &sheetList[i] );
103 
104  ret |= fprintf( f, " ( %s %s",
105  TO_UTF8( comp->GetPath( &sheetList[i] ) ),
106  TO_UTF8( footprint ) );
107 
108  ret |= fprintf( f, " %s", TO_UTF8( field ) );
109 
110  field = comp->GetField( VALUE )->GetText();
111  field.Replace( wxT( " " ), wxT( "_" ) );
112  ret |= fprintf( f, " %s", TO_UTF8( field ) );
113 
114  ret |= fprintf( f, "\n" );
115 
116  // Write pin list:
117  for( unsigned ii = 0; ii < m_SortedComponentPinList.size(); ii++ )
118  {
120 
121  if( !pin )
122  continue;
123 
124  sprintPinNetName( netName, wxT( "N-%.6d" ), pin );
125 
126  if( netName.IsEmpty() )
127  netName = wxT( "?" );
128 
129  netName.Replace( wxT( " " ), wxT( "_" ) );
130 
131  ret |= fprintf( f, " ( %4.4s %s )\n", TO_UTF8( pin->m_PinNum ),
132  TO_UTF8( netName ) );
133  }
134 
135  ret |= fprintf( f, " )\n" );
136  }
137  }
138 
139  ret |= fprintf( f, ")\n*\n" );
140 
141  fclose( f );
142 
143  m_SortedComponentPinList.clear();
144  return ret >= 0;
145 }
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:56
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:143
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.
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
size_t i
Definition: json11.cpp:597
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:154
Definition for part library class.
#define VALUE
void DisplayError(wxWindow *parent, const wxString &text, int displaytime)
Function DisplayError displays an error or warning message box with aMessage.
Definition: confirm.cpp:245
Class SCH_REFERENCE is used as a helper to define a component&#39;s reference designator in a schematic...
wxString DateAndTime()
Function DateAndTime.
Definition: string.cpp:306
bool WriteNetlist(const wxString &aOutFileName, unsigned aNetlistOptions) override
Function WriteNetlist writes to specified output file.