コード例 #1
0
    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)
コード例 #2
0
 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
コード例 #3
0
    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)
コード例 #4
0
    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
コード例 #5
0
 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}")
コード例 #6
0
 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