/* * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2020 Jon Evans * Copyright (C) 2020-2022 KiCad Developers, see AUTHORS.txt for contributors. * * 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 using namespace std::placeholders; PARAM_LAYER_PRESET::PARAM_LAYER_PRESET( const std::string& aPath, std::vector* aPresetList ) : PARAM_LAMBDA( aPath, std::bind( &PARAM_LAYER_PRESET::presetsToJson, this ), std::bind( &PARAM_LAYER_PRESET::jsonToPresets, this, _1 ), {} ), m_presets( aPresetList ) { wxASSERT( aPresetList ); } nlohmann::json PARAM_LAYER_PRESET::presetsToJson() { nlohmann::json ret = nlohmann::json::array(); for( const LAYER_PRESET& preset : *m_presets ) { nlohmann::json js = { { "name", preset.name }, { "activeLayer", preset.activeLayer } }; nlohmann::json layers = nlohmann::json::array(); for( PCB_LAYER_ID layer : preset.layers.Seq() ) layers.push_back( static_cast( layer ) ); js["layers"] = layers; nlohmann::json renderLayers = nlohmann::json::array(); for( GAL_LAYER_ID layer : preset.renderLayers.Seq() ) renderLayers.push_back( static_cast( layer ) ); js["renderLayers"] = renderLayers; ret.push_back( js ); } return ret; } void PARAM_LAYER_PRESET::jsonToPresets( const nlohmann::json& aJson ) { if( aJson.empty() || !aJson.is_array() ) return; m_presets->clear(); for( const nlohmann::json& preset : aJson ) { if( preset.contains( "name" ) ) { LAYER_PRESET p( preset.at( "name" ).get() ); if( preset.contains( "activeLayer" ) && preset.at( "activeLayer" ).is_number_integer() ) { int active = preset.at( "activeLayer" ).get(); if( active >= 0 && active < PCB_LAYER_ID_COUNT ) p.activeLayer = static_cast( active ); } if( preset.contains( "layers" ) && preset.at( "layers" ).is_array() ) { p.layers.reset(); for( const nlohmann::json& layer : preset.at( "layers" ) ) { if( layer.is_number_integer() ) { int layerNum = layer.get(); if( layerNum >= 0 && layerNum < PCB_LAYER_ID_COUNT ) p.layers.set( layerNum ); } } } if( preset.contains( "renderLayers" ) && preset.at( "renderLayers" ).is_array() ) { p.renderLayers.reset(); for( const nlohmann::json& layer : preset.at( "renderLayers" ) ) { if( layer.is_number_integer() ) { int layerNum = layer.get(); if( layerNum >= GAL_LAYER_ID_START && layerNum < GAL_LAYER_ID_END ) p.renderLayers.set( static_cast( layerNum ) ); } } } m_presets->emplace_back( p ); } } } PARAM_VIEWPORT::PARAM_VIEWPORT( const std::string& aPath, std::vector* aViewportList ) : PARAM_LAMBDA( aPath, std::bind( &PARAM_VIEWPORT::viewportsToJson, this ), std::bind( &PARAM_VIEWPORT::jsonToViewports, this, _1 ), {} ), m_viewports( aViewportList ) { wxASSERT( aViewportList ); } nlohmann::json PARAM_VIEWPORT::viewportsToJson() { nlohmann::json ret = nlohmann::json::array(); for( const VIEWPORT& viewport : *m_viewports ) { nlohmann::json js = { { "name", viewport.name }, { "x", viewport.rect.GetX() }, { "y", viewport.rect.GetY() }, { "w", viewport.rect.GetWidth() }, { "h", viewport.rect.GetHeight() } }; ret.push_back( js ); } return ret; } void PARAM_VIEWPORT::jsonToViewports( const nlohmann::json& aJson ) { if( aJson.empty() || !aJson.is_array() ) return; m_viewports->clear(); for( const nlohmann::json& viewport : aJson ) { if( viewport.contains( "name" ) ) { VIEWPORT v( viewport.at( "name" ).get() ); if( viewport.contains( "x" ) ) v.rect.SetX( viewport.at( "x" ).get() ); if( viewport.contains( "y" ) ) v.rect.SetY( viewport.at( "y" ).get() ); if( viewport.contains( "w" ) ) v.rect.SetWidth( viewport.at( "w" ).get() ); if( viewport.contains( "h" ) ) v.rect.SetHeight( viewport.at( "h" ).get() ); m_viewports->emplace_back( v ); } } } PARAM_VIEWPORT3D::PARAM_VIEWPORT3D( const std::string& aPath, std::vector* aViewportList ) : PARAM_LAMBDA( aPath, std::bind( &PARAM_VIEWPORT3D::viewportsToJson, this ), std::bind( &PARAM_VIEWPORT3D::jsonToViewports, this, _1 ), {} ), m_viewports( aViewportList ) { wxASSERT( aViewportList ); } nlohmann::json PARAM_VIEWPORT3D::viewportsToJson() { nlohmann::json ret = nlohmann::json::array(); for( const VIEWPORT3D& viewport : *m_viewports ) { nlohmann::json js = { { "name", viewport.name }, { "xx", viewport.matrix[0].x }, { "xy", viewport.matrix[0].y }, { "xz", viewport.matrix[0].z }, { "xw", viewport.matrix[0].w }, { "yx", viewport.matrix[1].x }, { "yy", viewport.matrix[1].y }, { "yz", viewport.matrix[1].z }, { "yw", viewport.matrix[1].w }, { "zx", viewport.matrix[2].x }, { "zy", viewport.matrix[2].y }, { "zz", viewport.matrix[2].z }, { "zw", viewport.matrix[2].w }, { "wx", viewport.matrix[3].x }, { "wy", viewport.matrix[3].y }, { "wz", viewport.matrix[3].z }, { "ww", viewport.matrix[3].w } }; ret.push_back( js ); } return ret; } void PARAM_VIEWPORT3D::jsonToViewports( const nlohmann::json& aJson ) { if( aJson.empty() || !aJson.is_array() ) return; m_viewports->clear(); for( const nlohmann::json& viewport : aJson ) { if( viewport.contains( "name" ) ) { VIEWPORT3D v( viewport.at( "name" ).get() ); if( viewport.contains( "xx" ) ) v.matrix[0].x = viewport.at( "xx" ).get(); if( viewport.contains( "xy" ) ) v.matrix[0].y = viewport.at( "xy" ).get(); if( viewport.contains( "xz" ) ) v.matrix[0].z = viewport.at( "xz" ).get(); if( viewport.contains( "xw" ) ) v.matrix[0].w = viewport.at( "xw" ).get(); if( viewport.contains( "yx" ) ) v.matrix[1].x = viewport.at( "yx" ).get(); if( viewport.contains( "yy" ) ) v.matrix[1].y = viewport.at( "yy" ).get(); if( viewport.contains( "yz" ) ) v.matrix[1].z = viewport.at( "yz" ).get(); if( viewport.contains( "yw" ) ) v.matrix[1].w = viewport.at( "yw" ).get(); if( viewport.contains( "zx" ) ) v.matrix[2].x = viewport.at( "zx" ).get(); if( viewport.contains( "zy" ) ) v.matrix[2].y = viewport.at( "zy" ).get(); if( viewport.contains( "zz" ) ) v.matrix[2].z = viewport.at( "zz" ).get(); if( viewport.contains( "zw" ) ) v.matrix[2].w = viewport.at( "zw" ).get(); if( viewport.contains( "wx" ) ) v.matrix[3].x = viewport.at( "wx" ).get(); if( viewport.contains( "wy" ) ) v.matrix[3].y = viewport.at( "wy" ).get(); if( viewport.contains( "wz" ) ) v.matrix[3].z = viewport.at( "wz" ).get(); if( viewport.contains( "ww" ) ) v.matrix[3].w = viewport.at( "ww" ).get(); m_viewports->emplace_back( v ); } } }