def test_create_new_regular_polygon(self): """ Test creating a new regular polygon. """ rpoly = RegularPolygon(x=0, y=0, outer=5, vertices=5) assert rpoly.x == 0 assert rpoly.y == 0 assert rpoly.outer_diameter == 5 assert rpoly.vertices == 5 assert rpoly.rotation == 0
def instantiate(self, values): """ Return a core.layout.Primitive with a set of fixed shapes given a dict mapping variable numbers to values, or None if there is no corresponding shape. """ shape_type = self.shape_type mods = [m.evaluate(values) for m in self.modifiers] if shape_type == 'ignore': return None is_additive = True if shape_type in ('moire', 'thermal') \ else bool(mods[0]) rotation = 0 if shape_type in ('circle', 'moire', 'thermal') \ else mods[-1]/180 if shape_type == 'circle': shape = Circle(x=mods[2], y=mods[3], radius=mods[1] / 2) elif shape_type == 'line-vector': shape, rotation = self._vector_to_rect(mods, rotation) elif shape_type == 'line-center': shape = Rectangle(x=mods[3] - mods[1] / 2, y=mods[4] + mods[2] / 2, width=mods[1], height=mods[2]) elif shape_type == 'line-lower-left': shape = Rectangle(x=mods[3], y=mods[4] + mods[2], width=mods[1], height=mods[2]) elif shape_type == 'outline': points = [ Point(mods[i], mods[i + 1]) for i in range(2, len(mods[:-1]), 2) ] shape = Polygon(points) elif shape_type == 'polygon': shape = RegularPolygon(x=mods[2], y=mods[3], outer=mods[4], vertices=mods[1]) elif shape_type == 'moire': mods[8] = 2 - mods[8] / 180 shape = Moire(*mods[0:9]) elif shape_type == 'thermal': mods[5] = 2 - mods[5] / 180 shape = Thermal(*mods[0:6]) return Primitive(is_additive, rotation, shape)
def _extract_ad(self, tok): """ Extract aperture definition into shapes dict. """ tok = tok if ',' in tok else tok + ',' code_end = 4 if tok[3].isdigit() else 3 code = tok[1:code_end] ap_type, mods = tok[code_end:].split(',') if mods: mods = [float(m) for m in mods.split('X') if m] # An aperture can use any of the 4 standard types, # (with or without a central hole), or a previously # defined macro. if ap_type == 'C': shape = Circle(0, 0, mods[0] / 2) hole_defs = len(mods) > 1 and mods[1:] elif ap_type == 'R': if len(mods) == 1: shape = Rectangle(-mods[0] / 2, mods[0] / 2, mods[0], mods[0]) else: shape = Rectangle(-mods[0] / 2, mods[1] / 2, mods[0], mods[1]) hole_defs = len(mods) > 2 and mods[2:] elif ap_type == 'O': shape = Obround(0, 0, mods[0], mods[1]) hole_defs = len(mods) > 2 and mods[2:] elif ap_type == 'P': if len(mods) < 3: mods.append(0) shape = RegularPolygon(0, 0, mods[0], mods[1], mods[2]) hole_defs = len(mods) > 3 and mods[3:] else: # macro shape = ap_type if shape in self.macro_buff: macro = self.macro_buff[shape].instantiate(mods) counter = 0 # pick a unique name for the macro while mods and macro.name in self.layer_buff.macros: macro.name = shape + str(counter) counter += 1 self.layer_buff.macros[macro.name] = macro hole_defs = None if hole_defs and (len(hole_defs) > 1): hole = Rectangle(-hole_defs[0] / 2, hole_defs[1] / 2, hole_defs[0], hole_defs[1]) elif hole_defs: hole = Circle(0, 0, hole_defs[0] / 2) else: hole = None self.layer_buff.apertures.update({code: Aperture(code, shape, hole)})