mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2024-11-25 09:25:01 +00:00
1506beecbc
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
102 lines
2.8 KiB
C++
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 );
|
|
}
|