示例#1
0
class Window_test(QtWidgets.QMainWindow):
    def __init__(self):
        super(Window_test, self).__init__()
        uic.loadUi("version_1.ui", self)
        self.condition_combox.addItems(["step", "range", ">", "="])
        self.condition_combox.setItemText(0, "step")
        self.condition_combox.activated[str].connect(self.condition_select) # 当改变筛选方式时,调用condition_select函数

        self.file_open_button.clicked.connect(self.openfiles)  # 打开mdf

        self.lower_range.setText("0")
        self.upper_range.setText("0")
        # self.export_csv_button.clicked.connect(self.delete_all_signals)
        self.export_csv_button.clicked.connect(self.to_csv) # 导出到csv

        self.all_signals.itemDoubleClicked[QtWidgets.QListWidgetItem].connect(self.select_signal)  # 双击选要导出的信号
        self.all_signals.addItem("hello")

        self.selected_sig = set()   # 导出的信号,不可重复选
        self.selected_signals.itemDoubleClicked.connect(self.deselect_signal) # 双击删除导出的信号

        self.add_condition_combox.addItem("")
        self.add_condition_combox.setItemText(0, "信号")
        # 等价于 self.add_condition_combox.addItem("信号")

        self.show() # 显示窗口

    def openfiles(self):
        # 打开单个mdf文件
        self.all_signals.clear()     # 先清除上一个文件的信号
        filename, filetype = QtWidgets.QFileDialog.getOpenFileName()
        if filename[-3:] not in ["dat", "mdf", "DAT", "MDF"]:
            QtWidgets.QMessageBox.about(self, "Message", "文件类型错误")
            return

        # 把信号显示在左边框中
        self.mdf_file = MDF(filename, memory="minimum")
        channel_list = list(self.mdf_file.channels_db.keys())
        channel_list.remove("time")
        channel_list.sort()
        self.add_condition_combox.addItems(channel_list)
        self.all_signals.addItems(channel_list)


        # 打开多个mdf文件
        # filenames, filetype= QtWidgets.QFileDialog.getOpenFileNames()
        # for filename in filenames:
        #     file = MDF(filename, memory="minimum")
        #     channel_list = list(file.channels_db.keys())
        #     channel_list.remove("time")                   # 多个文件时间可能不同,因此该程序肯定有问题,不管。
        #     channel_list.sort()
        #     self.data += file.select(channel_list)
        #     for channel in channel_list:
        #         self.all_signals.addItem(channel)

        # 打开一个文件夹下的所有mdf文件。但具体是否可行未知,或者把上面程序多运行几遍
        # dir = os.listdir(QtWidgets.QFileDialog.getExistingDirectory())
        # mdf_files = [mdf_file for mdf_file in dir if mdf_file[-3:] in ["dat", "mdf", "DAT", "MDF"]]
        # mdf = MDF()
        # mdf.stack(mdf_files, memory='minimum')
        # signals = mdf.iter_channels()  # generator that yields a Signal for each non-master channel
        # for signal in signals:
        #     self.all_signals.addItem(signal)

    def select_signal(self, item):
        # print(item.text())  # QtWidgets.QListWidgetItem.text()
        # Adding the same QListWidgetItem multiple times to a QListWidget will result in undefined behavior.
        if item.text() not in self.selected_sig:
            self.selected_signals.addItem(item.text())
            self.selected_sig.add(item.text())

    def deselect_signal(self):
        text = self.selected_signals.takeItem(self.selected_signals.currentRow())
        self.selected_sig.remove(text.text())

    def delete_all_signals(self):
        self.selected_signals.clear()

    def condition_select(self, item):
        if item in ["step", "range"]:
            self.upper_range.show()
            self.label_2.show()
        elif item in [">", "="]:
            self.upper_range.hide()
            self.label_2.hide()
        else:
            pass

    def to_csv(self):
        condition = self.condition_combox.currentText()  # 筛选方式
        condition_channels = []  # 筛选所用的信号

        if condition == "step":
            if not (self.lower_range.text().isdigit() and self.upper_range.text().isdigit()):
                QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                return
            lower_range = float(self.lower_range.text())
            upper_range = float(self.upper_range.text())
            print("___________")
            # 得到筛选所用信号的samples值
            condition_channels.append(self.add_condition_combox.currentText())
            signal_samples = self.mdf_file.select(condition_channels)[0].samples
            timestamps = self.mdf_file.select(condition_channels)[0].timestamps
            print("-------------")
            # start_indexes 和 end_indexes分别是起始和终止索引
            start_flag = 0
            start_indexes = []
            end_flag = 0
            end_indexes = []

            for i, signal_sample in enumerate(signal_samples):
                if signal_sample == lower_range and start_flag == 0:
                    start_indexes.append(i)
                    start_flag = 1
                if signal_sample == upper_range and start_flag == 1:
                    start_flag = 0
                    end_flag = 1
                if signal_sample != upper_range and end_flag == 1:
                    end_flag = 0
                    end_indexes.append(i)
                if signal_sample == upper_range and start_flag ==1 and i == len(signal_samples)-1:
                    end_indexes.append(i+1)

            # 把所需导出的信号名添加到items中,并从mdf中获得其值,得到selected_signals
            count = self.selected_signals.count()
            items = []
            data_dict = {"timestamps": []}
            for i in range(count):
                items.append(self.selected_signals.item(i).text())
            selected_signals = self.mdf_file.select(items)

            # 将所需信号满足条件的片段筛选出来,加入到data_dict中,并添加时间戳
            for idx, signal in enumerate(selected_signals):
                data_dict[signal.name] = []
                for i, j in zip(start_indexes, end_indexes):
                    # data_dict.update({signal.name: signal.samples[i:j]})
                    try:
                        data_dict[signal.name] += signal.interp(timestamps[i:j]).samples.tolist()
                        if idx == 0:
                            data_dict["timestamps"] += timestamps[i:j].tolist()
                    except:
                        print("error")
            print(data_dict)
            # 写入csv
            self.write_csv(data_dict)

        elif condition == "range":
            if not (self.lower_range.text().isdigit() and self.upper_range.text().isdigit()):
                QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                return
            lower_range = float(self.lower_range.text())
            upper_range = float(self.upper_range.text())
            print("___________")
            condition_channels.append(self.add_condition_combox.currentText())
            signal_samples = self.mdf_file.select(condition_channels)[0].samples
            timestamps = self.mdf_file.select(condition_channels)[0].timestamps
            print("-------------")
            start_flag = 0
            start_indexes = []
            end_indexes = []

            for i, signal_sample in enumerate(signal_samples):
                if upper_range > signal_sample > lower_range and start_flag == 0:
                    start_indexes.append(i)
                    start_flag = 1
                if (signal_sample > upper_range or signal_sample < lower_range) and start_flag == 1:
                    start_flag = 0
                    end_indexes.append(i)
                if upper_range > signal_sample > lower_range and start_flag == 1 and i == len(signal_samples) - 1:
                    end_indexes.append(i+1)
            count = self.selected_signals.count()
            items = []
            data_dict = {"timestamps": []}
            for i in range(count):
                items.append(self.selected_signals.item(i).text())
            selected_signals = self.mdf_file.select(items)

            for idx, signal in enumerate(selected_signals):
                data_dict[signal.name] = []
                for i, j in zip(start_indexes, end_indexes):
                    # data_dict.update({signal.name: signal.samples[i:j]})
                    try:
                        data_dict[signal.name] += signal.interp(timestamps[i:j]).samples.tolist()
                        if idx == 0:
                            data_dict["timestamps"] += timestamps[i:j].tolist()
                    except:
                        print("error")
            print(data_dict)
            self.write_csv(data_dict)

        elif condition == ">":
            if not self.lower_range.text().isdigit():
                QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                return
            lower_range = float(self.lower_range.text())
            condition_channels.append(self.add_condition_combox.currentText())
            signal_samples = self.mdf_file.select(condition_channels)[0].samples
            timestamps = self.mdf_file.select(condition_channels)[0].timestamps
            print("-------------")
            start_flag = 0
            start_indexes = []
            end_indexes = []

            for i, signal_sample in enumerate(signal_samples):
                if signal_sample > lower_range and start_flag == 0:
                    start_indexes.append(i)
                    start_flag = 1
                if signal_sample < lower_range and start_flag == 1:
                    start_flag = 0
                    end_indexes.append(i)
                if signal_sample > lower_range and start_flag == 1 and i == len(signal_samples) - 1:
                    end_indexes.append(i+1)
            count = self.selected_signals.count()
            items = []
            data_dict = {"timestamps": []}
            for i in range(count):
                items.append(self.selected_signals.item(i).text())
            selected_signals = self.mdf_file.select(items)

            for idx, signal in enumerate(selected_signals):
                data_dict[signal.name] = []
                # signal[i].interp(time).samples
                for i, j in zip(start_indexes, end_indexes):
                    try:
                        data_dict[signal.name] += signal.interp(timestamps[i:j]).samples.tolist()
                        if idx == 0:
                            data_dict["timestamps"] += timestamps[i:j].tolist()
                    except:
                        print("error")
            print(data_dict)
            self.write_csv(data_dict)

        elif condition == "=":
            if not self.lower_range.text().isdigit():
                QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                return
            lower_range = float(self.lower_range.text())
            condition_channels.append(self.add_condition_combox.currentText())
            signal_samples = self.mdf_file.select(condition_channels)[0].samples
            timestamps = self.mdf_file.select(condition_channels)[0].timestamps
            print("-------------")
            start_flag = 0
            start_indexes = []
            for i, signal_sample in enumerate(signal_samples):
                if signal_sample == lower_range and start_flag == 0:
                    start_indexes.append(i)
                    start_flag = 1
                if signal_sample != lower_range and start_flag == 1:
                    start_flag = 0
            count = self.selected_signals.count()
            items = []
            data_dict = {"timestamps": []}
            for i in range(count):
                items.append(self.selected_signals.item(i).text())
            selected_signals = self.mdf_file.select(items)

            for idx, signal in enumerate(selected_signals):
                data_dict[signal.name] = []
                for i in start_indexes:
                    # data_dict.update({signal.name: signal.samples[i:j]})
                    try:
                        print(signal.interp([timestamps[i]]).samples)
                        data_dict[signal.name].append(signal.interp(timestamps[i]).samples)
                        if idx == 0:
                            data_dict["timestamps"].append(timestamps[i])
                    except:
                        print("error")
            print(data_dict)
            self.write_csv(data_dict)
        else:
            pass

    def write_csv(self, data_dict):
        print("writing to csv..\n")
        df = pd.DataFrame(data=data_dict)
        timestamps = df['timestamps']
        df.drop(labels=['timestamps'], axis=1, inplace=True)
        df.insert(0, 'timestamps', timestamps)
        f_name = str(datetime.now()).split(".")[0].replace(":", "_", 2) + ".csv"
        f = open(f_name, "w")
        f.close()
        df.to_csv(f_name, index=False)
        print("finished")
