def _init_base(self): # set attributes self.setAttribute('virtual') # add pads small_hole_size = 3.048 large_hole_size = 3.9878 top_offset = -6.985 bottom_offset = 8.225 offset = self.lu_table[self.size]['offset'] layers = ['*.Cu', '*.Mask'] # create pads self.append( Pad(number="~", type=Pad.TYPE_NPTH, shape=Pad.SHAPE_CIRCLE, at=[-offset, top_offset], size=small_hole_size, drill=small_hole_size, layers=layers)) self.append( Pad(number="~", type=Pad.TYPE_NPTH, shape=Pad.SHAPE_CIRCLE, at=[offset, top_offset], size=small_hole_size, drill=small_hole_size, layers=layers)) self.append( Pad(number="~", type=Pad.TYPE_NPTH, shape=Pad.SHAPE_CIRCLE, at=[-offset, bottom_offset], size=large_hole_size, drill=large_hole_size, layers=layers)) self.append( Pad(number="~", type=Pad.TYPE_NPTH, shape=Pad.SHAPE_CIRCLE, at=[offset, bottom_offset], size=large_hole_size, drill=large_hole_size, layers=layers)) # create reference center point self.append( Line(start=[0, 2], end=[0, -2], layer='Dwgs.User', width=0.1)) self.append( Line(start=[-2, 0], end=[2, 0], layer='Dwgs.User', width=0.1))
def intersectTwoNodes(*nodes): import KicadModTree.nodes.base.Line if len(nodes) < 2 or len(nodes) > 3: raise KeyError("intersectTwoNodes expects two node objects or a node and two vectors") circles = [] lines = [] vectors = [] for n in nodes: if hasattr(n, 'getRadius') and hasattr(n, 'center_pos'): circles.append(n) elif hasattr(n, 'end_pos') and hasattr(n, 'start_pos'): lines.append(n) else: vectors.append(n) if len(vectors) == 2: lines.append(Line(start=vectors[0], end=vectors[1])) if len(lines) == 2: return BaseNodeIntersection.intersectTwoLines(*lines) if len(circles) == 2: raise NotImplementedError('intersection between circles is not supported') if len(lines) == 1 and len(circles) == 1: return BaseNodeIntersection.intersectLineWithCircle(lines[0], circles[0]) print(lines) print(circles) raise NotImplementedError('unsupported combination of parameter types')
def _createChildNodes(self, start_pos, end_pos, layer, width): nodes = [] cur_y_pos = min([start_pos.y, end_pos.y]) max_y_pos = max([start_pos.y, end_pos.y]) while (cur_y_pos + width) < max_y_pos: cur_y_pos += width new_node = Line(start=Vector2D(start_pos.x, cur_y_pos), end=Vector2D(end_pos.x, cur_y_pos), layer=layer, width=width) new_node._parent = self nodes.append(new_node) return nodes
def _line(self, x, y): if self.keepout != None: segments = self.keepout.processLine(self.x, self.y, self.x + x, self.y + y) for line in segments: # TODO: move grid alignment to keepout code? line[0] = self._align(line[0]) line[1] = self._align(line[1]) line[2] = self._align(line[2]) line[3] = self._align(line[3]) self.footprint.append( Line(start=[line[0], line[1]], end=[line[2], line[3]], layer=self.layer, width=self.line_width)) else: self.footprint.append( Line(start=[self.x, self.y], end=[self.x + x, self.y + y], layer=self.layer, width=self.line_width))
def _init_switch(self): # set attributes self.setAttribute('smd') # create fab outline (keyswitch) self.append( RectLine(start=[-self.kailh_hs_w / 2, -self.kailh_hs_h / 2], end=[self.kailh_hs_w / 2, self.kailh_hs_h / 2], layer='F.Fab', width=0.1)) # create fab outline (socket) self.append( Line(start=[-4, -6.8], end=[4.8, -6.8], layer='B.Fab', width=0.12)) self.append( Line(start=[4.8, -6.8], end=[4.8, -2.8], layer='B.Fab', width=0.12)) self.append( Line(start=[-0.3, -2.8], end=[4.8, -2.8], layer='B.Fab', width=0.12)) self.append( Line(start=[-6, -0.8], end=[-2.3, -0.8], layer='B.Fab', width=0.12)) self.append( Line(start=[-6, -0.8], end=[-6, -4.8], layer='B.Fab', width=0.12)) self.append( Arc(center=[-4, -4.8], start=[-4, -6.8], angle=-90, layer='B.Fab', width=0.12)) self.append( Arc(center=[-0.3, -0.8], start=[-0.3, -2.8], angle=-90, layer='B.Fab', width=0.12)) # create silkscreen (keyswitch) self.append( RectLine(start=[-self.kailh_hs_w / 2, -self.kailh_hs_h / 2], end=[self.kailh_hs_w / 2, self.kailh_hs_h / 2], layer='F.SilkS', width=0.12, offset=0.1)) # create silkscreen (socket) self.append( Line(start=[-4.1, -6.9], end=[1, -6.9], layer='B.SilkS', width=0.12)) self.append( Line(start=[-0.2, -2.7], end=[4.9, -2.7], layer='B.SilkS', width=0.12)) self.append( Arc(center=[-4.1, -4.9], start=[-4.1, -6.9], angle=-90, layer='B.SilkS', width=0.12)) self.append( Arc(center=[-0.2, -0.7], start=[-0.2, -2.7], angle=-90, layer='B.SilkS', width=0.12)) # create courtyard (keyswitch) self.append( RectLine(start=[-self.kailh_hs_w / 2, -self.kailh_hs_h / 2], end=[self.kailh_hs_w / 2, self.kailh_hs_h / 2], layer='F.CrtYd', width=0.05, offset=0.25)) # create courtyard (socket) # !TODO: add KLC correct offset (0.25) self.append( Line(start=[-4, -6.8], end=[4.8, -6.8], layer='B.CrtYd', width=0.05)) self.append( Line(start=[4.8, -6.8], end=[4.8, -2.8], layer='B.CrtYd', width=0.05)) self.append( Line(start=[-0.3, -2.8], end=[4.8, -2.8], layer='B.CrtYd', width=0.05)) self.append( Line(start=[-6, -0.8], end=[-2.3, -0.8], layer='B.CrtYd', width=0.05)) self.append( Line(start=[-6, -0.8], end=[-6, -4.8], layer='B.CrtYd', width=0.05)) self.append( Arc(center=[-4, -4.8], start=[-4, -6.8], angle=-90, layer='B.CrtYd', width=0.05)) self.append( Arc(center=[-0.3, -0.8], start=[-0.3, -2.8], angle=-90, layer='B.CrtYd', width=0.05)) # create pads if self.plated_th is True: self.append( Pad(number=1, type=Pad.TYPE_THT, shape=Pad.SHAPE_CIRCLE, at=[-3.81, -2.54], size=[3.6, 3.6], drill=3.05, layers=['*.Cu', 'B.Mask'])) self.append( Pad(number=2, type=Pad.TYPE_THT, shape=Pad.SHAPE_CIRCLE, at=[2.54, -5.08], size=[3.6, 3.6], drill=3.05, layers=['*.Cu', 'B.Mask'])) self.append( Pad(number=1, type=Pad.TYPE_SMT, shape=Pad.SHAPE_ROUNDRECT, at=[-6.585, -2.54], size=[3.55, 2.5], round_radius_exact=0.25, layers=['B.Cu'])) self.append( Pad(number=2, type=Pad.TYPE_SMT, shape=Pad.SHAPE_ROUNDRECT, at=[5.32, -5.08], size=[3.55, 2.5], round_radius_exact=0.25, layers=['B.Cu'])) self.append( Pad(type=Pad.TYPE_SMT, shape=Pad.SHAPE_ROUNDRECT, at=[-7.085, -2.54], size=[2.55, 2.5], round_radius_exact=0.25, layers=['B.Mask', 'B.Paste'])) self.append( Pad(type=Pad.TYPE_SMT, shape=Pad.SHAPE_ROUNDRECT, at=[5.842, -5.08], size=[2.55, 2.5], round_radius_exact=0.25, layers=['B.Mask', 'B.Paste'])) else: self.append( Pad(type=Pad.TYPE_NPTH, shape=Pad.SHAPE_CIRCLE, at=[-3.81, -2.54], size=[3.05, 3.05], drill=3.05, layers=['*.Cu', '*.Mask'])) self.append( Pad(type=Pad.TYPE_NPTH, shape=Pad.SHAPE_CIRCLE, at=[2.54, -5.08], size=[3.05, 3.05], drill=3.05, layers=['*.Cu', '*.Mask'])) self.append( Pad(number=1, type=Pad.TYPE_SMT, shape=Pad.SHAPE_ROUNDRECT, at=[-7.085, -2.54], size=[2.55, 2.5], round_radius_exact=0.25, layers=['B.Cu', 'B.Mask', 'B.Paste'])) self.append( Pad(number=2, type=Pad.TYPE_SMT, shape=Pad.SHAPE_ROUNDRECT, at=[5.842, -5.08], size=[2.55, 2.5], round_radius_exact=0.25, layers=['B.Cu', 'B.Mask', 'B.Paste'])) self.append( Pad(type=Pad.TYPE_NPTH, shape=Pad.SHAPE_CIRCLE, at=[0, 0], size=[4, 4], drill=4, layers=['*.Cu', '*.Mask'])) self.append( Pad(type=Pad.TYPE_NPTH, shape=Pad.SHAPE_CIRCLE, at=[-5.08, 0], size=[1.75, 1.75], drill=1.75, layers=['*.Cu', '*.Mask'])) self.append( Pad(type=Pad.TYPE_NPTH, shape=Pad.SHAPE_CIRCLE, at=[5.08, 0], size=[1.75, 1.75], drill=1.75, layers=['*.Cu', '*.Mask']))