Esempio n. 1
0
    def draw_cell(cell_data):
        out = []

        if cell_data == 0:
            out.append(svgfig.Rect(0, 0, CELL_WIDTH, CELL_HEIGHT,
                                   fill="black"))
        elif type(cell_data) == type(1):
            out.append(svgfig.Rect(0, 0, CELL_WIDTH, CELL_HEIGHT))
            out.append(
                svgfig.Text(
                    10,
                    10,
                    cell_data,
                    text_anchor="middle",
                    font_size=12,
                    font_weight=600,
                    dominant_baseline="middle",
                    fill="brown",
                ))
        elif type(cell_data) == type(()):
            across = cell_data[0]
            down = cell_data[1]
            out.append(svgfig.Rect(0, 0, CELL_WIDTH, CELL_HEIGHT))
            out.append(
                svgfig.Line(
                    0,
                    0,
                    CELL_WIDTH,
                    CELL_HEIGHT,
                    stroke_width=1,
                ))
            if down == 0:
                points = ((0, 0), (0, CELL_HEIGHT), (CELL_WIDTH, CELL_HEIGHT))
                out.append(svgfig.Poly(points, "lines", fill="black"))
            else:
                out.append(
                    svgfig.Text(
                        2,
                        18,
                        down,
                        text_anchor="start",
                        font_size=7,
                        alignment_baseline="middle",
                    ))
            if across == 0:
                points = ((0, 0), (CELL_WIDTH, 0), (CELL_WIDTH, CELL_HEIGHT))
                out.append(svgfig.Poly(points, "lines", fill="black"))
            else:
                out.append(
                    svgfig.Text(
                        19,
                        7,
                        across,
                        text_anchor="end",
                        font_size=7,
                    ))
        else:
            raise Exception("")
        return out
 def add_boxes( self, step_dict, width, name_fill ):
     x, y = step_dict[ 'position' ][ 'left' ], step_dict[ 'position' ][ 'top' ]
     self.boxes.append( svgfig.Rect( x - MARGIN, y, x + width - MARGIN, y + 30, fill=name_fill ).SVG() )
     box_height = ( len( step_dict[ 'data_inputs' ] ) + len( step_dict[ 'data_outputs' ] ) ) * LINE_SPACING + MARGIN
     # Draw separator line.
     if len( step_dict[ 'data_inputs' ] ) > 0:
         box_height += 15
         sep_y = y + len( step_dict[ 'data_inputs' ] ) * LINE_SPACING + 40
         self.text.append( svgfig.Line( x - MARGIN, sep_y, x + width - MARGIN, sep_y ).SVG() )
     # Define an input/output box.
     self.boxes.append( svgfig.Rect( x - MARGIN, y + 30, x + width - MARGIN, y + 30 + box_height, fill="#ffffff" ).SVG() )
Esempio n. 3
0
 def rect(self, shape):
   x = fget(shape, 'x')
   y = fget(shape, 'y')
   dx = fget(shape, 'dx')
   dy = fget(shape, 'dy')
   ro = fget(shape, 'ro') / 100.0
   rot = fget(shape, 'rot')
   drill = fget(shape, 'drill')
   drill_dx = fget(shape, 'drill_dx')
   drill_dy = -fget(shape, 'drill_dy')
   if rot not in [0, 90, 180, 270]:
     raise Exception("only 0, 90, 180, 270 rotation supported for now")
   if rot in [90, 270]:
     (dx, dy) = (dy, dx)
   if rot == 90:
     (drill_dx, drill_dy) = (drill_dy, drill_dx)
   if rot == 180:
     (drill_dx, drill_dy) = (-drill_dx, drill_dy)
   if rot == 270:
     (drill_dx, drill_dy) = (-drill_dy, -drill_dx)
   res = []
   res.append(svgfig.Rect(x-dx/2,y-dy/2,x+dx/2,y+dy/2, stroke=None, fill=self.color).SVG(trans=self.trans))
   res += self._hole(x,y, drill/2, drill/2)
   if 'name' in shape:
     m = min(dx, dy)/1.5
     self.set_color('name')
     res += self._txt(shape['name'], x, y, m)
   return res
