/* * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2020 CERN * @author Jon Evans * * 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 . */ #include #include // Netclasses were originally only stored in board files. The IU context is PCBNEW. #ifndef PCBNEW #define PCBNEW #endif #include const int netSettingsSchemaVersion = 0; NET_SETTINGS::NET_SETTINGS( JSON_SETTINGS* aParent, const std::string& aPath ) : NESTED_SETTINGS( "net_settings", netSettingsSchemaVersion, aParent, aPath ), m_NetClasses() { m_params.emplace_back( new PARAM_LAMBDA( "classes", [&]() -> nlohmann::json { nlohmann::json ret = nlohmann::json::array(); NETCLASSPTR netclass = m_NetClasses.GetDefault(); NETCLASSES::const_iterator nc = m_NetClasses.begin(); for( unsigned int idx = 0; idx <= m_NetClasses.GetCount(); idx++ ) { if( idx > 0 ) { netclass = nc->second; ++nc; } nlohmann::json netJson = { { "name", netclass->GetName().ToUTF8() }, { "clearance", Iu2Millimeter( netclass->GetClearance() ) }, { "track_width", Iu2Millimeter( netclass->GetTrackWidth() ) }, { "via_diameter", Iu2Millimeter( netclass->GetViaDiameter() ) }, { "via_drill", Iu2Millimeter( netclass->GetViaDrill() ) }, { "microvia_diameter", Iu2Millimeter( netclass->GetuViaDiameter() ) }, { "microvia_drill", Iu2Millimeter( netclass->GetuViaDrill() ) }, { "diff_pair_width", Iu2Millimeter( netclass->GetDiffPairWidth() ) }, { "diff_pair_gap", Iu2Millimeter( netclass->GetDiffPairGap() ) }, { "diff_pair_via_gap", Iu2Millimeter( netclass->GetDiffPairViaGap() ) } }; nlohmann::json nets = nlohmann::json::array(); for( NETCLASS::const_iterator i = netclass->begin(); i != netclass->end(); ++i ) if( !i->empty() ) nets.push_back( std::string( i->ToUTF8() ) ); netJson["nets"] = nets; ret.push_back( netJson ); } return ret; }, [&]( const nlohmann::json& aJson ) { if( !aJson.is_array() ) return; m_NetClasses.Clear(); NETCLASSPTR netclass; NETCLASSPTR defaultClass = m_NetClasses.GetDefault(); auto get = []( const nlohmann::json& aObj, const std::string& aKey, int aDefault ) { if( aObj.contains( aKey ) ) return Millimeter2iu( aObj[aKey].get() ); else return aDefault; }; for( const nlohmann::json& entry : aJson ) { if( !entry.is_object() || !entry.contains( "name" ) ) continue; wxString name = entry["name"]; if( name == defaultClass->GetName() ) netclass = defaultClass; else netclass = std::make_shared( name ); netclass->SetClearance( get( entry, "clearance", netclass->GetClearance() ) ); netclass->SetTrackWidth( get( entry, "track_width", netclass->GetTrackWidth() ) ); netclass->SetViaDiameter( get( entry, "via_diameter", netclass->GetViaDiameter() ) ); netclass->SetViaDrill( get( entry, "via_drill", netclass->GetViaDrill() ) ); netclass->SetuViaDiameter( get( entry, "microvia_diameter", netclass->GetuViaDiameter() ) ); netclass->SetuViaDrill( get( entry, "microvia_drill", netclass->GetuViaDrill() ) ); netclass->SetDiffPairWidth( get( entry, "diff_pair_width", netclass->GetDiffPairWidth() ) ); netclass->SetDiffPairGap( get( entry, "diff_pair_gap", netclass->GetDiffPairGap() ) ); netclass->SetDiffPairViaGap( get( entry, "diff_pair_via_gap", netclass->GetDiffPairViaGap() ) ); if( netclass != defaultClass ) m_NetClasses.Add( netclass ); } }, {} ) ); } NET_SETTINGS::~NET_SETTINGS() { // Release early before destroying members if( m_parent ) { m_parent->ReleaseNestedSettings( this ); m_parent = nullptr; } }