def initStats(self, robot):
        statsBox = self.sectionBox()

        motorDataBox = sea.vBoxWith(gui.Label("Motor Data"))
        self.motorDataTable = gui.Table()
        motorNumRow = gui.TableRow(gui.TableItem("Motor Number:"))
        motorAmpRow = gui.TableRow(gui.TableItem("Amp Draw:"))
        motorTempRow = gui.TableRow(gui.TableItem("Temp:"))
        motorMaxAmpRow = gui.TableRow(gui.TableItem("Max Amp Draw:"))
        motorMaxTempRow = gui.TableRow(gui.TableItem("Max Temp:"))

        self.motorDataTable.append(motorNumRow)
        self.motorDataDict["ampRow"] = self.motorDataTable.append(motorAmpRow)
        self.motorDataDict["tempRow"] = self.motorDataTable.append(
            motorTempRow)
        self.motorDataDict["maxAmpRow"] = self.motorDataTable.append(
            motorMaxAmpRow)
        self.motorDataDict["maxTempRow"] = self.motorDataTable.append(
            motorMaxTempRow)

        for motorNum in range(6):
            motorNumRow.append(gui.TableItem(str(motorNum + 1)))
            self.motorDataDict["amp"].append(
                motorAmpRow.append(gui.TableItem("")))
            self.motorDataDict["temp"].append(
                motorTempRow.append(gui.TableItem("")))
            self.motorDataDict["maxAmp"].append(
                motorMaxAmpRow.append(gui.TableItem("")))
            self.motorDataDict["maxTemp"].append(
                motorMaxTempRow.append(gui.TableItem("")))

        motorDataBox.append(self.motorDataTable)

        statsBox.append(motorDataBox)
        return statsBox
예제 #2
0
    def create_num_row(self, param_name, description, range_min, range_max,
                       current_value, callback_cb, step):
        row = gui.TableRow()
        param_name = gui.Label(param_name,
                               width=NAME_L_SIZE,
                               height=FIELD_HEIGHT)
        param_name.attributes['title'] = description
        min_val = gui.Label(str(range_min),
                            width=MIN_L_SIZE,
                            height=FIELD_HEIGHT)
        range_slider = gui.Slider(width=SLIDER_SIZE,
                                  height=FIELD_HEIGHT,
                                  defaultValue=current_value,
                                  min=range_min,
                                  max=range_max,
                                  step=step)
        range_slider.set_on_change_listener(callback_cb)
        max_val = gui.Label(str(range_max),
                            width=MAX_L_SIZE,
                            height=FIELD_HEIGHT)
        spin_val = gui.SpinBox(width=EDIT2_SIZE,
                               height=FIELD_HEIGHT,
                               defaultValue=current_value,
                               min=range_min,
                               max=range_max,
                               step=step)
        # https://github.com/dddomodossola/remi/issues/49
        # Added 46 as it's dot so we allow floating point values
        spin_val.attributes[
            spin_val.
            EVENT_ONKEYPRESS] = 'return event.charCode >= 48 && event.charCode <= 57 || event.charCode == 46 || event.charCode == 13'
        spin_val.set_on_change_listener(callback_cb)
        item = gui.TableItem()
        item.add_child(0, param_name)
        row.add_child(0, item)

        item = gui.TableItem()
        item.add_child(1, min_val)
        row.add_child(1, item)
        min_val.style['float'] = 'none'
        min_val.style['text-align'] = 'center'

        item = gui.TableItem()
        item.add_child(2, range_slider)
        row.add_child(2, item)

        item = gui.TableItem()
        item.add_child(3, max_val)
        row.add_child(3, item)
        max_val.style['float'] = 'none'
        max_val.style['text-align'] = 'center'

        item = gui.TableItem()
        item.add_child(4, spin_val)
        row.add_child(4, item)
        spin_val.style['display'] = 'block'
        spin_val.style['margin'] = '10px auto'
        spin_val.style['float'] = 'none'

        return row, [range_slider.set_value, spin_val.set_value]
예제 #3
0
    def create_enum_row(self, param_name, description, current_value,
                        callback_cb, enums):
        row = gui.TableRow()
        param_name = gui.Label(param_name,
                               width=NAME_L_SIZE,
                               height=FIELD_HEIGHT)
        param_name.attributes['title'] = description
        dropdown = gui.DropDown(width=SLIDER_SIZE, height=FIELD_HEIGHT)

        # Fill dropdown
        for idx, enum in enumerate(enums):
            description_enum = enum['description']
            value = enum['value']
            name = enum['name']
            type_enum = enum['type']
            ddi_text = name + " (" + str(value) + ")"
            ddi = gui.DropDownItem(ddi_text,
                                   width=EDIT1_SIZE,
                                   height=FIELD_HEIGHT)
            ddi.attributes['title'] = description_enum
            dropdown.add_child(value, ddi)
            if value == current_value:
                dropdown.select_by_key(value)

        item = gui.TableItem()
        item.add_child(0, param_name)
        row.add_child(0, item)

        # Dummy item
        item = gui.TableItem()
        item.add_child(1, "")
        row.add_child(1, item)

        item = gui.TableItem()
        item.add_child(2, dropdown)
        row.add_child(2, item)
        dropdown.style['display'] = 'block'
        dropdown.style['margin'] = '0px auto'
        dropdown.style['float'] = 'none'

        # Dummy item
        item = gui.TableItem()
        item.add_child(3, "")
        row.add_child(3, item)

        # Dummy item
        item = gui.TableItem()
        item.add_child(4, "")
        row.add_child(4, item)

        dropdown.set_on_change_listener(callback_cb)

        # return the row itself and the setter func list
        return row, [dropdown.select_by_key]