Esempio n. 4
0
 def draw_shapes(self):
   # really ugly redraw everything
   self.scene.clear()
   self.webview = QGraphicsWebView()
   self.webview.setZoomFactor(3.0)
   self.scene.setBackgroundBrush(Qt.black)
   self.scene.addItem(self.webview)
   w = self.width()*.5
   h = self.height()*.5
   width = "%spx" % (w)
   height = "%spx" % (h)
   dx = (int(self.parent.gl_dx + 1)/2)*2
   dy = (int(self.parent.gl_dy + 1)/2)*2
   vx = dx
   dy = dy
   self.dx = dx
   self.dy = dy
   print dx, dy
   # TODO: clever viewbox calculation     
   viewbox = "%d %d %d %d" % (-self.q*dx/2, -self.q*dy/2, self.q*dx, self.q*dy)
   rect = svgfig.Rect(-dx/2,-dy/2,dx/2,dy/2, fill='black', stroke=None).SVG(trans=self.trans)
   dot_field = self.draw_dot_field()
   print self.box.contentsRect()
   print width, height, viewbox
   svg_g = svgfig.SVG("g")
   svg_g.append(rect)
   for x in dot_field:
     svg_g.append(x)
   for shape in self.shapes:
     self.set_color(shape['type'])
     if 'shape' in shape:
       dispatch = {
         'circle': self.circle,
         'disc': self.disc,
         'label': self.label,
         'line': self.vertex,
         'vertex': self.vertex,
         'octagon': self.octagon,
         'rect': self.rect,
         'polygon': self.polygon,
         'hole': self.hole,
       }
       shape_svg = dispatch.get(shape['shape'], self.skip)(shape)
       print shape_svg
       for x in shape_svg:
         svg_g.append(x)
   
   #print subs
   canvas = svgfig.canvas(svg_g, width=width, height=height, viewBox=viewbox)
   xml = canvas.standalone_xml()
   print xml
   self.webview.setContent(QtCore.QByteArray(xml))
Esempio n. 5
0
    def test_placeLabel(self, points, layer):
        """Use this for testing different packing algorthims.
    """

        # Get the label
        label = self.labels[layer]

        # Take a guess at the aspect ratio of the word
        label_aspect = len(label) * 0.7  #magic

        window_aspect = (self.x_max - self.x_min) / float(self.y_max * 1.3)

        iterations = 20
        end_of_line = (len(points) / 2)
        point_range = range(len(points))
        point_range.reverse()
        for i in range(0, end_of_line - 1):
            bottom_point = point_range[i]
            x = points[i][0]
            y = points[i][1]
            y_0 = points[bottom_point][1]
            height_init = y_0 - y
            for i in range(iterations):
                height = height_init - (i * (height_init / iterations))
                width = height / (label_aspect / window_aspect)

        yint = 6
        x = points[yint][0]
        y = points[yint][1]
        y_0 = points[point_range[yint]][1]
        height = y - y_0
        width = height / (label_aspect / window_aspect / self.canvas_aspect)

        x1 = x
        y1 = y_0
        x2 = x1 + width
        y2 = y

        return svgfig.Rect(x1,
                           y1,
                           x2,
                           y2,
                           fill="#cccccc",
                           fill_opacity="50%",
                           stroke_width="0")
