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() )
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
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))
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")
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()
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