コード例 #1
0
ファイル: YSLocRecView.py プロジェクト: piaoxue88/HWExplorer
class LocateRecognizeView(QWidget):

    def __init__(self, *args, **kwargs):
        super(LocateRecognizeView, self).__init__(*args, **kwargs)
        self.ori_image_path = None                  # 选中的原图像路径
        self.ori_label_list = []                    # 选中图像对应的文本信息, 若没有则为空
        self.res_image_list = None                  # [(定位出文本行的图像, [文本行图像])]
        self.start_flag = False                     # 当前是否正在定位识别
        self.show_diff_flag = False                 # 是否显示对比结果视图,默认为False(选中图像无对应txt文件)
        self.locate_start_timer = 0                 # 定位计时器起始时间
        self.locate_end_timer = 0                   # 定位计时器结束时间
        self.rec_start_timer = 0                    # 识别计时器起始时间
        self.rec_end_timer = 0                      # 识别计时器结束时间
        self.setStyleSheet(LRStylesheet)            # 初始化GUI样式
        self.initUi()                               # 初始化GUI布局

        self.texts_rect = []                        # 文本行图像位置

        self.dbnetThread = None                     # 初始化DBNet定位后台线程
        self.backThread = None                      # 初始化形态学定位后台线程
        self.recogBackThread = None                 # 初始化识别后台线程

    # 界面布局
    def initUi(self):

        # 内容视图, 管理所有的子视图
        self.content_view = QWidget(self)
        self.content_view.setObjectName("Content_View")
        self.content_view.setGeometry(QRect(0, 0, Sub_Win_Width, Sub_Win_Height))

        # 顶部状态栏
        self.top_state_bar = QWidget(self.content_view)
        self.top_state_bar.setObjectName("Top_State_Bar")
        self.top_state_bar.setGeometry(QRect(0, 0, Top_State_Bar_Width, Top_State_Bar_Height))
        # 选择文件按钮:
        self.choose_img_btn = QPushButton(self.top_state_bar)
        self.choose_img_btn.setGeometry(QRect(Top_State_Bar_Width / 2 - 50, 10, 100, 60))
        self.choose_img_btn.setObjectName("Choose_Img_Btn")
        self.choose_img_btn.setText("选择文件")
        self.choose_img_btn.clicked.connect(self.choose_img_file)

        # 启用DBNet按钮
        self.switch_button = SwitchButton(self.content_view)
        self.switch_button.setGeometry(QRect(680, 90, 70, 30))
        self.switch_button.setObjectName("Switch_Button")
        self.switch_label = QLabel(self.content_view)
        self.switch_label.setObjectName("Switch_Label")
        self.switch_label.setGeometry(QRect(665, 120, 100, 30))
        self.switch_label.setAlignment(Qt.AlignCenter)
        self.switch_label.setText("启用DBNet")

        # 全尺寸背景视图
        self.full_size_content_widget = QWidget(self.content_view)
        self.full_size_content_widget.setObjectName("Full_Size_Content_Widget")
        self.full_size_content_widget.setGeometry(QRect(60, 150, Locate_Show_Area_Width * 2 + 50 + 25 * 2, Locate_Show_Area_Height + 120))
        # 全尺寸webview
        self.full_size_web_view = QWebEngineView(self.full_size_content_widget)
        self.full_size_web_view.setObjectName("Full_Size_Web_View")
        self.full_size_web_view.setGeometry(QRect(20, 20, Locate_Show_Area_Width * 2 + 50 + 10, Locate_Show_Area_Height + 30))
        self.full_size_web_view.setHidden(True)  # 默认隐藏
        # 退出全尺寸按钮
        self.exit_full_button = QPushButton(self.full_size_content_widget)
        self.exit_full_button.setObjectName("Exit_Full_Button")
        self.exit_full_button.setGeometry(QRect(590, 765, 100, 40))
        self.exit_full_button.setText("退出")
        self.exit_full_button.clicked.connect(self.exit_full_size_view_mode)

        # 中间识别区域
        self.show_area_widget = QWidget(self.content_view)
        self.show_area_widget.setObjectName("Show_Area_Widget")
        self.show_area_widget.setGeometry(QRect(60, 150, Locate_Show_Area_Width * 2 + 50 + 25 * 2, Locate_Show_Area_Height + 120))

        # 左侧图像区域: 显示定位出文本行的图片
        self.ori_image_View = QLabel(self.show_area_widget)
        self.ori_image_View.setGeometry(QRect(25, 25, Locate_Show_Area_Width, Locate_Show_Area_Height))
        self.ori_image_View.setObjectName("Ori_Image_View")
        self.ori_image_View.setScaledContents(True)             # 对图像进行缩放显示
        # 中间放大按钮区域
        self.mid_circle_area = QLabel(self.show_area_widget)
        self.mid_circle_area.setObjectName("Mid_Circle_Area")
        self.mid_circle_area.setGeometry(QRect(Locate_Show_Area_Width+25, 320, 50, 50))
        self.mid_circle_area.setHidden(True)                # 默认隐藏, 显示对比视图时再显示
        # 放大按钮
        self.mid_zoom_btn = QPushButton(self.mid_circle_area)
        self.mid_zoom_btn.setObjectName("Mid_Zoom_Btn")
        self.mid_zoom_btn.setGeometry(QRect(5, 5, 40, 40))
        self.mid_zoom_btn.clicked.connect(self.show_full_size_view)

        # 右侧识别文字区域
        self.text_area_widget = QLabel(self.show_area_widget)
        self.text_area_widget.setGeometry(QRect(25 + Locate_Show_Area_Width + 50, 25, Locate_Show_Area_Width, Locate_Show_Area_Height))
        self.text_area_widget.setObjectName("Text_Area_Widget")
        # 自定义textview: 无对应标签时展示
        self.res_text_view = PaintTextView(self.text_area_widget)
        self.res_text_view.setGeometry(QRect(20, 20, Locate_Show_Area_Width - 20 * 2, Locate_Show_Area_Height - 20 * 2))
        self.res_text_view.setObjectName("Res_Text_View")
        # web界面: 有对应标签时展示
        self.diff_web_view = QWebEngineView(self.text_area_widget)
        self.diff_web_view.setObjectName("Diff_Web_View")
        self.diff_web_view.setGeometry(QRect(20, 20, Locate_Show_Area_Width - 20 * 2, Locate_Show_Area_Height - 20 * 2))
        self.diff_web_view.setHidden(True)              # 默认隐藏
        self.diff_web_view.setZoomFactor(0.70)          # 缩放

        # 下方状态信息栏
        self.bottom_state_bar = QWidget(self.show_area_widget)
        self.bottom_state_bar.setGeometry(QRect(250, 740, 800, 60))
        self.bottom_state_bar.setObjectName("Bottom_State_Bar")
        # 定位总时长Label
        self.locate_time_label = QLabel(self.bottom_state_bar)
        self.locate_time_label.setGeometry(QRect(20, 20, 200, 20))
        self.locate_time_label.setObjectName("Locate_Time_Label")
        self.locate_time_label.setAlignment(Qt.AlignLeft)
        # AR label
        self.ar_label = QLabel(self.bottom_state_bar)
        self.ar_label.setGeometry(QRect(260, 20, 100, 20))
        self.ar_label.setObjectName("AR_Label")
        self.ar_label.setAlignment(Qt.AlignLeft)
        # 相似度Label
        self.sim_ratio_label = QLabel(self.bottom_state_bar)
        self.sim_ratio_label.setGeometry(QRect(360, 20, 100, 20))
        self.sim_ratio_label.setObjectName("Sim_Ratio_Label")
        self.sim_ratio_label.setAlignment(Qt.AlignCenter)
        # CR label
        self.cr_label = QLabel(self.bottom_state_bar)
        self.cr_label.setGeometry(QRect(500, 20, 100, 20))
        self.cr_label.setObjectName("CR_Label")
        self.cr_label.setAlignment(Qt.AlignLeft)
        # 识别总时长Label
        self.rec_time_label = QLabel(self.bottom_state_bar)
        self.rec_time_label.setGeometry(QRect(560, 20, 200, 20))
        self.rec_time_label.setObjectName("Rec_Time_Label")
        self.rec_time_label.setAlignment(Qt.AlignRight)


    # 事件响应
    @pyqtSlot()
    # 选择单个图像文件
    def choose_img_file(self):
        if self.start_flag:                 # 正在处理中,则不再响应
            return

        # 获取图像路径: 支持的图像类型(jpg, png)
        file_path, file_type = QFileDialog.getOpenFileName(self, "选取文件", fm.get_Curr_Dir(), "Images (*.jpg *.png)")
        if file_path == "":  # 取消选择
            return

        # 重置参数
        self.show_diff_flag = False
        self.ori_image_path = None
        self.ori_label_list = []
        self.res_image_list = None
        self.locate_start_timer = 0
        self.locate_end_timer = 0
        self.rec_start_timer = 0
        self.rec_end_timer = 0
        self.backThread = None
        self.dbnetThread = None
        self.exit_full_size_view_mode()
        self.mid_circle_area.setHidden(True)                                # 默认隐藏放大按钮区域
        self.res_text_view.clear_text_for_update()                          # 清除上次显示的残留信息
        self.diff_web_view.load(QUrl(""))                                   # 清除上次显示的残留信息

        txt_file_path = file_path.split('.')[0] + ".txt"                    # 查找与选择图像同名的txt文件
        if os.path.exists(txt_file_path):                                   # 图像有对应的标签txt文件
            self.res_text_view.setHidden(True)                              # 隐藏自定义textview
            self.diff_web_view.setHidden(False)                             # 显示对比视图
            self.show_diff_flag = True                                      # 修改对比视图显示标志, 也即存在标签标志

            with open(txt_file_path, 'r', encoding='gbk') as f:             # gbk格式打开
                texts = f.readlines()
                for line in texts:
                    self.ori_label_list.append(line.strip('\n'))
            f.close()
        else:                                                               # 图像没有对应的标签txt文件
            self.res_text_view.setHidden(False)                             # 显示自定义textview
            self.diff_web_view.setHidden(True)                              # 隐藏对比视图
            self.show_diff_flag = False                                     # 修改对比视图显示标志

        self.start_flag = True                                              # 开始处理, 修改Start_Flag
        self.ori_image_path = file_path
        self.ori_image_View.setPixmap(QPixmap(file_path))                   # 先显示原图像
        self.locate_start_timer = time.perf_counter()                       # 定位计时器开始计时

        self.locate_time_label.setText("DBNet定位中,请等待...")
        self.rec_time_label.setText("")                                     # 状态栏label置空
        self.sim_ratio_label.setText("")
        self.ar_label.setText("")
        self.cr_label.setText("")

        if self.switch_button.state:                                        # True, 启用DBNet
            print("启用DBNet")
            self.dbnetThread = DBNetBackThread(self.ori_image_path)         # 初始化 DBNet 后台线程处理图片
            self.dbnetThread._signal.connect(self.update_dbnet_res_img)     # 设置 DBNet 后台线程回调函数
            self.dbnetThread.start()                                        # 启动DBNet后台线程
        else:                                                               # False, 启用形态学
            print("启用形态学")
            self.backThread = LocateBackThread([self.ori_image_path])       # 初始化 形态学 后台线程处理图片
            self.backThread._signal.connect(self.update_Res_ImageView)      # 设置 形态学 后台线程回调函数
            self.backThread.start()                                         # 启动形态学后台线程

    # 更新 DBNet 定位结果视图, qImg:(定位出文本行的图像, [文本行图像], [文本行图像位置])
    def update_dbnet_res_img(self, qImg):
        self.ori_image_View.setPixmap(QPixmap.fromImage(qImg[0]))                        # 更新定位出文本行的图像
        self.texts_rect = qImg[2]                                                        # 保存文本行图像位置
        self.locate_end_timer = time.perf_counter()                                      # 定位计时器结束计时
        duration = (self.locate_end_timer - self.locate_start_timer) * 1000              # 更新计时Label
        self.locate_time_label.setText("DBNet 定位时长: {:.2f} ms".format(duration))
        self.rec_time_label.setText("CRNN识别中,请等待...")

        # 识别定位出的文本行
        self.rec_start_timer = time.perf_counter()                                      # 识别计时器开始计时
        self.recogBackThread = RecogBackThread([qImg[1]])                               # 初始化识别后台线程处理图片
        self.recogBackThread._signal.connect(self.update_texts_in_textView)             # 设置后台线程回调函数
        self.recogBackThread.start()                                                    # 启动后台线程


    # 刷新形态学定位结果视图
    def update_Res_ImageView(self, qImg):
        self.res_image_list = qImg                                                       # [(定位出文本行的图像, [文本行图像], [文本行图像位置])]
        self.ori_image_View.setPixmap(QPixmap.fromImage(self.res_image_list[0][0]))      # 结果数组中只有一个元素(只选择一张图片定位)
        self.texts_rect = self.res_image_list[0][2]                                      # 保存文本行图像位置
        self.locate_end_timer = time.perf_counter()                                      # 定位计时器结束计时
        duration = (self.locate_end_timer - self.locate_start_timer) * 1000              # 更新计时Label
        self.locate_time_label.setText("形态学 定位时长: {:.2f} ms".format(duration))

        # 识别定位出的文本行
        self.rec_start_timer = time.perf_counter()                            # 识别计时器开始计时
        self.recogBackThread = RecogBackThread([self.res_image_list[0][1]])   # 初始化一个新的后台线程处理图片
        self.recogBackThread._signal.connect(self.update_texts_in_textView)   # 设置后台线程回调函数
        self.recogBackThread.start()                                          # 启动后台线程

    # 更新识别出的文字信息, texts: [[str1,str2,...], [str1, str2, ....]]
    def update_texts_in_textView(self, texts):
        self.start_flag = False                                               # 定位识别完成,修改当前状态
        self.rec_end_timer = time.perf_counter()                              # 识别计时器结束计时
        duration = (self.rec_end_timer - self.rec_start_timer) * 1000         # 更新计时Label
        self.rec_time_label.setText("识别时长: {:.2f} ms".format(duration))

        self.sim_ratio_label.setText("相似度计算中,请等待...")
        if self.show_diff_flag:                                                                         # 显示对比视图
            self.mid_circle_area.setHidden(False)                                                       # 显示放大按钮区域
            diff = difflib.HtmlDiff().make_file(self.ori_label_list, texts[0])                          #
            save_path = "/Users/soyou/Documents/EProjects/HWExplorer/diff.html"
            outfile = open(save_path, 'w')                                                              # TODO: 绝对路径修改
            outfile.write(diff)                                                                         # 保存html文件
            outfile.close()
            self.diff_web_view.load(QUrl.fromLocalFile(save_path))                                      # 显示对比视图
            seq = difflib.SequenceMatcher(None, '.'.join(self.ori_label_list), '.'.join(texts[0]))
            ratio = seq.ratio()
            self.sim_ratio_label.setText("相似度: {:.3f}".format(ratio))                                 # 设置文本相似度

            num, ar_num, cr_num = calculate_ar_cr('.'.join(self.ori_label_list), '.'.join(texts[0]))
            self.ar_label.setText("AR: {:.2f}".format(ar_num/num))                                      # 计算AR
            self.cr_label.setText("CR: {:.2f}".format(cr_num/num))                                      # 计算CR

        else:                                                                                           # 隐藏对比视图
            self.sim_ratio_label.setText(" ")                                                           # 文本相似度置空
            self.res_text_view.redraw_text_in_view(texts[0], self.texts_rect)                           # 自定义textview绘制文字信息

    # 显示全尺寸视图
    def show_full_size_view(self):
        self.show_area_widget.setHidden(True)
        self.full_size_web_view.setHidden(False)
        # TODO:  使用项目内相对路径
        self.full_size_web_view.load(QUrl.fromLocalFile("/Users/soyou/Documents/EProjects/HWExplorer/diff.html"))

    # 退出全尺寸视图模式
    def exit_full_size_view_mode(self):
        self.show_area_widget.setHidden(False)
        self.full_size_web_view.setHidden(True)