Esempio n. 6
0
def generate_workflow_image( trans, workflow_name, repository_metadata_id=None, repository_id=None ):
    """
    Return an svg image representation of a workflow dictionary created when the workflow was exported.  This method is called
    from both Galaxy and the tool shed.  When called from the tool shed, repository_metadata_id will have a value and repository_id
    will be None.  When called from Galaxy, repository_metadata_id will be None and repository_id will have a value.
    """
    workflow_name = encoding_util.tool_shed_decode( workflow_name )
    if trans.webapp.name == 'community':
        # We're in the tool shed.
        repository_metadata = suc.get_repository_metadata_by_id( trans, repository_metadata_id )
        repository_id = trans.security.encode_id( repository_metadata.repository_id )
        changeset_revision = repository_metadata.changeset_revision
        metadata = repository_metadata.metadata
    else:
        # We're in Galaxy.
        repository = suc.get_tool_shed_repository_by_id( trans, repository_id )
        changeset_revision = repository.changeset_revision
        metadata = repository.metadata
    # metadata[ 'workflows' ] is a list of tuples where each contained tuple is
    # [ <relative path to the .ga file in the repository>, <exported workflow dict> ]
    for workflow_tup in metadata[ 'workflows' ]:
        workflow_dict = workflow_tup[1]
        if workflow_dict[ 'name' ] == workflow_name:
            break
    if 'tools' in metadata:
        tools_metadata = metadata[ 'tools' ]
    else:
        tools_metadata = []
    workflow, missing_tool_tups = get_workflow_from_dict( trans=trans,
                                                          workflow_dict=workflow_dict,
                                                          tools_metadata=tools_metadata,
                                                          repository_id=repository_id,
                                                          changeset_revision=changeset_revision )
    data = []
    canvas = svgfig.canvas( style="stroke:black; fill:none; stroke-width:1px; stroke-linejoin:round; text-anchor:left" )
    text = svgfig.SVG( "g" )
    connectors = svgfig.SVG( "g" )
    boxes = svgfig.SVG( "g" )
    svgfig.Text.defaults[ "font-size" ] = "10px"
    in_pos = {}
    out_pos = {}
    margin = 5
    # Spacing between input/outputs.
    line_px = 16
    # Store px width for boxes of each step.
    widths = {}
    max_width, max_x, max_y = 0, 0, 0
    for step in workflow.steps:
        step.upgrade_messages = {}
        module = module_factory.from_workflow_step( trans, repository_id, changeset_revision, tools_metadata, step )
        tool_errors = module.type == 'tool' and not module.tool
        module_data_inputs = get_workflow_data_inputs( step, module )
        module_data_outputs = get_workflow_data_outputs( step, module, workflow.steps )
        step_dict = {
            'id' : step.order_index,
            'data_inputs' : module_data_inputs,
            'data_outputs' : module_data_outputs,
            'position' : step.position,
            'tool_errors' : tool_errors
        }
        input_conn_dict = {}
        for conn in step.input_connections:
            input_conn_dict[ conn.input_name ] = dict( id=conn.output_step.order_index, output_name=conn.output_name )
        step_dict[ 'input_connections' ] = input_conn_dict
        data.append( step_dict )
        x, y = step.position[ 'left' ], step.position[ 'top' ]
        count = 0
        module_name = get_workflow_module_name( module, missing_tool_tups )
        max_len = len( module_name ) * 1.5
        text.append( svgfig.Text( x, y + 20, module_name, **{ "font-size": "14px" } ).SVG() )
        y += 45
        for di in module_data_inputs:
            cur_y = y + count * line_px
            if step.order_index not in in_pos:
                in_pos[ step.order_index ] = {}
            in_pos[ step.order_index ][ di[ 'name' ] ] = ( x, cur_y )
            text.append( svgfig.Text( x, cur_y, di[ 'label' ] ).SVG() )
            count += 1
            max_len = max( max_len, len( di[ 'label' ] ) )
        if len( module.get_data_inputs() ) > 0:
            y += 15
        for do in module_data_outputs:
            cur_y = y + count * line_px
            if step.order_index not in out_pos:
                out_pos[ step.order_index ] = {}
            out_pos[ step.order_index ][ do[ 'name' ] ] = ( x, cur_y )
            text.append( svgfig.Text( x, cur_y, do[ 'name' ] ).SVG() )
            count += 1
            max_len = max( max_len, len( do['name' ] ) )
        widths[ step.order_index ] = max_len * 5.5
        max_x = max( max_x, step.position[ 'left' ] )
        max_y = max( max_y, step.position[ 'top' ] )
        max_width = max( max_width, widths[ step.order_index ] )
    for step_dict in data:
        tool_unavailable = step_dict[ 'tool_errors' ]
        width = widths[ step_dict[ 'id' ] ]
        x, y = step_dict[ 'position' ][ 'left' ], step_dict[ 'position' ][ 'top' ]
        # Only highlight missing tools if displaying in the tool shed.
        if trans.webapp.name == 'community' and tool_unavailable:
            fill = "#EBBCB2"
        else:
            fill = "#EBD9B2"    
        boxes.append( svgfig.Rect( x - margin, y, x + width - margin, y + 30, fill=fill ).SVG() )
        box_height = ( len( step_dict[ 'data_inputs' ] ) + len( step_dict[ 'data_outputs' ] ) ) * line_px + margin
        # Draw separator line.
        if len( step_dict[ 'data_inputs' ] ) > 0:
            box_height += 15
            sep_y = y + len( step_dict[ 'data_inputs' ] ) * line_px + 40
            text.append( svgfig.Line( x - margin, sep_y, x + width - margin, sep_y ).SVG() )
        # Define an input/output box.
        boxes.append( svgfig.Rect( x - margin, y + 30, x + width - margin, y + 30 + box_height, fill="#ffffff" ).SVG() )
        for conn, output_dict in step_dict[ 'input_connections' ].iteritems():
            in_coords = in_pos[ step_dict[ 'id' ] ][ conn ]
            # out_pos_index will be a step number like 1, 2, 3...
            out_pos_index = output_dict[ 'id' ]
            # out_pos_name will be a string like 'o', 'o2', etc.
            out_pos_name = output_dict[ 'output_name' ]
            if out_pos_index in out_pos:
                # out_conn_index_dict will be something like:
                # 7: {'o': (824.5, 618)}
                out_conn_index_dict = out_pos[ out_pos_index ]
                if out_pos_name in out_conn_index_dict:
                    out_conn_pos = out_pos[ out_pos_index ][ out_pos_name ]
                else:
                    # Take any key / value pair available in out_conn_index_dict.
                    # A problem will result if the dictionary is empty.
                    if out_conn_index_dict.keys():
                        key = out_conn_index_dict.keys()[0]
                        out_conn_pos = out_pos[ out_pos_index ][ key ]
            adjusted = ( out_conn_pos[ 0 ] + widths[ output_dict[ 'id' ] ], out_conn_pos[ 1 ] )
            text.append( svgfig.SVG( "circle",
                                     cx=out_conn_pos[ 0 ] + widths[ output_dict[ 'id' ] ] - margin,
                                     cy=out_conn_pos[ 1 ] - margin,
                                     r = 5,
                                     fill="#ffffff" ) )
            connectors.append( svgfig.Line( adjusted[ 0 ],
                                            adjusted[ 1 ] - margin,
                                            in_coords[ 0 ] - 10,
                                            in_coords[ 1 ],
                                            arrow_end = "true" ).SVG() )
    canvas.append( connectors )
    canvas.append( boxes )
    canvas.append( text )
    width, height = ( max_x + max_width + 50 ), max_y + 300
    canvas[ 'width' ] = "%s px" % width
    canvas[ 'height' ] = "%s px" % height
    canvas[ 'viewBox' ] = "0 0 %s %s" % ( width, height )
    trans.response.set_content_type( "image/svg+xml" )
    return canvas.standalone_xml()
