Skip to content

Commit e0e92cf

Browse files
Add Solver Options User Preference
This new option allows users to change to "developer" solver options, so they can change to the Ceres LMDER or LMDIF solvers for testing purposes. The default value will always be intended for regular users, trying to hide the underlying complexity from regular users.
1 parent 3280703 commit e0e92cf

File tree

8 files changed

+107
-20
lines changed

8 files changed

+107
-20
lines changed

python/mmSolver/tools/solver/constant.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -399,9 +399,6 @@
399399
(SOLVER_TYPE_CERES_LMDER_LABEL, SOLVER_TYPE_CERES_LMDER),
400400
]
401401

402-
# Hide the Solver Type mode in the UI.
403-
SOLVER_TYPE_WIDGET_VISIBLE = False
404-
405402
# Solver Scene Graph (stored on Collection node)
406403
SOLVER_TYPE_ATTR = 'solver_type'
407404
SOLVER_TYPE_ATTR_TYPE = 'long'
@@ -433,10 +430,6 @@
433430
(SCENE_GRAPH_MODE_MM_SCENE_GRAPH_LABEL, SCENE_GRAPH_MODE_MM_SCENE_GRAPH),
434431
]
435432

436-
# Hide the Scene Graph mode in the UI, the value defaults to 'auto',
437-
# which should do work out the fastest scene graph by default.
438-
SCENE_GRAPH_MODE_WIDGET_VISIBLE = False
439-
440433
# Solver Scene Graph (stored on Collection node)
441434
SOLVER_SCENE_GRAPH_MODE_ATTR = 'solver_scene_graph'
442435
SOLVER_SCENE_GRAPH_MODE_ATTR_TYPE = 'long'

python/mmSolver/tools/solver/widget/solver_basic_widget.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,19 @@
4141
import mmSolver.tools.solver.widget.ui_solver_basic_widget as ui_solver_basic_widget
4242
import mmSolver.tools.solver.widget.framerange_widget as framerange_widget
4343
import mmSolver.tools.solver.constant as const
44+
import mmSolver.tools.userpreferences.constant as userprefs_const
45+
import mmSolver.tools.userpreferences.lib as userprefs_lib
4446

4547
LOG = mmSolver.logger.get_logger()
4648

4749

50+
def get_user_prefs_solver_options_as_developer():
51+
config = userprefs_lib.get_config()
52+
key = userprefs_const.SOLVER_UI_SOLVER_OPTIONS_KEY
53+
value = userprefs_lib.get_value(config, key)
54+
return value == userprefs_const.SOLVER_UI_SOLVER_OPTIONS_DEVELOPER_VALUE
55+
56+
4857
def _populateWidgetsEnabled(widgets):
4958
col = lib_state.get_active_collection()
5059
enabled = col is not None
@@ -94,15 +103,19 @@ def __init__(self, parent=None, *args, **kwargs):
94103
self.frameRange_widget = BasicFrameRangeWidget(self)
95104
self.frameRange_layout.addWidget(self.frameRange_widget)
96105

106+
developer_options = get_user_prefs_solver_options_as_developer()
107+
scene_graph_mode_widget_visible = developer_options
108+
solver_type_widget_visible = developer_options
109+
97110
# Solver Type Combo Box.
98111
self.solverType_model = uimodels.StringDataListModel()
99112
self.solverType_model.setStringDataList(const.SOLVER_TYPE_LABEL_VALUE_LIST)
100113
self.solverType_comboBox.setModel(self.solverType_model)
101114
self.solverType_comboBox.currentIndexChanged.connect(
102115
self.solverTypeIndexChanged
103116
)
104-
self.solverType_comboBox.setVisible(const.SOLVER_TYPE_WIDGET_VISIBLE)
105-
self.solverType_label.setVisible(const.SOLVER_TYPE_WIDGET_VISIBLE)
117+
self.solverType_comboBox.setVisible(solver_type_widget_visible)
118+
self.solverType_label.setVisible(solver_type_widget_visible)
106119