예제 #4
0
 def add_table_row(self, table, field1, field2, field3):
     row = gui.TableRow()
     item = gui.TableItem()
     item.append(str(id(item)), field1)
     row.append(str(id(item)), item)
     item = gui.TableItem()
     item.append(str(id(item)), field2)
     row.append(str(id(item)), item)
     item = gui.TableItem()
     item.append(str(id(item)), field3)
     row.append(str(id(item)), item)
     table.append(str(id(row)), row)
예제 #5
0
    def refresh_table(self):
        td_style = {'padding': '5px'}
        self.table.empty()
        date = self.date_picker.get_value()
        header = ('Класс', 'Урок', 'Предмет', 'Учитель', 'Удаление')
        tr = gui.TableRow()
        for col in header:
            tr.append(gui.TableTitle(col, style=td_style))
        self.table.append(tr)
        with self.app.db.from_query(
                "SELECT class_no, class_letter, lesson_no, lesson, teacher"
                " FROM lesson_replaces WHERE date = ?;", (date, )) as cursor:
            rows = cursor.fetchall()
            for row in rows:
                tr = gui.TableRow()
                tr.append(str(row[0]) + row[1])
                tr.append(str(row[2]))
                tr.append(row[3])
                tr.append(row[4])
                del_cell = gui.TableItem('[X] Удалить', style=td_style)

                def on_del_click(widget, to_drop):
                    self.app.db.do_query(
                        'DELETE FROM lesson_replaces WHERE '
                        ' date = ? AND class_no = ? AND class_letter = ? AND'
                        ' lesson_no = ? AND lesson = ? AND teacher = ?;',
                        to_drop)
                    self.refresh_table()

                tr.append(del_cell)
                del_cell.onclick.do(on_del_click, (date, ) + row)

                self.table.append(tr)
예제 #6
0
    def on_button_pressed(self):
        # Connect to the sqlite database using DB.py
        db = DB(filename="/home/pybokeh/Dropbox/data_sets/nba", dbtype="sqlite")

        sql = """
        select *

        from player_game_stats

        where
        team_name like '{{ name }}';"""

        # Get the text the user entered into the textinput widget
        token = self.txt.get_text()

        # To prevent sql injection attacks, parameterize the sql string
        parameter = '%' + token + '%'

        params = [
                  {"name": parameter}
                 ]

        # Execute the query and store the results into a pandas dataframe
        df = db.query(sql, data=params)

        # Get the column names of the query result and the query row_data
        column_names = df.columns
        row_data = df.values

        # Create the table widget with the specified dimensions
        self.table = gui.Table(1200, 800)
       
        # Generate the table row containing the table column names
        row = gui.TableRow()
        for column in column_names:
            item = gui.TableTitle()  # TableTitle refers to the column header/names
            item.append(str(id(item)), str(column))
            row.append(str(id(item)), item)

        # Now add the row to the table
        self.table.append(str(id(row)), row)

        # Generate rows that will contain the table data
        for _row in row_data:
            row = gui.TableRow()
            for row_item in _row:
                item = gui.TableItem() # TableItem refers to the table data
                item.append(str(id(item)), str(row_item))
                row.append(str(id(item)), item)

                self.table.append(str(id(row)), row)

        # Now render / add the bottom container to the master container
        self.masterContainer.append('2', self.bottomContainer)

        # Now add the table widget to the bottom container        
        self.bottomContainer.append('1', self.table)
예제 #7
0
    def create_str_row(self, param_name, description, current_value,
                       callback_cb):
        row = gui.TableRow()
        param_name = gui.Label(param_name,
                               width=NAME_L_SIZE,
                               height=FIELD_HEIGHT)
        param_name.attributes['title'] = description
        text_input = gui.TextInput(width=SLIDER_SIZE,
                                   height=FIELD_HEIGHT,
                                   single_line=True)
        text_input.set_text(current_value)

        text_input.set_on_enter_listener(callback_cb)

        # set_button = gui.Button(80, DEFAULT_HEIGHT, text="Set")
        # set_button.set_on_click_listener(self, callback_cb_name)

        item = gui.TableItem()
        item.add_child(0, param_name)
        row.add_child(0, item)

        # Dummy item
        item = gui.TableItem()
        item.add_child(1, "")
        row.add_child(1, item)

        item = gui.TableItem()
        item.add_child(2, text_input)
        row.add_child(2, item)
        text_input.style['display'] = 'block'
        text_input.style['margin'] = '10px auto'
        text_input.style['float'] = 'none'

        # Dummy item
        item = gui.TableItem()
        item.add_child(3, "")
        row.add_child(3, item)

        item = gui.TableItem()
        #item.add_child(4, set_button)
        item.add_child(4, "")
        row.add_child(4, item)

        return row, [text_input.set_text]
