24#include <pybind11/pybind11.h>
38#include <wx/tokenzr.h>
43#include "../3d-viewer/3d_viewer/eda_3d_viewer_settings.h"
59 m_FootprintWizardList(),
72 m_CtrlClickHighlight( false ),
73 m_Use45DegreeLimit( false ),
75 m_ESCClearsNetHighlight( true ),
76 m_PolarCoords( false ),
78 m_ShowPageLimits( true ),
79 m_ShowCourtyardCollisions( true ),
80 m_AutoRefillZones( false ),
81 m_AllowFreePads( false ),
82 m_PnsSettings( nullptr ),
83 m_FootprintViewerZoom( 1.0 ),
84 m_FootprintViewerAutoZoomOnSelect( true ),
85 m_FootprintViewerLibListWidth( 200 ),
86 m_FootprintViewerFPListWidth( 300 )
160 static_cast<bool>( FLIP_DIRECTION::LEFT_RIGHT ) ) );
173 static_cast<int>( MAGNETIC_OPTIONS::CAPTURE_CURSOR_IN_TRACK_TOOL ) ) );
177 static_cast<int>( MAGNETIC_OPTIONS::CAPTURE_CURSOR_IN_TRACK_TOOL ) ) );
187 static_cast<int>( TRACK_DRAG_ACTION::DRAG ) ) );
191 static_cast<int>( ARC_EDIT_MODE::KEEP_CENTER_ADJUST_ANGLE_RADIUS ) ) );
274 PCB_DISPLAY_ORIGIN::PCB_ORIGIN_PAGE ) );
606 [&]() -> nlohmann::json
608 nlohmann::json js = nlohmann::json::array();
611 js.push_back( nlohmann::json( { { pair.first.ToUTF8(), pair.second } } ) );
615 [&](
const nlohmann::json& aObj )
619 if( !aObj.is_array() )
624 for(
const auto& entry : aObj )
626 if( entry.empty() || !entry.is_object() )
629 for(
const auto& pair : entry.items() )
632 wxString( pair.key().c_str(), wxConvUTF8 ), pair.value() ) );
636 nlohmann::json::array() ) );
663 if( std::optional<int> optval = Get<int>(
"pcb_display.rotation_angle" ) )
664 Set(
"editing.rotation_angle", *optval );
668 At(
"pcb_display" ).erase(
"rotation_angle" );
681 Set(
"editing.auto_fill_zones",
false );
692 if( std::optional<int> optval = Get<int>(
"lib_tree.column_width" ) )
695 Set(
"lib_tree.column_width", 300 );
712 Set(
"editing.auto_fill_zones",
false );
730 ret &= fromLegacy<bool>( aCfg,
"ShowLayerManagerTools",
"aui.show_layer_manager" );
732 ret &= fromLegacy<int>( aCfg,
"FootprintChooserHSashPosition",
"footprint_chooser.sash_h" );
733 ret &= fromLegacy<int>( aCfg,
"FootprintChooserVSashPosition",
"footprint_chooser.sash_v" );
734 ret &= fromLegacy<int>( aCfg,
"FootprintChooserWidth",
"footprint_chooser.width" );
735 ret &= fromLegacy<int>( aCfg,
"FootprintChooserHeight",
"footprint_chooser.height" );
737 ret &= fromLegacy<bool>( aCfg,
"FlipLeftRight",
"editing.flip_left_right" );
738 ret &= fromLegacy<bool>( aCfg,
"MagneticGraphics",
"editing.magnetic_graphics" );
739 ret &= fromLegacy<int>( aCfg,
"MagneticPads",
"editing.magnetic_pads" );
740 ret &= fromLegacy<int>( aCfg,
"MagneticTracks",
"editing.magnetic_tracks" );
741 ret &= fromLegacy<bool>( aCfg,
"DisplayPolarCoords",
"editing.polar_coords" );
742 ret &= fromLegacy<bool>( aCfg,
"Use45DegreeGraphicSegments",
"editing.use_45_degree_graphic_segments" );
744 ret &= fromLegacy<bool>( aCfg,
"PcbAffT",
"pcb_display.graphic_items_fill" );
745 ret &= fromLegacy<int>( aCfg,
"MaxLnkS",
"pcb_display.max_links_shown" );
746 ret &= fromLegacy<bool>( aCfg,
"ModAffC",
"pcb_display.footprint_edge_fill" );
747 ret &= fromLegacy<bool>( aCfg,
"ModAffT",
"pcb_display.footprint_text_fill" );
748 ret &= fromLegacy<int>( aCfg,
"ShowNetNamesMode",
"pcb_display.net_names_mode" );
749 ret &= fromLegacy<int>( aCfg,
"PcbDisplayOrigin",
"pcb_display.origin_mode" );
750 ret &= fromLegacy<bool>( aCfg,
"PcbInvertXAxis",
"pcb_display.origin_invert_x_axis" );
751 ret &= fromLegacy<bool>( aCfg,
"PcbInvertYAxis",
"pcb_display.origin_invert_y_axis" );
752 ret &= fromLegacy<bool>( aCfg,
"PadAffG",
"pcb_display.pad_clearance" );
753 ret &= fromLegacy<bool>( aCfg,
"PadFill",
"pcb_display.pad_fill" );
754 ret &= fromLegacy<bool>( aCfg,
"PadSNum",
"pcb_display.pad_numbers" );
755 ret &= fromLegacy<bool>( aCfg,
"ShowRatsnestLines",
"pcb_display.ratsnest_global" );
756 ret &= fromLegacy<bool>( aCfg,
"ShowRatsnestModuleLines",
"pcb_display.ratsnest_footprint" );
757 ret &= fromLegacy<bool>( aCfg,
"CurvedRatsnestLines",
"pcb_display.ratsnest_curved" );
758 ret &= fromLegacy<int>( aCfg,
"RotationAngle",
"pcb_display.rotation_angle" );
759 ret &= fromLegacy<int>( aCfg,
"TrackDisplayClearance",
"pcb_display.track_clearance_mode" );
760 ret &= fromLegacy<bool>( aCfg,
"DisplayTrackFilled",
"pcb_display.track_fill" );
761 ret &= fromLegacy<bool>( aCfg,
"ViaFill",
"pcb_display.via_fill" );
762 ret &= fromLegacy<int>( aCfg,
"PcbShowZonesMode",
"pcb_display.zone_mode" );
764 ret &= fromLegacy<double>( aCfg,
"PlotLineWidth_mm",
"plot.line_width" );
766 aCfg->SetPath(
"/dialogs/cleanup_tracks" );
767 ret &= fromLegacy<bool>( aCfg,
"DialogCleanupVias",
"cleanup.cleanup_vias" );
768 ret &= fromLegacy<bool>( aCfg,
"DialogCleanupMergeSegments",
"cleanup.merge_segments" );
769 ret &= fromLegacy<bool>( aCfg,
"DialogCleanupUnconnected",
"cleanup.cleanup_unconnected" );
770 ret &= fromLegacy<bool>( aCfg,
"DialogCleanupShortCircuit",
"cleanup.cleanup_short_circuits" );
771 ret &= fromLegacy<bool>( aCfg,
"DialogCleanupTracksInPads",
"cleanup.cleanup_tracks_in_pad" );
772 aCfg->SetPath(
"../.." );
774 ret &= fromLegacy<bool>( aCfg,
"RefillZonesBeforeDrc",
"drc_dialog.refill_zones" );
775 ret &= fromLegacy<bool>( aCfg,
"DrcTestFootprints",
"drc_dialog.test_footprints" );
777 ret &= fromLegacy<bool>( aCfg,
"DrillMergePTHNPTH",
"gen_drill.merge_pth_npth" );
778 ret &= fromLegacy<bool>( aCfg,
"DrillMinHeader",
"gen_drill.minimal_header" );
779 ret &= fromLegacy<bool>( aCfg,
"DrillMirrorYOpt",
"gen_drill.mirror" );
780 ret &= fromLegacy<bool>( aCfg,
"DrillUnit",
"gen_drill.unit_drill_is_inch" );
781 ret &= fromLegacy<bool>( aCfg,
"OvalHolesRouteMode",
"gen_drill.use_route_for_oval_holes" );
782 ret &= fromLegacy<int>( aCfg,
"DrillFileType",
"gen_drill.drill_file_type" );
783 ret &= fromLegacy<int>( aCfg,
"DrillMapFileType",
"gen_drill.map_file_type" );
784 ret &= fromLegacy<int>( aCfg,
"DrillZerosFormat",
"gen_drill.zeros_format" );
786 ret &= fromLegacy<bool>( aCfg,
"IDFRefAutoAdj",
"export_idf.auto_adjust" );
787 ret &= fromLegacy<int>( aCfg,
"IDFRefUnits",
"export_idf.ref_units" );
788 ret &= fromLegacy<double>( aCfg,
"IDFRefX",
"export_idf.ref_x" );
789 ret &= fromLegacy<double>( aCfg,
"IDFRefY",
"export_idf.ref_y" );
790 ret &= fromLegacy<bool>( aCfg,
"IDFExportThou",
"export_idf.units_mils" );
792 ret &= fromLegacy<int>( aCfg,
"STEP_Origin_Opt",
"export_step.origin_mode" );
793 ret &= fromLegacy<int>( aCfg,
"STEP_UserOriginUnits",
"export_step.origin_units" );
794 ret &= fromLegacy<double>( aCfg,
"STEP_UserOriginX",
"export_step.origin_x" );
795 ret &= fromLegacy<double>( aCfg,
"STEP_UserOriginY",
"export_step.origin_y" );
796 ret &= fromLegacy<bool>( aCfg,
"STEP_NoVirtual",
"export_step.no_virtual" );
798 ret &= fromLegacy<bool>( aCfg,
"PlotSVGModeColor",
"export_svg.black_and_white" );
799 ret &= fromLegacy<bool>( aCfg,
"PlotSVGModeMirror",
"export_svg.mirror" );
800 ret &= fromLegacy<bool>( aCfg,
"PlotSVGModeOneFile",
"export_svg.one_file" );
801 ret &= fromLegacy<bool>( aCfg,
"PlotSVGBrdEdge",
"export_svg.plot_board_edges" );
802 ret &= fromLegacy<int>( aCfg,
"PlotSVGPageOpt",
"export_svg.page_size" );
803 ret &=
fromLegacyString( aCfg,
"PlotSVGDirectory",
"export_svg.output_dir" );
806 nlohmann::json js = nlohmann::json::array();
812 key.Printf( wxT(
"PlotSVGLayer_%d" ), i );
814 if( aCfg->Read( key, &val ) && val )
818 Set(
"export_svg.layers", js );
822 nlohmann::json js = nlohmann::json::array();
826 if( aCfg->Read(
"ActionPluginButtons", &packed ) )
828 wxStringTokenizer pluginSettingsTokenizer = wxStringTokenizer( packed,
";" );
830 while( pluginSettingsTokenizer.HasMoreTokens() )
833 wxString plugin = pluginSettingsTokenizer.GetNextToken();
834 wxStringTokenizer pluginTokenizer = wxStringTokenizer( plugin,
"=" );
836 if( pluginTokenizer.CountTokens() != 2 )
842 std::string key( pluginTokenizer.GetNextToken().ToUTF8() );
843 bool value( pluginTokenizer.GetNextToken().Cmp( wxT(
"Visible" ) ) == 0 );
845 js.push_back( nlohmann::json( { { key, value } } ) );
849 Set(
"action_plugins", js );
855 ret &= fromLegacy<int>( aCfg,
"VrmlExportUnit",
"export_vrml.units" );
856 ret &= fromLegacy<bool>( aCfg,
"VrmlExportCopyFiles",
"export_vrml.copy_3d_models" );
857 ret &= fromLegacy<bool>( aCfg,
"VrmlUseRelativePaths",
"export_vrml.use_relative_paths" );
858 ret &= fromLegacy<int>( aCfg,
"VrmlRefUnits",
"export_vrml.ref_units" );
859 ret &= fromLegacy<double>( aCfg,
"VrmlRefX",
"export_vrml.ref_x" );
860 ret &= fromLegacy<double>( aCfg,
"VrmlRefY",
"export_vrml.ref_y" );
861 ret &= fromLegacy<int> ( aCfg,
"VrmlOriginMode",
"export_vrml.origin_mode" );
863 ret &= fromLegacy<int>( aCfg,
"Zone_Ouline_Hatch_Opt",
"zones.hatching_style" );
864 ret &= fromLegacy<int>( aCfg,
"Zone_NetSort_Opt",
"zones.net_sort_mode" );
865 ret &= fromLegacy<double>( aCfg,
"Zone_Clearance",
"zones.clearance" );
866 ret &= fromLegacy<double>( aCfg,
"Zone_Thickness",
"zones.min_thickness" );
867 ret &= fromLegacy<double>( aCfg,
"Zone_TH_Gap",
"zones.thermal_relief_gap" );
868 ret &= fromLegacy<double>( aCfg,
"Zone_TH_Copper_Width",
"zones.thermal_relief_copper_width" );
870 aCfg->SetPath(
"ImportGraphics" );
871 ret &= fromLegacy<int>( aCfg,
"BoardLayer",
"import_graphics.layer" );
872 ret &= fromLegacy<bool>( aCfg,
"InteractivePlacement",
"import_graphics.interactive_placement" );
874 ret &= fromLegacy<double>( aCfg,
"LineWidth",
"import_graphics.line_width" );
875 ret &= fromLegacy<int>( aCfg,
"LineWidthUnits",
"import_graphics.line_width_units" );
876 ret &= fromLegacy<int>( aCfg,
"PositionUnits",
"import_graphics.origin_units" );
877 ret &= fromLegacy<double>( aCfg,
"PositionX",
"import_graphics.origin_x" );
878 ret &= fromLegacy<double>( aCfg,
"PositionY",
"import_graphics.origin_y" );
879 aCfg->SetPath(
".." );
881 ret &= fromLegacy<int>( aCfg,
"NetlistReportFilterMsg",
"netlist.report_filter" );
882 ret &= fromLegacy<bool>( aCfg,
"NetlistUpdateFootprints",
"netlist.update_footprints" );
883 ret &= fromLegacy<bool>( aCfg,
"NetlistDeleteShortingTracks",
"netlist.delete_shorting_tracks" );
884 ret &= fromLegacy<bool>( aCfg,
"NetlistDeleteExtraFootprints",
"netlist.delete_extra_footprints" );
886 ret &= fromLegacy<int>( aCfg,
"PlaceFileUnits",
"place_file.units" );
887 ret &= fromLegacy<int>( aCfg,
"PlaceFileOpts",
"place_file.file_options" );
888 ret &= fromLegacy<int>( aCfg,
"PlaceFileFormat",
"place_file.file_format" );
889 ret &= fromLegacy<bool>( aCfg,
"PlaceFileIncludeBrdEdge",
"place_file.include_board_edge" );
891 ret &= fromLegacy<int>( aCfg,
"PrintSinglePage",
"plot.all_layers_on_one_page" );
892 ret &= fromLegacy<int>( aCfg,
"PrintPadsDrillOpt",
"plot.pads_drill_mode" );
893 ret &= fromLegacy<double>( aCfg,
"PlotXFineScaleAdj",
"plot.fine_scale_x" );
894 ret &= fromLegacy<double>( aCfg,
"PlotYFineScaleAdj",
"plot.fine_scale_y" );
895 ret &= fromLegacy<double>( aCfg,
"PSPlotFineWidthAdj",
"plot.ps_fine_width_adjust" );
896 ret &= fromLegacy<bool>( aCfg,
"CheckZonesBeforePlotting",
"plot.check_zones_before_plotting" );
898 ret &=
fromLegacyString( aCfg,
"FootprintTextShownColumns",
"window.footprint_text_shown_columns" );
900 ret &= fromLegacy<int>( aCfg,
"FpWizardListWidth",
"footprint_wizard_list.width" );
901 ret &= fromLegacy<int>( aCfg,
"FpWizardListHeight",
"footprint_wizard_list.height" );
905 ret &= fromLegacy<bool>( aCfg,
"ModViewFrameAutoZoom",
"footprint_viewer.auto_zoom" );
906 ret &= fromLegacy<double>( aCfg,
"ModViewFrameZoom",
"footprint_viewer.zoom" );
909 ret &=
fromLegacyString( aCfg,
"Fpwizard_auiPerspective",
"footprint_wizard.perspective" );
912 const std::string p =
"pcbnew.InteractiveRouter.";
914 Set(
"tools.pns.meta", nlohmann::json( {
915 {
"filename",
"pns" },
919 ret &= fromLegacy<int>( aCfg, p +
"Mode",
"tools.pns.mode" );
920 ret &= fromLegacy<int>( aCfg, p +
"OptimizerEffort",
"tools.pns.effort" );
921 ret &= fromLegacy<bool>( aCfg, p +
"RemoveLoops",
"tools.pns.remove_loops" );
922 ret &= fromLegacy<bool>( aCfg, p +
"SmartPads",
"tools.pns.smart_pads" );
923 ret &= fromLegacy<bool>( aCfg, p +
"ShoveVias",
"tools.pns.shove_vias" );
924 ret &= fromLegacy<bool>( aCfg, p +
"StartDiagonal",
"tools.pns.start_diagonal" );
925 ret &= fromLegacy<int>( aCfg, p +
"ShoveTimeLimit",
"tools.pns.shove_time_limit" );
926 ret &= fromLegacy<int>( aCfg, p +
"ShoveIterationLimit",
"tools.pns.shove_iteration_limit" );
927 ret &= fromLegacy<int>( aCfg, p +
"WalkaroundIterationLimit",
"tools.pns.walkaround_iteration_limit" );
928 ret &= fromLegacy<bool>( aCfg, p +
"JumpOverObstacles",
"tools.pns.jump_over_obstacles" );
929 ret &= fromLegacy<bool>( aCfg, p +
"SmoothDraggedSegments",
"tools.pns.smooth_dragged_segments" );
930 ret &= fromLegacy<bool>( aCfg, p +
"CanViolateDRC",
"tools.pns.can_violate_drc" );
931 ret &= fromLegacy<bool>( aCfg, p +
"SuggestFinish",
"tools.pns.suggest_finish" );
932 ret &= fromLegacy<bool>( aCfg, p +
"FreeAngleMode",
"tools.pns.free_angle_mode" );
933 ret &= fromLegacy<bool>( aCfg, p +
"InlineDragEnabled",
"editing.track_drag_action" );
936 Set(
"tools.pns.fix_all_segments",
false );
942 auto migrateLegacyColor =
943 [&] (
const std::string& aKey,
int aLayerId )
947 if( aCfg->Read( aKey, &str ) )
954 migrateLegacyColor(
"Color4DPCBLayer_" + layer.ToStdString(),
PCB_LAYER_ID( i ) );
959 migrateLegacyColor(
"Color4DGrid",
LAYER_GRID );
976 if( aCfg->Read( f +
"PcbUserGrid_X", &x ) && aCfg->Read( f +
"PcbUserGrid_Y", &y ) )
979 static_cast<long>( EDA_UNITS::INCHES ) ) );
ARC_EDIT_MODE
Settings for arc editing.
@ KEEP_CENTER_ADJUST_ANGLE_RADIUS
constexpr EDA_IU_SCALE pcbIUScale
bool migrateWindowConfig(wxConfigBase *aCfg, const std::string &aFrameName, const std::string &aJsonPath)
Migrates legacy window settings into the JSON document.
virtual bool MigrateFromLegacy(wxConfigBase *aCfg) override
Migrates from wxConfig to JSON-based configuration.
void addParamsForWindow(WINDOW_SETTINGS *aWindow, const std::string &aJsonPath)
Adds parameters for the given window object.
bool migrateLibTreeWidth()
Migrates the library tree width setting from a single column (Item) to multi-column.
Color settings are a bit different than most of the settings objects in that there can be more than o...
void SetColor(int aLayer, const COLOR4D &aColor)
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
int AsTenthsOfADegree() const
bool fromLegacyString(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy wxConfig string value to a given JSON pointer value.
void Set(const std::string &aPath, ValueType aVal)
Stores a value into the JSON document Will throw an exception if ValueType isn't something that the l...
std::vector< PARAM_BASE * > m_params
The list of parameters (owned by this object)
void registerMigration(int aOldSchemaVersion, int aNewSchemaVersion, std::function< bool(void)> aMigrator)
Registers a migration from one schema version to another.
nlohmann::json & At(const std::string &aPath)
Wrappers for the underlying JSON API so that most consumers don't need json.hpp All of these function...
wxString GetFilename() const
A color representation with 4 components: red, green, blue, alpha.
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Like a normal param, but with custom getter and setter functions.
DIALOG_EXPORT_2581 m_Export2581
double m_FootprintViewerZoom
The last zoom level used (0 for auto)
DISPLAY_OPTIONS m_Display
DIALOG_NETLIST m_NetlistDialog
EDA_ANGLE m_RotationAngle
DIALOG_PLACE_FILE m_PlaceFile
bool m_FootprintViewerAutoZoomOnSelect
true to use automatic zoom on fp selection
DIALOG_FOOTPRINT_WIZARD_LIST m_FootprintWizardList
ARC_EDIT_MODE m_ArcEditMode
FOOTPRINT_CHOOSER m_FootprintChooser
virtual ~PCBNEW_SETTINGS()
bool m_CtrlClickHighlight
DIALOG_EXPORT_VRML m_ExportVrml
DIALOG_EXPORT_IDF m_ExportIdf
TRACK_DRAG_ACTION m_TrackDragAction
LOCKING_OPTIONS m_LockingOptions
bool m_ESCClearsNetHighlight
wxString m_lastFootprintLibDir
virtual std::string getLegacyFrameName() const override
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
WINDOW_SETTINGS m_FootprintWizard
ACTION_PLUGIN_SETTINGS_LIST m_VisibleActionPlugins
DIALOG_IMPORT_GRAPHICS m_ImportGraphics
DIALOG_EXPORT_STEP m_ExportStep
WINDOW_SETTINGS m_FootprintViewer
wxString m_lastFootprint3dDir
bool m_ShowCourtyardCollisions
DIALOG_GENERATE_DRILL m_GenDrill
MAGNETIC_SETTINGS m_MagneticItems
FLIP_DIRECTION m_FlipDirection
DIALOG_REANNOTATE m_Reannotate
int m_FootprintViewerFPListWidth
DIALOG_EXPORT_SVG m_ExportSvg
wxString m_FootprintTextShownColumns
int m_FootprintViewerLibListWidth
VIEWERS_DISPLAY_OPTIONS m_ViewersDisplay
virtual SETTINGS_MANAGER & GetSettingsManager() const
T * GetAppSettings()
Returns a handle to the a given settings by type If the settings have already been loaded,...
void SaveColorSettings(COLOR_SETTINGS *aSettings, const std::string &aNamespace="")
Safely saves a COLOR_SETTINGS to disk, preserving any changes outside the given namespace.
COLOR_SETTINGS * GetMigratedColorSettings()
Returns a color theme for storing colors migrated from legacy (5.x and earlier) settings,...
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_360
@ LAYER_PAGE_LIMITS
color for drawing the page extents (visibility stored in PCBNEW_SETTINGS::m_ShowPageLimits)
@ LAYER_NON_PLATEDHOLES
handle color for not plated holes (holes, not pads)
@ LAYER_DRAWINGSHEET
drawingsheet frame and titleblock
@ LAYER_PCB_BACKGROUND
PCB background color.
@ LAYER_CURSOR
PCB cursor.
@ LAYER_AUX_ITEMS
Auxiliary items (guides, rule, etc)
@ LAYER_ANCHOR
anchor of items having an anchor point (texts, footprints)
@ LAYER_VIA_MICROVIA
to draw micro vias
@ LAYER_VIA_THROUGH
to draw usual through hole vias
@ LAYER_VIA_BBLIND
to draw blind/buried vias
PCB_LAYER_ID
A quick note on layer IDs:
KICOMMON_API double FromUserUnit(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnit, double aValue)
Return in internal units the value aValue given in a real unit such as "in", "mm",...
KICOMMON_API wxString StringFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Returns the string from aValue according to aUnits (inch, mm ...) for display.
const int pcbnewSchemaVersion
! Update the schema version whenever a migration is required
@ SHOW_WITH_VIA_WHILE_ROUTING
PGM_BASE & Pgm()
The global Program "get" accessor.
float properties_splitter
int properties_panel_width
bool appearance_expand_layer_display
bool appearance_expand_net_display
int search_panel_dock_direction
bool cleanup_tracks_in_pad
bool delete_dangling_vias
bool cleanup_refill_zones
bool cleanup_short_circuits
bool test_all_track_errors
std::vector< int > layers
bool use_route_for_oval_holes
bool use_dlg_layer_selection
bool interactive_placement
bool associate_by_ref_sch
bool delete_extra_footprints
bool delete_shorting_tracks
int all_layers_on_one_page
double ps_fine_width_adjust
bool check_zones_before_plotting
bool edgecut_on_all_layers
wxString front_refdes_start
wxString back_refdes_start
wxString report_file_name
bool m_DisplayPcbTrackFill
TRACK_CLEARANCE_MODE m_TrackClearance
bool m_DisplayInvertYAxis
bool m_DisplayRatsnestLinesCurved
bool m_ShowModuleRatsnest
bool m_DisplayInvertXAxis
bool m_ForceShowFieldsWhenFPSelected
bool m_ShowGlobalRatsnest
PCB_DISPLAY_ORIGIN m_DisplayOrigin
double m_RatsnestThickness
bool m_sessionSkipPrompts
bool m_DisplayGraphicsFill
Functions to provide common constants and other functions to assist in making a consistent UI.