/* * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2020-2024 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 2 * 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, you may find one here: * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * or you may search the http://www.gnu.org website for the version 2 license, * or you may write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // For some default values using namespace T_BOMCFG_T; // for the BOM_CFG_PARSER parser and its keywords ///! Update the schema version whenever a migration is required const int eeschemaSchemaVersion = 3; /// Default value for bom.plugins const nlohmann::json defaultBomPlugins = { { { "name", "bom_csv_grouped_extra" }, { "path", "bom_csv_grouped_extra.py" } }, { { "name", "bom_csv_grouped_by_value" }, { "path", "bom_csv_grouped_by_value.py" } }, { { "name", "bom_csv_grouped_by_value_with_fp" }, { "path", "bom_csv_grouped_by_value_with_fp.py" } }, }; const wxAuiPaneInfo& defaultNetNavigatorPaneInfo() { static wxAuiPaneInfo paneInfo; paneInfo.Name( wxS( "NetNavigator" ) ) .Caption( _( "Net Navigator" ) ) .CaptionVisible( true ) .PaneBorder( true ) .Left().Layer( 3 ).Position( 0 ) .TopDockable( false ) .BottomDockable( false ) .CloseButton( false ) .MinSize( 120, 60 ) .BestSize( 200, 200 ) .FloatingSize( 200, 200 ) .FloatingPosition( 50, 200 ) .Show( false ); return paneInfo; } const wxAuiPaneInfo& defaultPropertiesPaneInfo( wxWindow* aWindow ) { static wxAuiPaneInfo paneInfo; paneInfo.Name( EDA_DRAW_FRAME::PropertiesPaneName() ) .Caption( _( "Properties" ) ) .CaptionVisible( true ) .PaneBorder( true ) .Left().Layer( 3 ).Position( 2 ) .TopDockable( false ) .BottomDockable( false ) .CloseButton( false ) .MinSize( aWindow->FromDIP( wxSize( 240, 60 ) ) ) .BestSize( aWindow->FromDIP( wxSize( 300, 200 ) ) ) .FloatingSize( aWindow->FromDIP( wxSize( 300, 400 ) ) ) .FloatingPosition( aWindow->FromDIP( wxPoint( 50, 200 ) ) ) .Show( true ); return paneInfo; } const wxAuiPaneInfo& defaultSchSelectionFilterPaneInfo( wxWindow* aWindow ) { static wxAuiPaneInfo paneInfo; paneInfo.Name( wxS( "SelectionFilter" ) ) .Caption( _( "Selection Filter" ) ) .CaptionVisible( true ) .PaneBorder( false ) .Left().Layer( 3 ).Position( 4 ) .TopDockable( false ) .BottomDockable( false ) .CloseButton( false ) .MinSize( aWindow->FromDIP( wxSize( 180, -1 ) ) ) .BestSize( aWindow->FromDIP( wxSize( 180, -1 ) ) ) .Show( true ); return paneInfo; } EESCHEMA_SETTINGS::EESCHEMA_SETTINGS() : APP_SETTINGS_BASE( "eeschema", eeschemaSchemaVersion ), m_Appearance(), m_AutoplaceFields(), m_Drawing(), m_FindReplaceExtra(), m_Input(), m_PageSettings(), m_AnnotatePanel(), m_BomPanel(), m_FieldEditorPanel(), m_LibViewPanel(), m_NetlistPanel(), m_PlotPanel(), m_SymChooserPanel(), m_ImportGraphics(), m_Selection(), m_Simulator(), m_RescueNeverShow( false ) { m_params.emplace_back( new PARAM( "appearance.edit_symbol_visible_columns", &m_Appearance.edit_symbol_visible_columns, "0 1 2 3 4 5 6 7" ) ); m_params.emplace_back( new PARAM( "appearance.edit_symbol_width", &m_Appearance.edit_symbol_width, -1 ) ); m_params.emplace_back( new PARAM( "appearance.edit_symbol_height", &m_Appearance.edit_symbol_height, -1 ) ); m_params.emplace_back( new PARAM( "appearance.edit_sheet_visible_columns", &m_Appearance.edit_sheet_visible_columns, "0 1 2 3 4 5 6 7" ) ); m_params.emplace_back( new PARAM( "appearance.edit_sheet_width", &m_Appearance.edit_sheet_width, -1 ) ); m_params.emplace_back( new PARAM( "appearance.edit_sheet_height", &m_Appearance.edit_sheet_height, -1 ) ); m_params.emplace_back( new PARAM( "appearance.edit_label_visible_columns", &m_Appearance.edit_label_visible_columns, "0 1 2 3 4 5 6 7" ) ); m_params.emplace_back( new PARAM( "appearance.edit_label_width", &m_Appearance.edit_label_width, -1 ) ); m_params.emplace_back( new PARAM( "appearance.edit_label_height", &m_Appearance.edit_label_height, -1 ) ); m_params.emplace_back( new PARAM( "appearance.erc_severities", &m_Appearance.erc_severities, RPT_SEVERITY_ERROR | RPT_SEVERITY_WARNING ) ); m_params.emplace_back( new PARAM( "appearance.footprint_preview", &m_Appearance.footprint_preview, true ) ); m_params.emplace_back( new PARAM( "appearance.print_sheet_reference", &m_Appearance.print_sheet_reference, true ) ); m_params.emplace_back( new PARAM( "appearance.default_font", &m_Appearance.default_font, "KiCad Font" ) ); m_params.emplace_back( new PARAM( "appearance.show_hidden_pins", &m_Appearance.show_hidden_pins, false ) ); m_params.emplace_back( new PARAM( "appearance.show_hidden_fields", &m_Appearance.show_hidden_fields, false ) ); m_params.emplace_back( new PARAM( "appearance.show_directive_labels", &m_Appearance.show_directive_labels, true ) ); m_params.emplace_back( new PARAM( "appearance.show_erc_warnings", &m_Appearance.show_erc_warnings, true ) ); m_params.emplace_back( new PARAM( "appearance.show_erc_errors", &m_Appearance.show_erc_errors, true ) ); m_params.emplace_back( new PARAM( "appearance.show_erc_exclusions", &m_Appearance.show_erc_exclusions, false ) ); m_params.emplace_back( new PARAM( "appearance.show_op_voltages", &m_Appearance.show_op_voltages, true ) ); m_params.emplace_back( new PARAM( "appearance.show_op_currents", &m_Appearance.show_op_currents, true ) ); m_params.emplace_back( new PARAM( "appearance.show_illegal_symbol_lib_dialog", &m_Appearance.show_illegal_symbol_lib_dialog, true ) ); m_params.emplace_back( new PARAM( "appearance.show_page_limits", &m_Appearance.show_page_limits, true ) ); m_params.emplace_back( new PARAM( "appearance.show_sexpr_file_convert_warning", &m_Appearance.show_sexpr_file_convert_warning, true ) ); m_params.emplace_back( new PARAM( "appearance.show_sheet_filename_case_sensitivity_dialog", &m_Appearance.show_sheet_filename_case_sensitivity_dialog, true ) ); m_params.emplace_back( new PARAM( "aui.show_schematic_hierarchy", &m_AuiPanels.show_schematic_hierarchy, true ) ); m_params.emplace_back( new PARAM( "aui.hierarchy_panel_docked_width", &m_AuiPanels.hierarchy_panel_docked_width, -1 ) ); m_params.emplace_back( new PARAM( "aui.hierarchy_panel_docked_height", &m_AuiPanels.hierarchy_panel_docked_height, -1 ) ); m_params.emplace_back( new PARAM( "aui.hierarchy_panel_float_width", &m_AuiPanels.hierarchy_panel_float_width, -1 ) ); m_params.emplace_back( new PARAM( "aui.hierarchy_panel_float_height", &m_AuiPanels.hierarchy_panel_float_height, -1 ) ); m_params.emplace_back( new PARAM( "aui.schematic_hierarchy_float", &m_AuiPanels.schematic_hierarchy_float, false ) ); m_params.emplace_back( new PARAM( "aui.search_panel_height", &m_AuiPanels.search_panel_height, -1 ) ); m_params.emplace_back( new PARAM( "aui.search_panel_width", &m_AuiPanels.search_panel_width, -1 ) ); m_params.emplace_back( new PARAM( "aui.search_panel_dock_direction", &m_AuiPanels.search_panel_dock_direction, 3 ) ); m_params.emplace_back( new PARAM( "aui.show_search", &m_AuiPanels.show_search, false ) ); m_params.emplace_back( new PARAM( "aui.show_net_nav_panel", &m_AuiPanels.show_net_nav_panel, false ) ); m_params.emplace_back( new PARAM( "aui.float_net_nav_panel", &m_AuiPanels.float_net_nav_panel, false ) ); m_params.emplace_back( new PARAM( "aui.net_nav_panel_docked_size", &m_AuiPanels.net_nav_panel_docked_size, wxSize( 120, -1 ) ) ); m_params.emplace_back( new PARAM( "aui.net_nav_panel_float_pos", &m_AuiPanels.net_nav_panel_float_pos, wxPoint( 50, 200 ), false ) ); m_params.emplace_back( new PARAM( "aui.net_nav_panel_float_size", &m_AuiPanels.net_nav_panel_float_size, wxSize( 200, 200 ) ) ); m_params.emplace_back( new PARAM( "aui.show_properties", &m_AuiPanels.show_properties, true ) ); m_params.emplace_back( new PARAM( "aui.properties_panel_width", &m_AuiPanels.properties_panel_width, -1 ) ); m_params.emplace_back( new PARAM( "aui.properties_splitter_proportion", &m_AuiPanels.properties_splitter, 0.5f ) ); m_params.emplace_back( new PARAM( "autoplace_fields.enable", &m_AutoplaceFields.enable, true ) ); m_params.emplace_back( new PARAM( "autoplace_fields.allow_rejustify", &m_AutoplaceFields.allow_rejustify, true ) ); m_params.emplace_back( new PARAM( "autoplace_fields.align_to_grid", &m_AutoplaceFields.align_to_grid, true ) ); m_params.emplace_back( new PARAM( "drawing.default_bus_thickness", &m_Drawing.default_bus_thickness, DEFAULT_BUS_WIDTH_MILS ) ); m_params.emplace_back( new PARAM( "drawing.default_junction_size", &m_Drawing.default_junction_size, DEFAULT_JUNCTION_DIAM ) ); m_params.emplace_back( new PARAM( "drawing.pin_symbol_size", &m_Drawing.pin_symbol_size, DEFAULT_TEXT_SIZE / 2 ) ); m_params.emplace_back( new PARAM( "drawing.text_offset_ratio", &m_Drawing.text_offset_ratio, 0.08 ) ); m_params.emplace_back( new PARAM( "drawing.default_line_thickness", &m_Drawing.default_line_thickness, DEFAULT_LINE_WIDTH_MILS ) ); m_params.emplace_back( new PARAM( "drawing.default_repeat_offset_x", &m_Drawing.default_repeat_offset_x, 0 ) ); m_params.emplace_back( new PARAM( "drawing.default_repeat_offset_y", &m_Drawing.default_repeat_offset_y, 100 ) ); m_params.emplace_back( new PARAM( "drawing.default_wire_thickness", &m_Drawing.default_wire_thickness, DEFAULT_WIRE_WIDTH_MILS ) ); m_params.emplace_back( new PARAM( "drawing.default_text_size", &m_Drawing.default_text_size, DEFAULT_TEXT_SIZE ) ); m_params.emplace_back( new PARAM( "drawing.field_names", &m_Drawing.field_names, "" ) ); m_params.emplace_back( new PARAM( "drawing.line_mode", &m_Drawing.line_mode, LINE_MODE::LINE_MODE_90 ) ); m_params.emplace_back( new PARAM( "drawing.auto_start_wires", &m_Drawing.auto_start_wires, true ) ); m_params.emplace_back( new PARAM( "drawing.repeat_label_increment", &m_Drawing.repeat_label_increment, 1 ) ); m_params.emplace_back( new PARAM( "drawing.default_sheet_border_color", &m_Drawing.default_sheet_border_color, COLOR4D::UNSPECIFIED ) ); m_params.emplace_back( new PARAM( "drawing.default_sheet_background_color", &m_Drawing.default_sheet_background_color, COLOR4D::UNSPECIFIED ) ); m_params.emplace_back( new PARAM_LIST( "drawing.junction_size_mult_list", &m_Drawing.junction_size_mult_list, { 0.0, 1.7, 4.0, 6.0, 9.0, 12.0 } ) ); m_params.emplace_back(new PARAM ( "drawing.junction_size_choice", &m_Drawing.junction_size_choice, 3 ) ); m_params.emplace_back( new PARAM( "find_replace.search_all_fields", &m_FindReplaceExtra.search_all_fields, false ) ); m_params.emplace_back( new PARAM( "find_replace.search_all_pins", &m_FindReplaceExtra.search_all_pins, false ) ); m_params.emplace_back( new PARAM( "find_replace.search_current_sheet_only", &m_FindReplaceExtra.search_current_sheet_only, false ) ); m_params.emplace_back( new PARAM( "find_replace.replace_references", &m_FindReplaceExtra.replace_references, false ) ); m_params.emplace_back( new PARAM( "input.drag_is_move", &m_Input.drag_is_move, false ) ); m_params.emplace_back( new PARAM( "input.esc_clears_net_highlight", &m_Input.esc_clears_net_highlight, true ) ); m_params.emplace_back( new PARAM( "selection.thickness", &m_Selection.selection_thickness, 3 ) ); m_params.emplace_back( new PARAM( "selection.highlight_thickness", &m_Selection.highlight_thickness, 2 ) ); m_params.emplace_back( new PARAM( "selection.draw_selected_children", &m_Selection.draw_selected_children, true ) ); m_params.emplace_back( new PARAM( "selection.fill_shapes", &m_Selection.fill_shapes, false ) ); m_params.emplace_back( new PARAM( "annotation.automatic", &m_AnnotatePanel.automatic, true ) ); m_params.emplace_back( new PARAM( "annotation.recursive", &m_AnnotatePanel.recursive, true ) ); m_params.emplace_back( new PARAM( "annotation.method", &m_AnnotatePanel.method, 0, 0, 2 ) ); m_params.emplace_back( new PARAM( "annotation.scope", &m_AnnotatePanel.scope, 0, 0, 2 ) ); m_params.emplace_back( new PARAM( "annotation.options", &m_AnnotatePanel.options, 0, 0, 2 ) ); m_params.emplace_back( new PARAM( "annotation.messages_filter", &m_AnnotatePanel.messages_filter, -1 ) ); m_params.emplace_back( new PARAM( "annotation.sort_order", &m_AnnotatePanel.sort_order, 0, 0, 1 ) ); m_params.emplace_back( new PARAM( "bom.selected_plugin", &m_BomPanel.selected_plugin, "" ) ); m_params.emplace_back( new PARAM_LAMBDA( "bom.plugins", std::bind( &EESCHEMA_SETTINGS::bomSettingsToJson, this ), [&]( const nlohmann::json& aObj ) { if( !aObj.is_array() ) return; const nlohmann::json& list = aObj.empty() ? defaultBomPlugins : aObj; m_BomPanel.plugins = bomSettingsFromJson( list ); }, defaultBomPlugins ) ); m_params.emplace_back( new PARAM_LAMBDA( "netlist.plugins", std::bind( &EESCHEMA_SETTINGS::netlistSettingsToJson, this ), [&]( const nlohmann::json& aObj ) { if( !aObj.is_array() ) return; if( aObj.empty() ) return; const nlohmann::json& list = aObj; m_NetlistPanel.plugins = netlistSettingsFromJson( list ); }, nullptr ) ); m_params.emplace_back( new PARAM( "page_settings.export_paper", &m_PageSettings.export_paper, false ) ); m_params.emplace_back( new PARAM( "page_settings.export_revision", &m_PageSettings.export_revision, false ) ); m_params.emplace_back( new PARAM( "page_settings.export_date", &m_PageSettings.export_date, false ) ); m_params.emplace_back( new PARAM( "page_settings.export_title", &m_PageSettings.export_title, false ) ); m_params.emplace_back( new PARAM( "page_settings.export_company", &m_PageSettings.export_company, false ) ); m_params.emplace_back( new PARAM( "page_settings.export_comment1", &m_PageSettings.export_comment1, false ) ); m_params.emplace_back( new PARAM( "page_settings.export_comment2", &m_PageSettings.export_comment2, false ) ); m_params.emplace_back( new PARAM( "page_settings.export_comment3", &m_PageSettings.export_comment3, false ) ); m_params.emplace_back( new PARAM( "page_settings.export_comment4", &m_PageSettings.export_comment4, false ) ); m_params.emplace_back( new PARAM( "page_settings.export_comment5", &m_PageSettings.export_comment5, false ) ); m_params.emplace_back( new PARAM( "page_settings.export_comment6", &m_PageSettings.export_comment6, false ) ); m_params.emplace_back( new PARAM( "page_settings.export_comment7", &m_PageSettings.export_comment7, false ) ); m_params.emplace_back( new PARAM( "page_settings.export_comment8", &m_PageSettings.export_comment8, false ) ); m_params.emplace_back( new PARAM( "page_settings.export_comment9", &m_PageSettings.export_comment9, false ) ); m_params.emplace_back( new PARAM_MAP( "field_editor.field_widths", &m_FieldEditorPanel.field_widths, {} ) ); m_params.emplace_back( new PARAM( "field_editor.width", &m_FieldEditorPanel.width, 0 ) ); m_params.emplace_back( new PARAM( "field_editor.height", &m_FieldEditorPanel.height, 0 ) ); m_params.emplace_back( new PARAM( "field_editor.page", &m_FieldEditorPanel.page, 0 ) ); m_params.emplace_back( new PARAM( "field_editor.export_filename", &m_FieldEditorPanel.export_filename, wxT( "" ) ) ); m_params.emplace_back( new PARAM( "field_editor.selection_mode", &m_FieldEditorPanel.selection_mode, 0 ) ); m_params.emplace_back( new PARAM( "field_editor.scope", &m_FieldEditorPanel.scope, 0 ) ); m_params.emplace_back( new PARAM( "plot.background_color", &m_PlotPanel.background_color, false ) ); m_params.emplace_back( new PARAM( "plot.color", &m_PlotPanel.color, true ) ); m_params.emplace_back( new PARAM( "plot.color_theme", &m_PlotPanel.color_theme, wxT( "user" ) ) ); m_params.emplace_back( new PARAM( "plot.format", &m_PlotPanel.format, 0 ) ); m_params.emplace_back( new PARAM( "plot.frame_reference", &m_PlotPanel.frame_reference, true ) ); m_params.emplace_back( new PARAM( "plot.pdf_property_popups", &m_PlotPanel.pdf_property_popups, true ) ); m_params.emplace_back( new PARAM( "plot.pdf_metadata", &m_PlotPanel.pdf_metadata, true ) ); m_params.emplace_back( new PARAM( "plot.hpgl_paper_size", &m_PlotPanel.hpgl_paper_size, 0 ) ); m_params.emplace_back( new PARAM( "plot.hpgl_pen_size", &m_PlotPanel.hpgl_pen_size, 0.5 ) ); m_params.emplace_back( new PARAM( "plot.hpgl_origin", &m_PlotPanel.hpgl_origin, 0 ) ); m_params.emplace_back( new PARAM( "plot.other_open_file_after_plot", &m_PlotPanel.open_file_after_plot, false ) ); m_params.emplace_back( new PARAM( "simulator.window.pos_x", &m_Simulator.window.state.pos_x, 0 ) ); m_params.emplace_back( new PARAM( "simulator.window.pos_y", &m_Simulator.window.state.pos_y, 0 ) ); m_params.emplace_back( new PARAM( "simulator.window.size_x", &m_Simulator.window.state.size_x, 500 ) ); m_params.emplace_back( new PARAM( "simulator.window.size_y", &m_Simulator.window.state.size_y, 400 ) ); m_params.emplace_back( new PARAM( "simulator.window.display", &m_Simulator.window.state.display, 0 ) ); m_params.emplace_back( new PARAM( "simulator.window.maximized", &m_Simulator.window.state.maximized, false ) ); m_params.emplace_back( new PARAM( "simulator.window.perspective", &m_Simulator.window.perspective, "" ) ); m_params.emplace_back( new PARAM( "simulator.plot_panel_width", &m_Simulator.view.plot_panel_width, 0 ) ); m_params.emplace_back( new PARAM( "simulator.plot_panel_height", &m_Simulator.view.plot_panel_height, 0 ) ); m_params.emplace_back( new PARAM( "simulator.signal_panel_height", &m_Simulator.view.signal_panel_height, 0 ) ); m_params.emplace_back( new PARAM( "simulator.cursors_panel_height", &m_Simulator.view.cursors_panel_height, 0 ) ); m_params.emplace_back( new PARAM( "simulator.measurements_panel_height", &m_Simulator.view.measurements_panel_height, 0 ) ); m_params.emplace_back( new PARAM( "simulator.white_background", &m_Simulator.view.white_background, false ) ); m_params.emplace_back( new PARAM_ENUM( "simulator.mouse_wheel_actions.vertical_unmodified", &m_Simulator.preferences.mouse_wheel_actions.vertical_unmodified, SIM_MOUSE_WHEEL_ACTION::ZOOM, SIM_MOUSE_WHEEL_ACTION::NONE, SIM_MOUSE_WHEEL_ACTION::ZOOM_VERTICALLY ) ); m_params.emplace_back( new PARAM_ENUM( "simulator.mouse_wheel_actions.vertical_with_ctrl", &m_Simulator.preferences.mouse_wheel_actions.vertical_with_ctrl, SIM_MOUSE_WHEEL_ACTION::PAN_LEFT_RIGHT, SIM_MOUSE_WHEEL_ACTION::NONE, SIM_MOUSE_WHEEL_ACTION::ZOOM_VERTICALLY ) ); m_params.emplace_back( new PARAM_ENUM( "simulator.mouse_wheel_actions.vertical_with_shift", &m_Simulator.preferences.mouse_wheel_actions.vertical_with_shift, SIM_MOUSE_WHEEL_ACTION::PAN_UP_DOWN, SIM_MOUSE_WHEEL_ACTION::NONE, SIM_MOUSE_WHEEL_ACTION::ZOOM_VERTICALLY ) ); m_params.emplace_back( new PARAM_ENUM( "simulator.mouse_wheel_actions.vertical_with_alt", &m_Simulator.preferences.mouse_wheel_actions.vertical_with_alt, SIM_MOUSE_WHEEL_ACTION::NONE, SIM_MOUSE_WHEEL_ACTION::NONE, SIM_MOUSE_WHEEL_ACTION::ZOOM_VERTICALLY ) ); m_params.emplace_back( new PARAM_ENUM( "simulator.mouse_wheel_actions.horizontal", &m_Simulator.preferences.mouse_wheel_actions.horizontal, SIM_MOUSE_WHEEL_ACTION::NONE, SIM_MOUSE_WHEEL_ACTION::NONE, SIM_MOUSE_WHEEL_ACTION::ZOOM_VERTICALLY ) ); m_params.emplace_back( new PARAM( "symbol_chooser.sash_pos_h", &m_SymChooserPanel.sash_pos_h, -1 ) ); m_params.emplace_back( new PARAM( "symbol_chooser.sash_pos_v", &m_SymChooserPanel.sash_pos_v, -1 ) ); m_params.emplace_back( new PARAM( "symbol_chooser.width", &m_SymChooserPanel.width, -1 ) ); m_params.emplace_back( new PARAM( "symbol_chooser.height", &m_SymChooserPanel.height, -1 ) ); m_params.emplace_back( new PARAM( "symbol_chooser.sort_mode", &m_SymChooserPanel.sort_mode, 0 ) ); m_params.emplace_back( new PARAM( "symbol_chooser.keep_symbol", &m_SymChooserPanel.keep_symbol, false ) ); m_params.emplace_back( new PARAM( "symbol_chooser.place_all_units", &m_SymChooserPanel.place_all_units, true ) ); m_params.emplace_back( new PARAM( "import_graphics.interactive_placement", &m_ImportGraphics.interactive_placement, true ) ); m_params.emplace_back( new PARAM( "import_graphics.line_width_units", &m_ImportGraphics.dxf_line_width_units, 0 ) ); m_params.emplace_back( new PARAM( "import_graphics.line_width", &m_ImportGraphics.dxf_line_width, 0.2 ) ); m_params.emplace_back( new PARAM( "import_graphics.origin_units", &m_ImportGraphics.origin_units, 0 ) ); m_params.emplace_back( new PARAM( "import_graphics.origin_x", &m_ImportGraphics.origin_x, 0 ) ); m_params.emplace_back( new PARAM( "import_graphics.origin_y", &m_ImportGraphics.origin_y, 0 ) ); m_params.emplace_back( new PARAM( "import_graphics.dxf_units", &m_ImportGraphics.dxf_units, 0 ) ); m_params.emplace_back( new PARAM( "system.never_show_rescue_dialog", &m_RescueNeverShow, false ) ); m_params.emplace_back( new PARAM( "lib_view.window.pos_x", &m_LibViewPanel.window.state.pos_x, 0 ) ); m_params.emplace_back( new PARAM( "lib_view.window.pos_y", &m_LibViewPanel.window.state.pos_y, 0 ) ); m_params.emplace_back( new PARAM( "lib_view.window.size_x", &m_LibViewPanel.window.state.size_x, 500 ) ); m_params.emplace_back( new PARAM( "lib_view.window.size_y", &m_LibViewPanel.window.state.size_y, 400 ) ); m_params.emplace_back( new PARAM( "lib_view.window.display", &m_LibViewPanel.window.state.display, 0 ) ); m_params.emplace_back( new PARAM( "lib_view.window.maximized", &m_LibViewPanel.window.state.maximized, false ) ); m_params.emplace_back( new PARAM( "lib_view.window.perspective", &m_LibViewPanel.window.perspective, "" ) ); m_params.emplace_back( new PARAM( "lib_view.lib_list_width", &m_LibViewPanel.lib_list_width, 150 ) ); m_params.emplace_back( new PARAM( "lib_view.cmp_list_width", &m_LibViewPanel.cmp_list_width, 150 ) ); m_params.emplace_back( new PARAM( "lib_view.show_pin_electrical_type", &m_LibViewPanel.show_pin_electrical_type, true ) ); m_params.emplace_back( new PARAM( "system.last_symbol_lib_dir", &m_lastSymbolLibDir, "" ) ); // Migrations registerMigration( 0, 1, [&]() -> bool { // Version 0 to 1: BOM plugin settings moved from sexpr to JSON return migrateBomSettings(); } ); registerMigration( 1, 2, [&]() -> bool { // We used to have a bug on GTK which would set the lib tree column width way // too narrow. if( std::optional optval = Get( "lib_tree.column_width" ) ) { if( optval < 150 ) Set( "lib_tree.column_width", 300 ); } return true; } ); registerMigration( 2, 3, [&]() -> bool { // This is actually a migration for APP_SETTINGS_BASE::m_LibTree return migrateLibTreeWidth(); } ); } bool EESCHEMA_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg ) { bool ret = APP_SETTINGS_BASE::MigrateFromLegacy( aCfg ); // Now modify the loaded grid selection, because in earlier versions the grids index was shared // between all applications and started at 1000 mils. There is a 4-position offset between // this index and the possible eeschema grids list that we have to subtract. std::string gridSizePtr = "window.grid.last_size"; if( std::optional currentSize = Get( gridSizePtr ) ) { Set( gridSizePtr, *currentSize - 4 ); } else { // Otherwise, default grid size should be 50 mils; index 1 Set( gridSizePtr, 1 ); } ret &= fromLegacy( aCfg, "FootprintPreview", "appearance.footprint_preview" ); ret &= fromLegacy( aCfg, "NavigatorStaysOpen", "appearance.navigator_stays_open" ); ret &= fromLegacy( aCfg, "PrintSheetReferenceAndTitleBlock", "appearance.print_sheet_reference" ); ret &= fromLegacy( aCfg, "ShowHiddenPins", "appearance.show_hidden_pins" ); ret &= fromLegacy( aCfg, "ShowIllegalSymbolLibDialog", "appearance.show_illegal_symbol_lib_dialog" ); ret &= fromLegacy( aCfg, "ShowPageLimits", "appearance.show_page_limits" ); ret &= fromLegacy( aCfg, "ShowSheetFileNameCaseSensitivityDlg", "appearance.show_sheet_filename_case_sensitivity_dialog" ); ret &= fromLegacy( aCfg, "AutoplaceFields", "autoplace_fields.enable" ); ret &= fromLegacy( aCfg, "AutoplaceJustify", "autoplace_fields.allow_rejustify" ); ret &= fromLegacy( aCfg, "AutoplaceAlign", "autoplace_fields.align_to_grid" ); ret &= fromLegacy( aCfg, "DefaultBusWidth", "drawing.default_bus_thickness" ); ret &= fromLegacy( aCfg, "DefaultJunctionSize", "drawing.default_junction_size" ); ret &= fromLegacy( aCfg, "DefaultDrawLineWidth", "drawing.default_line_thickness" ); ret &= fromLegacy( aCfg, "RepeatStepX", "drawing.default_repeat_offset_x" ); ret &= fromLegacy( aCfg, "RepeatStepY", "drawing.default_repeat_offset_y" ); ret &= fromLegacy( aCfg, "DefaultWireWidth", "drawing.default_wire_thickness" ); ret &= fromLegacyString( aCfg, "FieldNames", "drawing.field_names" ); ret &= fromLegacy( aCfg, "HorizVertLinesOnly", "drawing.line_mode" ); ret &= fromLegacy( aCfg, "RepeatLabelIncrement", "drawing.repeat_label_increment" ); ret &= fromLegacy( aCfg, "DragActionIsMove", "input.drag_is_move" ); ret &= fromLegacy( aCfg, "SelectionThickness", "selection.thickness" ); ret &= fromLegacy( aCfg, "SelectionDrawChildItems", "selection.draw_selected_children" ); ret &= fromLegacy( aCfg, "SelectionFillShapes", "selection.fill_shapes" ); ret &= fromLegacy( aCfg, "SelectPinSelectSymbolOpt", "selection.select_pin_selects_symbol" ); ret &= fromLegacy( aCfg, "AnnotateAlgoOption", "annotation.method" ); ret &= fromLegacy( aCfg, "AnnotateFilterMsg", "annotation.messages_filter" ); ret &= fromLegacy( aCfg, "AnnotateSortOption", "annotation.sort_order" ); ret &= fromLegacyString( aCfg, "bom_plugin_selected", "bom.selected_plugin" ); ret &= fromLegacyString( aCfg, "bom_plugins", "bom.plugins" ); migrateBomSettings(); ret &= fromLegacyString( aCfg, "SymbolFieldsShownColumns", "edit_sch_component.visible_columns" ); ret &= fromLegacy( aCfg, "PageSettingsExportRevision", "page_settings.export_revision" ); ret &= fromLegacy( aCfg, "PageSettingsExportDate", "page_settings.export_date" ); ret &= fromLegacy( aCfg, "PageSettingsExportTitle", "page_settings.export_title" ); ret &= fromLegacy( aCfg, "PageSettingsExportCompany", "page_settings.export_company" ); ret &= fromLegacy( aCfg, "PageSettingsExportComment1", "page_settings.export_comment1" ); ret &= fromLegacy( aCfg, "PageSettingsExportComment2", "page_settings.export_comment2" ); ret &= fromLegacy( aCfg, "PageSettingsExportComment3", "page_settings.export_comment3" ); ret &= fromLegacy( aCfg, "PageSettingsExportComment4", "page_settings.export_comment4" ); ret &= fromLegacy( aCfg, "PageSettingsExportComment5", "page_settings.export_comment5" ); ret &= fromLegacy( aCfg, "PageSettingsExportComment6", "page_settings.export_comment6" ); ret &= fromLegacy( aCfg, "PageSettingsExportComment7", "page_settings.export_comment7" ); ret &= fromLegacy( aCfg, "PageSettingsExportComment8", "page_settings.export_comment8" ); ret &= fromLegacy( aCfg, "PageSettingsExportComment9", "page_settings.export_comment9" ); #if 0 // To do: move this code to the new netlist plugin management in settings { constexpr int max_custom_commands = 8; // from DIALOG_NETLIST nlohmann::json js_cmd = nlohmann::json::array(); nlohmann::json js_title = nlohmann::json::array(); wxString cmd_key, title_key, cmd, title; for( int i = 1; i <= max_custom_commands; ++i ) { // Only migrate if both title and command are specified cmd_key.Printf( "CustomNetlistCommand%d", i ); title_key.Printf( "CustomNetlistTitle%d", i ); if( aCfg->Read( cmd_key, &cmd ) && aCfg->Read( title_key, &title ) && !cmd.IsEmpty() && !title.IsEmpty() ) { js_cmd.push_back( cmd.ToUTF8() ); js_title.push_back( title.ToUTF8() ); } } Set( "netlist.custom_command_titles", js_title ); Set( "netlist.custom_command_paths", js_cmd ); } #endif { // NOTE(JE) These parameters should move to project-local storage before V6, but we are // migrating them here in order to preserve data. There is a bug here that is preserved: // keys are taken directly from the (translated) UI and stored in the config, so if the user // changes languages the keys will no longer work. aCfg->SetPath( "SymbolFieldEditor/Show/" ); nlohmann::json js = nlohmann::json( {} ); wxString key; bool value = false; long index = 0; while( aCfg->GetNextEntry( key, index ) ) { if( aCfg->Read( key, &value ) ) { std::string key_utf( key.ToUTF8() ); try { js[ std::move( key_utf ) ] = value; } catch(...) { continue; } } } Set( "field_editor.fields_show", js ); aCfg->SetPath( "../GroupBy" ); while( aCfg->GetNextEntry( key, index ) ) { if( aCfg->Read( key, &value ) ) { std::string key_utf( key.ToUTF8() ); try { js[ std::move( key_utf ) ] = value; } catch(...) { continue; } } } Set( "field_editor.fields_group_by", js ); aCfg->SetPath( "../.." ); } ret &= fromLegacy( aCfg, "PlotModeColor", "plot.color" ); ret &= fromLegacy( aCfg, "PlotFormat", "plot.format" ); ret &= fromLegacy( aCfg, "PlotFrameRef", "plot.frame_reference" ); ret &= fromLegacy( aCfg, "PlotHPGLOrg", "plot.hpgl_origin" ); ret &= fromLegacy( aCfg, "PlotHPGLPaperSize", "plot.hpgl_paper_size" ); ret &= fromLegacy( aCfg, "PlotHPGLPenSize", "plot.hpgl_pen_size" ); ret &= fromLegacy( aCfg, "SIM_PLOT_FRAMEPos_x", "simulator.window.pos_x" ); ret &= fromLegacy( aCfg, "SIM_PLOT_FRAMEPos_y", "simulator.window.pos_y" ); ret &= fromLegacy( aCfg, "SIM_PLOT_FRAMESize_x", "simulator.window.size_x" ); ret &= fromLegacy( aCfg, "SIM_PLOT_FRAMESize_y", "simulator.window.size_y" ); ret &= fromLegacy( aCfg, "SIM_PLOT_FRAMEMaximized", "simulator.window.maximized" ); ret &= fromLegacyString( aCfg, "SIM_PLOT_FRAMEPerspective", "simulator.window.perspective" ); ret &= fromLegacyString( aCfg, "SIM_PLOT_FRAMEMostRecentlyUsedPath", "simulator.mru_path" ); ret &= fromLegacy( aCfg, "SimPlotPanelWidth", "simulator.plot_panel_width" ); ret &= fromLegacy( aCfg, "SimPlotPanelHeight", "simulator.plot_panel_height" ); ret &= fromLegacy( aCfg, "SimSignalPanelHeight", "simulator.signal_panel_height" ); ret &= fromLegacy( aCfg, "SimCursorsPanelHeight", "simulator.cursors_panel_height" ); ret &= fromLegacy( aCfg, "SimPlotWhiteBg", "simulator.white_background" ); ret &= fromLegacy( aCfg, "SymbolChooserHSashPosition", "symbol_chooser.sash_pos_h" ); ret &= fromLegacy( aCfg, "SymbolChooserVSashPosition", "symbol_chooser.sash_pos_v" ); ret &= fromLegacy( aCfg, "SymbolChooserWidth", "symbol_chooser.width" ); ret &= fromLegacy( aCfg, "SymbolChooserHeight", "symbol_chooser.height" ); ret &= fromLegacy( aCfg, "SymbolChooserKeepSymbol", "symbol_chooser.keep_symbol" ); ret &= fromLegacy( aCfg, "SymbolChooserUseUnits", "symbol_chooser.place_all_units" ); const std::string vlf = "ViewlibFrame"; ret &= fromLegacy( aCfg, vlf + "Maximized", "lib_view.window.maximized" ); ret &= fromLegacyString( aCfg, vlf + "MostRecentlyUsedPath", "lib_view.window.mru_path" ); ret &= fromLegacy( aCfg, vlf + "Size_x", "lib_view.window.size_x" ); ret &= fromLegacy( aCfg, vlf + "Size_y", "lib_view.window.size_y" ); ret &= fromLegacyString( aCfg, vlf + "Perspective", "lib_view.window.perspective" ); ret &= fromLegacy( aCfg, vlf + "Pos_x", "lib_view.window.pos_x" ); ret &= fromLegacy( aCfg, vlf + "Pos_y", "lib_view.window.pos_y" ); ret &= fromLegacy( aCfg, "ViewLiblistWidth", "lib_view.lib_list_width" ); ret &= fromLegacy( aCfg, "ViewCmplistWidth", "lib_view.cmp_list_width" ); ret &= fromLegacy( aCfg, "ViewCmpShowPinElectricalType", "lib_view.show_pin_electrical_type" ); ret &= fromLegacy( aCfg, vlf + "ShowGrid", "lib_view.grid.show" ); ret &= fromLegacy( aCfg, vlf + "_LastGridSize", "lib_view.grid.last_size" ); ret &= fromLegacy( aCfg, "RescueNeverShow", "system.never_show_rescue_dialog" ); // Legacy version stored this setting in eeschema, so move it to common if it exists bool tmp; if( aCfg->Read( "MoveWarpsCursor", &tmp ) ) Pgm().GetCommonSettings()->m_Input.warp_mouse_on_move = tmp; COLOR_SETTINGS* cs = Pgm().GetSettingsManager().GetMigratedColorSettings(); auto migrateLegacyColor = [&] ( const std::string& aKey, int aLayerId ) { wxString str; if( aCfg->Read( aKey, &str ) ) cs->SetColor( aLayerId, COLOR4D( str ) ); }; migrateLegacyColor( "Color4DBgCanvasEx", LAYER_SCHEMATIC_BACKGROUND ); migrateLegacyColor( "Color4DBodyBgEx", LAYER_DEVICE_BACKGROUND ); migrateLegacyColor( "Color4DBodyEx", LAYER_DEVICE ); migrateLegacyColor( "Color4DBrightenedEx", LAYER_BRIGHTENED ); migrateLegacyColor( "Color4DBusEx", LAYER_BUS ); migrateLegacyColor( "Color4DConnEx", LAYER_JUNCTION ); migrateLegacyColor( "Color4DCursorEx", LAYER_SCHEMATIC_CURSOR ); migrateLegacyColor( "Color4DErcEEx", LAYER_ERC_ERR ); migrateLegacyColor( "Color4DErcWEx", LAYER_ERC_WARN ); migrateLegacyColor( "Color4DFieldEx", LAYER_FIELDS ); migrateLegacyColor( "Color4DGLabelEx", LAYER_GLOBLABEL ); migrateLegacyColor( "Color4DGridEx", LAYER_SCHEMATIC_GRID ); migrateLegacyColor( "Color4DHLabelEx", LAYER_HIERLABEL ); migrateLegacyColor( "Color4DHiddenEx", LAYER_HIDDEN ); migrateLegacyColor( "Color4DLLabelEx", LAYER_LOCLABEL ); migrateLegacyColor( "Color4DNoConnectEx", LAYER_NOCONNECT ); migrateLegacyColor( "Color4DNoteEx", LAYER_NOTES ); migrateLegacyColor( "Color4DPinEx", LAYER_PIN ); migrateLegacyColor( "Color4DPinNameEx", LAYER_PINNAM ); migrateLegacyColor( "Color4DPinNumEx", LAYER_PINNUM ); migrateLegacyColor( "Color4DReferenceEx", LAYER_REFERENCEPART ); migrateLegacyColor( "Color4DShadowEx", LAYER_SELECTION_SHADOWS ); migrateLegacyColor( "Color4DSheetEx", LAYER_SHEET ); migrateLegacyColor( "Color4DSheetFileNameEx", LAYER_SHEETFILENAME ); migrateLegacyColor( "Color4DSheetLabelEx", LAYER_SHEETLABEL ); migrateLegacyColor( "Color4DSheetNameEx", LAYER_SHEETNAME ); migrateLegacyColor( "Color4DValueEx", LAYER_VALUEPART ); migrateLegacyColor( "Color4DWireEx", LAYER_WIRE ); migrateLegacyColor( "Color4DWorksheetEx", LAYER_SCHEMATIC_DRAWINGSHEET ); Pgm().GetSettingsManager().SaveColorSettings( cs, "schematic" ); Set( "appearance.color_theme", cs->GetFilename() ); // LibEdit settings were stored with eeschema. If eeschema is the first app to run, // we need to migrate the LibEdit settings here auto libedit = Pgm().GetSettingsManager().GetAppSettings(); libedit->MigrateFromLegacy( aCfg ); libedit->Load(); return ret; } /** * Used for parsing legacy-format bom plugin configurations. Only used for migrating into * EESCHEMA_SETTINGS JSON format. */ class BOM_CFG_PARSER : public DIALOG_BOM_CFG_LEXER { std::vector* m_pluginList; public: BOM_CFG_PARSER( std::vector* aPluginList, const char* aData, const wxString& aSource ); void Parse(); private: void parseGenerator(); }; std::vector EESCHEMA_SETTINGS::DefaultBomPlugins() { return bomSettingsFromJson( defaultBomPlugins ); } bool EESCHEMA_SETTINGS::migrateBomSettings() { if( !Contains( "bom.plugins" ) ) return false; wxString list = *Get( "bom.plugins" ); BOM_CFG_PARSER cfg_parser( &m_BomPanel.plugins, TO_UTF8( list ), wxT( "plugins" ) ); try { cfg_parser.Parse(); } catch( const IO_ERROR& ) { return false; } // Parser will have loaded up our array, let's dump it out to JSON At( "bom.plugins" ) = bomSettingsToJson(); return true; } nlohmann::json EESCHEMA_SETTINGS::bomSettingsToJson() const { nlohmann::json js = nlohmann::json::array(); for( const BOM_PLUGIN_SETTINGS& plugin : m_BomPanel.plugins ) { nlohmann::json pluginJson; pluginJson["name"] = plugin.name.ToUTF8(); pluginJson["path"] = plugin.path.ToUTF8(); pluginJson["command"] = plugin.command.ToUTF8(); js.push_back( pluginJson ); } return js; } std::vector EESCHEMA_SETTINGS::bomSettingsFromJson( const nlohmann::json& aObj ) { std::vector ret; wxASSERT( aObj.is_array() ); for( const nlohmann::json& entry : aObj ) { if( entry.empty() || !entry.is_object() ) continue; if( !entry.contains( "name" ) || !entry.contains( "path" ) ) continue; BOM_PLUGIN_SETTINGS plugin( entry.at( "name" ).get(), entry.at( "path" ).get() ); if( entry.contains( "command" ) ) plugin.command = entry.at( "command" ).get(); ret.emplace_back( plugin ); } return ret; } nlohmann::json EESCHEMA_SETTINGS::netlistSettingsToJson() const { nlohmann::json js = nlohmann::json::array(); for( const NETLIST_PLUGIN_SETTINGS& plugin : m_NetlistPanel.plugins ) { nlohmann::json pluginJson; pluginJson["name"] = plugin.name.ToUTF8(); pluginJson["path"] = plugin.path.ToUTF8(); pluginJson["command"] = plugin.command.ToUTF8(); js.push_back( pluginJson ); } return js; } std::vector EESCHEMA_SETTINGS::netlistSettingsFromJson( const nlohmann::json& aObj ) { std::vector ret; wxASSERT( aObj.is_array() ); for( const nlohmann::json& entry : aObj ) { if( entry.empty() || !entry.is_object() ) continue; if( !entry.contains( "name" ) || !entry.contains( "path" ) ) continue; NETLIST_PLUGIN_SETTINGS plugin( entry.at( "name" ).get(), entry.at( "path" ).get() ); if( entry.contains( "command" ) ) plugin.command = entry.at( "command" ).get(); ret.emplace_back( plugin ); } return ret; } BOM_CFG_PARSER::BOM_CFG_PARSER( std::vector* aPluginList, const char* aLine, const wxString& aSource ) : DIALOG_BOM_CFG_LEXER( aLine, aSource ) { wxASSERT( aPluginList ); m_pluginList = aPluginList; } void BOM_CFG_PARSER::Parse() { T token; while( ( token = NextTok() ) != T_RIGHT ) { if( token == T_EOF) break; if( token == T_LEFT ) token = NextTok(); if( token == T_plugins ) continue; switch( token ) { case T_plugin: // Defines a new plugin parseGenerator(); break; default: // Unexpected( CurText() ); break; } } } void BOM_CFG_PARSER::parseGenerator() { wxString str; EESCHEMA_SETTINGS::BOM_PLUGIN_SETTINGS settings; NeedSYMBOLorNUMBER(); settings.path = FromUTF8(); T token; while( ( token = NextTok() ) != T_RIGHT ) { if( token == T_EOF) break; switch( token ) { case T_LEFT: break; case T_cmd: NeedSYMBOLorNUMBER(); settings.command = FromUTF8(); NeedRIGHT(); break; case T_opts: { NeedSYMBOLorNUMBER(); wxString option = FromUTF8(); if( option.StartsWith( wxS( "nickname=" ), &str ) ) settings.name = str; NeedRIGHT(); break; } default: Unexpected( CurText() ); break; } } m_pluginList->emplace_back( settings ); }