예제 #8
0
    def create_bool_row(self, param_name, description, current_value,
                        callback_cb):
        row = gui.TableRow()
        param_name = gui.Label(param_name,
                               width=NAME_L_SIZE,
                               height=FIELD_HEIGHT)
        param_name.attributes['title'] = description
        checkbox = gui.CheckBox(width=SLIDER_SIZE,
                                height=FIELD_HEIGHT,
                                checked=current_value)
        checkbox.set_on_change_listener(callback_cb)

        item = gui.TableItem()
        item.add_child(0, param_name)
        row.add_child(0, item)

        # Dummy item
        item = gui.TableItem()
        item.add_child(1, "")
        row.add_child(1, item)

        item = gui.TableItem()
        item.add_child(2, checkbox)
        row.add_child(2, item)
        # To center the checkbox
        checkbox.style['float'] = 'none'
        checkbox.style['margin'] = '0px auto'
        checkbox.style['display'] = 'block'

        # Dummy item
        item = gui.TableItem()
        item.add_child(3, "")
        row.add_child(3, item)

        # Dummy item
        item = gui.TableItem()
        item.add_child(4, "")
        row.add_child(4, item)

        return row, [checkbox.set_value]
예제 #9
0
 def Define_TreeTable(self, heads, heads2=None):
     ''' Define a TreeTable with a heading row
         and optionally a second heading row.
     '''
     display_heads = []
     display_heads.append(tuple(heads[2:]))
     self.tree_table = TreeTable()
     self.tree_table.append_from_list(display_heads, fill_title=True)
     if heads2 is not None:
         heads2_color = heads2[1]
         row_widget = gui.TableRow()
         for index, field in enumerate(heads2[2:]):
             row_item = gui.TableItem(
                 text=field, style={'background-color': heads2_color})
             row_widget.append(row_item, field)
         self.tree_table.append(row_widget, heads2[0])
     self.wid.append(self.tree_table)
예제 #10
0
    def append_row(self, value, key=''):
        modified_row = gui.TableRow(style={'display': 'table-row'})
        fold_items = [''] * (self.fold_level + 1)
        for i in range(0, len(fold_items)):
            ti = gui.TableItem(fold_items[i])
            ti.style['min-width'] = '10px'
            modified_row.append(ti, "fold_cell_%s" % i)

        for k in value._render_children_list:
            modified_row.append(value.children[k], k)

        modified_row.children[modified_row._render_children_list[self.fold_level + 1]]. \
            attributes['colspan'] = str(self.max_fold_levels - self.fold_level)
        modified_row.on_row_item_click.connect(self.on_table_row_click)

        if self.fold_level > 0:
            self.current_fold_button[str(self.fold_level)].add_nested_row(modified_row)
        self.current_row = modified_row
        return super(gui.Table, self).append(modified_row, key)