示例#2
0
import matplotlib
# import matplotlib.pyplot as plt

# MDF 파일을 읽어옵니다.
path = "./"
data = MDF(path + "Acceleration_StandingStart.MDF")

### CAN 신호 리스트를 가져 옵니다.
signal_list = list(data.channels_db)
# 가져온 리스트에서 시간축은 신호가 아니므로 제외합니다.
signal_list.remove('t')
print(signal_list)  # 로깅된 CAN 신호 전체를 볼 수 있습니다.

### 그래프 출력
#speed = data.get('VehicleSpeed')
#speed.plot()

### 필요한 신호만 필터링
filtered_signal_list = ['VehicleSpeed', 'Throttle']

### 여러 그래프 출력
for signal in data.select(filtered_signal_list):
    signal.plot()

# 10초 ~ 12초 사이의 데이터만 필터링
filtered_data = data.filter(filtered_signal_list).cut(start=10, stop=12)

### 엑셀 파일 또는 CSV 파일로 출력
#signals_data_frame = data.to_dataframe()
#signals_data_frame.to_excel(path + "signals_data_frame.xlsx")
#signals_data_frame.to_csv(path + "signals_data_frame.csv")
示例#3
0
class Window_test(QtWidgets.QMainWindow):
    def __init__(self):
        super(Window_test, self).__init__()
        uic.loadUi("version_3.ui", self)
        self.condition_combox.addItems(["step", "range", ">"])
        self.condition_combox.setItemText(0, "step")
        self.condition_combox_2.addItems(["step", "range", ">"])
        self.condition_combox_2.setItemText(0, "step")
        self.condition_combox.activated[str].connect(self.condition_select)
        self.condition_combox_2.activated[str].connect(self.condition_select)
        self.file_open_button.clicked.connect(self.openfiles)
        self.lower_range.setText("0")
        self.upper_range.setText("0")
        self.lower_range_2.setText("0")
        self.upper_range_2.setText("0")
        self.export_csv_button.clicked.connect(self.to_csv)

        self.all_signals.itemDoubleClicked[QtWidgets.QListWidgetItem].connect(self.select_signal)
        self.selected_sig = set()   # 选中的信号,不可重复选
        self.selected_signals.itemDoubleClicked.connect(self.deselect_signal)
        self.all_signals.addItem("hello")

        self.add_condition_combox.addItem("")
        self.add_condition_combox.setItemText(0, "信号")
        self.add_condition_combox_2.addItem("")
        self.add_condition_combox_2.setItemText(0, "信号")
        # 等价于 self.add_condition_combox.addItem("信号")
        self.add_condition_combox.setMaxVisibleItems(20)
        self.add_condition_combox_2.setMaxVisibleItems(20)

        self.checkbox_1.stateChanged.connect(self.check)
        self.checkbox_2.stateChanged.connect(self.check)
        self.check_flag_1 = 0
        self.check_flag_2 = 0
        self.statusBar().showMessage('鲁班7号,智商250')

        self.save_config.clicked.connect(self.save_configs)
        self.load_config.clicked.connect(self.load_configs)
        self.filenames = []
        self.completer = QtWidgets.QCompleter()
        self.completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion)
        self.add_condition_combox.setCompleter(self.completer)
        self.add_condition_combox_2.setCompleter(self.completer)
        # QCompleter::UnfilteredPopupCompletion	1
        # All possible completions are displayed in a popup window with the most likely suggestion indicated as current.
        self.show()
    def openfiles(self):
        self.statusBar().showMessage('打开多个文件')
        self.all_signals.clear()
        files, filetype = QtWidgets.QFileDialog.getOpenFileNames(self, "选取文件", ".", "MDF Files (*.dat *.mdf *.DAT *.MDF);;All Files (*)")
        if not files:
            return
        for filename in files:
            if filename[-3:] in ["dat", "mdf", "DAT", "MDF"]:
                self.filenames.append(filename)
        filename = self.filenames[0]
        self.mdf_file = MDF(filename, memory="minimum")   #
        signalnames = list(self.mdf_file.channels_db.keys())
        self.all_signals.addItems(signalnames)

    def check(self, state):
        # checkbox选中才出现信号选项
        source = self.sender()
        try:
            self.mdf_file
        except:
            if self.checkbox_1.checkState() == 2:  # 0 表示未选中, 2表示选中
                QtWidgets.QMessageBox.about(self, "Message", "请先打开mdf文件")
            self.checkbox_1.setCheckState(0)
            self.checkbox_2.setCheckState(0)
            return
        # 每次复选框状态变化,就把flag复位,然后根据信号选择是否置位
        if self.check_flag_1 == 1:
            self.check_flag_1 = 0
        if self.check_flag_2 == 1:
            self.check_flag_2 = 0
        if source == self.checkbox_1 and state == QtCore.Qt.Checked:
            channel_list = list(self.mdf_file.channels_db.keys())
            channel_list.remove("time")
            channel_list.sort()
            self.add_condition_combox.addItems(channel_list)
            self.check_flag_1 = 1

        if source == self.checkbox_2 and state == QtCore.Qt.Checked:
            channel_list = list(self.mdf_file.channels_db.keys())
            channel_list.remove("time")
            channel_list.sort()
            self.add_condition_combox_2.addItems(channel_list)
            self.check_flag_2 = 1

    def select_signal(self, item):
        # print(item.text())  # QtWidgets.QListWidgetItem.text()
        # Adding the same QListWidgetItem multiple times to a QListWidget will result in undefined behavior.
        if item.text() not in self.selected_sig:
            self.selected_signals.addItem(item.text())
            self.selected_sig.add(item.text())

    def deselect_signal(self):
        text = self.selected_signals.takeItem(self.selected_signals.currentRow())
        self.selected_sig.remove(text.text())

    def delete_all_signals(self):
        self.selected_signals.clear()

    def condition_select(self, item):
        source = self.sender()
        if source == self.condition_combox:
            if item in ["step", "range"]:
                self.upper_range.show()
                self.label_2.show()
            elif item in [">", "="]:
                self.upper_range.hide()
                self.label_2.hide()
            else:
                pass
        if source == self.condition_combox_2:
            if item in ["step", "range"]:
                self.upper_range_2.show()
                self.label_3.show()
            elif item in [">", "="]:
                self.upper_range_2.hide()
                self.label_3.hide()
            else:
                pass
        else:
            pass

    def save_configs(self):
        self.statusBar().showMessage("保存配置")
        configs = {"selected_signals":[]}
        # configs = {}
        if self.checkbox_1.checkState() == 2:
            configs["checkbox_1"] = True
            configs["condition_signal"] = self.add_condition_combox.currentText()
            configs["condition"] = self.condition_combox.currentText()
            configs["lower_range"] = self.lower_range.text()
            configs["upper_range"] = self.upper_range.text()

        if self.checkbox_2.checkState() == 2:
            configs["checkbox_2"] = True
            configs["condition_signal_2"] = self.add_condition_combox_2.currentText()
            configs["condition_2"] = self.condition_combox_2.currentText()
            configs["lower_range_2"] = self.lower_range_2.text()
            configs["upper_range_2"] = self.upper_range_2.text()
        for i in range(self.selected_signals.count()):
            configs["selected_signals"].append(self.selected_signals.item(i).text())

        filename, okpressed = QtWidgets.QInputDialog.getText(self, "保存配置", "请输入文件名:", QtWidgets.QLineEdit.Normal, "")
        if okpressed and filename.strip():
            with open(filename + ".json", "w") as f:
                json.dump(configs, f)
        self.statusBar().showMessage("idle")

    def load_configs(self):
        self.statusBar().showMessage("导入筛选条件")
        filename, filetype = QtWidgets.QFileDialog().getOpenFileName(self, "选取文件", ".", "Json Files (*.json);;All Files (*)")
        if filename:
            with open(filename, "r") as f:
                configs = json.load(f)
            if "checkbox_1" in configs.keys():
                self.checkbox_1.setCheckState(2)
                self.add_condition_combox.setCurrentText(configs["condition_signal"])
                self.condition_combox.setCurrentText(configs["condition"])
                self.lower_range.setText(configs["lower_range"])
                self.upper_range.setText(configs["upper_range"])
            if "checkbox_2" in configs.keys():
                self.checkbox_2.setCheckState(2)
                self.add_condition_combox_2.setCurrentText(configs["condition_signal_2"])
                self.condition_combox_2.setCurrentText(configs["condition_2"])
                self.lower_range_2.setText(configs["lower_range_2"])
                self.upper_range_2.setText(configs["upper_range_2"])
            self.selected_sig = set(configs["selected_signals"])
            self.selected_signals.addItems(list(self.selected_sig))


    def to_csv(self):
        for filename in self.filenames:
            condition = self.condition_combox.currentText()
            condition_2 = self.condition_combox_2.currentText()
            condition_channels = []
            condition_channels_2 = []
            end_indexes_1 = []
            start_indexes_1 = []
            end_indexes_2 = []
            start_indexes_2 = []
            if self.check_flag_1 == 1:
                if condition == "step":
                    if not (self.lower_range.text().isdigit() and self.upper_range.text().isdigit()):
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range = float(self.lower_range.text())
                    upper_range = float(self.upper_range.text())
                    condition_channels.append(self.add_condition_combox.currentText())
                    mdf = MDF(filename, "minimum")
                    signal_samples = mdf.select(condition_channels)[0].samples
                    self.statusBar().showMessage("处理第一个筛选条件")
                    for i in range(len(signal_samples)-1):
                        if signal_samples[i] == lower_range and signal_samples[i+1] == upper_range:
                            start_indexes_1.append(i)
                            end_indexes_1.append(i+1)
                    # for i, signal_sample in enumerate(signal_samples):
                    #     if signal_sample == lower_range and start_flag == 0:
                    #         start_indexes_1.append(i)
                    #         start_flag = 1
                    #     if signal_sample == upper_range and start_flag == 1:
                    #         start_flag = 0
                    #         end_flag = 1
                    #     if signal_sample != upper_range and end_flag == 1:
                    #         end_flag = 0
                    #         end_indexes_1.append(i)
                    #     if signal_sample == upper_range and start_flag ==1 and i == len(signal_samples)-1:
                    #         end_indexes_1.append(i+1)

                elif condition == "range":
                    if not (self.lower_range.text().isdigit() and self.upper_range.text().isdigit()):
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range = float(self.lower_range.text())
                    upper_range = float(self.upper_range.text())
                    condition_channels.append(self.add_condition_combox.currentText())
                    mdf = MDF(filename, "minimum")
                    signal_samples = mdf.select(condition_channels)[0].samples
                    self.statusBar().showMessage("处理第一个筛选条件")
                    start_flag = 0

                    for i, signal_sample in enumerate(signal_samples):
                        if upper_range >= signal_sample >= lower_range and start_flag == 0:
                            start_indexes_1.append(i)
                            start_flag = 1
                        if (signal_sample > upper_range or signal_sample < lower_range) and start_flag == 1:
                            start_flag = 0
                            end_indexes_1.append(i)
                        if upper_range > signal_sample > lower_range and start_flag == 1 and i == len(signal_samples) - 1:
                            end_indexes_1.append(i+1)

                elif condition == ">":
                    if not self.lower_range.text().isdigit():
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range = float(self.lower_range.text())
                    condition_channels.append(self.add_condition_combox.currentText())
                    mdf = MDF(filename, "minimum")
                    signal_samples = mdf.select(condition_channels)[0].samples
                    self.statusBar().showMessage("处理第一个筛选条件")
                    start_flag = 0

                    for i, signal_sample in enumerate(signal_samples):
                        if signal_sample > lower_range and start_flag == 0:
                            start_indexes_1.append(i)
                            start_flag = 1
                        if signal_sample < lower_range and start_flag == 1:
                            start_flag = 0
                            end_indexes_1.append(i)
                        if signal_sample > lower_range and start_flag == 1 and i == len(signal_samples) - 1:
                            end_indexes_1.append(i + 1)

                else:
                    pass
            if self.check_flag_2 == 1:
                if condition_2 == "step":
                    if not (self.lower_range_2.text().isdigit() and self.upper_range_2.text().isdigit()):
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range_2 = float(self.lower_range_2.text())
                    upper_range_2 = float(self.upper_range_2.text())
                    condition_channels_2.append(self.add_condition_combox_2.currentText())
                    mdf = MDF(filename, "minimum")
                    signal_samples_2 = mdf.select(condition_channels_2)[0].samples
                    self.statusBar().showMessage("处理第二个筛选条件")
                    for i in range(len(signal_samples_2)-1):
                        if signal_samples_2[i] == lower_range_2 and signal_samples_2[i+1] == upper_range_2:
                            start_indexes_2.append(i)
                            end_indexes_2.append(i+1)

                elif condition_2 == "range":
                    if not (self.lower_range_2.text().isdigit() and self.upper_range_2.text().isdigit()):
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range_2 = float(self.lower_range_2.text())
                    upper_range_2 = float(self.upper_range_2.text())
                    condition_channels_2.append(self.add_condition_combox_2.currentText())
                    mdf = MDF(filename, "minimum")
                    signal_samples_2 = mdf.select(condition_channels_2)[0].samples
                    self.statusBar().showMessage("处理第二个筛选条件")
                    start_flag = 0

                    for i, signal_sample in enumerate(signal_samples_2):
                        if upper_range_2 >= signal_sample >= lower_range_2 and start_flag == 0:
                            start_indexes_2.append(i)
                            start_flag = 1
                        if (signal_sample > upper_range_2 or signal_sample < lower_range_2) and start_flag == 1:
                            start_flag = 0
                            end_indexes_2.append(i)
                        if upper_range_2 > signal_sample > lower_range_2 and start_flag == 1 and i == len(signal_samples_2) - 1:
                            end_indexes_2.append(i + 1)

                elif condition_2 == ">":
                    if not self.lower_range_2.text().isdigit():
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range_2 = float(self.lower_range_2.text())
                    condition_channels_2.append(self.add_condition_combox_2.currentText())
                    mdf = MDF(filename, "minimum")
                    signal_samples_2 = mdf.select(condition_channels_2)[0].samples
                    self.statusBar().showMessage("处理第二个筛选条件")
                    start_flag = 0

                    for i, signal_sample in enumerate(signal_samples_2):
                        if signal_sample > lower_range_2 and start_flag == 0:
                            start_indexes_2.append(i)
                            start_flag = 1
                        if signal_sample < lower_range_2 and start_flag == 1:
                            start_flag = 0
                            end_indexes_2.append(i)
                        if signal_sample > lower_range_2 and start_flag == 1 and i == len(signal_samples_2) - 1:
                            end_indexes_2.append(i + 1)
                else:
                    pass

            if self.check_flag_1 == 1 and self.check_flag_2 == 0:
                self.statusBar().showMessage("getting selected signal")
                count = self.selected_signals.count()
                data_dict = {"timestamps": [], "filename": []}
                timestamps = self.mdf_file.select(condition_channels)[0].timestamps
                for i in range(count):
                    signal_name = self.selected_signals.item(i).text()
                    mdf = MDF(filename, "minimum")
                    selected_signal = mdf.select([signal_name])    # mdf的select方法参数必须为list
                    data_dict[self.selected_signals.item(i).text()] = []
                    for k, j in zip(start_indexes_1, end_indexes_1):
                        try:
                            data_dict[self.selected_signals.item(i).text()] += selected_signal[0].interp(timestamps[k:j]).samples.tolist()
                        except:
                            self.statusBar().showMessage("error")
                for i, j in zip(start_indexes_1, end_indexes_1):
                    try:
                        data_dict["timestamps"] += timestamps[i:j].tolist()
                        data_dict["filename"].append(filename)
                    except:
                        self.statusBar().showMessage("error")
                self.write_csv(data_dict)
            elif self.check_flag_1 == 1 and self.check_flag_2 == 1:
                # 先把两个索引扩展开,把中间的数填上,并把它变成集合,最后取两个集合交集
                index_1 = set()
                index_2 = set()
                for i, j in zip(start_indexes_1, end_indexes_1):
                    for n in range(i, j+1):
                        index_1.add(n)
                for i, j in zip(start_indexes_2, end_indexes_2):
                    for n in range(i, j+1):
                        index_2.add(n)
                indexes = index_1 and index_2
                # 获取需要导出的信号名
                count = self.selected_signals.count()
                data_dict = {"timestamps": [], "filename":[]}
                timestamps = self.mdf_file.select(condition_channels)[0].timestamps
                for i in range(count):
                    signal_name = self.selected_signals.item(i).text()
                    mdf = MDF(filename, "minimum")
                    selected_signal = mdf.select([signal_name])
                    data_dict[self.selected_signals.item(i).text()] = []
                # 把相应信号及其采样值做成字典,信号名作为键,采样值的列表作为值
                    for k in indexes:
                        try:
                            data_dict[self.selected_signals.item(i).text()].append(selected_signal.interp(timestamps[k]).samples)
                        except:
                            self.statusBar().showMessage("error")
                for i in indexes:
                    try:
                        data_dict["timestamps"].append(timestamps[i])
                        data_dict["filename"].append(filename)
                    except:
                        self.statusBar().showMessage("error")
                self.write_csv(data_dict)
            else:
                QtWidgets.QMessageBox.about(self, "Message", "请按顺序勾选复选框")
                return

    def write_csv(self, data_dict):
        try:
            df = pd.DataFrame(data=data_dict)
        except ValueError:
            QtWidgets.QMessageBox.about(self, "Message", "某些信号采样值缺失")
            return
        timestamps = df['timestamps']
        df.drop(labels=['timestamps'], axis=1, inplace=True)
        df.insert(0, 'timestamps', timestamps)
        f_name = str(datetime.now()).split(".")[0].replace(":", "_", 2) + ".csv"
        f = open(f_name, "w")
        f.close()
        df.to_csv(f_name, index=False)
        self.statusBar().showMessage("finished")
