24#include <pybind11/pybind11.h> 
   38#include <wx/tokenzr.h> 
  104            &
m_AuiPanels.appearance_expand_layer_display, 
false ) );
 
  107            &
m_AuiPanels.appearance_expand_net_display, 
false ) );
 
  121                                           &
m_AuiPanels.design_blocks_panel_docked_width, -1 ) );
 
  124            new PARAM<int>( 
"aui.design_blocks_panel_float_width", &
m_AuiPanels.design_blocks_panel_float_width, -1 ) );
 
  127                                           &
m_AuiPanels.design_blocks_panel_float_height, -1 ) );
 
  201                int rot = m_RotationAngle.AsTenthsOfADegree();
 
  209                    m_RotationAngle = EDA_ANGLE( aVal, TENTHS_OF_A_DEGREE_T );
 
  214                while( m_RotationAngle > ANGLE_360 )
 
  215                    m_RotationAngle = m_RotationAngle / 100;
 
  224            &
m_Display.m_MaxLinksShowed, 3, 0, 15 ) );
 
  238    m_params.emplace_back( 
new PARAM<bool>( 
"pcb_display.pad_use_via_color_for_normal_th_padstacks",
 
  239            &
m_Display.m_UseViaColorForNormalTHPadstacks, 
false ) );
 
  248            &
m_Display.m_ShowGlobalRatsnest, 
true ) );
 
  251            &
m_Display.m_ShowModuleRatsnest, 
true ) );
 
  254            &
m_Display.m_DisplayRatsnestLinesCurved, 
false ) );
 
  263            &
m_Display.m_DisplayPcbTrackFill, 
true ) );
 
  269            reinterpret_cast<int*
>( &
m_Display.m_DisplayOrigin ),
 
  273            &
m_Display.m_DisplayInvertXAxis, 
false ) );
 
  276            &
m_Display.m_DisplayInvertYAxis, 
false ) );
 
  279            &