예제 #11
0
 def test_init(self):
     widget = gui.TableItem()
     assertValidHTML(widget.repr())
    def Draw_a_drawing_of_one_sheet(self, nrOfOccs, occs, parent_id):
        ''' - parent_id: the ID of the whole occurrence(box)
            of which the occNames(occurrences) are parts.
        '''
        outputUID = '640019'  # output role
        inputUID = '640016'  # input role
        actorUID = '5036'  # actor role (supertype of mechanism)
        subOutputs, subOutputUIDs = self.gel_net.Determine_subtype_list(
            outputUID)
        subInputs, subInputUIDs = self.gel_net.Determine_subtype_list(inputUID)
        subActors, subActorUIDs = self.gel_net.Determine_subtype_list(actorUID)

        thickness = 2
        centerX = []  # X-Center of box[i] on canvas
        centerY = []  # Y-Center of box[i] on canvas
        midPts = []
        boxes_on_sheet = []
        lines_on_sheet = []

        box_width = 120  # pixels
        box_height = 80  # pixels
        self.boxW2 = box_width / 2  # 1/2Width of boxes
        self.boxH2 = box_height / 2  # 1/2Height of boxes

        deltaX = self.screen_width / (nrOfOccs + 1)
        deltaY = self.screen_height / (nrOfOccs + 1)
        dxC = 8  # corner rounding
        dyC = 8
        # dx = 8                 # shifted start point for line on box
        dy = 8

        # Initialize inputs, outputs, controls and mechanisms according to IDEF0.
        # occCon, occMech, occConUp and 0ccMechUp not yet used, but later exprected
        occIn = []
        occOut = []
        # occCon = []
        # occMech = []
        occInUp = []
        occOutUp = []
        # occConUp = []
        # occMechUp = []
        # Draw boxes (occurrences), return midpts[i] = N(x,y), S(x,y), E(x,y), W(x,y)
        for boxNr in range(0, nrOfOccs):
            centerX.append(deltaX +
                           boxNr * deltaX)  # X of center of box[i] on canvas
            centerY.append(deltaY +
                           boxNr * deltaY)  # Y of center of box[i] on canvas
            self.boxID = str(parent_id) + '.' + str(boxNr + 1)

            midPts.append(
                self.box_type_1(centerX[boxNr], centerY[boxNr],
                                occs[boxNr].name))

            # Debug print('NSEWPts:',boxNr,midPts[boxNr])
        self.boxes.append(boxes_on_sheet)

        # Initialize number of I/O/C/M down and upwards for each occurrence on sheet
        occIn = [0 for i in range(0, nrOfOccs)
                 ]  # input stream nr of deltas downward
        occOut = [0 for i in range(0, nrOfOccs)]
        # occCon = [0 for i in range(0, nrOfOccs)]  # control stream nr of deltas right
        # occMech = [0 for i in range(0, nrOfOccs)]
        occInUp = [0 for i in range(0, nrOfOccs)
                   ]  # input stream nr of deltas upward
        occOutUp = [0 for i in range(0, nrOfOccs)]
        # occConUp = [0 for i in range(0, nrOfOccs)]  # control stream nr of deltas left
        # occMechUp = [0 for i in range(0, nrOfOccs)]

        # Draw lines (streams)
        strNr = 0
        hor_size = 15  # horizontal half size of the rhombus polygon
        vert_size = 25  # vertical half size of the rhombus polygon
        left = True  # indicator for left or right streamTree.
        border = 5

        # Search for lines that have no begin/source occurrence (box),
        # but only a destination occurrence.
        for occur, involved, inv_role_kind, inv_kind_name in self.involv_table:
            # Debug print('ioRow[0]:', occur.uid, occur.name, involved.name, inv_role_kind.name)
            occUIDFrom = '0'
            # If inputStream to occurrence on this sheet, then
            if occur in occs and inv_role_kind.uid in subInputUIDs:
                # IndexTo is the nr of the occ that has stream as input.
                indexTo = occs.index(occur)

                # Verify whether found stream is an output of any box on sheet,
                # then set out = True
                origin = 'external'
                for occur_2, involved_2, inv_role_kind_2, inv_kind_name_2 in self.involv_table:
                    if involved == involved_2 and occur_2 in occs \
                       and inv_role_kind_2.uid in subOutputUIDs:
                        origin = 'box'
                        break

                if origin == 'external':
                    # Input comes from outside the sheet
                    streamUID = involved.uid
                    streamName = involved.name
                    streamKind = inv_kind_name
                    occIn[indexTo] += 1
                    occInUp[indexTo] += 1
                    strNr = strNr + 1
                    strID = str(strNr)
                    endPt = midPts[indexTo][3]
                    beginPt = [border, midPts[indexTo][3][1]]

                    # Draw rhombus at x,y and determine its end points
                    x = (beginPt[0] + endPt[0]) / 2
                    y = beginPt[1]
                    rhombus = self.RhombusPolygon(x, y, strID, hor_size,
                                                  vert_size)

                    # Draw two straight lines from the left hand side to the rhombus
                    # and from the rhombus to the box
                    lConnPt = rhombus[3]
                    rConnPt = rhombus[2]
                    line1Pts = [beginPt, lConnPt]
                    line2Pts = [rConnPt, endPt]
                    line1 = gui.SvgLine(line1Pts[0][0], line1Pts[0][1],
                                        line1Pts[1][0], line1Pts[1][1])
                    line1.set_stroke(width=thickness, color='black')
                    self.sheets[self.sheet_nr].append(line1)

                    line2 = gui.SvgLine(line2Pts[0][0], line2Pts[0][1],
                                        line2Pts[1][0], line2Pts[1][1])
                    line2.set_stroke(width=thickness, color='black')
                    self.sheets[self.sheet_nr].append(line2)
                    lines_on_sheet.append(line1)
                    lines_on_sheet.append(line2)

                    # Add an arrow head to line2
                    head = SvgPolygon(4)
                    arrow_height = 20
                    arrow_width = arrow_height / 3
                    recess = arrow_height / 5
                    head.add_arrow_coord(line2, arrow_height, arrow_width,
                                         recess)
                    head.set_stroke(width=thickness, color='black')
                    head.set_fill(color='blue')
                    self.sheets[self.sheet_nr].append(head)
                    # lines_on_sheet.append(head)

                    # Record stream in left or right stream table
                    values = [strID, streamName, streamUID, streamKind]
                    table_row = gui.TableRow(style={'text-align': 'left'})
                    for field in values:
                        item = gui.TableItem(text=field,
                                             style={
                                                 'text-align': 'left',
                                                 'background-color':
                                                 self.occ_color
                                             })
                        table_row.append(item)
                    if left is True:
                        # Debug print('Sheet nr:', self.sheet_nr)
                        self.left_str_tables[self.sheet_nr].append(table_row)
                        left = False
                    else:
                        self.right_str_tables[self.sheet_nr].append(table_row)
                        left = True
        # Find streams per occurrence (box) on this sheet in involv_table
        # involv_table: occur_obj, involved_obj, role_obj (of invObj), invKindName.
        # Debug print('subI/O-UIDs:',occs[0].name, subInputUIDs, subOutputUIDs)
        for occ, involved, inv_role_kind, inv_kind_name in self.involv_table:
            # Debug print(' ioRow2:', occs[0].name, occ.name, involved.name, inv_role_kind.uid)
            occUIDTo = '0'
            # If outputStream from occurrence on this sheet, then
            if occ in occs and inv_role_kind.uid in subOutputUIDs:
                # Debug print('**outputStream:', involved.name, inv_role_kind.name)
                strNr = strNr + 1
                strID = str(strNr)
                occUIDFrom = occ.uid
                streamUID = involved.uid
                streamName = involved.name
                streamKind = inv_kind_name
                # Verify if found streamUID is input in box on sheet.
                # If yes, then occUIDTo is known.
                for occ_2, involved_2, inv_role_kind_2, inv_kind_name_2 in self.involv_table:
                    if streamUID == involved_2.uid and occ_2 in occs \
                       and inv_role_kind_2.uid in subInputUIDs:
                        # Debug print('** inputStream:', occ_2.name,
                        #             inv_role_kind_2.name, inv_role_kind_2.name)
                        occUIDTo = occ_2.uid
                        # else occUIDTo remains '0'
                        break
                # Determine index (in list of occs) of boxFrom and boxTo
                indexFrom = -1
                indexTo = -1
                for index in range(0, len(occs)):
                    if occUIDFrom == occs[index].uid:
                        indexFrom = index
                    if occUIDTo == occs[index].uid:
                        indexTo = index

                # Determine the sequenceNr of the input and output of the occurrence box
                # and adjust Yin and Yout accordingly.
                # Draw the stream line from box occUIDFrom to occUIDTo or to edge of sheet.
                if indexTo == -1:
                    # No destination box, thus endPt is on rh side of the sheet.
                    ddyFrom = (occOut[indexFrom]) * dy
                    ddyTo = (occIn[indexTo]) * dy
                    if occOut[indexFrom] == 0:
                        # if not yet started downward, then middle becomes occupied.
                        occOutUp[indexFrom] += 1
                    occOut[indexFrom] += 1
                    # occOut[indexTo] += 1         # indexTo == -1
                    # midPts(occNr, East, x / y)
                    beginPt = [
                        midPts[indexFrom][2][0],
                        midPts[indexFrom][2][1] + ddyFrom
                    ]
                    endPt = [self.screen_width - border, beginPt[1]]
                    x = (beginPt[0] + endPt[0]) / 2
                    y = beginPt[1]
                    # Rhombus on vertical line
                    rhombus = self.RhombusPolygon(x, y, strID, hor_size,
                                                  vert_size)
                    lConnPt = rhombus[3]
                    rConnPt = rhombus[2]
                    line1Pts = [beginPt, lConnPt]
                    line2Pts = [rConnPt, endPt]

                elif indexFrom + 1 < indexTo:
                    # Destination box is behind next box.
                    ddyFrom = (occOut[indexFrom]) * dy
                    ddyTo = (occIn[indexTo]) * dy
                    occOut[indexFrom] += 1
                    occOut[indexTo] += 1
                    beginPt = [
                        midPts[indexFrom][2][0],
                        midPts[indexFrom][2][1] + ddyFrom
                    ]
                    endPt = [
                        midPts[indexTo][3][0], midPts[indexTo][3][1] + ddyTo
                    ]
                    mid1Pt = [
                        (beginPt[0] + midPts[indexFrom + 1][3][0]) / 2 - dxC,
                        beginPt[1]
                    ]
                    mid2Pt = [(beginPt[0] + midPts[indexFrom + 1][3][0]) / 2,
                              beginPt[1] + dyC]
                    mid3Pt = [(beginPt[0] + midPts[indexFrom + 1][3][0]) / 2,
                              endPt[1] - dyC]
                    mid4Pt = [
                        (beginPt[0] + midPts[indexFrom + 1][3][0]) / 2 + dxC,
                        endPt[1]
                    ]
                    x = mid2Pt[0]
                    y = (mid2Pt[1] + mid3Pt[1]) / 2
                    rhombus = self.RhombusPolygon(x, y, strID, hor_size,
                                                  vert_size)
                    uConnPt = rhombus[0]
                    lConnPt = rhombus[1]
                    line1Pts = [beginPt, mid1Pt, mid2Pt, uConnPt]
                    line2Pts = [lConnPt, mid3Pt, mid4Pt, endPt]

                elif indexFrom + 1 > indexTo:
                    # Destination box id before source box (or the box itself).
                    ddyUpFrom = (occOutUp[indexFrom]) * dy
                    ddyUpTo = (occInUp[indexTo]) * dy
                    occOutUp[indexFrom] += 1
                    occOutUp[indexTo] += 1
                    beginPt = [
                        midPts[indexFrom][2][0],
                        midPts[indexFrom][2][1] - ddyUpFrom
                    ]
                    endPt = [
                        midPts[indexTo][3][0], midPts[indexTo][3][1] - ddyUpTo
                    ]
                    mid1Pt = [
                        (beginPt[0] + midPts[indexFrom + 1][3][0]) / 2 - dxC,
                        beginPt[1]
                    ]
                    mid2Pt = [(beginPt[0] + midPts[indexFrom + 1][3][0]) / 2,
                              beginPt[1] - dyC]
                    mid3Pt = [(beginPt[0] + midPts[indexFrom + 1][3][0]) / 2,
                              endPt[1] - box_height + dyC]
                    mid4Pt = [
                        (beginPt[0] + midPts[indexFrom + 1][3][0]) / 2 - dxC,
                        endPt[1] - box_height
                    ]
                    mid5Pt = [(endPt[0] - box_width / 2) + dxC,
                              endPt[1] - box_height]
                    mid6Pt = [(endPt[0] - box_width / 2),
                              endPt[1] - box_height + dyC]
                    mid7Pt = [(endPt[0] - box_width / 2), endPt[1] - dyC]
                    mid8Pt = [(endPt[0] - box_width / 2) + dxC, endPt[1]]
                    x = mid2Pt[0]
                    y = (mid2Pt[1] + mid3Pt[1]) / 2
                    rhombus = self.RhombusPolygon(x, y, strID, hor_size,
                                                  vert_size)
                    uConnPt = rhombus[0]
                    lConnPt = rhombus[1]
                    line1Pts = [beginPt, mid1Pt, mid2Pt, lConnPt]
                    line2Pts = [
                        uConnPt, mid3Pt, mid4Pt, mid5Pt, mid6Pt, mid7Pt,
                        mid8Pt, endPt
                    ]