示例#4
0
    def to_csv(self):
        for filename in self.filenames:
            condition = self.condition_combox.currentText()
            condition_2 = self.condition_combox_2.currentText()
            condition_channels = []
            condition_channels_2 = []
            end_indexes_1 = []
            start_indexes_1 = []
            end_indexes_2 = []
            start_indexes_2 = []
            if self.check_flag_1 == 1:
                if condition == "step":
                    if not (self.lower_range.text().isdigit() and self.upper_range.text().isdigit()):
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range = float(self.lower_range.text())
                    upper_range = float(self.upper_range.text())
                    condition_channels.append(self.add_condition_combox.currentText())
                    mdf = MDF(filename, "minimum")
                    signal_samples = mdf.select(condition_channels)[0].samples
                    self.statusBar().showMessage("处理第一个筛选条件")
                    for i in range(len(signal_samples)-1):
                        if signal_samples[i] == lower_range and signal_samples[i+1] == upper_range:
                            start_indexes_1.append(i)
                            end_indexes_1.append(i+1)
                    # for i, signal_sample in enumerate(signal_samples):
                    #     if signal_sample == lower_range and start_flag == 0:
                    #         start_indexes_1.append(i)
                    #         start_flag = 1
                    #     if signal_sample == upper_range and start_flag == 1:
                    #         start_flag = 0
                    #         end_flag = 1
                    #     if signal_sample != upper_range and end_flag == 1:
                    #         end_flag = 0
                    #         end_indexes_1.append(i)
                    #     if signal_sample == upper_range and start_flag ==1 and i == len(signal_samples)-1:
                    #         end_indexes_1.append(i+1)

                elif condition == "range":
                    if not (self.lower_range.text().isdigit() and self.upper_range.text().isdigit()):
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range = float(self.lower_range.text())
                    upper_range = float(self.upper_range.text())
                    condition_channels.append(self.add_condition_combox.currentText())
                    mdf = MDF(filename, "minimum")
                    signal_samples = mdf.select(condition_channels)[0].samples
                    self.statusBar().showMessage("处理第一个筛选条件")
                    start_flag = 0

                    for i, signal_sample in enumerate(signal_samples):
                        if upper_range >= signal_sample >= lower_range and start_flag == 0:
                            start_indexes_1.append(i)
                            start_flag = 1
                        if (signal_sample > upper_range or signal_sample < lower_range) and start_flag == 1:
                            start_flag = 0
                            end_indexes_1.append(i)
                        if upper_range > signal_sample > lower_range and start_flag == 1 and i == len(signal_samples) - 1:
                            end_indexes_1.append(i+1)

                elif condition == ">":
                    if not self.lower_range.text().isdigit():
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range = float(self.lower_range.text())
                    condition_channels.append(self.add_condition_combox.currentText())
                    mdf = MDF(filename, "minimum")
                    signal_samples = mdf.select(condition_channels)[0].samples
                    self.statusBar().showMessage("处理第一个筛选条件")
                    start_flag = 0

                    for i, signal_sample in enumerate(signal_samples):
                        if signal_sample > lower_range and start_flag == 0:
                            start_indexes_1.append(i)
                            start_flag = 1
                        if signal_sample < lower_range and start_flag == 1:
                            start_flag = 0
                            end_indexes_1.append(i)
                        if signal_sample > lower_range and start_flag == 1 and i == len(signal_samples) - 1:
                            end_indexes_1.append(i + 1)

                else:
                    pass
            if self.check_flag_2 == 1:
                if condition_2 == "step":
                    if not (self.lower_range_2.text().isdigit() and self.upper_range_2.text().isdigit()):
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range_2 = float(self.lower_range_2.text())
                    upper_range_2 = float(self.upper_range_2.text())
                    condition_channels_2.append(self.add_condition_combox_2.currentText())
                    mdf = MDF(filename, "minimum")
                    signal_samples_2 = mdf.select(condition_channels_2)[0].samples
                    self.statusBar().showMessage("处理第二个筛选条件")
                    for i in range(len(signal_samples_2)-1):
                        if signal_samples_2[i] == lower_range_2 and signal_samples_2[i+1] == upper_range_2:
                            start_indexes_2.append(i)
                            end_indexes_2.append(i+1)

                elif condition_2 == "range":
                    if not (self.lower_range_2.text().isdigit() and self.upper_range_2.text().isdigit()):
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range_2 = float(self.lower_range_2.text())
                    upper_range_2 = float(self.upper_range_2.text())
                    condition_channels_2.append(self.add_condition_combox_2.currentText())
                    mdf = MDF(filename, "minimum")
                    signal_samples_2 = mdf.select(condition_channels_2)[0].samples
                    self.statusBar().showMessage("处理第二个筛选条件")
                    start_flag = 0

                    for i, signal_sample in enumerate(signal_samples_2):
                        if upper_range_2 >= signal_sample >= lower_range_2 and start_flag == 0:
                            start_indexes_2.append(i)
                            start_flag = 1
                        if (signal_sample > upper_range_2 or signal_sample < lower_range_2) and start_flag == 1:
                            start_flag = 0
                            end_indexes_2.append(i)
                        if upper_range_2 > signal_sample > lower_range_2 and start_flag == 1 and i == len(signal_samples_2) - 1:
                            end_indexes_2.append(i + 1)

                elif condition_2 == ">":
                    if not self.lower_range_2.text().isdigit():
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range_2 = float(self.lower_range_2.text())
                    condition_channels_2.append(self.add_condition_combox_2.currentText())
                    mdf = MDF(filename, "minimum")
                    signal_samples_2 = mdf.select(condition_channels_2)[0].samples
                    self.statusBar().showMessage("处理第二个筛选条件")
                    start_flag = 0

                    for i, signal_sample in enumerate(signal_samples_2):
                        if signal_sample > lower_range_2 and start_flag == 0:
                            start_indexes_2.append(i)
                            start_flag = 1
                        if signal_sample < lower_range_2 and start_flag == 1:
                            start_flag = 0
                            end_indexes_2.append(i)
                        if signal_sample > lower_range_2 and start_flag == 1 and i == len(signal_samples_2) - 1:
                            end_indexes_2.append(i + 1)
                else:
                    pass

            if self.check_flag_1 == 1 and self.check_flag_2 == 0:
                self.statusBar().showMessage("getting selected signal")
                count = self.selected_signals.count()
                data_dict = {"timestamps": [], "filename": []}
                timestamps = self.mdf_file.select(condition_channels)[0].timestamps
                for i in range(count):
                    signal_name = self.selected_signals.item(i).text()
                    mdf = MDF(filename, "minimum")
                    selected_signal = mdf.select([signal_name])    # mdf的select方法参数必须为list
                    data_dict[self.selected_signals.item(i).text()] = []
                    for k, j in zip(start_indexes_1, end_indexes_1):
                        try:
                            data_dict[self.selected_signals.item(i).text()] += selected_signal[0].interp(timestamps[k:j]).samples.tolist()
                        except:
                            self.statusBar().showMessage("error")
                for i, j in zip(start_indexes_1, end_indexes_1):
                    try:
                        data_dict["timestamps"] += timestamps[i:j].tolist()
                        data_dict["filename"].append(filename)
                    except:
                        self.statusBar().showMessage("error")
                self.write_csv(data_dict)
            elif self.check_flag_1 == 1 and self.check_flag_2 == 1:
                # 先把两个索引扩展开,把中间的数填上,并把它变成集合,最后取两个集合交集
                index_1 = set()
                index_2 = set()
                for i, j in zip(start_indexes_1, end_indexes_1):
                    for n in range(i, j+1):
                        index_1.add(n)
                for i, j in zip(start_indexes_2, end_indexes_2):
                    for n in range(i, j+1):
                        index_2.add(n)
                indexes = index_1 and index_2
                # 获取需要导出的信号名
                count = self.selected_signals.count()
                data_dict = {"timestamps": [], "filename":[]}
                timestamps = self.mdf_file.select(condition_channels)[0].timestamps
                for i in range(count):
                    signal_name = self.selected_signals.item(i).text()
                    mdf = MDF(filename, "minimum")
                    selected_signal = mdf.select([signal_name])
                    data_dict[self.selected_signals.item(i).text()] = []
                # 把相应信号及其采样值做成字典,信号名作为键,采样值的列表作为值
                    for k in indexes:
                        try:
                            data_dict[self.selected_signals.item(i).text()].append(selected_signal.interp(timestamps[k]).samples)
                        except:
                            self.statusBar().showMessage("error")
                for i in indexes:
                    try:
                        data_dict["timestamps"].append(timestamps[i])
                        data_dict["filename"].append(filename)
                    except:
                        self.statusBar().showMessage("error")
                self.write_csv(data_dict)
            else:
                QtWidgets.QMessageBox.about(self, "Message", "请按顺序勾选复选框")
                return
