def __init__(
        self
    ):  # this is to start grid builder before .show  ***note grid builder will require a array of data type called loginfo in the future***
        super().__init__()

        #self.initUI()

        #this code runs GridBuilder
        #############################################################################

        _widget = QWidget()

        layout = QGridLayout()

        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(10)

        title_label = QLabel("Event Configuration")
        title_label.setMaximumHeight(35)

        layout_name = QHBoxLayout()
        name_text_label = QLabel("Event Name")
        #name_text_label.setMaximumWidth(150)
        name_text_label.setMaximumHeight(35)
        name_edit = QTextEdit()
        #name_edit.setMaximumWidth(300)
        name_edit.setMaximumHeight(35)
        layout_name.addWidget(name_text_label)
        layout_name.addWidget(name_edit)
        layout_name.setSpacing(0)

        layout_description = QHBoxLayout()
        description_text_label = QLabel("Event description")
        #description_text_label.setMaximumWidth(150)
        description_edit = QTextEdit()
        #description_edit.setMaximumWidth(300)
        description_edit.setMaximumHeight(150)
        layout_description.addWidget(description_text_label)
        layout_description.addWidget(description_edit)
        layout_description.setSpacing(0)

        layout_start = QHBoxLayout()
        start_text_label = QLabel("Event Start")
        #start_text_label.setMaximumWidth(150)
        start_text_label.setMaximumHeight(35)
        start_calendar = QCalendarWidget()
        #start_calendar.setMaximumWidth(600)
        start_calendar.setMaximumHeight(200)
        start_calendar.setGridVisible(True)
        start_time = QTime()
        start_time.setHMS(12, 0, 0)
        start_time_edit = QTimeEdit()
        start_time_edit.setTime(start_time)
        start_time_edit.setMaximumHeight(35)
        layout_start.addWidget(start_text_label)
        layout_start.addWidget(start_time_edit)
        layout_start.addWidget(start_calendar)
        layout_start.setSpacing(0)

        layout_end = QHBoxLayout()
        end_text_label = QLabel("Event End")
        #end_text_label.setMaximumWidth(150)
        end_text_label.setMaximumHeight(35)
        end_calendar = QCalendarWidget()
        #end_calendar.setMaximumWidth(600)
        end_calendar.setMaximumHeight(200)
        end_calendar.setGridVisible(True)
        end_time = QTime()
        end_time.setHMS(12, 0, 0)
        end_time_edit = QTimeEdit()
        end_time_edit.setTime(end_time)
        end_time_edit.setMaximumHeight(35)
        layout_end.addWidget(end_text_label)
        layout_end.addWidget(end_time_edit)
        layout_end.addWidget(end_calendar)
        layout_end.setSpacing(0)

        connect_project_button = QPushButton("Save Event")
        self.directory_config = Configure_Directory()
        connect_project_button.clicked.connect(
            lambda: self.closeMyApp_OpenNewApp())
        back_button = QPushButton("Go Back")
        back_button.clicked.connect(lambda: self.OpenPrevApp())
        #connect_project_button.clicked.connect(self.directory_config.show_config)
        #connect_project_button.setMaximumWidth(150) def closeMyApp_OpenNewApp(self): self.close() self.Open = NewApp.NewApp() self.Open.show()

        widget = QWidget()
        widget.setLayout(layout)

        layout.addWidget(title_label, 0, 0, 1, 3)
        layout.addLayout(layout_name, 1, 0, 1, 3)
        layout.addLayout(layout_description, 2, 0, 1, 3)
        layout.addLayout(layout_start, 3, 0, 1, 3)
        layout.addLayout(layout_end, 4, 0, 1, 3)
        layout.addWidget(connect_project_button, 5, 2)
        layout.addWidget(back_button, 5, 0)

        layout.setAlignment(Qt.AlignVCenter | Qt.AlignHCenter)
        widget.setLayout(layout)

        _layout = QVBoxLayout(_widget)
        _layout.addWidget(widget)
        _layout.setAlignment(Qt.AlignVCenter | Qt.AlignHCenter)
        self.setCentralWidget(_widget)
        #############################################################################

        self.setGeometry(400, 400, 400, 650)
        self.setWindowTitle("Event Configuration")