##                    if mid5Pt[1] < 0:
##                        self.sheets[self.sheet_nr].yview_scroll(int(-mid5Pt[1]) + 20, 'units')
                else:
                    # Destination box is next box
                    ddyFrom = (occOut[indexFrom]) * dy
                    ddyUpTo = (occIn[indexTo]) * dy
                    occOut[indexFrom] += 1
                    occOutUp[indexTo] += 1
                    beginPt = [
                        midPts[indexFrom][2][0],
                        midPts[indexFrom][2][1] + ddyFrom
                    ]
                    endPt = [
                        midPts[indexTo][3][0], midPts[indexTo][3][1] - ddyUpTo
                    ]
                    mid1Pt = [(beginPt[0] + endPt[0]) / 2 - dxC, beginPt[1]]
                    mid2Pt = [(beginPt[0] + endPt[0]) / 2, beginPt[1] + dyC]
                    mid3Pt = [(beginPt[0] + endPt[0]) / 2, endPt[1] - dyC]
                    mid4Pt = [(beginPt[0] + endPt[0]) / 2 + dxC, endPt[1]]
                    x = mid2Pt[0]
                    y = (mid2Pt[1] + mid3Pt[1]) / 2
                    rhombus = self.RhombusPolygon(x, y, strID, hor_size,
                                                  vert_size)
                    uConnPt = rhombus[0]
                    lConnPt = rhombus[1]
                    line1Pts = [beginPt, mid1Pt, mid2Pt, uConnPt]
                    line2Pts = [lConnPt, mid3Pt, mid4Pt, endPt]

                # Draw polyline 1 from box to rhombus and polyline 2 from rhombus to box
                # Debug print('  Stream:', indexFrom, indexTo, line1Pts)
                line1 = gui.SvgPolyline(_maxlen=4)
                for pt in line1Pts:
                    line1.add_coord(pt[0], pt[1])
                line1.set_stroke(width=thickness, color='black')
                self.sheets[self.sheet_nr].append(line1)

                line2 = gui.SvgPolyline(_maxlen=8)
                for pt in line2Pts:
                    line2.add_coord(pt[0], pt[1])
                line2.set_stroke(width=thickness, color='black')
                self.sheets[self.sheet_nr].append(line2)
                lines_on_sheet.append(line1)
                lines_on_sheet.append(line2)

                # Add an arrow head to line2
                head2 = SvgPolygon(4)
                arrow_height = 20
                arrow_width = arrow_height / 3
                recess = arrow_height / 5
                head2.add_arrow_coord(line2, arrow_height, arrow_width, recess)
                head2.set_stroke(width=thickness, color='black')
                head2.set_fill(color='blue')
                self.sheets[self.sheet_nr].append(head2)

                # Record stream in self.left_str_tables
                # or in self.right_str_tables[self.sheet_nr](s)
                values = [strID, streamName, streamUID, streamKind]
                table_row = gui.TableRow(style={'text-align': 'left'})
                for field in values:
                    item = gui.TableItem(text=field,
                                         style={
                                             'text-align': 'left',
                                             'background-color': self.occ_color
                                         })
                    table_row.append(item)
                if left is True:
                    self.left_str_tables[self.sheet_nr].append(table_row)
                    left = False
                else:
                    self.right_str_tables[self.sheet_nr].append(table_row)
                    left = True

        self.lines.append(lines_on_sheet)