m_Display.m_ForceShowFieldsWhenFPSelected, 
true ) );
 
  294            [&]() -> nlohmann::json
 
  296                nlohmann::json js = nlohmann::json::array();
 
  298                for( const auto& pair : m_VisibleActionPlugins )
 
  299                    js.push_back( nlohmann::json( { { pair.first.ToUTF8(), pair.second } } ) );
 
  303            [&]( 
const nlohmann::json& aObj )
 
  305                m_VisibleActionPlugins.clear();
 
  307                if( !aObj.is_array() )
 
  312                for( 
const auto& entry : aObj )
 
  314                    if( entry.empty() || !entry.is_object() )
 
  317                    for( 
const auto& pair : entry.items() )
 
  319                        m_VisibleActionPlugins.emplace_back( std::make_pair(
 
  320                                wxString( pair.key().c_str(), wxConvUTF8 ), pair.value() ) );
 
  324            nlohmann::json::array() ) );
 
  326    addParamsForWindow( &m_FootprintViewer, 
"footprint_viewer" );
 
  328    m_params.emplace_back( 
new PARAM<double>( 
"footprint_viewer.zoom",
 
  329            &m_FootprintViewerZoom, 1.0 ) );
 
  331    m_params.emplace_back( 
new PARAM<bool>( 
"footprint_viewer.autozoom",
 
  332            &m_FootprintViewerAutoZoomOnSelect, 
true ) );
 
  334    m_params.emplace_back( 
new PARAM<int>( 
"footprint_viewer.lib_list_width",
 
  335            &m_FootprintViewerLibListWidth, 200 ) );
 
  337    m_params.emplace_back( 
new PARAM<int>( 
"footprint_viewer.fp_list_width",
 
  338            &m_FootprintViewerFPListWidth, 300 ) );
 
  340    addParamsForWindow( &m_FootprintWizard, 
"footprint_wizard" );
 
  342    m_params.emplace_back( 
new PARAM<wxString>( 
"system.last_footprint_lib_dir",
 
  343            &m_LastFootprintLibDir, 
"" ) );
 
  345    m_params.emplace_back( 
new PARAM<wxString>( 
"system.last_footprint3d_dir",
 
  346            &m_LastFootprint3dDir, 
"" ) );
 
  348    m_params.emplace_back( 
new PARAM<bool>( 
"DRC.report_all_track_errors",
 
  349            &m_DRCDialog.report_all_track_errors, 
false ) );
 
  351    m_params.emplace_back( 
new PARAM<bool>( 
"DRC.crossprobe",
 
  352            &m_DRCDialog.crossprobe, 
true ) );
 
  354    m_params.emplace_back( 
new PARAM<bool>( 
"DRC.scroll_on_crossprobe",
 
  355            &m_DRCDialog.scroll_on_crossprobe, 
true ) );
 
  357    registerMigration( 0, 1,
 
  360                if( std::optional<int> optval = Get<int>( 
"pcb_display.rotation_angle" ) )
 
  361                    Set( 
"editing.rotation_angle", *optval );
 
  365                    At( 
"pcb_display" ).erase( 
"rotation_angle" );
 
  373    registerMigration( 1, 2,
 
  378                Set( 
"editing.auto_fill_zones", 
false );
 
  384    registerMigration( 2, 3,
 
  389                if( std::optional<int> optval = Get<int>( 
"lib_tree.column_width" ) )
 
  392                        Set( 
"lib_tree.column_width",  300 );
 
  398    registerMigration( 3, 4,
 
  402                           return migrateLibTreeWidth();
 
  405    registerMigration( 4, 5,
 
  409                           Set( 
"editing.auto_fill_zones", 
false );
 
 
  427    ret &= 
fromLegacy<bool>( aCfg, 
"ShowLayerManagerTools",         
"aui.show_layer_manager" );
 
  429    ret &= 
fromLegacy<int>(  aCfg, 
"FootprintChooserHSashPosition", 
"footprint_chooser.sash_h" );
 
  430    ret &= 
fromLegacy<int>(  aCfg, 
"FootprintChooserVSashPosition", 
"footprint_chooser.sash_v" );
 
  431    ret &= 
fromLegacy<int>(  aCfg, 
"FootprintChooserWidth",         
"footprint_chooser.width" );
 
  432    ret &= 
fromLegacy<int>(  aCfg, 
"FootprintChooserHeight",        
"footprint_chooser.height" );
 
  434    ret &= 
fromLegacy<bool>(  aCfg, 
"FlipLeftRight",                
"editing.flip_left_right" );
 
  435    ret &= 
fromLegacy<bool>(  aCfg, 
"MagneticGraphics",             
"editing.magnetic_graphics" );
 
  436    ret &= 
fromLegacy<int>(   aCfg, 
"MagneticPads",                 
"editing.magnetic_pads" );
 
  437    ret &= 
fromLegacy<int>(   aCfg, 
"MagneticTracks",               
"editing.magnetic_tracks" );
 
  438    ret &= 
fromLegacy<bool>(  aCfg, 
"DisplayPolarCoords",           
"editing.polar_coords" );
 
  439    ret &= 
fromLegacy<bool>(  aCfg, 
"Use45DegreeGraphicSegments",   
"editing.use_45_degree_graphic_segments" );
 
  441    ret &= 
fromLegacy<bool>(  aCfg, 
"PcbAffT",                      
"pcb_display.graphic_items_fill" );
 
  442    ret &= 
fromLegacy<int>(   aCfg, 
"MaxLnkS",                      
"pcb_display.max_links_shown" );
 
  443    ret &= 
fromLegacy<bool>(  aCfg, 
"ModAffC",                      
"pcb_display.footprint_edge_fill" );
 
  444    ret &= 
fromLegacy<bool>(  aCfg, 
"ModAffT",                      
"pcb_display.footprint_text_fill" );
 
  445    ret &= 
fromLegacy<int>(   aCfg, 
"ShowNetNamesMode",             
"pcb_display.net_names_mode" );
 
  446    ret &= 
fromLegacy<int>(   aCfg, 
"PcbDisplayOrigin",             
"pcb_display.origin_mode" );
 
  447    ret &= 
fromLegacy<bool>(  aCfg, 
"PcbInvertXAxis",               
"pcb_display.origin_invert_x_axis" );
 
  448    ret &= 
fromLegacy<bool>(  aCfg, 
"PcbInvertYAxis",               
"pcb_display.origin_invert_y_axis" );
 
  452    ret &= 
fromLegacy<bool>(  aCfg, 
"ShowRatsnestLines",            
"pcb_display.ratsnest_global" );
 
  453    ret &= 
fromLegacy<bool>(  aCfg, 
"ShowRatsnestModuleLines",      
"pcb_display.ratsnest_footprint" );
 
  454    ret &= 
fromLegacy<bool>(  aCfg, 
"CurvedRatsnestLines",          
"pcb_display.ratsnest_curved" );
 
  455    ret &= 
fromLegacy<int>(   aCfg, 
"RotationAngle",                
"pcb_display.rotation_angle" );
 
  456    ret &= 
fromLegacy<int>(   aCfg, 
"TrackDisplayClearance",        
"pcb_display.track_clearance_mode" );
 
  457    ret &= 
fromLegacy<bool>(  aCfg, 
"DisplayTrackFilled",           
"pcb_display.track_fill" );
 
  459    ret &= 
fromLegacy<int>(   aCfg, 
"PcbShowZonesMode",             
"pcb_display.zone_mode" );
 
  464        nlohmann::json js = nlohmann::json::array();
 
  470            key.Printf( wxT( 
"PlotSVGLayer_%d" ), i );
 
  472            if( aCfg->Read( key, &val ) && val )
 
  476        Set( 
"export_svg.layers", js );
 
  480        nlohmann::json js = nlohmann::json::array();
 
  484        if( aCfg->Read( 
"ActionPluginButtons", &packed ) )
 
  486            wxStringTokenizer pluginSettingsTokenizer = wxStringTokenizer( packed, 
";" );
 
  488            while( pluginSettingsTokenizer.HasMoreTokens() )
 
  491                wxString plugin = pluginSettingsTokenizer.GetNextToken();
 
  492                wxStringTokenizer pluginTokenizer = wxStringTokenizer( plugin, 
"=" );
 
  494                if( pluginTokenizer.CountTokens() != 2 )
 
  500                std::string key( pluginTokenizer.GetNextToken().ToUTF8() );
 
  501                bool        value( pluginTokenizer.GetNextToken().Cmp( wxT( 
"Visible" ) ) == 0 );
 
  503                js.push_back( nlohmann::json( { { key, value } } ) );
 
  507        Set( 
"action_plugins", js );
 
  513    ret &= 
fromLegacy<int>(    aCfg, 
"Zone_Ouline_Hatch_Opt", 
"zones.hatching_style" );
 
  514    ret &= 
fromLegacy<int>(    aCfg, 
"Zone_NetSort_Opt",      
"zones.net_sort_mode" );
 
  518    ret &= 
fromLegacy<double>( aCfg, 
"Zone_TH_Copper_Width",  
"zones.thermal_relief_copper_width" );
 
  520    ret &= 
fromLegacy<int>(    aCfg, 
"PrintSinglePage",          
"plot.all_layers_on_one_page" );
 
  521    ret &= 
fromLegacy<int>(    aCfg, 
"PrintPadsDrillOpt",        
"plot.pads_drill_mode" );
 
  525    ret &= 
fromLegacy<bool>(   aCfg, 
"CheckZonesBeforePlotting", 
"plot.check_zones_before_plotting" );
 
  527    ret &= 
fromLegacyString( aCfg, 
"FootprintTextShownColumns", 
"window.footprint_text_shown_columns" );
 
  529    ret &= 
fromLegacy<int>( aCfg, 
"FpWizardListWidth",        
"footprint_wizard_list.width" );
 
  530    ret &= 
fromLegacy<int>( aCfg, 
"FpWizardListHeight",       
"footprint_wizard_list.height" );
 
  534    ret &= 
fromLegacy<bool>( aCfg, 
"ModViewFrameAutoZoom",   
"footprint_viewer.auto_zoom" );
 
  538    ret &= 
fromLegacyString( aCfg, 
"Fpwizard_auiPerspective", 
"footprint_wizard.perspective" );
 
  541    const std::string p = 
"pcbnew.InteractiveRouter.";
 
  543    Set( 
"tools.pns.meta", nlohmann::json( {
 
  544                                               { 
"filename", 
"pns" },
 
  549    ret &= 
fromLegacy<int>(  aCfg, p + 
"OptimizerEffort",       
"tools.pns.effort" );
 
  550    ret &= 
fromLegacy<bool>( aCfg, p + 
"RemoveLoops",           
"tools.pns.remove_loops" );
 
  553    ret &= 
fromLegacy<bool>( aCfg, p + 
"StartDiagonal",         
"tools.pns.start_diagonal" );
 
  554    ret &= 
fromLegacy<int>(  aCfg, p + 
"ShoveTimeLimit",        
"tools.pns.shove_time_limit" );
 
  555    ret &= 
fromLegacy<int>(  aCfg, p + 
"ShoveIterationLimit",   
"tools.pns.shove_iteration_limit" );
 
  556    ret &= 
fromLegacy<int>(  aCfg, p + 
"WalkaroundIterationLimit", 
"tools.pns.walkaround_iteration_limit" );
 
  557    ret &= 
fromLegacy<bool>( aCfg, p + 
"JumpOverObstacles",     
"tools.pns.jump_over_obstacles" );
 
  558    ret &= 
fromLegacy<bool>( aCfg, p + 
"SmoothDraggedSegments", 
"tools.pns.smooth_dragged_segments" );
 
  559    ret &= 
fromLegacy<bool>( aCfg, p + 
"CanViolateDRC",         
"tools.pns.can_violate_drc" );
 
  560    ret &= 
fromLegacy<bool>( aCfg, p + 
"SuggestFinish",         
"tools.pns.suggest_finish" );
 
  561    ret &= 
fromLegacy<bool>( aCfg, p + 
"FreeAngleMode",         
"tools.pns.free_angle_mode" );
 
  562    ret &= 
fromLegacy<bool>( aCfg, p + 
"InlineDragEnabled",     
"editing.track_drag_action" );
 
  565    Set( 
"tools.pns.fix_all_segments", 
false );
 
  572    auto migrateLegacyColor =
 
  573            [&] ( 
const std::string& aKey, 
int aLayerId )
 
  577                if( aCfg->Read( aKey, &str ) )
 
  584        migrateLegacyColor( 
"Color4DPCBLayer_" + layer.ToStdString(), 
PCB_LAYER_ID( i ) );
 
  589    migrateLegacyColor( 
"Color4DGrid",               
LAYER_GRID );
 
  607    if( aCfg->Read( f + 
"PcbUserGrid_X", &x ) && aCfg->Read( f + 
"PcbUserGrid_Y", &y ) )
 
 
ARC_EDIT_MODE
Settings for arc editing.
 
@ KEEP_CENTER_ADJUST_ANGLE_RADIUS
When editing endpoints, the angle and radius are adjusted.
 
constexpr EDA_IU_SCALE pcbIUScale
 
bool migrateWindowConfig(wxConfigBase *aCfg, const std::string &aFrameName, const std::string &aJsonPath)
Migrate legacy window settings into the JSON document.
 
virtual bool MigrateFromLegacy(wxConfigBase *aCfg) override
Migrates from wxConfig to JSON-based configuration.
 
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.
 
bool fromLegacyString(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy wxConfig string value to a given JSON pointer value.
 
bool fromLegacy(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy wxConfig 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)
 
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_D356 m_ExportD356
 
DISPLAY_OPTIONS m_Display
 
EDA_ANGLE m_RotationAngle
 
ARC_EDIT_MODE m_ArcEditMode
 
FOOTPRINT_CHOOSER m_FootprintChooser
 
virtual ~PCBNEW_SETTINGS()
 
bool m_CtrlClickHighlight
 
TRACK_DRAG_ACTION m_TrackDragAction
 
bool m_ESCClearsNetHighlight
 
LEADER_MODE m_AngleSnapMode
 
virtual std::string getLegacyFrameName() const override
 
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
 
WINDOW_SETTINGS m_FootprintWizard
 
WINDOW_SETTINGS m_FootprintViewer
 
bool m_ShowCourtyardCollisions
 
MAGNETIC_SETTINGS m_MagneticItems
 
FLIP_DIRECTION m_FlipDirection
 
int m_FootprintViewerFPListWidth
 
std::unique_ptr< PNS::ROUTING_SETTINGS > m_PnsSettings
 
wxString m_FootprintTextShownColumns
 
int m_FootprintViewerLibListWidth
 
PCB_VIEWERS_SETTINGS_BASE(const std::string &aFilename, int aSchemaVersion)
 
VIEWERS_DISPLAY_OPTIONS m_ViewersDisplay
 
virtual SETTINGS_MANAGER & GetSettingsManager() const
 
void SaveColorSettings(COLOR_SETTINGS *aSettings, const std::string &aNamespace="")
Safely save a COLOR_SETTINGS to disk, preserving any changes outside the given namespace.
 
COLOR_SETTINGS * GetMigratedColorSettings()
Return a color theme for storing colors migrated from legacy (5.x and earlier) settings,...
 
static constexpr EDA_ANGLE ANGLE_90
 
LEADER_MODE
The kind of the leader line.
 
@ DIRECT
Unconstrained point-to-point.
 
@ LAYER_PAGE_LIMITS
Color for drawing the page extents (visibility stored in PCBNEW_SETTINGS::m_ShowPageLimits)
 
@ LAYER_NON_PLATEDHOLES
Draw usual through hole vias.
 
@ LAYER_DRAWINGSHEET
Sheet frame and title block.
 
@ 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_BURIED
Draw blind vias.
 
@ LAYER_VIA_BLIND
Draw micro vias.
 
@ LAYER_VIA_THROUGH
Draw buried vias.
 
PCB_LAYER_ID
A quick note on layer IDs:
 
@ LEFT_RIGHT
Flip left to right (around the Y axis)
 
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)
Return the string from aValue according to aUnits (inch, mm ...) for display.
 
const int pcbnewSchemaVersion
! Update the schema version whenever a migration is required
 
@ CAPTURE_CURSOR_IN_TRACK_TOOL
 
@ SHOW_WITH_VIA_WHILE_ROUTING
 
PGM_BASE & Pgm()
The global program "get" accessor.
 
T * GetAppSettings(const char *aFilename)