コード例 #2
0
ファイル: ow_x0h.py プロジェクト: tschoonj/XRayServer
class X0h(XrayServerWidget):
    name = "X0h"
    description = "X0h"
    icon = "icons/x0h.png"
    maintainer = "Luca Rebuffi"
    maintainer_email = "luca.rebuffi(@at@)elettra.eu"
    priority = 1
    category = "X0h"
    keywords = ["data", "file", "load", "read"]

    want_main_area = 1

    outputs = [
        {
            "name": "xrayserver_data",
            "type": DataExchangeObject,
            "doc": "xrayserver_data",
            "id": "xrayserver_data"
        },
    ]

    def __init__(self):
        super().__init__()

        left_box_1 = oasysgui.widgetBox(self.controlArea,
                                        "X0h Request Form",
                                        addSpace=True,
                                        orientation="vertical",
                                        width=610,
                                        height=640)

        html = self.clear_input_form(
            HttpManager.send_xray_server_direct_request(
                "/cgi/www_form.exe?template=X0h_form.htm"))

        self.x0h_input = QWebView(left_box_1)
        self.x0h_input.setHtml(html)

        left_box_1.layout().addWidget(self.x0h_input)

        self.x0h_input.setFixedHeight(540)
        self.x0h_input.setFixedWidth(590)

        button = gui.button(self.controlArea,
                            self,
                            "Get X0h!",
                            callback=self.submit)
        button.setFixedHeight(30)

        gui.rubber(self.controlArea)

        self.tabs = []
        self.tabs_widget = oasysgui.tabWidget(self.mainArea)
        self.initializeTabs()

        self.x0h_output = QWebView(self.tabs[0])

        self.tabs[0].layout().addWidget(self.x0h_output)

        self.x0h_output.setFixedHeight(630)
        self.x0h_output.setFixedWidth(740)

    def clear_input_form(self, html):
        temp_1 = html.split("<body onload=\"setOnloads()\">")[0]
        temp_2 = html.split(
            "<table cellspacing=0 cellpadding=0 border=0 bgcolor=\"#c1c1c1\"><tr><td>"
        )[1]

        html = temp_1 + "\n<table cellspacing=0 cellpadding=0 border=0 bgcolor=\"#c1c1c1\"><tr><td>\n" + temp_2

        html = html.split(
            "<input type=SUBMIT value=\"Get X0h!\"><input type=RESET> <br>")[0]
        html += "\n<input type=SUBMIT style=\"display: none;\" id=\"submit-btn\"><input type=RESET style=\"display: none;\" id=\"reset-btn\"> <br>"
        html += "\n</form>"
        html += "\n</td></tr></table>"
        html += "\n</td></tr></table>"
        html += "\n</body>"
        html += "\n</html>"

        return html

    def getLeftPartWidth(self):
        return 620

    def initializeTabs(self):
        current_tab = self.tabs_widget.currentIndex()

        size = len(self.tabs)

        for index in range(0, size):
            self.tabs_widget.removeTab(size - 1 - index)

        self.tabs = [
            gui.createTabPage(self.tabs_widget, "X-ray Server Ouput"),
            gui.createTabPage(self.tabs_widget, "Critical Angle for TER"),
            gui.createTabPage(self.tabs_widget,
                              "Darwin Curve (" + u"\u03C3" + " Pol.)"),
            gui.createTabPage(self.tabs_widget,
                              "Darwin Curve (" + u"\u03C0" + " Pol.)"),
        ]

        for tab in self.tabs:
            tab.setFixedHeight(650)
            tab.setFixedWidth(750)

        self.plot_canvas = [None, None, None]

        self.tabs_widget.setCurrentIndex(current_tab)

    def js_callback(self, result):
        pass

    def _callable_1(self, html):
        self.original_signal = self.x0h_input.loadFinished
        self.x0h_input.loadFinished.connect(self.loadFinished)
        self.x0h_input.setHidden(True)
        self.x0h_input.page().runJavaScript(
            "document.getElementById('submit-btn').click()", self.js_callback)

    def loadFinished(self):
        self.x0h_input.page().toHtml(self._callable_2)

    def _callable_2(self, html):
        try:
            self.x0h_input.loadFinished.disconnect()
            self.x0h_input.back()
            self.x0h_input.setHidden(False)

            response_1 = self.clear_response(html)
            response_2 = self.clear_response(html)

            self.tabs_widget.setCurrentIndex(0)

            self.x0h_output.setHtml(response_1)

            data0, data1, data2 = self.extract_plots(response_2)

            exchange_data = DataExchangeObject("XRAYSERVER", "X0H")
            exchange_data.add_content("reflectivity", data0)
            exchange_data.add_content("reflectivity_units_to_degrees", 1.0)
            exchange_data.add_content("x-ray_diffraction_profile_sigma", data1)
            exchange_data.add_content(
                "x-ray_diffraction_profile_sigma_units_to_degrees",
                0.000277777805)
            exchange_data.add_content("x-ray_diffraction_profile_pi", data2)
            exchange_data.add_content(
                "x-ray_diffraction_profile_pi_units_to_degrees",
                0.000277777805)

            self.send("xrayserver_data", exchange_data)

        except urllib.error.HTTPError as e:
            self.x0h_output.setHtml(
                'The server couldn\'t fulfill the request.\nError Code: ' +
                str(e.code) + "\n\n" +
                server.BaseHTTPRequestHandler.responses[e.code][1])

        except urllib.error.URLError as e:
            self.x0h_output.setHtml('We failed to reach a server.\nReason: ' +
                                    e.reason)

        except XrayServerException as e:
            ShowHtmlDialog.show_html("X-ray Server Error",
                                     e.response,
                                     width=750,
                                     height=500,
                                     parent=self)

        except Exception as e:
            self.x0h_output.setHtml('We failed to reach a server.\nReason: ' +
                                    str(e))

        self.tabs_widget.setCurrentIndex(0)
        self.setStatusMessage("")
        self.progressBarFinished()

    def submit(self):
        self.progressBarInit()
        self.setStatusMessage("Submitting Request")

        if platform.system() == 'Darwin':
            self.x0h_input.page().toHtml(self._callable_1)

        elif platform.system() == 'Linux':
            doc = self.x0h_input.page().mainFrame().documentElement()
            submit_btn = doc.findFirst("input[id=submit-btn]")

            try:
                response = ""
                #response = HttpManager.send_xray_server_request_POST(APPLICATION, parameters)
                response = self.clear_response(response)

                self.tabs_widget.setCurrentIndex(0)
                self.x0h_output.setHtml(response)

                data0, data1, data2 = self.extract_plots(response)

                exchange_data = DataExchangeObject("XRAYSERVER", "X0H")
                exchange_data.add_content("reflectivity", data0)
                exchange_data.add_content("reflectivity_units_to_degrees", 1.0)
                exchange_data.add_content("x-ray_diffraction_profile_sigma",
                                          data1)
                exchange_data.add_content(
                    "x-ray_diffraction_profile_sigma_units_to_degrees",
                    0.000277777805)
                exchange_data.add_content("x-ray_diffraction_profile_pi",
                                          data2)
                exchange_data.add_content(
                    "x-ray_diffraction_profile_pi_units_to_degrees",
                    0.000277777805)

                self.send("xrayserver_data", exchange_data)

                pass
            except urllib.error.HTTPError as e:
                self.x0h_output.setHtml(
                    'The server couldn\'t fulfill the request.\nError Code: ' +
                    str(e.code) + "\n\n" +
                    server.BaseHTTPRequestHandler.responses[e.code][1])
                raise e

            except urllib.error.URLError as e:
                self.x0h_output.setHtml(
                    'We failed to reach a server.\nReason: ' + e.reason)
                raise e

            except XrayServerException as e:
                ShowHtmlDialog.show_html("X-ray Server Error",
                                         e.response,
                                         width=750,
                                         height=500,
                                         parent=self)

                raise e
            except Exception as e:
                self.x0h_output.setHtml(
                    'We failed to reach a server.\nReason: ' + str(e))

                raise e

            self.setStatusMessage("")
            self.progressBarFinished()

    def clear_response(self, response):

        # remove links
        output = response.split(
            "<img src=\"images/x.gif\" width=\"31\" height=\"32\" border=\"0\">"
        )[0] + "\n</body></html>"

        # remove "get the curve" images
        output = "".join(
            output.split(
                "<input type=image src=\"images/get_the_curve.gif\" border=0 width=102 height=12 alt=\"Get the reflectivity curve\">"
            ))
        output = "".join(
            output.split(
                "<input type=image src=\"images/get_the_curve.gif\" border=0 width=102 height=12 alt=\"Get the Bragg curve (sigma)\">"
            ))
        output = "".join(
            output.split(
                "<input type=image src=\"images/get_the_curve.gif\" border=0 width=102 height=12 alt=\"Get the Bragg curve (pi)\">"
            ))
        # remove question mark images and links
        output = "".join(
            output.split(
                "<a  href=\"javascript:void(0)\" onClick=\"Wfloat(\'images/x0h_help_0.gif\',\'x0h_0\',740,357);\"><b>?</b></a> &nbsp;"
            ))
        output = "".join(
            output.split(
                "<a  href=\"javascript:void(0)\" onClick=\"Wfloat(\'images/x0h_help_h.gif\',\'x0h_h\',705,853);\"><b>?</b></a> &nbsp;"
            ))

        return output

    def extract_plots(self, response):
        form_1_begin = False
        form_2_begin = False
        form_3_begin = False

        form_1 = None
        form_2 = None
        form_3 = None

        rows = response.split("\n")

        for row in rows:
            if form_1_begin:
                if "<td>" in row:
                    form_1_begin = False
            elif form_2_begin:
                if "<td>" in row:
                    form_2_begin = False
            elif form_3_begin:
                if "<td>" in row:
                    form_3_begin = False

            if form_1_begin:
                form_1.append(row)
            elif form_2_begin:
                form_2.append(row)
            elif form_3_begin:
                form_3.append(row)

            if "/cgi/ter_form.pl" in row:
                if form_1 is None:
                    form_1 = []
                    form_1_begin = True

            if "/cgi/gid_form.pl" in row:
                if form_2 is None:
                    form_2 = []
                    form_2_begin = True
                elif form_3 is None:
                    form_3 = []
                    form_3_begin = True

        self.setStatusMessage("Plotting Results")

        if not form_1 is None:
            x_1, y_1 = self.get_plots_from_form("/cgi/ter_form.pl", form_1)

            self.plot_histo(x_1, y_1, 40, 1, 0, "Critical Angle for TER",
                            "Incidence angle [degrees]", "Reflectivity")
            self.tabs_widget.setCurrentIndex(1)
        else:
            x_1 = None
            y_1 = None

        if not form_2 is None:
            x_2, y_2 = self.get_plots_from_form("/cgi/gid_form.pl", form_2)

            self.plot_histo(x_2, y_2, 60, 2, 1, "Darwin Curve ($\sigma$ Pol.)",
                            "Scan Angle [arcsec]", "Diffracted Intensity")
            self.tabs_widget.setCurrentIndex(2)
        else:
            x_2 = None
            y_2 = None

        if not form_3 is None:
            x_3, y_3 = self.get_plots_from_form("/cgi/gid_form.pl", form_3)

            self.plot_histo(x_3, y_3, 80, 3, 2, "Darwin Curve ($\pi$ Pol.)",
                            "Scan Angle [arcsec]", "Diffracted Intensity")
            self.tabs_widget.setCurrentIndex(3)
        else:
            x_3 = None
            y_3 = None

        return [x_1, y_1], [x_2, y_2], [x_3, y_3]