예제 #13
0
파일: web.py 프로젝트: yesrod/hoplite
    def main(self, args):
        self.debug = args["debug"]
        utils.debug_msg(self, "start main")

        self.api_url = "http://127.0.0.1:5000/v1/"
        self.api_data = {}
        self.api_last_updated = 1
        self.api_update_interval = 5
        self.api_read()

        self.settings_up = False
        self.edit_keg_up = False
        self.delete_keg_up = False
        self.co2_list = []

        # root object
        self.container = gui.VBox(width=480)
        self.container.style['margin'] = 'auto'
        self.container.style['text-align'] = 'center'

        # header
        self.header = gui.Table(width=480)
        self.header.style['margin'] = 'auto'
        self.header.style['text-align'] = 'center'
        self.header.style['padding'] = '2em'

        # keg table
        self.keg_table = gui.Table(width=480)
        self.keg_table.style['margin'] = 'auto'
        self.keg_table.style['text-align'] = 'center'
        self.keg_table.style['padding'] = '2em'

        # first row
        first_row = gui.TableRow(height=60)

        # temperature
        t = utils.as_degF(self.api_data.get('temp', 0))
        self.temp = gui.Label("%s<br />CO2:%s%%" % (t, '???'))
        self.temp.style['padding-bottom'] = '1em'
        self.temp.style['white-space'] = 'pre'
        table_item = gui.TableItem(width=100, height=30)
        table_item.append(self.temp)
        first_row.append(table_item)

        # title
        self.title = gui.Label("HOPLITE")
        self.title.style['font-size'] = '2em'
        self.title.style['padding-bottom'] = '0.5em'
        table_item = gui.TableItem(width=240, height=30)
        table_item.append(self.title)
        first_row.append(table_item)

        # settings button
        self.settings_button = gui.Image('/static:settings_16.png', width=16)
        self.settings_button.set_on_click_listener(self.show_settings)
        self.settings_button.style['padding-bottom'] = '1.6em'
        table_item = gui.TableItem(width=100, height=30)
        table_item.append(self.settings_button)
        first_row.append(table_item)

        self.header.append(first_row)
        self.container.append(self.header)

        self.keg_table = self.build_keg_table()

        self.container.append(self.keg_table, 'keg_table')

        try:
            co2 = self.co2_list[0]  #TODO: Handle multiple CO2 sources
        except IndexError:
            co2 = "???"
        self.temp.set_text("%s\nCO2:%s%%" % (t, co2))

        utils.debug_msg(self, "end main")

        # return of the root widget
        return self.container
