PyOpenMagnetics 1.3.3__tar.gz → 1.3.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/CMakeLists.txt +3 -0
  2. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/PKG-INFO +1 -1
  3. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/pyproject.toml +1 -1
  4. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/advisers.cpp +63 -0
  5. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/advisers.h +1 -0
  6. pyopenmagnetics-1.3.5/src/settings.cpp +538 -0
  7. pyopenmagnetics-1.3.3/src/settings.cpp +0 -251
  8. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/.github/workflows/ci.yml +0 -0
  9. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/.github/workflows/publish.yml +0 -0
  10. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/.gitignore +0 -0
  11. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/AGENTS.md +0 -0
  12. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/LICENSE +0 -0
  13. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/PyOpenMagnetics.pyi +0 -0
  14. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/README.md +0 -0
  15. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/api/MAS.py +0 -0
  16. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/api/mas_db_reader.py +0 -0
  17. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/api/validation.py +0 -0
  18. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/clear_cibuildwheel_cache.sh +0 -0
  19. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/docs/compatibility.md +0 -0
  20. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/docs/errors.md +0 -0
  21. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/docs/performance.md +0 -0
  22. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/README.md +0 -0
  23. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/buck_inductor.py +0 -0
  24. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/complete_simulation_example.py +0 -0
  25. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/converter_design_example.py +0 -0
  26. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/debug_bobbin.py +0 -0
  27. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/debug_coil.py +0 -0
  28. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/debug_core.py +0 -0
  29. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/debug_plotting.py +0 -0
  30. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/flyback_220v_12v_1a.py +0 -0
  31. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/flyback_220v_12v_2a_complete.py +0 -0
  32. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/flyback_bh_curve.png +0 -0
  33. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/flyback_core.png +0 -0
  34. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/flyback_design.py +0 -0
  35. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/flyback_summary.png +0 -0
  36. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/flyback_waveforms.png +0 -0
  37. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/list_plot_funcs.py +0 -0
  38. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/plot_flyback_design.py +0 -0
  39. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/plot_flyback_pyom.py +0 -0
  40. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/test_field_calc.py +0 -0
  41. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/examples/test_field_plot.py +0 -0
  42. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/force_fresh_build.sh +0 -0
  43. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/llms.txt +0 -0
  44. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/notebooks/01_getting_started.ipynb +0 -0
  45. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/notebooks/02_buck_inductor.ipynb +0 -0
  46. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/notebooks/03_core_losses.ipynb +0 -0
  47. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/notebooks/README.md +0 -0
  48. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/requirements.txt +0 -0
  49. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/bobbin.cpp +0 -0
  50. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/bobbin.h +0 -0
  51. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/common.h +0 -0
  52. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/converter.cpp +0 -0
  53. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/converter.h +0 -0
  54. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/core.cpp +0 -0
  55. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/core.h +0 -0
  56. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/database.cpp +0 -0
  57. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/database.h +0 -0
  58. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/logging.cpp +0 -0
  59. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/logging.h +0 -0
  60. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/losses.cpp +0 -0
  61. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/losses.h +0 -0
  62. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/module.cpp +0 -0
  63. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/plotting.cpp +0 -0
  64. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/plotting.h +0 -0
  65. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/settings.h +0 -0
  66. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/simulation.cpp +0 -0
  67. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/simulation.h +0 -0
  68. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/utils.cpp +0 -0
  69. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/utils.h +0 -0
  70. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/winding.cpp +0 -0
  71. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/winding.h +0 -0
  72. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/wire.cpp +0 -0
  73. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/src/wire.h +0 -0
  74. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/test.py +0 -0
  75. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/tests/__init__.py +0 -0
  76. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/tests/conftest.py +0 -0
  77. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/tests/test_converter_endpoints.py +0 -0
  78. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/tests/test_core.py +0 -0
  79. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/tests/test_core_adviser.py +0 -0
  80. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/tests/test_examples_integration.py +0 -0
  81. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/tests/test_inputs.py +0 -0
  82. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/tests/test_logging.py +0 -0
  83. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/tests/test_magnetic_adviser.py +0 -0
  84. {pyopenmagnetics-1.3.3 → pyopenmagnetics-1.3.5}/tests/test_winding.py +0 -0
@@ -265,6 +265,9 @@ cmrc_add_resource_library(data ALIAS data::data NAMESPACE data WHENCE ${MAS_DIR}
265
265
  ${MAS_DIR}/data/wires.ndjson)
266
266
  target_link_libraries(PyOpenMagnetics PUBLIC data::data)
267
267
 
268
+ cmrc_add_resource_library(core_losses_data ALIAS data::core_losses_data NAMESPACE coreLossesData ${MKF_DIR}/src/data/core_losses/ciGSE_coefficients.json)
269
+ target_link_libraries(PyOpenMagnetics PUBLIC data::core_losses_data)
270
+
268
271
  include_directories("${CMAKE_BINARY_DIR}/_deps/json-src/include/nlohmann/")
269
272
  include_directories("${CMAKE_BINARY_DIR}/_deps/pybind11-src/include/")
270
273
  include_directories("${CMAKE_BINARY_DIR}/_deps/pybind11_json-src/include/pybind11_json/")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: PyOpenMagnetics
3
- Version: 1.3.3
3
+ Version: 1.3.5
4
4
  Summary: Python wrapper for OpenMagnetics
5
5
  Author-Email: Alfonso Martinez <Alfonso_VII@hotmail.com>
6
6
  Classifier: Development Status :: 4 - Beta
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "PyOpenMagnetics"
7
- version = "1.3.3"
7
+ version = "1.3.5"
8
8
  requires-python = ">=3.8"
9
9
  authors = [
10
10
  { name="Alfonso Martinez", email="Alfonso_VII@hotmail.com" },
@@ -104,6 +104,37 @@ json calculate_advised_magnetics(json inputsJson, int maximumNumberResults, json
104
104
  }
105
105
  }
106
106
 