コード例 #3
0
ファイル: ow_x0h_NEW.py プロジェクト: lucarebuffi/XRayServer
class X0h(XrayServerWidget):
    name = "X0h"
    description = "X0h"
    icon = "icons/x0h.png"
    maintainer = "Luca Rebuffi"
    maintainer_email = "luca.rebuffi(@at@)elettra.eu"
    priority = 1
    category = "X0h"
    keywords = ["data", "file", "load", "read"]

    want_main_area = 1

    outputs = [{"name": "xrayserver_data",
                "type": DataExchangeObject,
                "doc": "xrayserver_data",
                "id": "xrayserver_data"}, ]

    def __init__(self):
        super().__init__()

        left_box_1 = oasysgui.widgetBox(self.controlArea, "X0h Request Form", addSpace=True, orientation="vertical",
                                         width=610, height=640)

        html = self.clear_input_form(HttpManager.send_xray_server_direct_request("/cgi/www_form.exe?template=x0h_form.htm"))

        self.x0h_input = QWebView(left_box_1)
        self.x0h_input.setHtml(html)

        left_box_1.layout().addWidget(self.x0h_input)

        self.x0h_input.setFixedHeight(540)
        self.x0h_input.setFixedWidth(590)

        button = gui.button(self.controlArea, self, "Get X0h!", callback=self.submit)
        button.setFixedHeight(30)

        gui.rubber(self.controlArea)

        self.tabs = []
        self.tabs_widget = oasysgui.tabWidget(self.mainArea)
        self.initializeTabs()

        self.x0h_output = QWebView(self.tabs[0])

        self.tabs[0].layout().addWidget(self.x0h_output)

        self.x0h_output.setFixedHeight(630)
        self.x0h_output.setFixedWidth(740)


    def clear_input_form(self, html):
        temp_1 = html.split("<body onload=\"setOnloads()\">")[0]
        temp_2 = html.split("<table cellspacing=0 cellpadding=0 border=0 bgcolor=\"#c1c1c1\"><tr><td>")[1]

        html = temp_1 + "<body>\n<table cellspacing=0 cellpadding=0 border=0 bgcolor=\"#c1c1c1\"><tr><td>\n" + temp_2

        html = html.split("<input type=SUBMIT value=\"Get X0h!\"><input type=RESET> <br>")[0]
        html += "\n<input type=SUBMIT style=\"display: none;\" id=\"submit-btn\"><input type=RESET style=\"display: none;\" id=\"reset-btn\"> <br>"
        html += "\n</form>"
        html += "\n</td></tr></table>"
        html += "\n</td></tr></table>"
        html += "\n</body>"
        html += "\n</html>"

        temp_1, temp_2 = html.split("x0h.js")
        html = temp_1 + XRAY_SERVER_URL + "/x0h.js" + temp_2

        temp_1, temp_2 = html.split("/cgi/x0h_form.exe")
        html = temp_1 + XRAY_SERVER_URL + "/cgi/x0h_form.exe" + temp_2

        return html

    def getLeftPartWidth(self):
        return 620

    def initializeTabs(self):
        current_tab = self.tabs_widget.currentIndex()

        size = len(self.tabs)

        for index in range(0, size):
            self.tabs_widget.removeTab(size-1-index)

        self.tabs = [gui.createTabPage(self.tabs_widget, "X-ray Server Ouput"),
                     gui.createTabPage(self.tabs_widget, "Critical Angle for TER"),
                     gui.createTabPage(self.tabs_widget, "Darwin Curve (" + u"\u03C3" + " Pol.)"),
                     gui.createTabPage(self.tabs_widget, "Darwin Curve (" + u"\u03C0" + " Pol.)"),
                     ]

        for tab in self.tabs:
            tab.setFixedHeight(650)
            tab.setFixedWidth(750)

        self.plot_canvas = [None, None, None]

        self.tabs_widget.setCurrentIndex(current_tab)

    def js_callback(self, result):
        pass

    def _callable_1(self, html):
        self.original_signal = self.x0h_input.loadFinished
        self.x0h_input.loadFinished.connect(self.loadFinished)
        self.x0h_input.setHidden(True)
        self.x0h_input.page().runJavaScript("document.getElementById('submit-btn').click()", self.js_callback)

    def loadFinished(self):
        self.x0h_input.page().toHtml(self._callable_2)

    def _callable_2(self, html):
        try:
            self.x0h_input.loadFinished.disconnect()
            self.x0h_input.back()
            self.x0h_input.setHidden(False)

            response_1 = self.clear_response(html)
            response_2 = self.clear_response(html)

            self.tabs_widget.setCurrentIndex(0)

            self.x0h_output.setHtml(response_1)

            data0, data1, data2 = self.extract_plots(response_2)

            exchange_data = DataExchangeObject("XRAYSERVER", "X0H")
            exchange_data.add_content("reflectivity", data0)
            exchange_data.add_content("reflectivity_units_to_degrees", 1.0)
            exchange_data.add_content("x-ray_diffraction_profile_sigma", data1)
            exchange_data.add_content("x-ray_diffraction_profile_sigma_units_to_degrees", 0.000277777805)
            exchange_data.add_content("x-ray_diffraction_profile_pi", data2)
            exchange_data.add_content("x-ray_diffraction_profile_pi_units_to_degrees", 0.000277777805)

            self.send("xrayserver_data", exchange_data)


        except urllib.error.HTTPError as e:
            self.x0h_output.setHtml('The server couldn\'t fulfill the request.\nError Code: '
                                    + str(e.code) + "\n\n" +
                                    server.BaseHTTPRequestHandler.responses[e.code][1])

        except urllib.error.URLError as e:
            self.x0h_output.setHtml('We failed to reach a server.\nReason: '
                                    + e.reason)

        except XrayServerException as e:
            ShowHtmlDialog.show_html("X-ray Server Error", e.response, width=750, height=500, parent=self)

        except Exception as e:
            self.x0h_output.setHtml('We failed to reach a server.\nReason: '
                                    + str(e))

        self.tabs_widget.setCurrentIndex(0)
        self.setStatusMessage("")
        self.progressBarFinished()

    def submit(self):
        self.progressBarInit()
        self.setStatusMessage("Submitting Request")

        if platform.system() == 'Darwin':
            self.x0h_input.page().toHtml(self._callable_1)

        elif platform.system() == 'Linux':
            doc = self.x0h_input.page().mainFrame().documentElement()
            submit_btn = doc.findFirst("input[id=submit-btn]")

            try:
                response = ""
                #response = HttpManager.send_xray_server_request_POST(APPLICATION, parameters)
                response = self.clear_response(response)

                self.tabs_widget.setCurrentIndex(0)
                self.x0h_output.setHtml(response)

                data0, data1, data2 = self.extract_plots(response)

                exchange_data = DataExchangeObject("XRAYSERVER", "X0H")
                exchange_data.add_content("reflectivity", data0)
                exchange_data.add_content("reflectivity_units_to_degrees", 1.0)
                exchange_data.add_content("x-ray_diffraction_profile_sigma", data1)
                exchange_data.add_content("x-ray_diffraction_profile_sigma_units_to_degrees", 0.000277777805)
                exchange_data.add_content("x-ray_diffraction_profile_pi", data2)
                exchange_data.add_content("x-ray_diffraction_profile_pi_units_to_degrees", 0.000277777805)

                self.send("xrayserver_data", exchange_data)

                pass
            except urllib.error.HTTPError as e:
                self.x0h_output.setHtml('The server couldn\'t fulfill the request.\nError Code: '
                                        + str(e.code) + "\n\n" +
                                        server.BaseHTTPRequestHandler.responses[e.code][1])
                raise e

            except urllib.error.URLError as e:
                self.x0h_output.setHtml('We failed to reach a server.\nReason: '
                                        + e.reason)
                raise e

            except XrayServerException as e:
                ShowHtmlDialog.show_html("X-ray Server Error", e.response, width=750, height=500, parent=self)

                raise e
            except Exception as e:
                self.x0h_output.setHtml('We failed to reach a server.\nReason: '
                                        + str(e))

                raise e


            self.setStatusMessage("")
            self.progressBarFinished()

    def clear_response(self, response):

        print(response)

        # remove links
        output = response.split("<img src=\"images/x.gif\" width=\"31\" height=\"32\" border=\"0\">")[0] + "\n</body></html>"

        # remove "get the curve" images
        output = "".join(output.split("<input type=image src=\"images/get_the_curve.gif\" border=0 width=102 height=12 alt=\"Get the reflectivity curve\">"))
        output = "".join(output.split("<input type=image src=\"images/get_the_curve.gif\" border=0 width=102 height=12 alt=\"Get the Bragg curve (sigma)\">"))
        output = "".join(output.split("<input type=image src=\"images/get_the_curve.gif\" border=0 width=102 height=12 alt=\"Get the Bragg curve (pi)\">"))
        # remove question mark images and links
        output = "".join(output.split("<a  href=\"javascript:void(0)\" onClick=\"Wfloat(\'images/x0h_help_0.gif\',\'x0h_0\',740,357);\"><b>?</b></a> &nbsp;"))
        output = "".join(output.split("<a  href=\"javascript:void(0)\" onClick=\"Wfloat(\'images/x0h_help_h.gif\',\'x0h_h\',705,853);\"><b>?</b></a> &nbsp;"))

        temp_1, temp_2 = output.split("style.css")
        output = temp_1 + XRAY_SERVER_URL + "/style.css" + temp_2

        return output

    def extract_plots(self, response):
        form_1_begin = False
        form_2_begin = False
        form_3_begin = False

        form_1 = None
        form_2 = None
        form_3 = None

        rows = response.split("\n")

        for row in rows:
            if form_1_begin:
                if "<td>" in row:
                    form_1_begin = False
            elif form_2_begin:
                if "<td>" in row:
                    form_2_begin = False
            elif form_3_begin:
                if "<td>" in row:
                    form_3_begin = False

            if form_1_begin:
                form_1.append(row)
            elif form_2_begin:
                form_2.append(row)
            elif form_3_begin:
                form_3.append(row)

            if "/cgi/ter_form.pl" in row:
                if form_1 is None:
                    form_1 = []
                    form_1_begin = True

            if "/cgi/gid_form.pl" in row:
                if form_2 is None:
                    form_2 = []
                    form_2_begin = True
                elif form_3 is None:
                    form_3 = []
                    form_3_begin = True

        self.setStatusMessage("Plotting Results")

        if not form_1 is None:
            x_1, y_1 = self.get_plots_from_form("/cgi/ter_form.pl", form_1)

            self.plot_histo(x_1, y_1, 40, 1, 0, "Critical Angle for TER", "Incidence angle [degrees]", "Reflectivity")
            self.tabs_widget.setCurrentIndex(1)
        else:
            x_1 = None
            y_1 = None
            
        if not form_2 is None:
            x_2, y_2 = self.get_plots_from_form("/cgi/gid_form.pl", form_2)

            self.plot_histo(x_2, y_2, 60, 2, 1, "Darwin Curve ($\sigma$ Pol.)", "Scan Angle [arcsec]", "Diffracted Intensity")
            self.tabs_widget.setCurrentIndex(2)
        else:
            x_2 = None
            y_2 = None

        if not form_3 is None:
            x_3, y_3 = self.get_plots_from_form("/cgi/gid_form.pl", form_3)

            self.plot_histo(x_3, y_3, 80, 3, 2, "Darwin Curve ($\pi$ Pol.)", "Scan Angle [arcsec]", "Diffracted Intensity")
            self.tabs_widget.setCurrentIndex(3)
        else:
            x_3 = None
            y_3 = None

        return [x_1, y_1], [x_2, y_2], [x_3, y_3]