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 );
943 auto migrateLegacyColor =
944 [&] (
const std::string& aKey,
int aLayerId )
948 if( aCfg->Read( aKey, &str ) )
955 migrateLegacyColor(
"Color4DPCBLayer_" + layer.ToStdString(),
PCB_LAYER_ID( i ) );
960 migrateLegacyColor(
"Color4DGrid",
LAYER_GRID );
977 if( aCfg->Read( f +
"PcbUserGrid_X", &x ) && aCfg->Read( f +
"PcbUserGrid_Y", &y ) )
980 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...
virtual void Load()
Updates the parameters of this object based on the current JSON document contents.
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
void SaveColorSettings(COLOR_SETTINGS *aSettings, const std::string &aNamespace="")
Safely saves a COLOR_SETTINGS to disk, preserving any changes outside the given namespace.
T * GetAppSettings(const wxString &aFilename)
Returns a handle to the a given settings by type If the settings have already been loaded,...
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.