107120
# Scene Graph Mode Combo Box.
108121
self.sceneGraphMode_model = uimodels.StringDataListModel()
@@ -113,8 +126,8 @@ def __init__(self, parent=None, *args, **kwargs):
113126
self.sceneGraphMode_comboBox.currentIndexChanged.connect(
114127
self.sceneGraphModeIndexChanged
115128
)
116-
self.sceneGraphMode_comboBox.setVisible(const.SCENE_GRAPH_MODE_WIDGET_VISIBLE)
117-
self.sceneGraphMode_label.setVisible(const.SCENE_GRAPH_MODE_WIDGET_VISIBLE)
129+
self.sceneGraphMode_comboBox.setVisible(scene_graph_mode_widget_visible)
130+
self.sceneGraphMode_label.setVisible(scene_graph_mode_widget_visible)
118131

119132
self.evalComplexGraphs_checkBox.toggled.connect(
120133
self.evalComplexGraphsValueToggled

python/mmSolver/tools/solver/widget/solver_camera_widget.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,20 @@
4242
import mmSolver.tools.solver.widget.framerange_widget as framerange_widget
4343
import mmSolver.tools.solver.widget.rootframe_widget as rootframe_widget
4444
import mmSolver.tools.solver.constant as const
45+
import mmSolver.tools.userpreferences.constant as userprefs_const
46+
import mmSolver.tools.userpreferences.lib as userprefs_lib
4547

4648

4749
LOG = mmSolver.logger.get_logger()
4850

4951

52+
def get_user_prefs_solver_options_as_developer():
53+
config = userprefs_lib.get_config()
54+
key = userprefs_const.SOLVER_UI_SOLVER_OPTIONS_KEY
55+
value = userprefs_lib.get_value(config, key)
56+
return value == userprefs_const.SOLVER_UI_SOLVER_OPTIONS_DEVELOPER_VALUE
57+
58+
5059
def _populateWidgetsEnabled(widgets):
5160
col = lib_state.get_active_collection()
5261
enabled = col is not None
@@ -147,15 +156,18 @@ def __init__(self, parent=None, *args, **kwargs):
147156
self.originFrame_spinBox.valueChanged.connect(self.originFrameValueChanged)
148157
self.sceneScale_doubleSpinBox.valueChanged.connect(self.sceneScaleValueChanged)
149158

159+
developer_options = get_user_prefs_solver_options_as_developer()
160+
solver_type_widget_visible = developer_options
161+
150162
# Solver Type Combo Box.
151163
self.solverType_model = uimodels.StringDataListModel()
152164
self.solverType_model.setStringDataList(const.SOLVER_TYPE_LABEL_VALUE_LIST)
153165
self.solverType_comboBox.setModel(self.solverType_model)
154166
self.solverType_comboBox.currentIndexChanged.connect(
155167
self.solverTypeIndexChanged
156168
)
157-
self.solverType_comboBox.setVisible(const.SOLVER_TYPE_WIDGET_VISIBLE)
158-
self.solverType_label.setVisible(const.SOLVER_TYPE_WIDGET_VISIBLE)
169+
self.solverType_comboBox.setVisible(solver_type_widget_visible)
170+
self.solverType_label.setVisible(solver_type_widget_visible)
159171

160172
self.solveFocalLength_checkBox.toggled.connect(
161173
self.solveFocalLengthValueToggled

python/mmSolver/tools/solver/widget/solver_standard_widget.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,20 @@
4242
import mmSolver.tools.solver.widget.framerange_widget as framerange_widget
4343
import mmSolver.tools.solver.widget.rootframe_widget as rootframe_widget
4444
import mmSolver.tools.solver.constant as const
45+
import mmSolver.tools.userpreferences.constant as userprefs_const
46+
import mmSolver.tools.userpreferences.lib as userprefs_lib
4547

4648

4749
LOG = mmSolver.logger.get_logger()
4850

4951

52+
def get_user_prefs_solver_options_as_developer():
53+
config = userprefs_lib.get_config()
54+
key = userprefs_const.SOLVER_UI_SOLVER_OPTIONS_KEY
55+
value = userprefs_lib.get_value(config, key)
56+
return value == userprefs_const.SOLVER_UI_SOLVER_OPTIONS_DEVELOPER_VALUE
57+
58+
5059
def _populateWidgetsEnabled(widgets):
5160
col = lib_state.get_active_collection()
5261
enabled = col is not None
@@ -148,15 +157,19 @@ def __init__(self, parent=None, *args, **kwargs):
148157
self.rootFrames_widget = StandardRootFrameWidget(self)
149158
self.rootFrames_layout.addWidget(self.rootFrames_widget)
150159

160+
developer_options = get_user_prefs_solver_options_as_developer()
161+
scene_graph_mode_widget_visible = developer_options
162+
solver_type_widget_visible = developer_options
163+
151164
# Solver Type Combo Box.
152165
self.solverType_model = uimodels.StringDataListModel()
153166
self.solverType_model.setStringDataList(const.SOLVER_TYPE_LABEL_VALUE_LIST)
154167
self.solverType_comboBox.setModel(self.solverType_model)
155168
self.solverType_comboBox.currentIndexChanged.connect(
156169
self.solverTypeIndexChanged
157170
)
158-
self.solverType_comboBox.setVisible(const.SOLVER_TYPE_WIDGET_VISIBLE)
159-
self.solverType_label.setVisible(const.SOLVER_TYPE_WIDGET_VISIBLE)
171+
self.solverType_comboBox.setVisible(solver_type_widget_visible)
172+
self.solverType_label.setVisible(solver_type_widget_visible)
160173

161174
# Scene Graph Mode Combo Box.
162175
self.sceneGraphMode_model = uimodels.StringDataListModel()
@@ -167,8 +180,8 @@ def __init__(self, parent=None, *args, **kwargs):
167180
self.sceneGraphMode_comboBox.currentIndexChanged.connect(
168181
self.sceneGraphModeIndexChanged
169182
)
170-
self.sceneGraphMode_comboBox.setVisible(const.SCENE_GRAPH_MODE_WIDGET_VISIBLE)
171-
self.sceneGraphMode_label.setVisible(const.SCENE_GRAPH_MODE_WIDGET_VISIBLE)
183+
self.sceneGraphMode_comboBox.setVisible(scene_graph_mode_widget_visible)
184+
self.sceneGraphMode_label.setVisible(scene_graph_mode_widget_visible)
172185

173186
self.globalSolve_checkBox.toggled.connect(self.globalSolveValueToggled)
174187
self.onlyRootFrames_checkBox.toggled.connect(self.onlyRootFramesValueToggled)

python/mmSolver/tools/userpreferences/constant.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,26 @@
208208
]
209209

210210

211+
# "Solver UI - Solver Options" preference.
212+
#
213+
# This allows developers or testing users to display and unlock other
214+
# solver options. "Default" should be used by normal users.
215+
SOLVER_UI_SOLVER_OPTIONS_KEY = 'solver_ui/solver_options'
216+
SOLVER_UI_SOLVER_OPTIONS_TYPE = TYPE_ENUMERATION_INT
217+
SOLVER_UI_SOLVER_OPTIONS_DEVELOPER_VALUE = 1
218+
SOLVER_UI_SOLVER_OPTIONS_DEVELOPER_LABEL = 'Developer'
219+
SOLVER_UI_SOLVER_OPTIONS_DEFAULT_VALUE = 0
220+
SOLVER_UI_SOLVER_OPTIONS_DEFAULT_LABEL = 'Default'
221+
SOLVER_UI_SOLVER_OPTIONS_VALUES = [
222+
SOLVER_UI_SOLVER_OPTIONS_DEVELOPER_VALUE,
223+
SOLVER_UI_SOLVER_OPTIONS_DEFAULT_VALUE,
224+
]
225+
SOLVER_UI_SOLVER_OPTIONS_LABELS = [
226+
SOLVER_UI_SOLVER_OPTIONS_DEVELOPER_LABEL,
227+
SOLVER_UI_SOLVER_OPTIONS_DEFAULT_LABEL,
228+
]
229+
230+
211231
# "Create Controller - Shape Node Type" preference.
212232
CREATE_CONTROLLER_SHAPE_KEY = 'create_controller/shape_node_type'
213233
CREATE_CONTROLLER_SHAPE_TYPE = TYPE_ENUMERATION_INT
@@ -234,6 +254,7 @@
234254
LOAD_MARKER_UI_USE_OVERSCAN_DEFAULT_KEY: LOAD_MARKER_UI_USE_OVERSCAN_DEFAULT_VALUES,
235255
LOAD_MARKER_UI_LOAD_BUNDLE_POSITIONS_DEFAULT_KEY: LOAD_MARKER_UI_LOAD_BUNDLE_POSITIONS_DEFAULT_VALUES,
236256
SOLVER_UI_MINIMAL_UI_WHILE_SOLVING_KEY: SOLVER_UI_MINIMAL_UI_WHILE_SOLVING_VALUES,
257+
SOLVER_UI_SOLVER_OPTIONS_KEY: SOLVER_UI_SOLVER_OPTIONS_VALUES,
237258
CREATE_CONTROLLER_SHAPE_KEY: CREATE_CONTROLLER_SHAPE_VALUES,
238259
}
239260

