def place_path_shape(cfg, shape, layer, layer_name, mirror=False): """ Places a dict path shape definition in the specified layer """ sig_dig = cfg['pcbmode']['significant_digits'] path = shape.get('value') rotation = shape.get('rotate') or 0 location = shape.get('location') scale = shape.get('scale') or 1 style = shape.get('style') stroke_width = shape.get('stroke_width') gerber_lp = (shape.get('gerber_lp') or shape.get('gerber-lp')) translate = 'translate(' + str(round(location[0], sig_dig)) + ' ' + str(round(-location[1], sig_dig)) + ')' transform = translate # convert path to relative commands path = svg.absolute_to_relative_path(path) # get a path having an origin at the center of the shape # defined by the path d_width, d_height, path = svg.transform_path(path, True, scale, rotation, Point()) if mirror is True: path = svg.mirror_path_over_axis(path, 'x', 0) subelement = et.SubElement(layer, 'path', transform=transform, d=path) if gerber_lp is not None: subelement.set('{'+config.cfg['ns']['pcbmode']+'}gerber-lp', gerber_lp) # add the right style if style is not None: if style == 'outline': style = cfg['layout_style'][layer_name].get('outline') # if there's a stroke-width definition, then override the default if stroke_width is not None: style['stroke-width'] = str(stroke_width) style = utils.dict_to_style(style) elif style == 'fill': style = utils.dict_to_style(cfg['layout_style'][layer_name].get('fill')) else: print "ERROR: unrecognised style" else: # default to outline style = utils.dict_to_style(cfg['layout_style'][layer_name].get('outline')) if style is not None: subelement.set('style', style) return
def place_text(cfg, text_element, layer, layer_name, mirror=False, additional_rotate=0): """ Places a dict text element in the specified layer """ sig_dig = cfg['pcbmode']['significant_digits'] text_list = text_element.get('value') # Check if text is a string. Text fields used to be only a single line # are not a list of lines. So if the input is a string, we need to convert # into a single item list. # TODO: check if this can be removed after all designs have text input as a list if isinstance(text_list, basestring): text_list = [text_list] font = text_element.get('font') scale = text_element.get('scale') or text_element.get('scale') or 0.0009 rotate = text_element.get('rotate') or 0 rotate += additional_rotate location = utils.to_Point(text_element.get('location') or [0, 0]) offset = utils.to_Point(text_element.get('offset') or [0, 0]) location += offset if mirror is True: location.x = -location.x add_space = text_element.get('additional_space_between_glyphs') or 0 style = text_element.get('style') gerber_lp = (text_element.get('gerber-lp') or text_element.get('gerber_lp') or '') # create a group for the entire string string_group = et.SubElement(layer, 'g') # add the right style if style is not None: if style == 'outline': style = utils.dict_to_style(cfg['layout_style'][layer_name].get('outline')) elif style == 'fill': style = utils.dict_to_style(cfg['layout_style'][layer_name].get('fill')) else: print "ERROR: unrecognised style '%s' for text element" % style else: # default to fill style = utils.dict_to_style(cfg['layout_style'][layer_name].get('fill')) if style is not None: string_group.set('style', style) # place the glyphs' paths line_number = 0 for text in text_list: line_number += 1 # get the slyphs for the text paths, text_width, text_height = glyphs.get_glyphs(cfg, text, font, location, scale, line_number, # line number rotate, add_space) origin = utils.to_Point(paths[0]['location']) for path in paths: # TODO: hack? place = utils.to_Point(path['location']) d = place - origin d.rotate(rotate, Point()) place = origin + d if mirror is True: path['d'] = svg.mirror_path_over_axis(path['d'], 'x', 0) place.x = -place.x transform = 'translate(%s %s)' % (round(place.x, sig_dig), round(-place.y, sig_dig)) # add glyph subelement = et.SubElement(string_group, 'path', transform=transform, d=path['d'], letter=path['symbol'], gerber_lp=path['gerber-lp']) return