예제 #14
0
파일: web.py 프로젝트: yesrod/hoplite
    def build_keg_table(self):
        utils.debug_msg(self, "start")
        new_table = gui.Table(width=480)
        new_table.style['margin'] = 'auto'
        new_table.style['text-align'] = 'center'
        new_table.style['padding'] = '2em'

        w_mode = self.api_data.get('weight_mode', 'as_kg_gross')

        # iterate through HX sensors
        for index, hx_conf in enumerate(self.api_data['hx_list']):

            # keg information
            for channel in ['A', 'B']:
                try:
                    keg_name = hx_conf['channels'][channel].get('name', None)
                except KeyError:
                    keg_name = None
                try:
                    if hx_conf['channels'][channel]['co2'] == True:
                        local_w = hx_conf['channels'][channel]['weight']
                        local_max = hx_conf['channels'][channel][
                            'volume'] * 1000
                        local_tare = hx_conf['channels'][channel]['tare'] * 1000
                        local_net_w = max((local_w - local_tare), 0)
                        local_pct = local_net_w / float(local_max)
                        self.co2_list.append(int(local_pct * 100))
                        continue
                except KeyError:
                    pass

                if keg_name != None:
                    utils.debug_msg(self, hx_conf['channels'][channel])
                    keg_label = gui.Label(keg_name, width=100, height=30)

                    keg_bar = gui.Svg(width=240, height=30)
                    keg_w = hx_conf['channels'][channel]['weight']
                    keg_cap = hx_conf['channels'][channel]['volume']
                    keg_tare = hx_conf['channels'][channel]['tare']
                    keg_fill_pct = utils.get_keg_fill_percent(
                        keg_w, keg_cap, keg_tare)
                    keg_bar_rect = gui.SvgRectangle(0, 0, 240 * keg_fill_pct,
                                                    30)
                    keg_bar_rect.style['fill'] = utils.fill_bar_color(
                        keg_fill_pct)
                    keg_bar_outline = gui.SvgRectangle(0, 0, 240, 30)
                    keg_bar_outline.style['fill'] = 'rgb(0,0,0)'
                    keg_bar_outline.style['fill-opacity'] = '0'
                    keg_bar.append(keg_bar_rect)
                    keg_bar.append(keg_bar_outline)

                    keg_weight = gui.Label(utils.format_weight(
                        keg_w,
                        w_mode,
                        tare=(keg_tare * 1000),
                        cap=(keg_cap * 1000)),
                                           width=100,
                                           height=30)

                    table_row = gui.TableRow(height=30)
                    for item in [keg_label, keg_bar, keg_weight]:
                        table_item = gui.TableItem()
                        table_item.append(item)
                        table_row.append(table_item)

                    new_table.append(table_row)

        utils.debug_msg(self, "end")
        return new_table