@@ -247,6 +268,7 @@
247268
LOAD_MARKER_UI_USE_OVERSCAN_DEFAULT_KEY: LOAD_MARKER_UI_USE_OVERSCAN_DEFAULT_LABELS,
248269
LOAD_MARKER_UI_LOAD_BUNDLE_POSITIONS_DEFAULT_KEY: LOAD_MARKER_UI_LOAD_BUNDLE_POSITIONS_DEFAULT_LABELS,
249270
SOLVER_UI_MINIMAL_UI_WHILE_SOLVING_KEY: SOLVER_UI_MINIMAL_UI_WHILE_SOLVING_LABELS,
271+
SOLVER_UI_SOLVER_OPTIONS_KEY: SOLVER_UI_SOLVER_OPTIONS_LABELS,
250272
CREATE_CONTROLLER_SHAPE_KEY: CREATE_CONTROLLER_SHAPE_LABELS,
251273
}
252274

@@ -260,6 +282,7 @@
260282
LOAD_MARKER_UI_USE_OVERSCAN_DEFAULT_KEY: LOAD_MARKER_UI_USE_OVERSCAN_DEFAULT_TRUE_VALUE,
261283
LOAD_MARKER_UI_LOAD_BUNDLE_POSITIONS_DEFAULT_KEY: LOAD_MARKER_UI_LOAD_BUNDLE_POSITIONS_DEFAULT_TRUE_VALUE,
262284
SOLVER_UI_MINIMAL_UI_WHILE_SOLVING_KEY: SOLVER_UI_MINIMAL_UI_WHILE_SOLVING_TRUE_VALUE,
285+
SOLVER_UI_SOLVER_OPTIONS_KEY: SOLVER_UI_SOLVER_OPTIONS_DEFAULT_VALUE,
263286
CREATE_CONTROLLER_SHAPE_KEY: CREATE_CONTROLLER_SHAPE_LOCATOR_VALUE,
264287
}
265288

