7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2024-11-25 09:25:01 +00:00
kicad/pcbnew/pcb_io/odbpp/odb_attribute.cpp
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

102 lines
2.8 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/>.
*/
#include "odb_attribute.h"
#include <sstream>
#include <iomanip>
size_t ATTR_MANAGER::GetTextIndex( std::unordered_map<std::string, size_t>& aMap,
std::vector<std::pair<size_t, std::string>>& aVec,
const std::string& aText )
{
if( aMap.count( aText ) )
{
return aMap.at( aText );
}
else
{
auto index = aMap.size();
aMap.emplace( aText, index );
aVec.emplace_back( index, aText );
return index;
}
}
size_t ATTR_MANAGER::GetAttrNameNumber( const wxString& aName )
{
return GetTextIndex( m_attrNames, m_attrNameVec, aName.Lower().ToStdString() );
}
size_t ATTR_MANAGER::GetAttrTextNumber( const wxString& aText )
{
return GetTextIndex( m_attrTexts, m_attrTextVec, aText.Upper().ToStdString() );
}
void ATTR_RECORD_WRITER::WriteAttributes( std::ostream& ost ) const
{
ODB::CHECK_ONCE once;
for( const auto& attr : attributes )
{
if( once() )
ost << ";";
else
ost << ",";
ost << attr.first;
if( attr.second.size() )
ost << "=" << attr.second;
}
ost << ";";
}
void ATTR_MANAGER::WriteAttributesName( std::ostream& ost, const std::string& prefix ) const
{
for( const auto& [n, name] : m_attrNameVec )
{
ost << prefix << "@" << n << " " << name << std::endl;
}
}
void ATTR_MANAGER::WriteAttributesText( std::ostream& ost, const std::string& prefix ) const
{
for( const auto& [n, name] : m_attrTextVec )
{
ost << prefix << "&" << n << " " << name << std::endl;
}
}
void ATTR_MANAGER::WriteAttributes( std::ostream& ost, const std::string& prefix ) const
{
ost << std::endl << "#\n#Feature attribute names\n#" << std::endl;
WriteAttributesName( ost );
ost << std::endl << "#\n#Feature attribute text strings\n#" << std::endl;
WriteAttributesText( ost );
}