def _edit_field_arcs(self, field_geometry: GeometryFieldSize): while len(self._field_arc_expanded) < len(field_geometry.field_arcs): self._field_arc_expanded.append(False) while len(self._field_arc_expanded) > len(field_geometry.field_arcs): del self._field_arc_expanded[-1] imgui.text("Field Arcs") imgui.separator() arcs_to_delete = [] for i, arc in enumerate(field_geometry.field_arcs): expanded, visible = imgui.collapsing_header( arc.name, True, imgui.TREE_NODE_DEFAULT_OPEN if self._field_arc_expanded[i] else 0, ) if not visible: arcs_to_delete.append(i) if expanded: self._field_arc_expanded[i] = True changed, value = imgui.input_text(f"Name##{i}", arc.name, 255) if changed: arc.name = value changed, values = imgui.input_float2("Center", arc.center.x, arc.center.y) if changed: arc.center.x, arc.center.y = values changed, values = imgui.input_float(f"Radius##{i}", arc.radius) if changed: if value > 0: arc.radius = value else: self._log.error( f"Arc radius must be > 0. Got {arc.radius}") changed, values = imgui.input_float2( f"Start Angle, End Angle##{i}", arc.a1, arc.a2) if changed: arc.a1, arc.a2 = sorted(values) changed, value = imgui.input_float(f"Thickness##{i}", arc.thickness) if changed: if value > 0: arc.thickness = value else: self._log.error("Field arc must have thickness > 0. " f"Got {arc.thickness}") for arc in arcs_to_delete[::-1]: del field_geometry.field_arcs[arc] del self._field_arc_expanded[arc] if imgui.button("Add field arc"): new_arc = field_geometry.field_arcs.add() new_arc.radius = 1000 new_arc.thickness = 10 self._field_arc_expanded.append(False)
def _draw_initial_state(self): expanded, _ = imgui.collapsing_header("Initial State") if expanded: changed, values = imgui.input_float2("Position (x, y)", self.initial_state[0], self.initial_state[2]) if changed: self.is_dirty = True self.initial_state[0], self.initial_state[2] = values changed, values = imgui.input_float2("Velocity (x, y)", self.initial_state[1], self.initial_state[3]) if changed: self.is_dirty = True self.initial_state[1], self.initial_state[3] = values
def _edit_field_lines(self, field_geometry: GeometryFieldSize): while len(self._field_line_expanded) < len(field_geometry.field_lines): self._field_line_expanded.append(False) while len(self._field_line_expanded) > len(field_geometry.field_lines): del self._field_line_expanded[-1] imgui.text("Field Lines") imgui.separator() lines_to_delete = [] for i, line in enumerate(field_geometry.field_lines): expanded, visible = imgui.collapsing_header( f"{line.name}##{i}", True, imgui.TREE_NODE_DEFAULT_OPEN if self._field_line_expanded[i] else 0, ) if not visible: lines_to_delete.append(i) if expanded: self._field_line_expanded[i] = True changed, value = imgui.input_text(f"Name##{i}", line.name, 255) if changed: line.name = value changed, values = imgui.input_float2(f"P1##{i}", line.p1.x, line.p1.y) if changed: line.p1.x, line.p1.y = values[0], values[1] changed, values = imgui.input_float2(f"P2##{i}", line.p2.x, line.p2.y) if changed: line.p2.x, line.p2.y = values[0], values[1] changed, value = imgui.input_float(f"Thickness##{i}", line.thickness) if changed: if value > 0: line.thickness = value else: self._log.error("Field line must have thickness > 0. " f"Got {line.thickness}") else: self._field_line_expanded[i] = False for line in lines_to_delete[::-1]: del field_geometry.field_lines[line] del self._field_line_expanded[line] if imgui.button("Add field line"): new_line = field_geometry.field_lines.add() new_line.thickness = 10 self._field_line_expanded.append(False)
def _draw_R(self, ball_filter: BasicBallFilter): expanded, _ = imgui.collapsing_header("R") if expanded: changed, values = imgui.input_float2("R[0, :]", ball_filter.R[0, 0], ball_filter.R[0, 1]) if changed: if values[0] >= 0 and values[1] >= 0: self.is_dirty = True ball_filter.R[0, :] = values changed, values = imgui.input_float2("R[1, :]", ball_filter.R[1, 0], ball_filter.R[1, 1]) if changed: if values[0] >= 0 and values[1] >= 0: self.is_dirty = True ball_filter.R[1, :] = values
def _draw_initial_P(self): expanded, _ = imgui.collapsing_header("Initial P diagonals") if expanded: changed, values = imgui.input_float2("Position Uncertainty (x, y)", self.initial_P[0], self.initial_P[2]) if changed: if values[0] >= 0 and values[1] >= 0: self.is_dirty = True self.initial_P[0], self.initial_P[2] = values else: self._log.error( f"Position uncertainty must be >= 0. Got {values}") changed, values = imgui.input_float2("Velocity Uncertainty (x, y)", self.initial_P[1], self.initial_P[3]) if changed: if values[0] >= 0 and values[1] >= 0: self.is_dirty = True self.initial_P[1], self.initial_P[3] = values else: self._log.error( f"Velocity uncertainty must be >= 0. Got {values}")
def render_camera(self, scene): if not imgui.tree_node("Camera"): return changed = False with scene.camera.hold_trait_notifications(): for attr in ("position", "up", "focus"): arr = getattr(scene.camera, attr) imgui.text(f"Camera {attr}") _, values = imgui.input_float3( "", arr[0], arr[1], arr[2], flags=imgui.INPUT_TEXT_ENTER_RETURNS_TRUE, ) changed = changed or _ if _: setattr(scene.camera, attr, np.array(values)) _, values = imgui.input_float2( "Camera Planes", scene.camera.near_plane, scene.camera.far_plane, format="%0.6f", flags=imgui.INPUT_TEXT_ENTER_RETURNS_TRUE, ) changed = changed or _ if _: scene.camera.near_plane = values[0] scene.camera.far_plane = values[1] if imgui.button("Center"): scene.camera.position = np.array([0.499, 0.499, 0.499]) scene.camera.focus = np.array([0.5, 0.5, 0.5]) changed = True if imgui.button("Outside"): scene.camera.position = np.array([1.5, 1.5, 1.5]) scene.camera.focus = np.array([0.5, 0.5, 0.5]) changed = True if changed: scene.camera._update_matrices() imgui.tree_pop() return changed