7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2024-11-25 09:45:01 +00:00
kicad/pcbnew/pcb_io/odbpp/odb_netlist.h
Eric 1506beecbc Implement ODB++ export
ADDED: Add support in Pcbnew for exporting ODB++ files under Fabrication
       Outputs, base on ODB++Design Format Specification (Release v8.1
       Update 3 February 2021).

Note: There is still a lot of work to do if we will make the feature as
      complete as the ODB++ spec.  However, the current functionality's
      completeness is already sufficient to cover general production
      scenarios. I have compared the output results with Gerber files by
      DFM tool and the accuracy at the graphic level should be able to
      cover most usage scenarios.  Additionally, I am very grateful to
      the great open-source project Horizon EDA for giving me a lot of
      inspiration in terms of ideas.

The feature can be enabled by adding "EnableODB=1" to the kicad_advanced
configuration file.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/2019
2024-09-14 15:34:51 +00:00

77 lines
2.6 KiB
C++

/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors.
* Author: SYSUEric <jzzhuang666@gmail.com>.
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*/
#ifndef _ODB_NETLIST_H_
#define _ODB_NETLIST_H_
#include <wx/string.h>
// Structure for holding the ODB net point record.
struct ODB_NET_RECORD
{
bool smd;
bool hole;
bool is_via;
wxString netname;
std::string refdes;
int drill_radius;
bool mechanical;
std::string side; // B: Both, T: Top, D: Down
// All these in PCB units, will be output in decimils
int x_location;
int y_location;
// Width and height of non-drilled pads (only when radius = 0).
int x_size; // Width
int y_size; // Height
// int rotation;
std::string epoint; // e: net end point, m: net mid point
int soldermask; // !< e — Solder mask exposed point. soldermask = 0
// !< c — Solder mask covered point. = 3
// !< p — Solder mask covered point on top side of product model. = 1
// !< s — Solder mask covered point on bottom side of product model. = 2
};
class BOARD;
class ODB_NET_LIST
{
public:
ODB_NET_LIST( BOARD* aBoard ) : m_board( aBoard ) {}
virtual ~ODB_NET_LIST() {}
void Write( std::ostream& aStream );
private:
BOARD* m_board;
std::string ComputePadAccessSide( BOARD* aBoard, LSET aLayerMask );
std::string ComputeViaAccessSide( BOARD* aBoard, int top_layer, int bottom_layer );
void InitPadNetPoints( BOARD* aBoard, std::map<size_t, std::vector<ODB_NET_RECORD>>& aRecords );
void InitViaNetPoints( BOARD* aBoard, std::map<size_t, std::vector<ODB_NET_RECORD>>& aRecords );
/// Writes a list of records to the given output stream
void WriteNetPointRecords( std::map<size_t, std::vector<ODB_NET_RECORD>>& aRecords,
std::ostream& aStream );
};
#endif // _ODB_NETLIST_H_