class Ui_Form(QtWidgets.QWidget):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(599, 468)

        self.file_open_button = QtWidgets.QPushButton(Form)
        self.file_open_button.setGeometry(QtCore.QRect(60, 20, 75, 23))
        self.file_open_button.setObjectName("file_open_button")
        self.file_open_button.clicked.connect(self.openfiles)

        self.condition_combox = QtWidgets.QComboBox(Form)
        self.condition_combox.setGeometry(QtCore.QRect(290, 70, 70, 20))
        self.condition_combox.setObjectName("condition_combox")
        self.condition_combox.addItems(["step", "range", ">", "="])
        self.condition_combox.activated[str].connect(self.condition_select)

        self.lower_range = QtWidgets.QLineEdit(Form)
        self.lower_range.setGeometry(QtCore.QRect(372, 70, 61, 20))
        self.lower_range.setObjectName("lower_range")
        self.lower_range.setText("0")

        self.upper_range = QtWidgets.QLineEdit(Form)
        self.upper_range.setGeometry(QtCore.QRect(460, 70, 61, 20))
        self.upper_range.setObjectName("upper_range")
        self.upper_range.setText("0")

        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(440, 70, 16, 16))
        self.label_2.setObjectName("label_2")

        self.add_condition_combox = QtWidgets.QComboBox(Form)
        self.add_condition_combox.setGeometry(QtCore.QRect(50, 70, 200, 23))
        self.add_condition_combox.setObjectName("add_condition_combox")
        self.add_condition_combox.addItem("")

        self.export_csv_button = QtWidgets.QPushButton(Form)
        self.export_csv_button.setGeometry(QtCore.QRect(270, 410, 75, 23))
        self.export_csv_button.setObjectName("export_csv_button")
        # self.export_csv_button.clicked.connect(self.delete_all_signals)
        self.export_csv_button.clicked.connect(self.to_csv)

        self.all_signals = QtWidgets.QListWidget(Form)
        self.all_signals.setGeometry(QtCore.QRect(10, 150, 256, 192))
        self.all_signals.setObjectName("all_signals")
        self.all_signals.itemDoubleClicked[QtWidgets.QListWidgetItem].connect(
            self.select_signal)
        self.selected_sig = set()  # 选中的信号,不可重复选

        self.selected_signals = QtWidgets.QListWidget(Form)
        self.selected_signals.setGeometry(QtCore.QRect(320, 150, 256, 192))
        self.selected_signals.setObjectName("selected_signals")
        self.selected_signals.itemDoubleClicked.connect(self.deselect_signal)

        self.all_signals.addItem("hello")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.file_open_button.setText(_translate("Form", "打开MDF"))
        # self.condition_combox.setItemText(0, _translate("Form", "step"))
        self.add_condition_combox.setItemText(0, _translate("Form", "信号"))
        self.label_2.setText(_translate("Form", "-"))
        self.export_csv_button.setText(_translate("Form", "导出csv"))

    def openfiles(self):
        # 打开单个mdf文件
        self.all_signals.clear()
        filename, filetype = QtWidgets.QFileDialog.getOpenFileName()
        if filename[-3:] not in ["dat", "mdf", "DAT", "MDF"]:
            QtWidgets.QMessageBox.about(self, "Message", "文件类型错误")
            return
        self.mdf_file = MDF(filename, memory="minimum")
        channel_list = list(self.mdf_file.channels_db.keys())
        channel_list.remove("time")
        channel_list.sort()
        self.add_condition_combox.addItems(channel_list)
        self.all_signals.addItems(channel_list)

        # 打开多个mdf文件
        # filenames, filetype= QtWidgets.QFileDialog.getOpenFileNames()
        # for filename in filenames:
        #     file = MDF(filename, memory="minimum")
        #     channel_list = list(file.channels_db.keys())
        #     channel_list.remove("time")                   # 多个文件时间可能不同,因此该程序肯定有问题,不管。
        #     channel_list.sort()
        #     self.data += file.select(channel_list)
        #     for channel in channel_list:
        #         self.all_signals.addItem(channel)

        # 打开一个文件夹下的所有mdf文件。但具体是否可行未知,或者把上面程序多运行几遍
        # dir = os.listdir(QtWidgets.QFileDialog.getExistingDirectory())
        # mdf_files = [mdf_file for mdf_file in dir if mdf_file[-3:] in ["dat", "mdf", "DAT", "MDF"]]
        # mdf = MDF()
        # mdf.stack(mdf_files, memory='minimum')
        # signals = mdf.iter_channels()  # generator that yields a Signal for each non-master channel
        # for signal in signals:
        #     self.all_signals.addItem(signal)

    def select_signal(self, item):
        # print(item.text())  # QtWidgets.QListWidgetItem.text()
        # Adding the same QListWidgetItem multiple times to a QListWidget will result in undefined behavior.
        if item.text() not in self.selected_sig:
            self.selected_signals.addItem(item.text())
            self.selected_sig.add(item.text())

    def deselect_signal(self):
        self.selected_signals.takeItem(self.selected_signals.currentRow())

    def delete_all_signals(self):
        self.selected_signals.clear()

    def condition_select(self, item):
        if item in ["step", "range"]:
            self.upper_range.show()
            self.label_2.show()
        elif item in [">", "="]:
            self.upper_range.hide()
            self.label_2.hide()
        else:
            pass

    def to_csv(self):
        condition = self.condition_combox.currentText()
        channels = []  # 条件信号
        if not (self.lower_range.text().isdigit()
                and self.upper_range.text().isdigit()):
            QtWidgets.QMessageBox.about(self, "Message", "范围错误")
            return
        lower_range = float(self.lower_range.text())
        upper_range = float(self.upper_range.text())
        if condition == "step":
            signal_samples = self.mdf_file.select(
                self.add_condition_combox.currentText()).samples
            signal_time = self.mdf_file.select(
                self.add_condition_combox.currentText()).time
            print(signal_samples)
            print(signal_time)

        elif condition == "range":
            print(self.lower_range.text())
            print(self.upper_range.text())

        elif condition == ">":
            print(">")
            start_time = []
            channels.append(self.add_condition_combox.currentText())
            try:
                signal_samples = self.mdf_file.select(channels)[0].samples
                signal_time = self.mdf_file.select(channels)[0].timestamps
            except:
                print("信号错误")
            for i, signal_sample in enumerate(signal_samples):
                if signal_sample > lower_range:
                    start_time.append(i)
        elif condition == "=":
            print("=")
        else:
            pass
        count = self.selected_signals.count()
        items = []
        data_dict = {}
        for i in range(count):
            items.append(self.selected_signals.item(i).text())
        signals = self.mdf_file.select(items)  # 当存在空数据时,会出错
        try:
            for signal in signals:
                for i in start_time:
                    data_dict.update({signal.name: signal.samples[i]})
            print(data_dict)
            for i in start_time:
                data_dict.update({"timestamps": signals[0].timestamps[i]})
            print(data_dict)
            df = pd.DataFrame(data=data_dict)
            print("-" * 20)
            df.to_csv("11.csv", index=False)
        except:
            print("write error")