예제 #15
0
파일: web.py 프로젝트: kaschik/hoplite
    def main(self):
        self.shmem_read(5)

        self.KegLines = list()
        self.settings_up = False

        # root object
        self.container = gui.Table(width=480)
        self.container.style['margin'] = 'auto'
        self.container.style['text-align'] = 'center'
        self.container.style['padding'] = '2em'

        # first row
        first_row = gui.TableRow(height=60)

        # temperature
        t = self.h.as_degF(self.ShData['data'].get('temp', 0))
        co2 = self.ShData['data'].get('co2', '???')
        self.temp = gui.Label("%s<br />CO2:%s%%" % (t, co2))
        self.temp.style['padding-bottom'] = '1em'
        table_item = gui.TableItem()
        table_item.append(self.temp)
        first_row.append(table_item)

        # title
        self.title = gui.Label("HOPLITE")
        self.title.style['font-size'] = '2em'
        self.title.style['padding-bottom'] = '0.5em'
        table_item = gui.TableItem()
        table_item.append(self.title)
        first_row.append(table_item)

        # settings button
        self.settings_button = gui.Image('/res/settings_16.png', width=16)
        self.settings_button.set_on_click_listener(self.show_settings_menu)
        self.settings_button.style['padding-bottom'] = '1.6em'
        table_item = gui.TableItem()
        table_item.append(self.settings_button)
        first_row.append(table_item)

        self.container.append(first_row)

        w_mode = self.ShData['config'].get('weight_mode', 'as_kg_gross')

        # iterate through HX sensors
        for index, hx_conf in enumerate(self.ShData['config']['hx']):

            hx_weight = self.ShData['data']['weight'][index]
            self.KegLines.insert(index, list())
            self.KegLines[index].insert(0, None)
            self.KegLines[index].insert(1, None)

            # keg information
            for subindex, channel in enumerate(['A', 'B']):
                try:
                    keg_name = hx_conf['channels'][channel].get('name', None)
                except KeyError:
                    keg_name = None

                if keg_name != None:
                    keg_label = gui.Label(keg_name, width=100, height=30)

                    keg_bar = gui.Svg(240, 30)
                    keg_w = hx_weight[subindex]
                    keg_cap = hx_conf['channels'][channel]['size'][0]
                    keg_tare = hx_conf['channels'][channel]['size'][1]
                    keg_fill_pct = self.get_keg_fill_percent(
                        keg_w, keg_cap, keg_tare)
                    keg_bar_rect = gui.SvgRectangle(0, 0, 240 * keg_fill_pct,
                                                    30)
                    keg_bar_rect.style['fill'] = self.h.fill_bar_color(
                        keg_fill_pct)
                    keg_bar_outline = gui.SvgRectangle(0, 0, 240, 30)
                    keg_bar_outline.style['fill'] = 'rgb(0,0,0)'
                    keg_bar_outline.style['fill-opacity'] = '0'
                    keg_bar.append(keg_bar_rect)
                    keg_bar.append(keg_bar_outline)

                    keg_weight = gui.Label(self.h.format_weight(
                        keg_w, (keg_tare * 1000),
                        mode=w_mode,
                        cap=(keg_cap * 1000)),
                                           width=100,
                                           height=30)

                    try:
                        self.KegLines[index].insert(
                            subindex, [keg_label, keg_bar_rect, keg_weight])
                    except KeyError:
                        self.KegLines.insert(
                            index, [keg_label, keg_bar_rect, keg_weight])

                    table_row = gui.TableRow(height=30)
                    for item in [keg_label, keg_bar, keg_weight]:
                        table_item = gui.TableItem()
                        table_item.append(item)
                        table_row.append(table_item)

                    self.container.append(table_row)

        # return of the root widget
        return self.container
예제 #16
0
    def Display_TreeTable(self, table):
        ''' Display a table in which the values in first column form one or more trees.
            The table has row with fields that are strings of identifiers/names.
            First convert each row into a row_widget and item_widgets
            that are displayed in a TableTree.
            Each input row shall start with a parent field (field[0])
            that determines the tree hierarchy but that is not displayed on that row.
            The parent widget becomes an attribute of the first child widget.
            Field[1] is the row color, field[2:] contains the row values.
            Top child(s) shall have a parent field value that is blank ('').
            The input table rows shall be in the correct sequence.
        '''
        parent_names = []
        hierarchy = {}
        indent_level = 0
        widget_dict = {}  # key, value = name, widget
        for row in table:
            parent_name = row[0]
            row_color = row[1]
            child_name = row[2]
            row_widget = gui.TableRow(style={'background-color': row_color})
            # Determine whether hierarchy of sub_sub concepts shall be open or not
            openness = 'true'
            row_widget.attributes['treeopen'] = openness
            # widget_dict[child_name] = row_widget
            for index, field in enumerate(row[2:]):
                # Determine field color
                field_color = '#ffff99'
                row_item = gui.TableItem(text=field,
                                         style={
                                             'text-align': 'left',
                                             'background-color': field_color
                                         })
                row_widget.append(row_item, field)
                if index == 0:
                    row_item.parent = parent_name
                    child_id = row_item

            # The root of each tree has a parent that is blank ('').
            # Each row with childs has as attribute openness, which by default is 'true'.
            # The fields can be given other attributes, such as color.

            # Verify whether the parent_name (child.parent)
            # is present or is in the list of parent_names.
            print('parent-child:', parent_name, child_name)
            if parent_name == '':
                hierarchy[child_name] = 0
                parent_names.append(child_name)
                target_level = 0
            elif parent_name in parent_names:
                hierarchy[child_name] = hierarchy[parent_name] + 1
                target_level = hierarchy[child_name]
            else:
                # Parent not in parent_names
                print('Error: Parent name "{}" does not appear in network'.
                      format(parent_name))
                return
            print('indent, target-pre:', indent_level, target_level,
                  parent_name, child_name)
            # Indentation
            if target_level > indent_level:
                self.tree_table.begin_fold()
                indent_level += 1
            if target_level < indent_level:
                while target_level < indent_level:
                    indent_level += -1
                    self.tree_table.end_fold()
            print('indent, target-post:', indent_level, target_level,
                  parent_name, child_name)
            if child_name not in parent_names:
                parent_names.append(child_name)
            self.tree_table.append(row_widget, child_name)