107
+ json calculate_advised_magnetics_fast(json inputsJson, int maximumNumberResults, json coreModeJson) {
108
+ try {
109
+ OpenMagnetics::Inputs inputs(inputsJson);
110
+ OpenMagnetics::CoreAdviser::CoreAdviserModes coreMode;
111
+ from_json(coreModeJson, coreMode);
112
+
113
+ OpenMagnetics::MagneticAdviser magneticAdviser;
114
+ magneticAdviser.set_core_mode(coreMode);
115
+ auto masMagnetics = magneticAdviser.get_advised_magnetic_fast(inputs, maximumNumberResults);
116
+
117
+ json results = json();
118
+ results["data"] = json::array();
119
+ for (auto& [masMagnetic, scoring] : masMagnetics) {
120
+ std::string name = masMagnetic.get_magnetic().get_manufacturer_info().value().get_reference().value();
121
+ json result;
122
+ json masJson;
123
+ to_json(masJson, masMagnetic);
124
+ result["mas"] = masJson;
125
+ result["scoring"] = scoring;
126
+ results["data"].push_back(result);
127
+ }
128
+
129
+ return results;
130
+ }
131
+ catch (const std::exception &exc) {
132
+ json exception;
133
+ exception["data"] = "Exception: " + std::string{exc.what()};
134
+ return exception;
135
+ }
136
+ }
137
+
107
138
  json calculate_advised_magnetics_from_catalog(json inputsJson, json catalogJson, int maximumNumberResults) {
108
139
  try {
109
140
  OpenMagnetics::settings.set_coil_delimit_and_compact(true);
@@ -269,6 +300,38 @@ void register_adviser_bindings(py::module& m) {
269
300
  )pbdoc",
270
301
  py::arg("inputs_json"), py::arg("max_results"), py::arg("core_mode_json"));
271
302
 
303
+ m.def("calculate_advised_magnetics_fast", &calculate_advised_magnetics_fast,
304
+ R"pbdoc(
305
+ Get recommended complete magnetic designs using fast analytical mode.
306
+
307
+ Performs rapid magnetic design exploration using analytical turn/gap
308
+ calculation and simplified loss evaluation (DC ohmic + core losses only).
309
+ Bypasses CoilAdviser optimization and full MagneticSimulator for speed.
310
+ Results are sorted by ascending total losses (lower losses = better rank).
311
+
312
+ Suitable for design space exploration and Pareto front generation.
313
+ For production designs use calculate_advised_magnetics() instead.
314
+
315
+ Args:
316
+ inputs_json: JSON object containing design requirements and operating points.
317
+ Should be processed using process_inputs() first.
318
+ max_results: Maximum number of magnetic recommendations to return.
319
+ core_mode_json: Core selection mode - "AVAILABLE_CORES" or "STANDARD_CORES".
320
+
321
+ Returns:
322
+ JSON object with "data" array containing results sorted by total losses.
323
+ Each result has:
324
+ - "mas": Mas object with magnetic, inputs, and outputs (losses data)
325
+ - "scoring": Total losses value in watts (lower is better)
326
+
327
+ Example:
328
+ >>> inputs = PyMKF.process_inputs(raw_inputs)
329
+ >>> result = PyMKF.calculate_advised_magnetics_fast(inputs, 5, "STANDARD_CORES")
330
+ >>> for item in result["data"]:
331
+ ... print(f"Total losses: {item['scoring']} W")
332
+ )pbdoc",
333
+ py::arg("inputs_json"), py::arg("max_results"), py::arg("core_mode_json"));
334
+
272
335
  m.def("calculate_advised_magnetics_from_catalog", &calculate_advised_magnetics_from_catalog,
273
336
  R"pbdoc(
274
337
  Get recommended magnetics from a custom component catalog.
@@ -9,6 +9,7 @@ json calculate_advised_cores(json inputsJson, json weightsJson, int maximumNumbe
9
9
 
10
10
  // Magnetic adviser
11
11
  json calculate_advised_magnetics(json inputsJson, int maximumNumberResults, json coreModeJson);
12
+ json calculate_advised_magnetics_fast(json inputsJson, int maximumNumberResults, json coreModeJson);
12
13
  json calculate_advised_magnetics_from_catalog(json inputsJson, json catalogJson, int maximumNumberResults);
13
14
  json calculate_advised_magnetics_from_cache(json inputsJson, json filterFlowJson, int maximumNumberResults);
14
15
 
@@ -0,0 +1,538 @@
1
+ #include "settings.h"
2
+
3
+ namespace PyMKF {
4
+
5
+ py::dict get_constants() {
6
+ py::dict constantsMap;
7
+ constantsMap["residualGap"] = OpenMagnetics::constants.residualGap;
8
+ constantsMap["minimumNonResidualGap"] = OpenMagnetics::constants.minimumNonResidualGap;
9
+ constantsMap["vacuumPermeability"] = OpenMagnetics::constants.vacuumPermeability;
10
+ constantsMap["vacuumPermittivity"] = OpenMagnetics::constants.vacuumPermittivity;
11
+ constantsMap["spacerProtudingPercentage"] = OpenMagnetics::constants.spacerProtudingPercentage;
12
+ constantsMap["coilPainterScale"] = OpenMagnetics::constants.coilPainterScale;
13
+ constantsMap["minimumDistributedFringingFactor"] = OpenMagnetics::constants.minimumDistributedFringingFactor;
14
+ constantsMap["maximumDistributedFringingFactor"] = OpenMagnetics::constants.maximumDistributedFringingFactor;
15
+ constantsMap["initialGapLengthForSearching"] = OpenMagnetics::constants.initialGapLengthForSearching;
16
+ constantsMap["roshenMagneticFieldStrengthStep"] = OpenMagnetics::constants.roshenMagneticFieldStrengthStep;
17
+ constantsMap["foilToSectionMargin"] = OpenMagnetics::constants.foilToSectionMargin;
18
+ constantsMap["planarToSectionMargin"] = OpenMagnetics::constants.planarToSectionMargin;
19
+ return constantsMap;
20
+ }
21
+
22
+ py::dict get_defaults() {
23
+ py::dict defaultsMap;
24
+ json aux;
25
+ to_json(aux, OpenMagnetics::defaults.coreLossesModelDefault);
26
+ defaultsMap["coreLossesModelDefault"] = aux;
27
+ to_json(aux, OpenMagnetics::defaults.coreTemperatureModelDefault);
28
+ defaultsMap["coreTemperatureModelDefault"] = aux;
29
+ to_json(aux, OpenMagnetics::defaults.reluctanceModelDefault);
30
+ defaultsMap["reluctanceModelDefault"] = aux;
31
+ to_json(aux, OpenMagnetics::defaults.magneticFieldStrengthModelDefault);
32
+ defaultsMap["magneticFieldStrengthModelDefault"] = aux;
33
+ to_json(aux, OpenMagnetics::defaults.magneticFieldStrengthFringingEffectModelDefault);
34
+ defaultsMap["magneticFieldStrengthFringingEffectModelDefault"] = aux;
35
+ defaultsMap["maximumProportionMagneticFluxDensitySaturation"] = OpenMagnetics::defaults.maximumProportionMagneticFluxDensitySaturation;
36
+ defaultsMap["coreAdviserFrequencyReference"] = OpenMagnetics::defaults.coreAdviserFrequencyReference;
37
+ defaultsMap["coreAdviserMagneticFluxDensityReference"] = OpenMagnetics::defaults.coreAdviserMagneticFluxDensityReference;
38
+ defaultsMap["coreAdviserThresholdValidity"] = OpenMagnetics::defaults.coreAdviserThresholdValidity;
39
+ defaultsMap["coreAdviserMaximumCoreTemperature"] = OpenMagnetics::defaults.coreAdviserMaximumCoreTemperature;
40
+ defaultsMap["coreAdviserMaximumPercentagePowerCoreLosses"] = OpenMagnetics::defaults.coreAdviserMaximumPercentagePowerCoreLosses;
41
+ defaultsMap["coreAdviserMaximumMagneticsAfterFiltering"] = OpenMagnetics::defaults.coreAdviserMaximumMagneticsAfterFiltering;
42
+ defaultsMap["coreAdviserMaximumNumberStacks"] = OpenMagnetics::defaults.coreAdviserMaximumNumberStacks;
43
+ defaultsMap["maximumCurrentDensity"] = OpenMagnetics::defaults.maximumCurrentDensity;
44
+ defaultsMap["maximumEffectiveCurrentDensity"] = OpenMagnetics::defaults.maximumEffectiveCurrentDensity;
45
+ defaultsMap["maximumNumberParallels"] = OpenMagnetics::defaults.maximumNumberParallels;
46
+ defaultsMap["magneticFluxDensitySaturation"] = OpenMagnetics::defaults.magneticFluxDensitySaturation;
47
+ defaultsMap["magnetizingInductanceThresholdValidity"] = OpenMagnetics::defaults.magnetizingInductanceThresholdValidity;
48
+ defaultsMap["harmonicAmplitudeThreshold"] = OpenMagnetics::defaults.harmonicAmplitudeThreshold;
49
+ defaultsMap["ambientTemperature"] = OpenMagnetics::defaults.ambientTemperature;
50
+ defaultsMap["measurementFrequency"] = OpenMagnetics::defaults.measurementFrequency;
51
+ defaultsMap["magneticFieldMirroringDimension"] = OpenMagnetics::defaults.magneticFieldMirroringDimension;
52
+ defaultsMap["maximumCoilPattern"] = OpenMagnetics::defaults.maximumCoilPattern;
53
+ to_json(aux, OpenMagnetics::defaults.defaultRoundWindowSectionsOrientation);
54
+ defaultsMap["defaultRoundWindowSectionsOrientation"] = aux;
55
+ to_json(aux, OpenMagnetics::defaults.defaultRectangularWindowSectionsOrientation);
56
+ defaultsMap["defaultRectangularWindowSectionsOrientation"] = aux;
57
+ defaultsMap["defaultEnamelledInsulationMaterial"] = OpenMagnetics::defaults.defaultEnamelledInsulationMaterial;
58
+ defaultsMap["defaultInsulationMaterial"] = OpenMagnetics::defaults.defaultInsulationMaterial;
59
+ defaultsMap["defaultLayerInsulationMaterial"] = OpenMagnetics::defaults.defaultLayerInsulationMaterial;
60
+ defaultsMap["overlappingFactorSurroundingTurns"] = OpenMagnetics::defaults.overlappingFactorSurroundingTurns;
61
+ to_json(aux, OpenMagnetics::defaults.commonWireStandard);
62
+ defaultsMap["commonWireStandard"] = aux;
63
+ return defaultsMap;
64
+ }
65
+
66
+ json get_settings() {
67
+ try {
68
+ json settingsJson;
69
+
70
+ // General
71
+ settingsJson["verbose"] = OpenMagnetics::settings.get_verbose();
72
+ settingsJson["useToroidalCores"] = OpenMagnetics::settings.get_use_toroidal_cores();
73
+ settingsJson["useConcentricCores"] = OpenMagnetics::settings.get_use_concentric_cores();
74
+ settingsJson["useOnlyCoresInStock"] = OpenMagnetics::settings.get_use_only_cores_in_stock();
75
+ settingsJson["usePowderCores"] = OpenMagnetics::settings.get_use_powder_cores();
76
+
77
+ // Inputs
78
+ settingsJson["inputsTrimHarmonics"] = OpenMagnetics::settings.get_inputs_trim_harmonics();
79
+ settingsJson["inputsNumberPointsSampledWaveforms"] = OpenMagnetics::settings.get_inputs_number_points_sampled_waveforms();
80
+
81
+ // Magnetizing inductance
82
+ settingsJson["magnetizingInductanceIncludeAirInductance"] = OpenMagnetics::settings.get_magnetizing_inductance_include_air_inductance();
83
+
84
+ // Coil
85
+ settingsJson["coilAllowMarginTape"] = OpenMagnetics::settings.get_coil_allow_margin_tape();
86
+ settingsJson["coilAllowInsulatedWire"] = OpenMagnetics::settings.get_coil_allow_insulated_wire();
87
+ settingsJson["coilFillSectionsWithMarginTape"] = OpenMagnetics::settings.get_coil_fill_sections_with_margin_tape();
88
+ settingsJson["coilWindEvenIfNotFit"] = OpenMagnetics::settings.get_coil_wind_even_if_not_fit();
89
+ settingsJson["coilDelimitAndCompact"] = OpenMagnetics::settings.get_coil_delimit_and_compact();
90
+ settingsJson["coilTryRewind"] = OpenMagnetics::settings.get_coil_try_rewind();
91
+ settingsJson["coilIncludeAdditionalCoordinates"] = OpenMagnetics::settings.get_coil_include_additional_coordinates();
92
+ settingsJson["coilEqualizeMargins"] = OpenMagnetics::settings.get_coil_equalize_margins();
93
+ settingsJson["coilOnlyOneTurnPerLayerInContiguousRectangular"] = OpenMagnetics::settings.get_coil_only_one_turn_per_layer_in_contiguous_rectangular();
94
+ settingsJson["coilMaximumLayersPlanar"] = OpenMagnetics::settings.get_coil_maximum_layers_planar();
95
+ settingsJson["coilMesherInsideTurnsFactor"] = OpenMagnetics::settings.get_coil_mesher_inside_turns_factor();
96
+ settingsJson["coilEnableUserWindingLossesModels"] = OpenMagnetics::settings.get_coil_enable_user_winding_losses_models();
97
+
98
+ // Effective parameter standard
99
+ {
100
+ json aux;
101
+ to_json(aux, OpenMagnetics::settings.get_effective_parameter_standard());
102
+ settingsJson["effectiveParameterStandard"] = aux;
103
+ }
104
+ settingsJson["nanocrystallineStackingFactor"] = OpenMagnetics::settings.get_nanocrystalline_stacking_factor();
105
+
106
+ // Painter
107
+ settingsJson["painterNumberPointsX"] = OpenMagnetics::settings.get_painter_number_points_x();
108
+ settingsJson["painterNumberPointsY"] = OpenMagnetics::settings.get_painter_number_points_y();
109
+ settingsJson["painterMode"] = OpenMagnetics::settings.get_painter_mode();
110
+ settingsJson["painterLogarithmicScale"] = OpenMagnetics::settings.get_painter_logarithmic_scale();
111
+ settingsJson["painterIncludeFringing"] = OpenMagnetics::settings.get_painter_include_fringing();
112
+ settingsJson["painterDrawSpacer"] = OpenMagnetics::settings.get_painter_draw_spacer();
113
+ settingsJson["painterSimpleLitz"] = OpenMagnetics::settings.get_painter_simple_litz();
114
+ settingsJson["painterAdvancedLitz"] = OpenMagnetics::settings.get_painter_advanced_litz();
115
+ if (OpenMagnetics::settings.get_painter_maximum_value_colorbar()) {
116
+ settingsJson["painterMaximumValueColorbar"] = OpenMagnetics::settings.get_painter_maximum_value_colorbar();
117
+ }
118
+ if (OpenMagnetics::settings.get_painter_minimum_value_colorbar()) {
119
+ settingsJson["painterMinimumValueColorbar"] = OpenMagnetics::settings.get_painter_minimum_value_colorbar();
120
+ }
121
+ settingsJson["painterColorFerrite"] = OpenMagnetics::settings.get_painter_color_ferrite();
122
+ settingsJson["painterColorBobbin"] = OpenMagnetics::settings.get_painter_color_bobbin();
123
+ settingsJson["painterColorCopper"] = OpenMagnetics::settings.get_painter_color_copper();
124
+ settingsJson["painterColorInsulation"] = OpenMagnetics::settings.get_painter_color_insulation();
125
+ settingsJson["painterColorFr4"] = OpenMagnetics::settings.get_painter_color_fr4();
126
+ settingsJson["painterColorEnamel"] = OpenMagnetics::settings.get_painter_color_enamel();
127
+ settingsJson["painterColorFEP"] = OpenMagnetics::settings.get_painter_color_fep();
128
+ settingsJson["painterColorETFE"] = OpenMagnetics::settings.get_painter_color_etfe();
129
+ settingsJson["painterColorTCA"] = OpenMagnetics::settings.get_painter_color_tca();
130
+ settingsJson["painterColorPFA"] = OpenMagnetics::settings.get_painter_color_pfa();
131
+ settingsJson["painterColorSilk"] = OpenMagnetics::settings.get_painter_color_silk();
132
+ settingsJson["painterColorMargin"] = OpenMagnetics::settings.get_painter_color_margin();
133
+ settingsJson["painterColorSpacer"] = OpenMagnetics::settings.get_painter_color_spacer();
134
+ settingsJson["painterColorLines"] = OpenMagnetics::settings.get_painter_color_lines();
135
+ settingsJson["painterColorText"] = OpenMagnetics::settings.get_painter_color_text();
136
+ settingsJson["painterColorCurrentDensity"] = OpenMagnetics::settings.get_painter_color_current_density();
137
+ settingsJson["painterColorMagneticFieldMinimum"] = OpenMagnetics::settings.get_painter_color_magnetic_field_minimum();
138
+ settingsJson["painterColorMagneticFieldMaximum"] = OpenMagnetics::settings.get_painter_color_magnetic_field_maximum();
139
+ settingsJson["painterCciCoordinatesPath"] = OpenMagnetics::settings.get_painter_cci_coordinates_path();
140
+ settingsJson["painterMirroringDimension"] = OpenMagnetics::settings.get_painter_mirroring_dimension();
141
+ if (OpenMagnetics::settings.get_painter_magnetic_field_strength_model()) {
142
+ json aux;
143
+ to_json(aux, OpenMagnetics::settings.get_painter_magnetic_field_strength_model().value());
144
+ settingsJson["painterMagneticFieldStrengthModel"] = aux;
145
+ }
146
+
147
+ // Magnetic field
148
+ settingsJson["magneticFieldNumberPointsX"] = OpenMagnetics::settings.get_magnetic_field_number_points_x();
149
+ settingsJson["magneticFieldNumberPointsY"] = OpenMagnetics::settings.get_magnetic_field_number_points_y();
150
+ settingsJson["magneticFieldIncludeFringing"] = OpenMagnetics::settings.get_magnetic_field_include_fringing();
151
+ settingsJson["magneticFieldMirroringDimension"] = OpenMagnetics::settings.get_magnetic_field_mirroring_dimension();
152
+
153
+ // Leakage inductance
154
+ settingsJson["leakageInductanceGridAutoScaling"] = OpenMagnetics::settings.get_leakage_inductance_grid_auto_scaling();
155
+ settingsJson["leakageInductanceGridPrecisionLevelPlanar"] = OpenMagnetics::settings.get_leakage_inductance_grid_precision_level_planar();
156
+ settingsJson["leakageInductanceGridPrecisionLevelWound"] = OpenMagnetics::settings.get_leakage_inductance_grid_precision_level_wound();
157
+
158
+ // Adviser
159
+ settingsJson["coilAdviserMaximumNumberWires"] = OpenMagnetics::settings.get_coil_adviser_maximum_number_wires();
160
+ settingsJson["coreAdviserIncludeStacks"] = OpenMagnetics::settings.get_core_adviser_include_stacks();
161
+ settingsJson["coreAdviserIncludeDistributedGaps"] = OpenMagnetics::settings.get_core_adviser_include_distributed_gaps();
162
+ settingsJson["coreAdviserIncludeMargin"] = OpenMagnetics::settings.get_core_adviser_include_margin();
163
+ settingsJson["coreAdviserEnableIntermediatePruning"] = OpenMagnetics::settings.get_core_adviser_enable_intermediate_pruning();
164
+ settingsJson["coreAdviserMaximumMagneticsAfterFiltering"] = OpenMagnetics::settings.get_core_adviser_maximum_magnetics_after_filtering();
165
+ {
166
+ json aux;
167
+ to_json(aux, OpenMagnetics::settings.get_gapping_strategy());
168
+ settingsJson["gappingStrategy"] = aux;
169
+ }
170
+
171
+ // Wire adviser
172
+ settingsJson["wireAdviserIncludePlanar"] = OpenMagnetics::settings.get_wire_adviser_include_planar();
173
+ settingsJson["wireAdviserIncludeFoil"] = OpenMagnetics::settings.get_wire_adviser_include_foil();
174
+ settingsJson["wireAdviserIncludeRectangular"] = OpenMagnetics::settings.get_wire_adviser_include_rectangular();
175
+ settingsJson["wireAdviserIncludeLitz"] = OpenMagnetics::settings.get_wire_adviser_include_litz();
176
+ settingsJson["wireAdviserIncludeRound"] = OpenMagnetics::settings.get_wire_adviser_include_round();
177
+ settingsJson["wireAdviserAllowRectangularInToroidalCores"] = OpenMagnetics::settings.get_wire_adviser_allow_rectangular_in_toroidal_cores();
178
+
179
+ // Harmonics
180
+ settingsJson["harmonicAmplitudeThresholdQuickMode"] = OpenMagnetics::settings.get_harmonic_amplitude_threshold_quick_mode();
181
+ settingsJson["harmonicAmplitudeThreshold"] = OpenMagnetics::settings.get_harmonic_amplitude_threshold();
182
+
183
+ // Models
184
+ {
185
+ json aux;
186
+ to_json(aux, OpenMagnetics::settings.get_magnetic_field_strength_model());
187
+ settingsJson["magneticFieldStrengthModel"] = aux;
188
+ }
189
+ {
190
+ json aux;
191
+ to_json(aux, OpenMagnetics::settings.get_magnetic_field_strength_fringing_effect_model());
192
+ settingsJson["magneticFieldStrengthFringingEffectModel"] = aux;
193
+ }
194
+ {
195
+ json aux;
196
+ to_json(aux, OpenMagnetics::settings.get_leakage_inductance_magnetic_field_strength_model());
197
+ settingsJson["leakageInductanceMagneticFieldStrengthModel"] = aux;
198
+ }
199
+ {
200
+ json aux;
201
+ to_json(aux, OpenMagnetics::settings.get_reluctance_model());
202
+ settingsJson["reluctanceModel"] = aux;
203
+ }
204
+ {
205
+ json aux;
206
+ to_json(aux, OpenMagnetics::settings.get_core_temperature_model());
207
+ settingsJson["coreTemperatureModel"] = aux;
208
+ }
209
+ {
210
+ json aux;
211
+ to_json(aux, OpenMagnetics::settings.get_core_thermal_resistance_model());
212
+ settingsJson["coreThermalResistanceModel"] = aux;
213
+ }
214
+ {
215
+ json aux;
216
+ to_json(aux, OpenMagnetics::settings.get_winding_skin_effect_losses_model());
217
+ settingsJson["windingSkinEffectLossesModel"] = aux;
218
+ }
219
+ {
220
+ json aux;
221
+ to_json(aux, OpenMagnetics::settings.get_winding_proximity_effect_losses_model());
222
+ settingsJson["windingProximityEffectLossesModel"] = aux;
223
+ }
224
+ {
225
+ json aux;
226
+ to_json(aux, OpenMagnetics::settings.get_stray_capacitance_model());
227
+ settingsJson["strayCapacitanceModel"] = aux;
228
+ }
229
+ {
230
+ json aux;
231
+ to_json(aux, OpenMagnetics::settings.get_electric_field_output_unit());
232
+ settingsJson["electricFieldOutputUnit"] = aux;
233
+ }
234
+
235
+ // Circuit simulator
236
+ settingsJson["circuitSimulatorCurveFittingMode"] = OpenMagnetics::settings.get_circuit_simulator_curve_fitting_mode();
237
+ if (OpenMagnetics::settings.get_circuit_simulator_fracpole_options()) {
238
+ settingsJson["circuitSimulatorFracpoleOptions"] = OpenMagnetics::settings.get_circuit_simulator_fracpole_options().value();
239
+ }
240
+ settingsJson["circuitSimulatorIncludeSaturation"] = OpenMagnetics::settings.get_circuit_simulator_include_saturation();
241
+ settingsJson["circuitSimulatorIncludeMutualResistance"] = OpenMagnetics::settings.get_circuit_simulator_include_mutual_resistance();
242
+ settingsJson["circuitSimulatorCoreLossTopology"] = OpenMagnetics::settings.get_circuit_simulator_core_loss_topology();
243
+
244
+ // Preferred manufacturers
245
+ settingsJson["preferredCoreMaterialFerriteManufacturer"] = OpenMagnetics::settings.get_preferred_core_material_ferrite_manufacturer();
246
+ settingsJson["preferredCoreMaterialPowderManufacturer"] = OpenMagnetics::settings.get_preferred_core_material_powder_manufacturer();
247
+ settingsJson["coreCrossReferencerAllowDifferentCoreMaterialType"] = OpenMagnetics::settings.get_core_cross_referencer_allow_different_core_material_type();
248
+
249
+ return settingsJson;
250
+ }
251
+ catch (const std::exception &exc) {
252
+ json exception;
253
+ exception["data"] = "Exception: " + std::string{exc.what()};
254
+ return exception;
255
+ }
256
+ }
257
+
258
+ void set_settings(json settingsJson) {
259
+ try {
260
+ // General
261
+ if (settingsJson.contains("verbose")) OpenMagnetics::settings.set_verbose(settingsJson["verbose"]);
262
+ if (settingsJson.contains("useToroidalCores")) OpenMagnetics::settings.set_use_toroidal_cores(settingsJson["useToroidalCores"]);
263
+ if (settingsJson.contains("useConcentricCores")) OpenMagnetics::settings.set_use_concentric_cores(settingsJson["useConcentricCores"]);
264
+ if (settingsJson.contains("useOnlyCoresInStock")) OpenMagnetics::settings.set_use_only_cores_in_stock(settingsJson["useOnlyCoresInStock"]);
265
+ if (settingsJson.contains("usePowderCores")) OpenMagnetics::settings.set_use_powder_cores(settingsJson["usePowderCores"]);
266
+
267
+ // Inputs
268
+ if (settingsJson.contains("inputsTrimHarmonics")) OpenMagnetics::settings.set_inputs_trim_harmonics(settingsJson["inputsTrimHarmonics"]);
269
+ if (settingsJson.contains("inputsNumberPointsSampledWaveforms")) OpenMagnetics::settings.set_inputs_number_points_sampled_waveforms(settingsJson["inputsNumberPointsSampledWaveforms"]);
270
+
271
+ // Magnetizing inductance
272
+ if (settingsJson.contains("magnetizingInductanceIncludeAirInductance")) OpenMagnetics::settings.set_magnetizing_inductance_include_air_inductance(settingsJson["magnetizingInductanceIncludeAirInductance"]);
273
+
274
+ // Coil
275
+ if (settingsJson.contains("coilAllowMarginTape")) OpenMagnetics::settings.set_coil_allow_margin_tape(settingsJson["coilAllowMarginTape"]);
276
+ if (settingsJson.contains("coilAllowInsulatedWire")) OpenMagnetics::settings.set_coil_allow_insulated_wire(settingsJson["coilAllowInsulatedWire"]);
277
+ if (settingsJson.contains("coilFillSectionsWithMarginTape")) OpenMagnetics::settings.set_coil_fill_sections_with_margin_tape(settingsJson["coilFillSectionsWithMarginTape"]);
278
+ if (settingsJson.contains("coilWindEvenIfNotFit")) OpenMagnetics::settings.set_coil_wind_even_if_not_fit(settingsJson["coilWindEvenIfNotFit"]);
279
+ if (settingsJson.contains("coilDelimitAndCompact")) OpenMagnetics::settings.set_coil_delimit_and_compact(settingsJson["coilDelimitAndCompact"]);
280
+ if (settingsJson.contains("coilTryRewind")) OpenMagnetics::settings.set_coil_try_rewind(settingsJson["coilTryRewind"]);
281
+ if (settingsJson.contains("coilIncludeAdditionalCoordinates")) OpenMagnetics::settings.set_coil_include_additional_coordinates(settingsJson["coilIncludeAdditionalCoordinates"]);
282
+ if (settingsJson.contains("coilEqualizeMargins")) OpenMagnetics::settings.set_coil_equalize_margins(settingsJson["coilEqualizeMargins"]);
283
+ if (settingsJson.contains("coilOnlyOneTurnPerLayerInContiguousRectangular")) OpenMagnetics::settings.set_coil_only_one_turn_per_layer_in_contiguous_rectangular(settingsJson["coilOnlyOneTurnPerLayerInContiguousRectangular"]);
284
+ if (settingsJson.contains("coilMaximumLayersPlanar")) OpenMagnetics::settings.set_coil_maximum_layers_planar(settingsJson["coilMaximumLayersPlanar"]);
285
+ if (settingsJson.contains("coilMesherInsideTurnsFactor")) OpenMagnetics::settings.set_coil_mesher_inside_turns_factor(settingsJson["coilMesherInsideTurnsFactor"]);
286
+ if (settingsJson.contains("coilEnableUserWindingLossesModels")) OpenMagnetics::settings.set_coil_enable_user_winding_losses_models(settingsJson["coilEnableUserWindingLossesModels"]);
287
+
288
+ // Effective parameter standard
289
+ if (settingsJson.contains("effectiveParameterStandard")) {
290
+ EffectiveParameterStandard standard;
291
+ from_json(settingsJson["effectiveParameterStandard"], standard);
292
+ OpenMagnetics::settings.set_effective_parameter_standard(standard);
293
+ }
294
+ if (settingsJson.contains("nanocrystallineStackingFactor")) OpenMagnetics::settings.set_nanocrystalline_stacking_factor(settingsJson["nanocrystallineStackingFactor"]);
295
+
296
+ // Painter
297
+ if (settingsJson.contains("painterNumberPointsX")) OpenMagnetics::settings.set_painter_number_points_x(settingsJson["painterNumberPointsX"]);
298
+ if (settingsJson.contains("painterNumberPointsY")) OpenMagnetics::settings.set_painter_number_points_y(settingsJson["painterNumberPointsY"]);
299
+ if (settingsJson.contains("painterMode")) OpenMagnetics::settings.set_painter_mode(settingsJson["painterMode"]);
300
+ if (settingsJson.contains("painterLogarithmicScale")) OpenMagnetics::settings.set_painter_logarithmic_scale(settingsJson["painterLogarithmicScale"]);
301
+ if (settingsJson.contains("painterIncludeFringing")) OpenMagnetics::settings.set_painter_include_fringing(settingsJson["painterIncludeFringing"]);
302
+ if (settingsJson.contains("painterDrawSpacer")) OpenMagnetics::settings.set_painter_draw_spacer(settingsJson["painterDrawSpacer"]);
303
+ if (settingsJson.contains("painterSimpleLitz")) OpenMagnetics::settings.set_painter_simple_litz(settingsJson["painterSimpleLitz"]);
304
+ if (settingsJson.contains("painterAdvancedLitz")) OpenMagnetics::settings.set_painter_advanced_litz(settingsJson["painterAdvancedLitz"]);
305
+ if (settingsJson.contains("painterMaximumValueColorbar")) OpenMagnetics::settings.set_painter_maximum_value_colorbar(settingsJson["painterMaximumValueColorbar"]);
306
+ if (settingsJson.contains("painterMinimumValueColorbar")) OpenMagnetics::settings.set_painter_minimum_value_colorbar(settingsJson["painterMinimumValueColorbar"]);
307
+ if (settingsJson.contains("painterColorFerrite")) OpenMagnetics::settings.set_painter_color_ferrite(settingsJson["painterColorFerrite"]);
308
+ if (settingsJson.contains("painterColorBobbin")) OpenMagnetics::settings.set_painter_color_bobbin(settingsJson["painterColorBobbin"]);
309
+ if (settingsJson.contains("painterColorCopper")) OpenMagnetics::settings.set_painter_color_copper(settingsJson["painterColorCopper"]);
310
+ if (settingsJson.contains("painterColorInsulation")) OpenMagnetics::settings.set_painter_color_insulation(settingsJson["painterColorInsulation"]);
311
+ if (settingsJson.contains("painterColorFr4")) OpenMagnetics::settings.set_painter_color_fr4(settingsJson["painterColorFr4"]);
312
+ if (settingsJson.contains("painterColorEnamel")) OpenMagnetics::settings.set_painter_color_enamel(settingsJson["painterColorEnamel"]);
313
+ if (settingsJson.contains("painterColorFEP")) OpenMagnetics::settings.set_painter_color_fep(settingsJson["painterColorFEP"]);
314
+ if (settingsJson.contains("painterColorETFE")) OpenMagnetics::settings.set_painter_color_etfe(settingsJson["painterColorETFE"]);
315
+ if (settingsJson.contains("painterColorTCA")) OpenMagnetics::settings.set_painter_color_tca(settingsJson["painterColorTCA"]);
316
+ if (settingsJson.contains("painterColorPFA")) OpenMagnetics::settings.set_painter_color_pfa(settingsJson["painterColorPFA"]);
317
+ if (settingsJson.contains("painterColorSilk")) OpenMagnetics::settings.set_painter_color_silk(settingsJson["painterColorSilk"]);
318
+ if (settingsJson.contains("painterColorMargin")) OpenMagnetics::settings.set_painter_color_margin(settingsJson["painterColorMargin"]);
319
+ if (settingsJson.contains("painterColorSpacer")) OpenMagnetics::settings.set_painter_color_spacer(settingsJson["painterColorSpacer"]);
320
+ if (settingsJson.contains("painterColorLines")) OpenMagnetics::settings.set_painter_color_lines(settingsJson["painterColorLines"]);
321
+ if (settingsJson.contains("painterColorText")) OpenMagnetics::settings.set_painter_color_text(settingsJson["painterColorText"]);
322
+ if (settingsJson.contains("painterColorCurrentDensity")) OpenMagnetics::settings.set_painter_color_current_density(settingsJson["painterColorCurrentDensity"]);
323
+ if (settingsJson.contains("painterColorMagneticFieldMinimum")) OpenMagnetics::settings.set_painter_color_magnetic_field_minimum(settingsJson["painterColorMagneticFieldMinimum"]);
324
+ if (settingsJson.contains("painterColorMagneticFieldMaximum")) OpenMagnetics::settings.set_painter_color_magnetic_field_maximum(settingsJson["painterColorMagneticFieldMaximum"]);
325
+ if (settingsJson.contains("painterCciCoordinatesPath")) OpenMagnetics::settings.set_painter_cci_coordinates_path(settingsJson["painterCciCoordinatesPath"]);
326
+ if (settingsJson.contains("painterMirroringDimension")) OpenMagnetics::settings.set_painter_mirroring_dimension(settingsJson["painterMirroringDimension"]);
327
+ if (settingsJson.contains("painterMagneticFieldStrengthModel")) {
328
+ OpenMagnetics::MagneticFieldStrengthModels model;
329
+ from_json(settingsJson["painterMagneticFieldStrengthModel"], model);
330
+ OpenMagnetics::settings.set_painter_magnetic_field_strength_model(model);
331
+ }
332
+
333
+ // Magnetic field
334
+ if (settingsJson.contains("magneticFieldNumberPointsX")) OpenMagnetics::settings.set_magnetic_field_number_points_x(settingsJson["magneticFieldNumberPointsX"]);
335
+ if (settingsJson.contains("magneticFieldNumberPointsY")) OpenMagnetics::settings.set_magnetic_field_number_points_y(settingsJson["magneticFieldNumberPointsY"]);
336
+ if (settingsJson.contains("magneticFieldIncludeFringing")) OpenMagnetics::settings.set_magnetic_field_include_fringing(settingsJson["magneticFieldIncludeFringing"]);
337
+ if (settingsJson.contains("magneticFieldMirroringDimension")) OpenMagnetics::settings.set_magnetic_field_mirroring_dimension(settingsJson["magneticFieldMirroringDimension"]);
338
+
339
+ // Leakage inductance
340
+ if (settingsJson.contains("leakageInductanceGridAutoScaling")) OpenMagnetics::settings.set_leakage_inductance_grid_auto_scaling(settingsJson["leakageInductanceGridAutoScaling"]);
341
+ if (settingsJson.contains("leakageInductanceGridPrecisionLevelPlanar")) OpenMagnetics::settings.set_leakage_inductance_grid_precision_level_planar(settingsJson["leakageInductanceGridPrecisionLevelPlanar"]);
342
+ if (settingsJson.contains("leakageInductanceGridPrecisionLevelWound")) OpenMagnetics::settings.set_leakage_inductance_grid_precision_level_wound(settingsJson["leakageInductanceGridPrecisionLevelWound"]);
343
+
344
+ // Adviser
345
+ if (settingsJson.contains("coilAdviserMaximumNumberWires")) OpenMagnetics::settings.set_coil_adviser_maximum_number_wires(settingsJson["coilAdviserMaximumNumberWires"]);
346
+ if (settingsJson.contains("coreAdviserIncludeStacks")) OpenMagnetics::settings.set_core_adviser_include_stacks(settingsJson["coreAdviserIncludeStacks"]);
347
+ if (settingsJson.contains("coreAdviserIncludeDistributedGaps")) OpenMagnetics::settings.set_core_adviser_include_distributed_gaps(settingsJson["coreAdviserIncludeDistributedGaps"]);
348
+ if (settingsJson.contains("coreAdviserIncludeMargin")) OpenMagnetics::settings.set_core_adviser_include_margin(settingsJson["coreAdviserIncludeMargin"]);
349
+ if (settingsJson.contains("coreAdviserEnableIntermediatePruning")) OpenMagnetics::settings.set_core_adviser_enable_intermediate_pruning(settingsJson["coreAdviserEnableIntermediatePruning"]);
350
+ if (settingsJson.contains("coreAdviserMaximumMagneticsAfterFiltering")) OpenMagnetics::settings.set_core_adviser_maximum_magnetics_after_filtering(settingsJson["coreAdviserMaximumMagneticsAfterFiltering"]);
351
+ if (settingsJson.contains("gappingStrategy")) {
352
+ GappingOptimizationStrategy strategy;
353
+ from_json(settingsJson["gappingStrategy"], strategy);
354
+ OpenMagnetics::settings.set_gapping_strategy(strategy);
355
+ }
356
+
357
+ // Wire adviser
358
+ if (settingsJson.contains("wireAdviserIncludePlanar")) OpenMagnetics::settings.set_wire_adviser_include_planar(settingsJson["wireAdviserIncludePlanar"]);
359
+ if (settingsJson.contains("wireAdviserIncludeFoil")) OpenMagnetics::settings.set_wire_adviser_include_foil(settingsJson["wireAdviserIncludeFoil"]);
360
+ if (settingsJson.contains("wireAdviserIncludeRectangular")) OpenMagnetics::settings.set_wire_adviser_include_rectangular(settingsJson["wireAdviserIncludeRectangular"]);
361
+ if (settingsJson.contains("wireAdviserIncludeLitz")) OpenMagnetics::settings.set_wire_adviser_include_litz(settingsJson["wireAdviserIncludeLitz"]);
362
+ if (settingsJson.contains("wireAdviserIncludeRound")) OpenMagnetics::settings.set_wire_adviser_include_round(settingsJson["wireAdviserIncludeRound"]);
363
+ if (settingsJson.contains("wireAdviserAllowRectangularInToroidalCores")) OpenMagnetics::settings.set_wire_adviser_allow_rectangular_in_toroidal_cores(settingsJson["wireAdviserAllowRectangularInToroidalCores"]);
364
+
365
+ // Harmonics
366
+ if (settingsJson.contains("harmonicAmplitudeThresholdQuickMode")) OpenMagnetics::settings.set_harmonic_amplitude_threshold_quick_mode(settingsJson["harmonicAmplitudeThresholdQuickMode"]);
367
+ if (settingsJson.contains("harmonicAmplitudeThreshold")) OpenMagnetics::settings.set_harmonic_amplitude_threshold(settingsJson["harmonicAmplitudeThreshold"]);
368
+
369
+ // Models
370
+ if (settingsJson.contains("magneticFieldStrengthModel")) {
371
+ OpenMagnetics::MagneticFieldStrengthModels model;
372
+ from_json(settingsJson["magneticFieldStrengthModel"], model);
373
+ OpenMagnetics::settings.set_magnetic_field_strength_model(model);
374
+ }
375
+ if (settingsJson.contains("magneticFieldStrengthFringingEffectModel")) {
376
+ OpenMagnetics::MagneticFieldStrengthFringingEffectModels model;
377
+ from_json(settingsJson["magneticFieldStrengthFringingEffectModel"], model);
378
+ OpenMagnetics::settings.set_magnetic_field_strength_fringing_effect_model(model);
379
+ }
380
+ if (settingsJson.contains("leakageInductanceMagneticFieldStrengthModel")) {
381
+ OpenMagnetics::MagneticFieldStrengthModels model;
382
+ from_json(settingsJson["leakageInductanceMagneticFieldStrengthModel"], model);
383
+ OpenMagnetics::settings.set_leakage_inductance_magnetic_field_strength_model(model);
384
+ }
385
+ if (settingsJson.contains("reluctanceModel")) {
386
+ OpenMagnetics::ReluctanceModels model;
387
+ from_json(settingsJson["reluctanceModel"], model);
388
+ OpenMagnetics::settings.set_reluctance_model(model);
389
+ }
390
+ if (settingsJson.contains("coreTemperatureModel")) {
391
+ OpenMagnetics::CoreTemperatureModels model;
392
+ from_json(settingsJson["coreTemperatureModel"], model);
393
+ OpenMagnetics::settings.set_core_temperature_model(model);
394
+ }
395
+ if (settingsJson.contains("coreThermalResistanceModel")) {
396
+ OpenMagnetics::CoreThermalResistanceModels model;
397
+ from_json(settingsJson["coreThermalResistanceModel"], model);
398
+ OpenMagnetics::settings.set_core_thermal_resistance_model(model);
399
+ }
400
+ if (settingsJson.contains("windingSkinEffectLossesModel")) {
401
+ OpenMagnetics::WindingSkinEffectLossesModels model;
402
+ from_json(settingsJson["windingSkinEffectLossesModel"], model);
403
+ OpenMagnetics::settings.set_winding_skin_effect_losses_model(model);
404
+ }
405
+ if (settingsJson.contains("windingProximityEffectLossesModel")) {
406
+ OpenMagnetics::WindingProximityEffectLossesModels model;
407
+ from_json(settingsJson["windingProximityEffectLossesModel"], model);
408
+ OpenMagnetics::settings.set_winding_proximity_effect_losses_model(model);
409
+ }
410
+ if (settingsJson.contains("strayCapacitanceModel")) {
411
+ OpenMagnetics::StrayCapacitanceModels model;
412
+ from_json(settingsJson["strayCapacitanceModel"], model);
413
+ OpenMagnetics::settings.set_stray_capacitance_model(model);
414
+ }
415
+ if (settingsJson.contains("electricFieldOutputUnit")) {
416
+ OpenMagnetics::ElectricFieldOutputUnit unit;
417
+ from_json(settingsJson["electricFieldOutputUnit"], unit);
418
+ OpenMagnetics::settings.set_electric_field_output_unit(unit);
419
+ }
420
+
421
+ // Core losses model
422
+ if (settingsJson.contains("coreLossesPreferredModelName")) {
423
+ OpenMagnetics::CoreLossesModels model;
424
+ from_json(settingsJson["coreLossesPreferredModelName"], model);
425
+ OpenMagnetics::settings.set_core_losses_preferred_model_name(model);
426
+ }
427
+
428
+ // Circuit simulator
429
+ if (settingsJson.contains("circuitSimulatorCurveFittingMode")) OpenMagnetics::settings.set_circuit_simulator_curve_fitting_mode(settingsJson["circuitSimulatorCurveFittingMode"]);
430
+ if (settingsJson.contains("circuitSimulatorFracpoleOptions")) OpenMagnetics::settings.set_circuit_simulator_fracpole_options(settingsJson["circuitSimulatorFracpoleOptions"].get<std::map<std::string, double>>());
431
+ if (settingsJson.contains("circuitSimulatorIncludeSaturation")) OpenMagnetics::settings.set_circuit_simulator_include_saturation(settingsJson["circuitSimulatorIncludeSaturation"]);
432
+ if (settingsJson.contains("circuitSimulatorIncludeMutualResistance")) OpenMagnetics::settings.set_circuit_simulator_include_mutual_resistance(settingsJson["circuitSimulatorIncludeMutualResistance"]);
433
+ if (settingsJson.contains("circuitSimulatorCoreLossTopology")) OpenMagnetics::settings.set_circuit_simulator_core_loss_topology(settingsJson["circuitSimulatorCoreLossTopology"]);
434
+
435
+ // Preferred manufacturers
436
+ if (settingsJson.contains("preferredCoreMaterialFerriteManufacturer")) OpenMagnetics::settings.set_preferred_core_material_ferrite_manufacturer(settingsJson["preferredCoreMaterialFerriteManufacturer"]);
437
+ if (settingsJson.contains("preferredCoreMaterialPowderManufacturer")) OpenMagnetics::settings.set_preferred_core_material_powder_manufacturer(settingsJson["preferredCoreMaterialPowderManufacturer"]);
438
+ if (settingsJson.contains("coreCrossReferencerAllowDifferentCoreMaterialType")) OpenMagnetics::settings.set_core_cross_referencer_allow_different_core_material_type(settingsJson["coreCrossReferencerAllowDifferentCoreMaterialType"]);
439
+ }
440
+ catch (const std::exception &exc) {
441
+ throw std::runtime_error("Exception: " + std::string{exc.what()});
442
+ }
443
+ }
444
+
445
+ void reset_settings() {
446
+ OpenMagnetics::settings.reset();
447
+ }
448
+
449
+ json get_default_models() {
450
+ try {
451
+ json models;
452
+ models["coreLosses"] = magic_enum::enum_name(OpenMagnetics::defaults.coreLossesModelDefault);
453
+ models["coreTemperature"] = magic_enum::enum_name(OpenMagnetics::defaults.coreTemperatureModelDefault);
454
+ models["reluctance"] = magic_enum::enum_name(OpenMagnetics::defaults.reluctanceModelDefault);
455
+ models["magneticFieldStrength"] = magic_enum::enum_name(OpenMagnetics::defaults.magneticFieldStrengthModelDefault);
456
+ models["magneticFieldStrengthFringingEffect"] = magic_enum::enum_name(OpenMagnetics::defaults.magneticFieldStrengthFringingEffectModelDefault);
457
+ return models;
458
+ }
459
+ catch (const std::exception &exc) {
460
+ json exception;
461
+ exception["data"] = "Exception: " + std::string{exc.what()};
462
+ return exception;
463
+ }
464
+ }
465
+
466
+ void register_settings_bindings(py::module& m) {
467
+ m.def("get_constants", &get_constants,
468
+ R"pbdoc(
469
+ Get physical and system constants used in calculations.
470
+
471
+ Returns a dictionary of constants including vacuum permeability,
472
+ vacuum permittivity, gap parameters, and display settings.
473
+
474
+ Returns:
475
+ Dictionary with constant names as keys and values.
476
+ )pbdoc");
477
+
478
+ m.def("get_defaults", &get_defaults,
479
+ R"pbdoc(
480
+ Get default values for various parameters and models.
481
+
482
+ Returns defaults for core losses models, temperature models,
483
+ reluctance models, and design thresholds.
484
+
485
+ Returns:
486
+ Dictionary with default parameter names and values.
487
+ )pbdoc");
488
+
489
+ m.def("get_settings", &get_settings,
490
+ R"pbdoc(
491
+ Get current library settings.
492
+
493
+ Returns all configurable settings including coil winding options,
494
+ painter/visualization settings, and magnetic field calculation options.
495
+
496
+ Returns:
497
+ JSON object with all current settings.
498
+ )pbdoc");
499
+
500
+ m.def("set_settings", &set_settings,
501
+ R"pbdoc(
502
+ Update library settings.
503
+
504
+ Configures coil winding options, visualization settings, and
505
+ calculation parameters.
506
+
507
+ Args:
508
+ settings_json: JSON object with settings to update.
509
+ Only included keys will be modified.
510
+
511
+ Common settings:
512
+ - coilAllowMarginTape: Allow margin tape in windings
513
+ - coilAllowInsulatedWire: Allow insulated wire
514
+ - useOnlyCoresInStock: Limit to in-stock cores
515
+ - painterNumberPointsX/Y: Field plot resolution
516
+ )pbdoc");
517
+
518
+ m.def("reset_settings", &reset_settings,
519
+ R"pbdoc(
520
+ Reset all settings to default values.
521
+
522
+ Restores all library settings to their initial defaults.
523
+ Useful for ensuring consistent behavior between tests.
524
+ )pbdoc");
525
+
526
+ m.def("get_default_models", &get_default_models,
527
+ R"pbdoc(
528
+ Get names of default calculation models.
529
+
530
+ Returns the default model selections for core losses,
531
+ temperature, reluctance, and magnetic field calculations.
532
+
533
+ Returns:
534
+ JSON object mapping model types to default model names.
535
+ )pbdoc");
536
+ }
537
+
538
+ } // namespace PyMKF
@@ -1,251 +0,0 @@
1
- #include "settings.h"
2
-
3
- namespace PyMKF {
4
-
5
- py::dict get_constants() {
6
- py::dict constantsMap;
7
- constantsMap["residualGap"] = OpenMagnetics::constants.residualGap;
8
- constantsMap["minimumNonResidualGap"] = OpenMagnetics::constants.minimumNonResidualGap;
9
- constantsMap["vacuumPermeability"] = OpenMagnetics::constants.vacuumPermeability;
10
- constantsMap["vacuumPermittivity"] = OpenMagnetics::constants.vacuumPermittivity;
11
- constantsMap["spacerProtudingPercentage"] = OpenMagnetics::constants.spacerProtudingPercentage;
12
- constantsMap["coilPainterScale"] = OpenMagnetics::constants.coilPainterScale;
13
- constantsMap["minimumDistributedFringingFactor"] = OpenMagnetics::constants.minimumDistributedFringingFactor;
14
- constantsMap["maximumDistributedFringingFactor"] = OpenMagnetics::constants.maximumDistributedFringingFactor;
15
- constantsMap["initialGapLengthForSearching"] = OpenMagnetics::constants.initialGapLengthForSearching;
16
- constantsMap["roshenMagneticFieldStrengthStep"] = OpenMagnetics::constants.roshenMagneticFieldStrengthStep;
17
- constantsMap["foilToSectionMargin"] = OpenMagnetics::constants.foilToSectionMargin;
18
- constantsMap["planarToSectionMargin"] = OpenMagnetics::constants.planarToSectionMargin;
19
- return constantsMap;
20
- }
21
-
22
- py::dict get_defaults() {
23
- py::dict defaultsMap;
24
- json aux;
25
- to_json(aux, OpenMagnetics::defaults.coreLossesModelDefault);
26
- defaultsMap["coreLossesModelDefault"] = aux;
27
- to_json(aux, OpenMagnetics::defaults.coreTemperatureModelDefault);
28
- defaultsMap["coreTemperatureModelDefault"] = aux;
29
- to_json(aux, OpenMagnetics::defaults.reluctanceModelDefault);
30
- defaultsMap["reluctanceModelDefault"] = aux;
31
- to_json(aux, OpenMagnetics::defaults.magneticFieldStrengthModelDefault);
32
- defaultsMap["magneticFieldStrengthModelDefault"] = aux;
33
- to_json(aux, OpenMagnetics::defaults.magneticFieldStrengthFringingEffectModelDefault);
34
- defaultsMap["magneticFieldStrengthFringingEffectModelDefault"] = aux;
35
- defaultsMap["maximumProportionMagneticFluxDensitySaturation"] = OpenMagnetics::defaults.maximumProportionMagneticFluxDensitySaturation;
36
- defaultsMap["coreAdviserFrequencyReference"] = OpenMagnetics::defaults.coreAdviserFrequencyReference;
37
- defaultsMap["coreAdviserMagneticFluxDensityReference"] = OpenMagnetics::defaults.coreAdviserMagneticFluxDensityReference;
38
- defaultsMap["coreAdviserThresholdValidity"] = OpenMagnetics::defaults.coreAdviserThresholdValidity;
39
- defaultsMap["coreAdviserMaximumCoreTemperature"] = OpenMagnetics::defaults.coreAdviserMaximumCoreTemperature;
40
- defaultsMap["coreAdviserMaximumPercentagePowerCoreLosses"] = OpenMagnetics::defaults.coreAdviserMaximumPercentagePowerCoreLosses;
41
- defaultsMap["coreAdviserMaximumMagneticsAfterFiltering"] = OpenMagnetics::defaults.coreAdviserMaximumMagneticsAfterFiltering;
42
- defaultsMap["coreAdviserMaximumNumberStacks"] = OpenMagnetics::defaults.coreAdviserMaximumNumberStacks;
43
- defaultsMap["maximumCurrentDensity"] = OpenMagnetics::defaults.maximumCurrentDensity;
44
- defaultsMap["maximumEffectiveCurrentDensity"] = OpenMagnetics::defaults.maximumEffectiveCurrentDensity;
45
- defaultsMap["maximumNumberParallels"] = OpenMagnetics::defaults.maximumNumberParallels;
46
- defaultsMap["magneticFluxDensitySaturation"] = OpenMagnetics::defaults.magneticFluxDensitySaturation;
47
- defaultsMap["magnetizingInductanceThresholdValidity"] = OpenMagnetics::defaults.magnetizingInductanceThresholdValidity;
48
- defaultsMap["harmonicAmplitudeThreshold"] = OpenMagnetics::defaults.harmonicAmplitudeThreshold;
49
- defaultsMap["ambientTemperature"] = OpenMagnetics::defaults.ambientTemperature;
50
- defaultsMap["measurementFrequency"] = OpenMagnetics::defaults.measurementFrequency;
51
- defaultsMap["magneticFieldMirroringDimension"] = OpenMagnetics::defaults.magneticFieldMirroringDimension;
52
- defaultsMap["maximumCoilPattern"] = OpenMagnetics::defaults.maximumCoilPattern;
53
- to_json(aux, OpenMagnetics::defaults.defaultRoundWindowSectionsOrientation);
54
- defaultsMap["defaultRoundWindowSectionsOrientation"] = aux;
55
- to_json(aux, OpenMagnetics::defaults.defaultRectangularWindowSectionsOrientation);
56
- defaultsMap["defaultRectangularWindowSectionsOrientation"] = aux;
57
- defaultsMap["defaultEnamelledInsulationMaterial"] = OpenMagnetics::defaults.defaultEnamelledInsulationMaterial;
58
- defaultsMap["defaultInsulationMaterial"] = OpenMagnetics::defaults.defaultInsulationMaterial;
59
- defaultsMap["defaultLayerInsulationMaterial"] = OpenMagnetics::defaults.defaultLayerInsulationMaterial;
60
- defaultsMap["overlappingFactorSurroundingTurns"] = OpenMagnetics::defaults.overlappingFactorSurroundingTurns;
61
- to_json(aux, OpenMagnetics::defaults.commonWireStandard);
62
- defaultsMap["commonWireStandard"] = aux;
63
- return defaultsMap;
64
- }
65
-
66
- json get_settings() {
67
- try {
68
- json settingsJson;
69
- settingsJson["coilAllowMarginTape"] = OpenMagnetics::settings.get_coil_allow_margin_tape();
70
- settingsJson["coilAllowInsulatedWire"] = OpenMagnetics::settings.get_coil_allow_insulated_wire();
71
- settingsJson["coilFillSectionsWithMarginTape"] = OpenMagnetics::settings.get_coil_fill_sections_with_margin_tape();
72
- settingsJson["coilWindEvenIfNotFit"] = OpenMagnetics::settings.get_coil_wind_even_if_not_fit();
73
- settingsJson["coilDelimitAndCompact"] = OpenMagnetics::settings.get_coil_delimit_and_compact();
74
- settingsJson["coilTryRewind"] = OpenMagnetics::settings.get_coil_try_rewind();
75
- settingsJson["coilOnlyOneTurnPerLayerInContiguousRectangular"] = OpenMagnetics::settings.get_coil_only_one_turn_per_layer_in_contiguous_rectangular();
76
- settingsJson["useOnlyCoresInStock"] = OpenMagnetics::settings.get_use_only_cores_in_stock();
77
- settingsJson["coilMaximumLayersPlanar"] = OpenMagnetics::settings.get_coil_maximum_layers_planar();
78
-
79
- settingsJson["painterNumberPointsX"] = OpenMagnetics::settings.get_painter_number_points_x();
80
- settingsJson["painterNumberPointsY"] = OpenMagnetics::settings.get_painter_number_points_y();
81
- settingsJson["painterMode"] = OpenMagnetics::settings.get_painter_mode();
82
- settingsJson["painterLogarithmicScale"] = OpenMagnetics::settings.get_painter_logarithmic_scale();
83
- settingsJson["painterIncludeFringing"] = OpenMagnetics::settings.get_painter_include_fringing();
84
- if (OpenMagnetics::settings.get_painter_maximum_value_colorbar()) {
85
- settingsJson["painterMaximumValueColorbar"] = OpenMagnetics::settings.get_painter_maximum_value_colorbar();
86
- }
87
- if (OpenMagnetics::settings.get_painter_minimum_value_colorbar()) {
88
- settingsJson["painterMinimumValueColorbar"] = OpenMagnetics::settings.get_painter_minimum_value_colorbar();
89
- }
90
- settingsJson["painterColorLines"] = OpenMagnetics::settings.get_painter_color_lines();
91
- settingsJson["painterColorText"] = OpenMagnetics::settings.get_painter_color_text();
92
- settingsJson["painterColorFerrite"] = OpenMagnetics::settings.get_painter_color_ferrite();
93
- settingsJson["painterColorBobbin"] = OpenMagnetics::settings.get_painter_color_bobbin();
94
- settingsJson["painterColorCopper"] = OpenMagnetics::settings.get_painter_color_copper();
95
- settingsJson["painterColorInsulation"] = OpenMagnetics::settings.get_painter_color_insulation();
96
- settingsJson["painterColorMargin"] = OpenMagnetics::settings.get_painter_color_margin();
97
- settingsJson["painterMirroringDimension"] = OpenMagnetics::settings.get_painter_mirroring_dimension();
98
- settingsJson["magneticFieldNumberPointsX"] = OpenMagnetics::settings.get_magnetic_field_number_points_x();
99
- settingsJson["magneticFieldNumberPointsY"] = OpenMagnetics::settings.get_magnetic_field_number_points_y();
100
- settingsJson["magneticFieldIncludeFringing"] = OpenMagnetics::settings.get_magnetic_field_include_fringing();
101
- settingsJson["magneticFieldMirroringDimension"] = OpenMagnetics::settings.get_magnetic_field_mirroring_dimension();
102
- settingsJson["painterSimpleLitz"] = OpenMagnetics::settings.get_painter_simple_litz();
103
- settingsJson["painterAdvancedLitz"] = OpenMagnetics::settings.get_painter_advanced_litz();
104
- settingsJson["painterCciCoordinatesPath"] = OpenMagnetics::settings.get_painter_cci_coordinates_path();
105
- return settingsJson;
106
- }
107
- catch (const std::exception &exc) {
108
- json exception;
109
- exception["data"] = "Exception: " + std::string{exc.what()};
110
- return exception;
111
- }
112
- }
113
-
114
- void set_settings(json settingsJson) {
115
- try {
116
- OpenMagnetics::settings.set_coil_allow_margin_tape(settingsJson["coilAllowMarginTape"]);
117
- OpenMagnetics::settings.set_coil_allow_insulated_wire(settingsJson["coilAllowInsulatedWire"]);
118
- OpenMagnetics::settings.set_coil_fill_sections_with_margin_tape(settingsJson["coilFillSectionsWithMarginTape"]);
119
- OpenMagnetics::settings.set_coil_wind_even_if_not_fit(settingsJson["coilWindEvenIfNotFit"]);
120
- OpenMagnetics::settings.set_coil_delimit_and_compact(settingsJson["coilDelimitAndCompact"]);
121
- OpenMagnetics::settings.set_coil_try_rewind(settingsJson["coilTryRewind"]);
122
- OpenMagnetics::settings.set_coil_only_one_turn_per_layer_in_contiguous_rectangular(settingsJson["coilOnlyOneTurnPerLayerInContiguousRectangular"]);
123
- OpenMagnetics::settings.set_coil_maximum_layers_planar(settingsJson["coilMaximumLayersPlanar"]);
124
-
125
- OpenMagnetics::settings.set_painter_mode(settingsJson["painterMode"]);
126
- OpenMagnetics::settings.set_use_only_cores_in_stock(settingsJson["useOnlyCoresInStock"]);
127
- OpenMagnetics::settings.set_painter_number_points_x(settingsJson["painterNumberPointsX"]);
128
- OpenMagnetics::settings.set_painter_number_points_y(settingsJson["painterNumberPointsY"]);
129
- OpenMagnetics::settings.set_painter_logarithmic_scale(settingsJson["painterLogarithmicScale"]);
130
- OpenMagnetics::settings.set_painter_include_fringing(settingsJson["painterIncludeFringing"]);
131
- if (settingsJson.contains("painterMaximumValueColorbar")) {
132
- OpenMagnetics::settings.set_painter_maximum_value_colorbar(settingsJson["painterMaximumValueColorbar"]);
133
- }
134
- if (settingsJson.contains("painterMinimumValueColorbar")) {
135
- OpenMagnetics::settings.set_painter_minimum_value_colorbar(settingsJson["painterMinimumValueColorbar"]);
136
- }
137
- OpenMagnetics::settings.set_painter_color_lines(settingsJson["painterColorLines"]);
138
- OpenMagnetics::settings.set_painter_color_text(settingsJson["painterColorText"]);
139
- OpenMagnetics::settings.set_painter_color_ferrite(settingsJson["painterColorFerrite"]);
140
- OpenMagnetics::settings.set_painter_color_bobbin(settingsJson["painterColorBobbin"]);
141
- OpenMagnetics::settings.set_painter_color_copper(settingsJson["painterColorCopper"]);
142
- OpenMagnetics::settings.set_painter_color_insulation(settingsJson["painterColorInsulation"]);
143
- OpenMagnetics::settings.set_painter_color_margin(settingsJson["painterColorMargin"]);
144
- OpenMagnetics::settings.set_painter_mirroring_dimension(settingsJson["painterMirroringDimension"]);
145
- OpenMagnetics::settings.set_magnetic_field_number_points_x(settingsJson["magneticFieldNumberPointsX"]);
146
- OpenMagnetics::settings.set_magnetic_field_number_points_y(settingsJson["magneticFieldNumberPointsY"]);
147
- OpenMagnetics::settings.set_magnetic_field_include_fringing(settingsJson["magneticFieldIncludeFringing"]);
148
- OpenMagnetics::settings.set_magnetic_field_mirroring_dimension(settingsJson["magneticFieldMirroringDimension"]);
149
- OpenMagnetics::settings.set_painter_simple_litz(settingsJson["painterSimpleLitz"]);
150
- OpenMagnetics::settings.set_painter_advanced_litz(settingsJson["painterAdvancedLitz"]);
151
- OpenMagnetics::settings.set_painter_cci_coordinates_path(settingsJson["painterCciCoordinatesPath"]);
152
- }
153
- catch (const std::exception &exc) {
154
- throw std::runtime_error("Exception: " + std::string{exc.what()});
155
- }
156
- }
157
-
158
- void reset_settings() {
159
- OpenMagnetics::settings.reset();
160
- }
161
-
162
- json get_default_models() {
163
- try {
164
- json models;
165
- models["coreLosses"] = magic_enum::enum_name(OpenMagnetics::defaults.coreLossesModelDefault);
166
- models["coreTemperature"] = magic_enum::enum_name(OpenMagnetics::defaults.coreTemperatureModelDefault);
167
- models["reluctance"] = magic_enum::enum_name(OpenMagnetics::defaults.reluctanceModelDefault);
168
- models["magneticFieldStrength"] = magic_enum::enum_name(OpenMagnetics::defaults.magneticFieldStrengthModelDefault);
169
- models["magneticFieldStrengthFringingEffect"] = magic_enum::enum_name(OpenMagnetics::defaults.magneticFieldStrengthFringingEffectModelDefault);
170
- return models;
171
- }
172
- catch (const std::exception &exc) {
173
- json exception;
174
- exception["data"] = "Exception: " + std::string{exc.what()};
175
- return exception;
176
- }
177
- }
178
-
179
- void register_settings_bindings(py::module& m) {
180
- m.def("get_constants", &get_constants,
181
- R"pbdoc(
182
- Get physical and system constants used in calculations.
183
-
184
- Returns a dictionary of constants including vacuum permeability,
185
- vacuum permittivity, gap parameters, and display settings.
186
-
187
- Returns:
188
- Dictionary with constant names as keys and values.
189
- )pbdoc");
190
-
191
- m.def("get_defaults", &get_defaults,
192
- R"pbdoc(
193
- Get default values for various parameters and models.
194
-
195
- Returns defaults for core losses models, temperature models,
196
- reluctance models, and design thresholds.
197
-
198
- Returns:
199
- Dictionary with default parameter names and values.
200
- )pbdoc");
201
-
202
- m.def("get_settings", &get_settings,
203
- R"pbdoc(
204
- Get current library settings.
205
-
206
- Returns all configurable settings including coil winding options,
207
- painter/visualization settings, and magnetic field calculation options.
208
-
209
- Returns:
210
- JSON object with all current settings.
211
- )pbdoc");
212
-
213
- m.def("set_settings", &set_settings,
214
- R"pbdoc(
215
- Update library settings.
216
-
217
- Configures coil winding options, visualization settings, and
218
- calculation parameters.
219
-
220
- Args:
221
- settings_json: JSON object with settings to update.
222
- Only included keys will be modified.
223
-
224
- Common settings:
225
- - coilAllowMarginTape: Allow margin tape in windings
226
- - coilAllowInsulatedWire: Allow insulated wire
227
- - useOnlyCoresInStock: Limit to in-stock cores
228
- - painterNumberPointsX/Y: Field plot resolution
229
- )pbdoc");
230
-
231
- m.def("reset_settings", &reset_settings,
232
- R"pbdoc(
233
- Reset all settings to default values.
234
-
235
- Restores all library settings to their initial defaults.
236
- Useful for ensuring consistent behavior between tests.
237
- )pbdoc");
238
-
239
- m.def("get_default_models", &get_default_models,
240
- R"pbdoc(
241
- Get names of default calculation models.
242
-
243
- Returns the default model selections for core losses,
244
- temperature, reluctance, and magnetic field calculations.
245
-
246
- Returns:
247
- JSON object mapping model types to default model names.
248
- )pbdoc");
249
- }
250
-
251
- } // namespace PyMKF
File without changes
File without changes