示例#6
0
class Window_test(QtWidgets.QMainWindow):
    def __init__(self):
        super(Window_test, self).__init__()
        uic.loadUi("version_2.ui", self)
        self.condition_combox.addItems(["step", "range", ">"])
        self.condition_combox.setItemText(0, "step")
        self.condition_combox_2.addItems(["step", "range", ">"])
        self.condition_combox_2.setItemText(0, "step")

        self.condition_combox.activated[str].connect(self.condition_select)
        self.condition_combox_2.activated[str].connect(self.condition_select)

        self.file_open_button.clicked.connect(self.openfiles)
        self.lower_range.setText("0")
        self.upper_range.setText("0")
        self.lower_range_2.setText("0")
        self.upper_range_2.setText("0")
        # self.export_csv_button.clicked.connect(self.delete_all_signals)
        self.export_csv_button.clicked.connect(self.to_csv)

        self.all_signals.itemDoubleClicked[QtWidgets.QListWidgetItem].connect(
            self.select_signal)
        self.selected_sig = set()  # 选中的信号,不可重复选
        self.selected_signals.itemDoubleClicked.connect(self.deselect_signal)
        self.all_signals.addItem("hello")

        self.add_condition_combox.addItem("")
        self.add_condition_combox.setItemText(0, "信号")
        self.add_condition_combox_2.addItem("")
        self.add_condition_combox_2.setItemText(0, "信号")
        # 等价于 self.add_condition_combox.addItem("信号")

        self.checkbox_1.stateChanged.connect(self.check)
        self.checkbox_2.stateChanged.connect(self.check)
        self.check_flag_1 = 0
        self.check_flag_2 = 0

        self.show()

    def openfiles(self):
        # 打开单个mdf文件
        self.all_signals.clear()
        filename, filetype = QtWidgets.QFileDialog.getOpenFileName()
        if filename == "":
            return
        elif filename[-3:] not in ["dat", "mdf", "DAT", "MDF"]:
            QtWidgets.QMessageBox.about(self, "Message", "文件类型错误")
            return
        self.mdf_file = MDF(filename, memory="minimum")
        channel_list = list(self.mdf_file.channels_db.keys())
        channel_list.remove("time")
        channel_list.sort()
        self.all_signals.addItems(channel_list)

    def check(self, state):
        # checkbox选中才出现信号选项
        source = self.sender()
        try:
            self.mdf_file
        except:
            if self.checkbox_1.checkState() == 2:  # 0 表示未选中, 2表示选中
                QtWidgets.QMessageBox.about(self, "Message", "请先打开mdf文件")
            self.checkbox_1.setCheckState(0)
            self.checkbox_2.setCheckState(0)
            return
        channel_list = list(self.mdf_file.channels_db.keys())
        channel_list.remove("time")
        channel_list.sort()
        if source == self.checkbox_1 and state == QtCore.Qt.Checked:
            self.add_condition_combox.addItems(channel_list)
            self.check_flag_1 = 1

        if source == self.checkbox_2 and state == QtCore.Qt.Checked:
            self.add_condition_combox_2.addItems(channel_list)
            self.check_flag_2 = 1

    def select_signal(self, item):
        # print(item.text())  # QtWidgets.QListWidgetItem.text()
        # Adding the same QListWidgetItem multiple times to a QListWidget will result in undefined behavior.
        if item.text() not in self.selected_sig:
            self.selected_signals.addItem(item.text())
            self.selected_sig.add(item.text())

    def deselect_signal(self):
        text = self.selected_signals.takeItem(
            self.selected_signals.currentRow())
        self.selected_sig.remove(text.text())

    def delete_all_signals(self):
        self.selected_signals.clear()

    def condition_select(self, item):
        source = self.sender()
        if source == self.condition_combox:
            if item in ["step", "range"]:
                self.upper_range.show()
                self.label_2.show()
            elif item in [">", "="]:
                self.upper_range.hide()
                self.label_2.hide()
            else:
                pass
        if source == self.condition_combox_2:
            if item in ["step", "range"]:
                self.upper_range_2.show()
                self.label_3.show()
            elif item in [">", "="]:
                self.upper_range_2.hide()
                self.label_3.hide()
            else:
                pass
        else:
            pass

    def to_csv(self):
        condition = self.condition_combox.currentText()
        condition_2 = self.condition_combox_2.currentText()
        condition_channels = []
        condition_channels_2 = []
        end_indexes_1 = []
        start_indexes_1 = []
        end_indexes_2 = []
        start_indexes_2 = []
        if self.check_flag_1 == 1:
            if condition == "step":
                if not (self.lower_range.text().isdigit()
                        and self.upper_range.text().isdigit()):
                    QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                    return
                lower_range = float(self.lower_range.text())
                upper_range = float(self.upper_range.text())
                print("___________")
                condition_channels.append(
                    self.add_condition_combox.currentText())
                signal_samples = self.mdf_file.select(
                    condition_channels)[0].samples
                print("-------------")
                start_flag = 0
                end_flag = 0

                for i, signal_sample in enumerate(signal_samples):
                    if signal_sample == lower_range and start_flag == 0:
                        start_indexes_1.append(i)
                        start_flag = 1
                    if signal_sample == upper_range and start_flag == 1:
                        start_flag = 0
                        end_flag = 1
                    if signal_sample != upper_range and end_flag == 1:
                        end_flag = 0
                        end_indexes_1.append(i)
                    if signal_sample == upper_range and start_flag == 1 and i == len(
                            signal_samples) - 1:
                        end_indexes_1.append(i + 1)

            elif condition == "range":
                if not (self.lower_range.text().isdigit()
                        and self.upper_range.text().isdigit()):
                    QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                    return
                lower_range = float(self.lower_range.text())
                upper_range = float(self.upper_range.text())
                print("___________")
                condition_channels.append(
                    self.add_condition_combox.currentText())
                signal_samples = self.mdf_file.select(
                    condition_channels)[0].samples
                print("-------------")
                start_flag = 0

                for i, signal_sample in enumerate(signal_samples):
                    if upper_range > signal_sample > lower_range and start_flag == 0:
                        start_indexes_1.append(i)
                        start_flag = 1
                    if (signal_sample > upper_range or
                            signal_sample < lower_range) and start_flag == 1:
                        start_flag = 0
                        end_indexes_1.append(i)
                    if upper_range > signal_sample > lower_range and start_flag == 1 and i == len(
                            signal_samples) - 1:
                        end_indexes_1.append(i + 1)

            elif condition == ">":
                if not self.lower_range.text().isdigit():
                    QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                    return
                lower_range = float(self.lower_range.text())
                condition_channels.append(
                    self.add_condition_combox.currentText())
                signal_samples = self.mdf_file.select(
                    condition_channels)[0].samples
                print("-------------")
                start_flag = 0

                for i, signal_sample in enumerate(signal_samples):
                    if signal_sample > lower_range and start_flag == 0:
                        start_indexes_1.append(i)
                        start_flag = 1
                    if signal_sample < lower_range and start_flag == 1:
                        start_flag = 0
                        end_indexes_1.append(i)
                    if signal_sample > lower_range and start_flag == 1 and i == len(
                            signal_samples) - 1:
                        end_indexes_1.append(i + 1)

            else:
                pass
        if self.check_flag_2 == 1:
            if condition_2 == "step":
                if not (self.lower_range_2.text().isdigit()
                        and self.upper_range_2.text().isdigit()):
                    QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                    return
                lower_range_2 = float(self.lower_range_2.text())
                upper_range_2 = float(self.upper_range_2.text())
                print("___________")
                condition_channels_2.append(
                    self.add_condition_combox_2.currentText())
                signal_samples_2 = self.mdf_file.select(
                    condition_channels_2)[0].samples
                print("-------------")
                start_flag = 0
                end_flag = 0

                for i, signal_sample in enumerate(signal_samples_2):
                    if signal_sample == lower_range_2 and start_flag == 0:
                        start_indexes_2.append(i)
                        start_flag = 1
                    if signal_sample == upper_range_2 and start_flag == 1:
                        start_flag = 0
                        end_flag = 1
                    if signal_sample != upper_range_2 and end_flag == 1:
                        end_flag = 0
                        end_indexes_2.append(i)
                    if signal_sample == upper_range_2 and start_flag == 1 and i == len(
                            signal_samples_2) - 1:
                        end_indexes_2.append(i + 1)

            elif condition_2 == "range":
                if not (self.lower_range_2.text().isdigit()
                        and self.upper_range_2.text().isdigit()):
                    QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                    return
                lower_range_2 = float(self.lower_range_2.text())
                upper_range_2 = float(self.upper_range_2.text())
                print("___________")
                condition_channels_2.append(
                    self.add_condition_combox_2.currentText())
                signal_samples_2 = self.mdf_file.select(
                    condition_channels_2)[0].samples
                print("-------------")
                start_flag = 0

                for i, signal_sample in enumerate(signal_samples_2):
                    if upper_range_2 > signal_sample > lower_range_2 and start_flag == 0:
                        start_indexes_2.append(i)
                        start_flag = 1
                    if (signal_sample > upper_range_2 or
                            signal_sample < lower_range_2) and start_flag == 1:
                        start_flag = 0
                        end_indexes_2.append(i)
                    if upper_range_2 > signal_sample > lower_range_2 and start_flag == 1 and i == len(
                            signal_samples_2) - 1:
                        end_indexes_2.append(i + 1)

            elif condition_2 == ">":
                if not self.lower_range_2.text().isdigit():
                    QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                    return
                lower_range_2 = float(self.lower_range_2.text())
                condition_channels_2.append(
                    self.add_condition_combox_2.currentText())
                signal_samples_2 = self.mdf_file.select(
                    condition_channels_2)[0].samples
                print("-------------")
                start_flag = 0

                for i, signal_sample in enumerate(signal_samples_2):
                    if signal_sample > lower_range_2 and start_flag == 0:
                        start_indexes_2.append(i)
                        start_flag = 1
                    if signal_sample < lower_range_2 and start_flag == 1:
                        start_flag = 0
                        end_indexes_2.append(i)
                    if signal_sample > lower_range_2 and start_flag == 1 and i == len(
                            signal_samples_2) - 1:
                        end_indexes_2.append(i + 1)
            else:
                pass

        print(start_indexes_1, start_indexes_2, sep="\n")
        print(end_indexes_1, end_indexes_2, sep="\n")
        if self.check_flag_1 == 1 and self.check_flag_2 == 0:
            count = self.selected_signals.count()
            items = []
            data_dict = {"timestamps": []}
            for i in range(count):
                items.append(self.selected_signals.item(i).text())
            selected_signals = self.mdf_file.select(items)
            timestamps = self.mdf_file.select(condition_channels)[0].timestamps
            for idx, signal in enumerate(selected_signals):
                data_dict[signal.name] = []
                for i, j in zip(start_indexes_1, end_indexes_1):
                    try:
                        data_dict[signal.name] += signal.interp(
                            timestamps[i:j]).samples.tolist()
                        if idx == 0:
                            data_dict["timestamps"] += timestamps[i:j].tolist()
                    except:
                        print("error")
            print(data_dict)
            self.write_csv(data_dict)

        elif self.check_flag_1 == 1 and self.check_flag_2 == 1:
            # 先把两个索引扩展开,把中间的数填上,并把它变成集合,最后取两个集合交集
            index_1 = set()
            index_2 = set()
            for i, j in zip(start_indexes_1, end_indexes_1):
                for n in range(i, j + 1):
                    index_1.add(n)
            for i, j in zip(start_indexes_2, end_indexes_2):
                for n in range(i, j + 1):
                    index_2.add(n)
            indexes = index_1 and index_2
            # 获取需要导出的信号名
            count = self.selected_signals.count()
            items = []
            data_dict = {"timestamps": []}
            for i in range(count):
                items.append(self.selected_signals.item(i).text())
            selected_signals = self.mdf_file.select(items)
            timestamps = self.mdf_file.select(condition_channels)[0].timestamps
            # 把相应信号及其采样值做成字典,信号名作为键,采样值的列表作为值
            for idx, signal in enumerate(selected_signals):
                data_dict[signal.name] = []
                for i in indexes:
                    # data_dict.update({signal.name: signal.samples[i:j]})
                    try:
                        data_dict[signal.name].append(
                            signal.interp(timestamps[i]).samples)
                        if idx == 0:
                            data_dict["timestamps"].append(timestamps[i])
                    except:
                        print("error")
            print(data_dict)
            self.write_csv(data_dict)
        else:
            QtWidgets.QMessageBox.about(self, "Message", "请按顺序勾选复选框")
            return

    def write_csv(self, data_dict):
        print("writing to csv..\n")
        df = pd.DataFrame(data=data_dict)
        timestamps = df['timestamps']
        df.drop(labels=['timestamps'], axis=1, inplace=True)
        df.insert(0, 'timestamps', timestamps)
        f_name = str(datetime.now()).split(".")[0].replace(":", "_",
                                                           2) + ".csv"
        f = open(f_name, "w")
        f.close()
        df.to_csv(f_name, index=False)
        print("finished")