2012-04-07 18:05:56 +00:00
|
|
|
#ifndef LEGACY_PLUGIN_H_
|
|
|
|
#define LEGACY_PLUGIN_H_
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
|
|
*
|
2012-04-17 14:18:14 +00:00
|
|
|
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
2021-01-27 22:15:38 +00:00
|
|
|
* Copyright (C) 2016-2021 KiCad Developers, see AUTHORS.txt for contributors.
|
2012-04-07 18:05:56 +00:00
|
|
|
*
|
|
|
|
* 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
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <io_mgr.h>
|
|
|
|
#include <string>
|
2014-06-24 16:17:18 +00:00
|
|
|
#include <layers_id_colors_and_visibility.h>
|
2016-06-29 15:09:55 +00:00
|
|
|
#include <memory>
|
|
|
|
|
2012-04-17 01:35:43 +00:00
|
|
|
|
2016-05-10 19:07:35 +00:00
|
|
|
// FOOTPRINT_LIBRARY_HEADER_CNT gives the number of characters to compare to detect
|
|
|
|
// a footprint library. A few variants may have been used, and so we can only be
|
|
|
|
// sure that the header contains "PCBNEW-LibModule-V", not "PCBNEW-LibModule-V1".
|
2016-06-29 15:09:55 +00:00
|
|
|
|
2012-04-17 01:35:43 +00:00
|
|
|
#define FOOTPRINT_LIBRARY_HEADER "PCBNEW-LibModule-V1"
|
2016-05-10 19:07:35 +00:00
|
|
|
#define FOOTPRINT_LIBRARY_HEADER_CNT 18
|
2012-04-07 18:05:56 +00:00
|
|
|
|
|
|
|
class PCB_TARGET;
|
2020-11-13 15:15:52 +00:00
|
|
|
class FOOTPRINT;
|
2012-04-07 18:05:56 +00:00
|
|
|
class TRACK;
|
|
|
|
class NETCLASS;
|
2012-04-17 02:58:03 +00:00
|
|
|
class NETCLASSES;
|
2020-11-11 23:05:59 +00:00
|
|
|
class ZONE;
|
|
|
|
class DIMENSION_BASE;
|
2012-04-07 18:05:56 +00:00
|
|
|
class NETINFO_ITEM;
|
Added NETINFO_MAPPING, to ease saving nets with consecutive net codes (without modifying the net codes during the run time).
Now, nets are saved with consecutive net codes (both modern & legacy plugins).
Zones are saved together with their nets, without depending on the fact if there are any pads with such net. Therefore validation of zone net names was removed (pcbnew/class_board.cpp).
Performed tests:
- Changed a pad's net name from empty to existent - ok, name was changed.
- Changed a pad's net name from empty to nonexistent - ok, error message is displayed, net name stays empty.
- Changed a pad's net name from existent to empty - ok, net name became empty
- Changed a pad's net name from existent to nonexistent - ok, error message is displayed, net name is not changed.
- Drawn a zone that belongs to a net, then modified schematics so the net does not exist anymore. After reloading the net list, all pads/tracks are updated. Zones still belongs to the net that does not exist in the schematic (but still exists in .kicad_pcb file). After running DRC, the zone becomes not filled.
- Undo & redo affects assignment of a polygon to a specific net (you may change net of a polygon, refill it and undo/redo the changes).
- KiCad s-expr & legacy, Eagle, P-CAD boards seem to load without any problem (they also contain correct net names assigned to the appropriate pads). All types of board file formats were loaded, then saved in sexpr format and reopened with a KiCad built from the master branch (without my modifications).
- A few boards were also saved using the legacy format and were opened with the master KiCad without any issues.
- Change a net name for a pad, restore with undo/redo - ok
- Remove everything, restore with undo - ok
- Remove everything, reload netlist - ok
Differences observed between files saved by the master branch KiCad and this one:
- list of nets are not saved in any particular order, so net codes may differ
- the default net class does not contain the unconnected net
2014-01-28 09:19:51 +00:00
|
|
|
class NETINFO_MAPPING;
|
2020-10-04 23:34:59 +00:00
|
|
|
class FP_TEXT;
|
2012-04-07 18:05:56 +00:00
|
|
|
class TRACK;
|
2020-11-12 22:30:02 +00:00
|
|
|
class PAD;
|
2013-09-22 04:38:22 +00:00
|
|
|
struct LP_CACHE;
|
2012-04-16 03:18:41 +00:00
|
|
|
|
2012-04-07 18:05:56 +00:00
|
|
|
|
|
|
|
/**
|
2020-12-18 15:40:13 +00:00
|
|
|
* A #PLUGIN derivation which could possibly be put into a DLL/DSO.
|
2021-01-27 22:15:38 +00:00
|
|
|
*
|
2012-04-17 06:13:22 +00:00
|
|
|
* As with any PLUGIN, there is no UI, i.e. windowing calls allowed.
|
2012-04-07 18:05:56 +00:00
|
|
|
*/
|
|
|
|
class LEGACY_PLUGIN : public PLUGIN
|
|
|
|
{
|
2014-06-24 16:17:18 +00:00
|
|
|
friend struct LP_CACHE;
|
2012-04-07 18:05:56 +00:00
|
|
|
|
2014-06-24 16:17:18 +00:00
|
|
|
public:
|
2020-12-04 12:13:11 +00:00
|
|
|
LEGACY_PLUGIN();
|
|
|
|
~LEGACY_PLUGIN();
|
2012-05-20 13:14:46 +00:00
|
|
|
|
2016-09-25 17:06:49 +00:00
|
|
|
const wxString PluginName() const override
|
2012-04-07 18:05:56 +00:00
|
|
|
{
|
2013-11-27 06:04:04 +00:00
|
|
|
return wxT( "KiCad-Legacy" );
|
2012-04-07 18:05:56 +00:00
|
|
|
}
|
|
|
|
|
2016-09-25 17:06:49 +00:00
|
|
|
const wxString GetFileExtension() const override
|
2012-04-07 18:05:56 +00:00
|
|
|
{
|
2013-11-27 06:04:04 +00:00
|
|
|
return wxT( "brd" );
|
2012-04-07 18:05:56 +00:00
|
|
|
}
|
|
|
|
|
2016-05-10 19:07:35 +00:00
|
|
|
BOARD* Load( const wxString& aFileName, BOARD* aAppendToMe,
|
2020-12-18 15:40:13 +00:00
|
|
|
const PROPERTIES* aProperties = nullptr, PROJECT* aProject = nullptr ) override;
|
2012-04-07 18:05:56 +00:00
|
|
|
|
2017-06-11 20:20:44 +00:00
|
|
|
void FootprintEnumerate( wxArrayString& aFootprintNames, const wxString& aLibraryPath,
|
2020-12-18 15:40:13 +00:00
|
|
|
bool aBestEfforts, const PROPERTIES* aProperties = nullptr ) override;
|
2014-06-24 16:17:18 +00:00
|
|
|
|
2020-11-13 15:15:52 +00:00
|
|
|
FOOTPRINT* FootprintLoad( const wxString& aLibraryPath, const wxString& aFootprintName,
|
2020-12-18 15:40:13 +00:00
|
|
|
const PROPERTIES* aProperties = nullptr ) override;
|
2012-04-17 01:35:43 +00:00
|
|
|
|
2017-06-11 20:20:44 +00:00
|
|
|
bool FootprintLibDelete( const wxString& aLibraryPath,
|
2020-12-18 15:40:13 +00:00
|
|
|
const PROPERTIES* aProperties = nullptr ) override;
|
2012-04-17 01:35:43 +00:00
|
|
|
|
2018-03-04 01:13:09 +00:00
|
|
|
long long GetLibraryTimestamp( const wxString& aLibraryPath ) const override;
|
2018-03-02 20:41:37 +00:00
|
|
|
|
2016-09-24 18:53:15 +00:00
|
|
|
bool IsFootprintLibWritable( const wxString& aLibraryPath ) override;
|
2012-04-16 03:18:41 +00:00
|
|
|
|
2020-12-04 12:13:11 +00:00
|
|
|
typedef int BIU;
|
2012-04-16 03:18:41 +00:00
|
|
|
|
|
|
|
void SetReader( LINE_READER* aReader ) { m_reader = aReader; }
|
2012-04-17 02:58:03 +00:00
|
|
|
|
2015-07-25 11:16:05 +00:00
|
|
|
// return the new .kicad_pcb layer id from the old (legacy) layer id
|
2017-03-13 03:19:33 +00:00
|
|
|
static PCB_LAYER_ID leg_layer2new( int cu_count, LAYER_NUM aLayerNum );
|
2015-07-25 11:16:05 +00:00
|
|
|
|
2020-12-04 12:13:11 +00:00
|
|
|
static LSET leg_mask2new( int cu_count, unsigned aMask );
|
2012-04-07 18:05:56 +00:00
|
|
|
|
|
|
|
protected:
|
2021-01-27 22:15:38 +00:00
|
|
|
///< Converts net code using the mapping table if available,
|
|
|
|
///< otherwise returns unchanged net code
|
2014-06-03 07:32:57 +00:00
|
|
|
inline int getNetCode( int aNetCode )
|
|
|
|
{
|
2016-10-11 14:00:43 +00:00
|
|
|
if( (unsigned int) aNetCode < m_netCodes.size() )
|
2014-06-03 07:32:57 +00:00
|
|
|
return m_netCodes[aNetCode];
|
|
|
|
|
|
|
|
return aNetCode;
|
|
|
|
}
|
|
|
|
|
2012-04-07 18:05:56 +00:00
|
|
|
/**
|
2020-12-18 15:40:13 +00:00
|
|
|
* Parse an ASCII decimal floating point value and scales it into a BIU according to the
|
|
|
|
* current value of diskToBui.
|
2012-04-07 18:05:56 +00:00
|
|
|
*
|
2021-01-27 22:15:38 +00:00
|
|
|
* This function is the complement of #fmtBIU(). One has to know what the other is doing.
|
2012-04-07 18:05:56 +00:00
|
|
|
*
|
2020-12-18 15:40:13 +00:00
|
|
|
* @param aValue is the ASCII value in C locale form with possible leading whitespace
|
|
|
|
* @param nptrptr may be NULL, but if not, then it tells where to put a pointer to the
|
|
|
|
* next unconsumed input text. See "man strtod" for more information.
|
|
|
|
* @return the converted Board Internal Unit.
|
2012-04-07 18:05:56 +00:00
|
|
|
*/
|
2020-12-18 15:40:13 +00:00
|
|
|
BIU biuParse( const char* aValue, const char** nptrptr = nullptr );
|
2012-04-07 18:05:56 +00:00
|
|
|
|
|
|
|
/**
|
2020-12-18 15:40:13 +00:00
|
|
|
* Parse an ASCII decimal floating point value which is certainly an angle.
|
|
|
|
*
|
|
|
|
* This is a dedicated function for encapsulating support for the migration from
|
2012-04-07 18:05:56 +00:00
|
|
|
* tenths of degrees to degrees in floating point. This function is the complement of
|
|
|
|
* fmtDEG(). One has to know what the other is doing.
|
|
|
|
*
|
2020-12-18 15:40:13 +00:00
|
|
|
* @param aValue is the ASCII value in C locale form with possible leading whitespace.
|
|
|
|
* @param nptrptr may be NULL, but if not, then it tells where to put a pointer to the
|
|
|
|
* next unconsumed input text. See "man strtod" for more information.
|
|
|
|
* @return the string converted to a primitive double type
|
2012-04-07 18:05:56 +00:00
|
|
|
*/
|
2020-12-18 15:40:13 +00:00
|
|
|
double degParse( const char* aValue, const char** nptrptr = nullptr );
|
2012-04-07 18:05:56 +00:00
|
|
|
|
|
|
|
void checkVersion();
|
|
|
|
|
|
|
|
void loadAllSections( bool doAppend );
|
|
|
|
|
2012-04-16 03:18:41 +00:00
|
|
|
|
2012-04-07 18:05:56 +00:00
|
|
|
void loadGENERAL();
|
|
|
|
void loadSETUP();
|
|
|
|
void loadSHEET();
|
|
|
|
|
2020-11-13 15:15:52 +00:00
|
|
|
void load3D( FOOTPRINT* aFootprint );
|
|
|
|
void loadPAD( FOOTPRINT* aFootprint );
|
2020-10-04 23:34:59 +00:00
|
|
|
void loadMODULE_TEXT( FP_TEXT* aText );
|
2020-11-13 15:15:52 +00:00
|
|
|
void loadFP_SHAPE( FOOTPRINT* aFootprint );
|
2012-04-07 18:05:56 +00:00
|
|
|
|
|
|
|
void loadPCB_LINE();
|
|
|
|
void loadNETINFO_ITEM();
|
|
|
|
void loadPCB_TEXT();
|
|
|
|
void loadNETCLASS();
|
2020-11-13 15:15:52 +00:00
|
|
|
void loadFOOTPRINT( FOOTPRINT* aFootprint );
|
2012-04-07 18:05:56 +00:00
|
|
|
|
|
|
|
/**
|
2020-12-18 15:40:13 +00:00
|
|
|
* Read a list of segments (Tracks and Vias, or Segzones)
|
2012-04-07 18:05:56 +00:00
|
|
|
*
|
2019-04-10 09:19:16 +00:00
|
|
|
* @param aStructType is either PCB_TRACE_T to indicate tracks and vias, or NOT_USED
|
|
|
|
* to indicate oldschool zone segments (which are discarded).
|
2012-04-07 18:05:56 +00:00
|
|
|
*/
|
2012-06-10 00:39:40 +00:00
|
|
|
void loadTrackList( int aStructType );
|
2012-04-07 18:05:56 +00:00
|
|
|
|
|
|
|
void loadZONE_CONTAINER(); // "$CZONE_OUTLINE"
|
|
|
|
void loadDIMENSION(); // "$COTATION"
|
|
|
|
void loadPCB_TARGET(); // "$PCB_TARGET"
|
|
|
|
|
2012-04-16 03:18:41 +00:00
|
|
|
/// we only cache one footprint library for now, this determines which one.
|
|
|
|
void cacheLib( const wxString& aLibraryPath );
|
2020-12-04 12:13:11 +00:00
|
|
|
|
|
|
|
protected:
|
|
|
|
int m_cu_count;
|
|
|
|
|
|
|
|
wxString m_error; ///< for throwing exceptions
|
|
|
|
BOARD* m_board; ///< which BOARD, no ownership here
|
|
|
|
const PROPERTIES* m_props; ///< passed via Save() or Load(), no ownership, may be NULL.
|
|
|
|
|
|
|
|
LINE_READER* m_reader; ///< no ownership here.
|
|
|
|
FILE* m_fp; ///< no ownership here.
|
|
|
|
|
|
|
|
wxString m_field; ///< reused to stuff FOOTPRINT fields.
|
|
|
|
int m_loading_format_version; ///< which BOARD_FORMAT_VERSION am I Load()ing?
|
|
|
|
LP_CACHE* m_cache;
|
|
|
|
bool m_showLegacyZoneWarning;
|
|
|
|
|
|
|
|
NETINFO_MAPPING* m_mapping; ///< mapping for net codes, so only not empty nets
|
|
|
|
///< are stored with consecutive integers as net codes
|
|
|
|
std::vector<int> m_netCodes; ///< net codes mapping for boards being loaded
|
|
|
|
|
|
|
|
/// initialize PLUGIN like a constructor would, and futz with fresh BOARD if needed.
|
|
|
|
void init( const PROPERTIES* aProperties );
|
|
|
|
|
|
|
|
double biuToDisk; ///< convert from BIUs to disk engineering units
|
|
|
|
///< with this scale factor
|
|
|
|
|
|
|
|
double diskToBiu; ///< convert from disk engineering units to BIUs
|
|
|
|
///< with this scale factor
|
2012-04-07 18:05:56 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // LEGACY_PLUGIN_H_
|