@@ -273,6 +296,7 @@
273296
LOAD_MARKER_UI_USE_OVERSCAN_DEFAULT_KEY: LOAD_MARKER_UI_USE_OVERSCAN_DEFAULT_TYPE,
274297
LOAD_MARKER_UI_LOAD_BUNDLE_POSITIONS_DEFAULT_KEY: LOAD_MARKER_UI_LOAD_BUNDLE_POSITIONS_DEFAULT_TYPE,
275298
SOLVER_UI_MINIMAL_UI_WHILE_SOLVING_KEY: SOLVER_UI_MINIMAL_UI_WHILE_SOLVING_TYPE,
299+
SOLVER_UI_SOLVER_OPTIONS_KEY: SOLVER_UI_SOLVER_OPTIONS_TYPE,
276300
CREATE_CONTROLLER_SHAPE_KEY: CREATE_CONTROLLER_SHAPE_TYPE,
277301
}
278302

python/mmSolver/tools/userprefswindow/ui/pref_layout.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ def populateUI(self, config):
5959
self.updateAddNewMarkersToWidget(config)
6060
self.updateAddNewLinesToWidget(config)
6161
self.updateSolverUIMinimalUIWhileSolvingWidget(config)
62+
self.updateSolverUISolverOptionsWidget(config)
6263
self.updateLoadMarkerUIRenameMarkersDefaultWidget(config)
6364
self.updateLoadMarkerUIDistortionModeDefaultWidget(config)
6465
self.updateLoadMarkerUIUseOverscanDefaultWidget(config)
@@ -252,3 +253,20 @@ def getSolverUIMinimalUIWhileSolvingConfigValue(self):
252253
label = self.minimalUIWhileSolvingComboBox.currentText()
253254
value = userprefs_lib.get_value_from_label(key, label)
254255
return value
256+
257+
def updateSolverUISolverOptionsWidget(self, config):
258+
key = pref_const.SOLVER_UI_SOLVER_OPTIONS_KEY
259+
value = userprefs_lib.get_value(config, key)
260+
label = userprefs_lib.get_label_from_value(key, value)
261+
assert isinstance(label, pycompat.TEXT_TYPE)
262+
labels = userprefs_lib.get_labels(key)
263+
self.solverOptionsComboBox.clear()
264+
self.solverOptionsComboBox.addItems(labels)
265+
self.solverOptionsComboBox.setCurrentText(label)
266+
return
267+
268+
def getSolverUISolverOptionsConfigValue(self):
269+
key = pref_const.SOLVER_UI_SOLVER_OPTIONS_KEY
270+
label = self.solverOptionsComboBox.currentText()
271+
value = userprefs_lib.get_value_from_label(key, label)
272+
return value

