def cutoutComponents(board, components): topCutout = extractComponentPolygons(components, "F.CrtYd") for polygon in topCutout: zone = pcbnew.PCB_SHAPE() zone.SetShape(STROKE_T.S_POLYGON) zone.SetPolyShape(shapelyToSHAPE_POLY_SET(polygon)) zone.SetLayer(Layer.F_Paste) board.Add(zone) bottomCutout = extractComponentPolygons(components, "B.CrtYd") for polygon in bottomCutout: zone = pcbnew.PCB_SHAPE() zone.SetShape(STROKE_T.S_POLYGON) zone.SetPolyShape(shapelyToSHAPE_POLY_SET(polygon)) zone.SetLayer(Layer.B_Paste) board.Add(zone)
def addLine(board, start, end, thickness): line = pcbnew.PCB_SHAPE() line.SetShape(STROKE_T.S_SEGMENT) line.SetStart(wxPoint(start[0], start[1])) line.SetEnd(wxPoint(end[0], end[1])) line.SetWidth(thickness) line.SetLayer(Layer.F_Paste) board.Add(line) addBottomCounterpart(board, line)
def addHole(board, position, radius): circle = pcbnew.PCB_SHAPE() circle.SetShape(STROKE_T.S_CIRCLE) circle.SetCenter(wxPoint(position[0], position[1])) circle.SetArcStart(wxPoint(position[0], position[1]) + wxPoint(radius/2, 0)) circle.SetWidth(radius) circle.SetLayer(Layer.F_Paste) board.Add(circle) addBottomCounterpart(board, circle)
def addRoundedCorner(board, center, start, end, thickness): corner = pcbnew.PCB_SHAPE() corner.SetShape(STROKE_T.S_ARC) corner.SetCenter(wxPoint(center[0], center[1])) corner.SetArcStart(wxPoint(start[0], start[1])) if np.cross(start - center, end - center) > 0: corner.SetAngle(fromDegrees(90)) else: corner.SetAngle(fromDegrees(-90)) corner.SetWidth(thickness) corner.SetLayer(Layer.F_Paste) board.Add(corner) addBottomCounterpart(board, corner)
def undoTransformation(point, rotation, origin, translation): """ We apply a transformation "Rotate around origin and then translate" when placing a board. Given a point and original transformation parameters, return the original point position. """ # Abuse PcbNew to do so segment = pcbnew.PCB_SHAPE() segment.SetShape(STROKE_T.S_SEGMENT) segment.SetStart(wxPoint(point[0], point[1])) segment.SetEnd(wxPoint(0, 0)) segment.Move(wxPoint(-translation[0], -translation[1])) segment.Rotate(origin, -rotation) return segment.GetStart()
def _serializeRing(self, ring): coords = list(ring.simplify(pcbnew.FromMM(0.001)).coords) segments = [] # ToDo: Reconstruct arcs if coords[0] != coords[-1]: raise RuntimeError("Ring is incomplete") for a, b in zip(coords, coords[1:]): segment = pcbnew.PCB_SHAPE() segment.SetShape(STROKE_T.S_SEGMENT) segment.SetLayer(Layer.Edge_Cuts) segment.SetStart(roundPoint(a)) segment.SetEnd(roundPoint(b)) segments.append(segment) return segments
def _renderVCutH(self, layer=Layer.Cmts_User): """ return list of PCB_SHAPE V-Cuts """ bBox = self.boardSubstrate.boundingBox() minX, maxX = bBox.GetX() - fromMm(3), bBox.GetX() + bBox.GetWidth() + fromMm(3) segments = [] for cut in self.hVCuts: segment = pcbnew.PCB_SHAPE() self._setVCutSegmentStyle(segment, layer) segment.SetStart(pcbnew.wxPoint(minX, cut)) segment.SetEnd(pcbnew.wxPoint(maxX, cut)) segments.append(segment) label = pcbnew.PCB_TEXT(segment) self._setVCutLabelStyle(label, layer) label.SetPosition(wxPoint(maxX + fromMm(3), cut)) segments.append(label) return segments
def _renderVCutV(self, layer=Layer.Cmts_User): """ return list of PCB_SHAPE V-Cuts """ bBox = self.boardSubstrate.boundingBox() minY, maxY = bBox.GetY() - fromMm(3), bBox.GetY() + bBox.GetHeight() + fromMm(3) segments = [] for cut in self.vVCuts: segment = pcbnew.PCB_SHAPE() self._setVCutSegmentStyle(segment, layer) segment.SetStart(pcbnew.wxPoint(cut, minY)) segment.SetEnd(pcbnew.wxPoint(cut, maxY)) segments.append(segment) label = pcbnew.PCB_TEXT(segment) self._setVCutLabelStyle(label, layer) label.SetPosition(wxPoint(cut, minY - fromMm(3))) label.SetTextAngle(900) segments.append(label) return segments