Esempio n. 7
0
    def test2_placeLabel(self, points, layer, window):
        def interp(a, b, val):
            slope = float(b[1] - a[1]) / float(b[0] - a[0])
            inter = a[1] - slope * a[0]
            return (val * slope) + inter

        def f_bl(x):
            point_range = range(len(points))
            point_range.reverse()
            last_x = 0
            for i in range(len(points) / 2):
                point = points[point_range[i]]
                #print str(point[0]) + "  " +str(x) + "  " + str(last_x)
                if x <= point[0] and x > last_x:
                    #print "Bang!"
                    return interp(point, points[point_range[i - 1]], x)
                last_x = point[0]
            return 0

        def f_tl(x):
            last_x = 0
            for i in range(len(points) / 2):
                point = points[i]
                if x <= point[0] and x > last_x:
                    return interp(point, points[i - 1], x)
                last_x = point[0]
            return 0

        def is_box_in_shape(x1, y1, x2, y2):
            width = x2 - x1
            for j in range(resolution):
                x = x1 + ((width / float(resolution)) * j)
                y_lo = f_bl(x)
                y_hi = f_tl(x)
                if y1 < y_lo or y2 > y_hi:
                    return False
            return True

        # Get the label
        label = self.labels[layer]
        # Take a guess at the aspect ratio of the word
        label_aspect = len(label) * 0.7  #magic
        window_aspect = (self.x_max - self.x_min) / float(self.y_max * 1.3)

        num_guesses = 400
        resolution = 10

        total_aspect = (((1 / label_aspect) / window_aspect) *
                        self.canvas_aspect)

        height_max = 0
        boxes = svgfig.SVG("g", id="boxes")
        x1_l = 0
        x2_l = 0
        y1_l = 0
        y2_l = 0
        for i in range(num_guesses):
            x1 = random.uniform(self.x_min, self.x_max)
            y_lo = f_bl(x1)
            y_hi = f_tl(x1)
            h = y_hi - y_lo
            y1 = random.uniform(y_lo, y_hi - (h / 8.0))
            y2 = random.uniform(y1, y_hi)
            height = y2 - y1
            x2 = x1 + height / float(total_aspect)
            if is_box_in_shape(x1, y1, x2, y2):
                if height_max < height:
                    height_max = height
                    x1_l = x1
                    y1_l = y1
                    x2_l = x2
                    y2_l = y2
                boxes.append(
                    svgfig.Rect(x1,
                                y1,
                                x2,
                                y2,
                                fill="#eeeeee",
                                fill_opacity="10%",
                                stroke_width="0").SVG(window))

        boxes.append(
            svgfig.Rect(x1_l,
                        y1_l,
                        x2_l,
                        y2_l,
                        fill="#eeeeee",
                        fill_opacity="23%",
                        stroke_width="0").SVG(window))

        label_x = x1_l + ((x2_l - x1_l) / 2.0)
        label_y = y1_l + ((y2_l - y1_l) / 6.0)
        #print (y2_l - y1_l)
        font = ((y2_l - y1_l) / 2.5)  #magic
        self.current_label = svgfig.Text(label_x,
                                         label_y,
                                         label,
                                         font_family="Droid Sans",
                                         font_size=str(font))

        return boxes