예제 #2
0
class MyMainWindow(QMainWindow):
    displaying: bool = False  # 是否在循环刷新vtk控件
    frame_rate = 25  # 帧率
    origin_delta_tdb = 0.05
    delta_tdb = origin_delta_tdb

    def __init__(self, parent=None):
        super(MyMainWindow, self).__init__(parent)
        # 设置标题,大小,图标
        self.setWindowTitle("2016HO3")
        self.resize(1200, 700)
        self.setWindowIcon(QIcon("data/icon.jpg"))
        # 初始化数据
        self.dataProvider = DataProvider("data/de430.bsp", "data/status.eph")
        self.dataProvider.current_tdb = date2TDB(
            QDate.currentDate())  # 设置为当前日期
        # 初始化VTK控件
        self.vtkWidget = MyVTKWidget()  # VTK控件对象
        self._init_planets()  # 插入行星显示主体
        self._update_data()  # 更新球体坐标到当前日期
        # 初始化 UI
        self._initUI()
        # connections
        self.okButton.clicked.connect(self._on_OKButton_clicked)
        self.calendar.selectionChanged.connect(self._onCalChanged)
        self.speedButton_moreSlower.clicked.connect(
            self._on_speedButton_moreSlower)
        self.speedButton_slower.clicked.connect(self._on_speedButton_slower)
        self.speedButton_origion.clicked.connect(self._on_speedButton_origion)
        self.speedButton_faster.clicked.connect(self._on_speedButton_faster)
        self.speedButton_moreFaster.clicked.connect(
            self._on_speedButton_moreFaster)
        # log
        log("MainWindow Ready.", "info")
        self.window_status_label.setText("Ready")
        return

    def _initUI(self):
        # 分割窗口,并添加控件
        # 右半部分
        rSplitter = QSplitter(Qt.Vertical)
        rFrame = QFrame()
        rLayout = QVBoxLayout()
        rLayout.addWidget(self.vtkWidget)
        rLayout.setContentsMargins(0, 0, 0, 0)  # ?
        rFrame.setLayout(rLayout)
        rSplitter.addWidget(rFrame)
        # status bar
        self.window_status_label = QLabel()
        self.window_status_label.setMinimumWidth(200)
        self.window_status_label.setAlignment(Qt.AlignRight)
        self.statusBar = QStatusBar()
        self.statusBar.setMinimumWidth(300)
        self.statusBar.addPermanentWidget(self.window_status_label)
        rSplitter.addWidget(self.statusBar)
        # 拉伸比例
        rSplitter.setStretchFactor(0, 9)
        rSplitter.setStretchFactor(1, 1)

        # 左边
        self.lSplitter = QSplitter(Qt.Vertical)
        lFrame = QFrame()
        lLayout = QVBoxLayout()
        # 大标题2016HO3
        lLabel0 = QLabel()
        lLabel0.setText("2016HO3")
        lLabel0.setFont(QFont("Microsoft YaHei", 30, QFont.Bold))
        lLabel0.setAlignment(Qt.AlignCenter)
        lLayout.addWidget(lLabel0)  # 0
        lLayout.setStretch(0, 1.5)
        # Select start date
        lLabel = QLabel()
        # lLabel.setText("Select start date: ")
        # lLabel.setFont(QFont("Microsoft YaHei", 20, QFont.Bold))
        lLabel.setAlignment(Qt.AlignCenter)
        lLayout.addWidget(lLabel)  # 1
        lLayout.setStretch(1, 1)
        # 日历
        self.calendar = QCalendarWidget()
        self.calendar.setGridVisible(True)
        self.calendar.setDateRange(QDate(1900, 1, 1), QDate(2195, 12, 24))
        self.calendar.setMaximumHeight(300)
        # lLayout.addWidget(self.calendar)  # 2
        # 速度控制控件
        self.speed_box = QWidget()
        self.speed_layout = QHBoxLayout()
        self.speed_box.setLayout(self.speed_layout)
        speed_button_width = 40  # 按钮宽度
        self.speedButton_moreSlower = QPushButton("<<<")
        self.speedButton_moreSlower.setMaximumWidth(speed_button_width)
        self.speedButton_slower = QPushButton("<")
        self.speedButton_slower.setMaximumWidth(speed_button_width)
        self.speedButton_origion = QPushButton("▶")
        self.speedButton_origion.setMaximumWidth(speed_button_width)
        self.speedButton_faster = QPushButton(">")
        self.speedButton_faster.setMaximumWidth(speed_button_width)
        self.speedButton_moreFaster = QPushButton(">>>")
        self.speedButton_moreFaster.setMaximumWidth(speed_button_width)
        self.speed_layout.addWidget(self.speedButton_moreSlower)
        self.speed_layout.addWidget(self.speedButton_slower)
        self.speed_layout.addWidget(self.speedButton_origion)
        self.speed_layout.addWidget(self.speedButton_faster)
        self.speed_layout.addWidget(self.speedButton_moreFaster)
        lLayout.addWidget(self.speed_box)
        lLayout.setStretch(2, 4)
        # 日历标签
        self.calendar_label = QLabel()
        self.calendar_label.setFont(QFont("Microsoft YaHei", 10, QFont.Bold))
        self.calendar_label.setAlignment(Qt.AlignCenter)
        self._onCalChanged()
        lLayout.addWidget(self.calendar_label)  # 3
        lLayout.setStretch(3, 1)
        # OK按钮
        self.okButton = QPushButton("▶")
        self.okButton.setMinimumHeight(50)
        self.okButton.setFont(QFont("Microsoft YaHei", 20, QFont.Bold))
        lLayout.addWidget(self.okButton)  # 4
        lLayout.setStretch(4, 1)
        # 空标签(为了占地方)
        tempLabel = QLabel()
        tempLabel.setMaximumHeight(50)
        lLayout.addWidget(tempLabel)  # 5
        lLayout.setStretch(5, 1)

        lFrame.setLayout(lLayout)
        self.lSplitter.addWidget(lFrame)

        # 总布局
        splitter_main = QSplitter(Qt.Horizontal)
        splitter_main.addWidget(self.lSplitter)  # 左边
        splitter_main.addWidget(rSplitter)  # 右边
        splitter_main.setStretchFactor(0, 1)
        splitter_main.setStretchFactor(1, 5)
        self.setCentralWidget(splitter_main)
        return

    def _init_planets(self):
        # TODO 改半径,改为实际大小
        # 太阳
        self._build_planet_actors('Sun', np.array([0, 0, 0]), 0.2, "White")

        # 地球
        self._build_planet_actors('Earth', np.array([0, 0, 0]), 0.09,
                                  "SkyBlue")
        # 2016HO3
        self._build_planet_actors('2016HO3', np.array([0, 1, 0]), 0.03, "Pink")
        # Mercury
        self._build_planet_actors('Mercury', np.array([0, 1, 0]), 0.05, "Gold")
        # Venus
        self._build_planet_actors('Venus', np.array([0, 1, 0]), 0.04, "Green")

        # 光照
        # sun_light = vtkLight()
        # sun_light.SetColor(1, 1, 1)
        # sun_light.SetPosition(0, 0, 0)
        # self.vtkWidget.renderer.AddLight(sun_light)

        return None

    def _build_planet_actors(self, key: str, Center: np.array(3),
                             radius: float, color: str):
        sphereSource = vtk.vtkSphereSource()
        # Make the surface smooth.
        sphereSource.SetPhiResolution(100)
        sphereSource.SetThetaResolution(100)
        mapper = vtk.vtkPolyDataMapper()
        mapper.SetInputConnection(sphereSource.GetOutputPort())

        actor = vtk.vtkActor()
        actor.SetMapper(mapper)
        actor.GetProperty().SetColor(Colors.GetColor3d(color))
        sphereSource.SetCenter(Center[0], Center[1], Center[2])
        sphereSource.SetRadius(radius)

        # 标签
        vText = vtkVectorText()
        vText.SetText(key)
        textMapper = vtkPolyDataMapper()
        textMapper.SetInputConnection(vText.GetOutputPort())
        textActor = vtkFollower()
        textActor.SetMapper(textMapper)
        textActor.SetScale(0.05)
        # textActor.AddPosition(Center[0], Center[1], Center[2])
        textActor.SetPosition(Center[0], Center[1], Center[2])
        textActor.SetCamera(self.vtkWidget.renderer.GetActiveCamera())

        # 加入数据集
        self.dataProvider.add_sphere_source(key, sphereSource, textActor)
        self.vtkWidget.renderer.AddActor(actor)
        self.vtkWidget.renderer.AddActor(textActor)
        return

    def _on_OKButton_clicked(self):
        log("OK clicked", "info")
        if not self.displaying:
            self.displaying = True
            self.okButton.setText("||")
            log("go, displaying=" + self.displaying.__str__(), "debug")
            self._display_loop()
        else:  # displaying
            self.displaying = False
            self.okButton.setText("▶")
            log("pause, displaying=" + self.displaying.__str__(), "debug")
        QApplication.processEvents()
        return

    def _display_loop(self):
        log("start displaying", "info")
        self.window_status_label.setText("Displaying")
        while self.displaying:
            frame_start = time.time()  # 帧开始时间
            frame_time = 1 / self.frame_rate  # 帧时长
            # update data (takes time)
            self._update_data()
            # 控制帧率
            time_spent = time.time() - frame_start
            time_left = frame_time - time_spent
            if time_left > 0:
                time.sleep(time_left)
            self._refresh_vtkDisplay()
            QApplication.processEvents()
        self.window_status_label.setText("Pause")
        log("displaying circle quit", "info")
        return

    def _update_data(self):
        current_tdb = self.dataProvider.current_tdb
        new_tdb = current_tdb + self.delta_tdb
        self.dataProvider.update_to_tdb(new_tdb)
        return

    def _refresh_vtkDisplay(self):
        self.vtkWidget.GetRenderWindow().Render()  # 刷新
        # Show current tdb
        self.vtkWidget.commentTextActor.SetInput("TDB=%.4f\ncomment" %
                                                 self.dataProvider.current_tdb)
        QApplication.processEvents()
        return

    def _onCalChanged(self):
        date = self.calendar.selectedDate()
        tdb = date2TDB(date)
        self.calendar_label.setText("%s  TDB = %.2f" %
                                    (str(date.toPyDate()), tdb))
        # todo

    # TODO 重新设置速率步长
    large_step = 0.3
    small_step = 0.1

    def _on_speedButton_moreSlower(self):
        step = self.large_step
        if self.delta_tdb - step > 0:
            self.delta_tdb -= step
        log("speed more slower, delta_tdb=%f" % self.delta_tdb, "info")

    def _on_speedButton_slower(self):
        step = self.small_step
        if self.delta_tdb - step > 0:
            self.delta_tdb -= step
        log("speed slower, delta_tdb=%f" % self.delta_tdb, "info")

    def _on_speedButton_origion(self):
        self.delta_tdb = self.origin_delta_tdb
        log("speed origion", "info")

    def _on_speedButton_faster(self):
        step = self.small_step
        self.delta_tdb += step
        log("speed faster, delta_tdb=%f" % self.delta_tdb, "info")

    def _on_speedButton_moreFaster(self):
        step = self.large_step
        self.delta_tdb += step
        log("speed more faster, delta_tdb=%f" % self.delta_tdb, "info")

    def closeEvent(self, *args, **kwargs):
        log("Window Closed.", "Info")
        exit()