python/mmSolver/tools/userprefswindow/ui/pref_layout.ui

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
<rect>
77
<x>0</x>
88
<y>0</y>
9-
<width>1144</width>
10-
<height>826</height>
9+
<width>277</width>
10+
<height>447</height>
1111
</rect>
1212
</property>
1313
<property name="windowTitle">
@@ -65,6 +65,16 @@
6565
<item row="0" column="1">
6666
<widget class="QComboBox" name="minimalUIWhileSolvingComboBox"/>
6767
</item>
68+
<item row="1" column="0">
69+
<widget class="QLabel" name="solverOptionsLabel">
70+
<property name="text">
71+
<string>Solver Options</string>
72+
</property>
73+
</widget>
74+
</item>
75+
<item row="1" column="1">
76+
<widget class="QComboBox" name="solverOptionsComboBox"/>
77+
</item>
6878
</layout>
6979
</item>
7080
</layout>

python/mmSolver/tools/userprefswindow/ui/pref_window.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ def _open_help():
5151

5252

5353
class PrefWindow(BaseWindow):
54-
5554
name = 'UserPreferencesWindow'
5655

5756
def __init__(self, parent=None, name=None):
@@ -94,6 +93,7 @@ def reset_prefs(self):
9493
pref_const.LOAD_MARKER_UI_USE_OVERSCAN_DEFAULT_KEY,
9594
pref_const.LOAD_MARKER_UI_LOAD_BUNDLE_POSITIONS_DEFAULT_KEY,
9695
pref_const.SOLVER_UI_MINIMAL_UI_WHILE_SOLVING_KEY,
96+
pref_const.SOLVER_UI_SOLVER_OPTIONS_KEY,
9797
]
9898
for key in option_keys:
9999
value = pref_const.DEFAULT_VALUE_MAP[key]
@@ -134,6 +134,10 @@ def save_prefs(self):
134134
pref_const.SOLVER_UI_MINIMAL_UI_WHILE_SOLVING_KEY,
135135
self.subForm.getSolverUIMinimalUIWhileSolvingConfigValue,
136136
),
137+
(
138+
pref_const.SOLVER_UI_SOLVER_OPTIONS_KEY,
139+
self.subForm.getSolverUISolverOptionsConfigValue,
140+
),
137141
]
138142
for key, func in options:
139143
value = func()

0 commit comments

Comments
 (0)