def remove_back_keepout(pattern, corners): """ Remove keepout area from under the pads. @param pattern not used @param corners number of corners in approximate circle """ remove_areas = [] board = pcbnew.GetBoard() for i in range(board.GetAreaCount()): area = board.GetArea(i) if area.GetNumCorners() == corners: remove_areas.append(area) for area in remove_areas: board.Remove(area)
def Run(self): dlg = SVG2GraphicDialog() res = dlg.ShowModal() if res == wx.ID_OK: print("ok") # do it. SVG2Graphic(dlg.file_picker.value, pcbnew.GetBoard(), dlg.basic_layer.valueint) else: print("cancel")
def Run(self): pcb = pcbnew.GetBoard() tracks = pcb.GetTracks() tracks_cp = list(tracks) l = len(tracks_cp) #for track in tracks_cp: for i in range(l): if tracks_cp[i].Type() == pcbnew.PCB_VIA_T: #if track.Type() == pcbnew.PCB_VIA_T: #pcb.RemoveNative(track) pcb.RemoveNative(tracks_cp[i]) #pcb.DeleteNative(tracks_cp[i]) #this is making 'Segmentation fault (core dumped)' on k 5.99 pcbnew.Refresh()
def GetSelectedDrawings(): """Retrieves only the selected drawings Returns: List of drawings: """ selected = [] drawings = pcbnew.GetBoard().GetDrawings() for idx,drawing in enumerate(drawings): if drawing.IsSelected(): selected.append(drawing) LogDebug("Getting {} selected objects".format(idx)) return selected
def loadset(self,e): """Load a viewset based on the object (e) clicked.""" # self._message.SetLabel("m1") # return # The widget is the object that was clicked. widget = e.GetEventObject() #wx.MessageDialog(widget,widget.GetLabel(),style=wx.OK).ShowModal() # Find that widget in the layersetstack. element = filter (lambda x: x[2]==widget,self._layersetstack) if not element: element = filter (lambda x: x[2]==widget,self._layersetsaved) element = element[0] # The the visible layers according to that element in the stack. if element[0] is not None: pcbnew.GetBoard().SetVisibleLayers(element[0]) if element[1] is not None: pcbnew.GetBoard().SetVisibleElements(element[1]) try: pcbnew.UpdateUserInterface() self._message.SetLabel(element[2].GetLabel()) except: self._message.SetLabel("Change Canvas to view")
def Run(self): #self.pcb = GetBoard() pcb = pcbnew.GetBoard() ln = 0. pads = [] tracks = getSelTracks(pcb) if len(tracks) > 0: #selected tracks >0 for item in tracks: ln += (item.GetLength()) else: for item in pcb.GetPads(): if item.IsSelected(): pads.append(item) if len(pads) == 1: tracks = [] tracks = find_Tracks_inNet_Pad(pcb, pads[0]) c_tracks = get_contiguous_tracks(pcb, tracks, pads[0]) tracks = c_tracks # selectListTracks(pcb,tracks) # this seems not to allow deselecting ln = getTracksListLength(pcb, tracks) selectListTracks(pcb, tracks) pcbnew.Refresh() #else: # wx.LogMessage("Solder Mask Expander:\nSelect Tracks\nor One Pad to select connected Tracks") if ln > 0: #wx.LogMessage('Selected Traces Length: {0:.3f} mm'.format(ToMM(ln))) wxLogDebug('showing Selected Tracks', debug) #wx.LogMessage('debug'+str(debug)) msg = u"Selected Tracks Length:\n{0:.3f} mm \u2714".format( ToMM(ln)) if len(tracks) == 1: angle = (math.degrees(getTrackAngleRadians(tracks[0]))) msg += u"\nTrack Angle: {0:.1f} deg \u2714".format(angle) #selectListTracks(pcb,tracks) #pcbnew.Refresh() wdlg = wx.MessageDialog(None, msg, 'Info message', wx.OK | wx.ICON_INFORMATION) result = wdlg.ShowModal() if result == wx.ID_OK: pass clearListTracks(pcb, tracks, True) #timer = threading.Timer(1000, clearListTracks(pcb,tracks,True)) #timer.start() #blocking dialogw #wx.MessageBox("showing selection", 'Info', wx.OK | wx.ICON_INFORMATION) #clearListTracks(pcb,tracks) elif len(pads) != 1: wx.LogMessage( 'Select Tracks to calculate the Length\nor One Pad to select connected Tracks' )
def createZip( pcbServiceName, useAuxOrigin, excellonFormat, gerberProtelExtensions, layerRenameRules, drillMergeNpth, drillExtensionRenameTo, drillMinimalHeader ): board = pcbnew.GetBoard() boardFileName = board.GetFileName() boardDirPath = os.path.dirname(boardFileName) boardProjectName = (os.path.splitext(os.path.basename(boardFileName)))[0] outputDirPath = '%s/%s' % (boardDirPath, outputDirName) gerberDirName = '%s_for_%s' % (boardProjectName, pcbServiceName) gerberDirPath = '%s/%s' % (outputDirPath, gerberDirName) # timeStamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S') # zipFilePath = '%s/%s_%s.zip' % (outputDirPath, timeStamp, gerberDirName) zipFilePath = '%s/%s.zip' % (outputDirPath, gerberDirName) if not os.path.exists(outputDirPath): makeDir(outputDirPath) removeDirIfExists(gerberDirPath) makeDir(gerberDirPath) plotLayers( board = board, gerberDirPath = gerberDirPath, useAuxOrigin = useAuxOrigin, gerberProtelExtensions = gerberProtelExtensions, layerRenameRules = layerRenameRules, boardProjectName = boardProjectName, ) plotDrill( board = board, gerberDirPath = gerberDirPath, boardProjectName = boardProjectName, excellonFormat = excellonFormat, useAuxOrigin = useAuxOrigin, drillMinimalHeader = drillMinimalHeader, drillMergeNpth = drillMergeNpth, drillExtensionRenameTo = drillExtensionRenameTo, ) removeFileIfExists(zipFilePath) shutil.make_archive(os.path.splitext(zipFilePath)[0], 'zip', outputDirPath, gerberDirName) return zipFilePath
def Run(self): # load board board = pcbnew.GetBoard() # go to the project folder - so that log will be in proper place os.chdir(os.path.dirname(os.path.abspath(board.GetFileName()))) # Remove all handlers associated with the root logger object. for handler in logging.root.handlers[:]: logging.root.removeHandler(handler) # set up logger logging.basicConfig( level=logging.DEBUG, filename="length_stats.log", filemode='w', format='%(asctime)s %(name)s %(lineno)d:%(message)s', datefmt='%m-%d %H:%M:%S') logger = logging.getLogger(__name__) logger.info("Plugin executed on: " + repr(sys.platform)) logger.info("Plugin executed with python version: " + repr(sys.version)) logger.info("KiCad build version: " + BUILD_VERSION) logger.info("Length stats plugin version: " + VERSION + " started") stdout_logger = logging.getLogger('STDOUT') sl_out = StreamToLogger(stdout_logger, logging.INFO) sys.stdout = sl_out stderr_logger = logging.getLogger('STDERR') sl_err = StreamToLogger(stderr_logger, logging.ERROR) sys.stderr = sl_err _pcbnew_frame = [ x for x in wx.GetTopLevelWindows() if x.GetTitle().lower().startswith('pcbnew') ][0] # find all selected tracks and pads nets = set() selected_tracks = [x for x in board.GetTracks() if x.IsSelected()] nets.update([track.GetNetname() for track in selected_tracks]) modules = board.GetModules() for mod in modules: pads = mod.Pads() nets.update([pad.GetNetname() for pad in pads if pad.IsSelected()]) dlg = LenghtStatsDialog(_pcbnew_frame, board, list(nets), logger) dlg.Show()
def Run(self): #import pcbnew #pcb = pcbnew.GetBoard() # net_name = "GND" #aParameters = SolderExpanderDlg(None) _pcbnew_frame = [ x for x in wx.GetTopLevelWindows() if x.GetTitle().lower().startswith('pcbnew') ][0] aParameters = SolderExpander_Dlg(_pcbnew_frame) aParameters.m_clearanceMM.SetValue("0.2") aParameters.m_bitmap1.SetBitmap( wx.Bitmap( os.path.join(os.path.dirname(os.path.realpath(__file__)), "soldermask_clearance_help.png"))) modal_result = aParameters.ShowModal() clearance = FromMM( self.CheckInput(aParameters.m_clearanceMM.GetValue(), "extra clearance from track width")) if clearance is not None: pcb = pcbnew.GetBoard() if modal_result == wx.ID_OK: #pcb = pcbnew.GetBoard() tracks = getSelTracks(pcb) if len(tracks) > 0: #selected tracks >0 solderExpander(pcb, tracks, clearance) else: pads = [] for item in pcb.GetPads(): if item.IsSelected(): pads.append(item) if len(pads) == 1: tracks = [] tracks = find_Tracks_inNet_Pad(pcb, pads[0]) c_tracks = get_contiguous_tracks(pcb, tracks, pads[0]) solderExpander(pcb, c_tracks, clearance) else: wx.LogMessage( "Solder Mask Expander:\nSelect Tracks\nor One Pad to select connected Tracks" ) #solderExpander(clearance) elif modal_result == wx.ID_DELETE: Delete_Segments(pcb) #wx.LogMessage('Solder Mask Segments on Track Net Deleted') else: None # Cancel else: None # Invalid input aParameters.Destroy()
def Run(self): from ..version import version self.version = version config = Config(self.version) board = pcbnew.GetBoard() pcb_file_name = board.GetFileName() logger = ibom.Logger() if not pcb_file_name: logger.error('Please save the board file before generating BOM.') return parser = PcbnewParser(pcb_file_name, config, logger, board) ibom.run_with_dialog(parser, config, logger)
def _conv_fill(fill, net_code): conv_pts = list(map(ToPCB._conv_point, fill.points)) area = pcb.GetBoard().InsertArea(net_code, pcb.GetBoard().GetAreaCount(), fill.layer, conv_pts[0].x, conv_pts[0].y, pcb.CPolyLine.DIAGONAL_EDGE) area.SetPadConnection(pcb.PAD_ZONE_CONN_THERMAL if fill. thermal else pcb.PAD_ZONE_CONN_FULL) outline = area.Outline() for pt in conv_pts[1:]: if getattr(outline, 'AppendCorner', None) is None: # Kicad nightly outline.Append(pt.x, pt.y) else: outline.AppendCorner(pt.x, pt.y) if getattr(outline, 'CloseLastContour', None) is not None: outline.CloseLastContour() if fill.fillet_radius is not None and fill.fillet_radius > 0.: area.SetCornerSmoothingType(pcb.ZONE_SETTINGS.SMOOTHING_FILLET) area.SetCornerRadius(int(fill.fillet_radius)) # area.BuildFilledSolidAreasPolygons(pcb.GetBoard()) area.FillSegments()
def Layout(): board = pcbnew.GetBoard() fname = path.join(path.dirname(board.GetFileName()), "layout.tsv") with open(fname) as f: r = csv.reader(f, delimiter='\t') data = [row for row in r] for d in data: m = board.FindModuleByReference(d[0]) if m is not None: p = pcbnew.wxPointMM(float(d[1]), float(d[2])) m.SetPosition(p) if len(d) >= 4: m.SetOrientation(float(d[3]) * 10) pcbnew.Refresh()
def Run(self): global delete_before_connect #self.pcb = GetBoard() # net_name = "GND" pcb = pcbnew.GetBoard() #from https://github.com/MitjaNemec/Kicad_action_plugins #hack wxFormBuilder py2/py3 _pcbnew_frame = [ x for x in wx.GetTopLevelWindows() if x.GetTitle().lower().startswith('pcbnew') ][0] #aParameters = RoundTrackDlg(None) aParameters = RoundTrack_Dlg(_pcbnew_frame) if hasattr(pcb, 'm_Uuid'): aParameters.m_buttonDelete.Disable() aParameters.m_checkBoxDelete.Disable() #aParameters = RoundTrack_DlgEx(_pcbnew_frame) aParameters.Show() #end hack aParameters.m_distanceMM.SetValue("5") aParameters.m_segments.SetValue("16") aParameters.m_bitmap1.SetBitmap( wx.Bitmap( os.path.join(os.path.dirname(os.path.realpath(__file__)), "round_track_help.png"))) modal_result = aParameters.ShowModal() segments = self.CheckSegmentsInput(aParameters.m_segments.GetValue(), "number of segments") distI = FromMM( self.CheckDistanceInput(aParameters.m_distanceMM.GetValue(), "distance from intersection")) if aParameters.m_checkBoxDelete.IsChecked(): delete_before_connect = True else: delete_before_connect = False if segments is not None and distI is not None: if modal_result == wx.ID_OK: Round_Selection(pcb, distI, segments) elif modal_result == wx.ID_DELETE: Delete_Segments(pcb) #wx.LogMessage('Round Segments on Track Net Deleted') elif modal_result == wx.ID_REVERT: wxLogDebug('Connecting Tracks', debug) Connect_Segments(pcb) else: None # Cancel else: None # Invalid input aParameters.Destroy()
def write_text(): board = pcbnew.GetBoard() layertable = get_layertable() x = 0 for y in range(0, 100 * SCALE, SCALE * 10): text = pcbnew.TEXTE_PCB(board) text.SetText("HOLA: %d, %d" % (x, y)) text.SetPosition(pcbnew.wxPoint(x, y)) text.SetTextSize(pcbnew.wxSize(SCALE * 8, SCALE * 8)) text.SetThickness(SCALE * 1) text.SetLayer(layertable["F.SilkS"]) board.Add(text) pcbnew.Refresh()
def __init__(self, board): """Init the brand new instance""" super(AddNetDialog, self).__init__(None) self.SetTitle("AddNet v{0}".format(__version__)) self.Bind(wx.EVT_CLOSE, self.onCloseWindow) self.m_cbModule.Bind(wx.EVT_COMBOBOX, self.onModuleSelect) self.m_cbPad.Bind(wx.EVT_COMBOBOX, self.onPadSelect) self.m_btnCancel.Bind(wx.EVT_BUTTON, self.onCloseWindow) self.m_btnOk.Bind(wx.EVT_BUTTON, self.onProcessAction) self.board = pcbnew.GetBoard() self.modules = self.board.GetModules() self.SelectedModule = None self.SelectedPad = None self.PopulateModules()
def add_module(x, y): io = pcbnew.PCB_IO() board = pcbnew.GetBoard() layertable = get_layertable() footprint_lib = "/home/mattvenn/work/nfc-ring/python/fp.pretty" mod = io.FootprintLoad(footprint_lib, "matt") pt = pcbnew.wxPoint(x, y) mod.SetPosition(pt) board.Add(mod) pcbnew.Refresh()
def Run(self): _pcbnew_frame = \ filter(lambda w: w.GetTitle().lower().startswith('pcbnew'), wx.GetTopLevelWindows() )[0] # load board board = pcbnew.GetBoard() # check if there is anything selected all_tracks = board.GetTracks() selected_tracks = filter(lambda x: x.IsSelected(), all_tracks) all_zones = [] for zoneid in range(board.GetAreaCount()): all_zones.append(board.GetArea(zoneid)) selected_zones = filter(lambda x: x.IsSelected(), all_zones) all_modules = board.GetModules() selected_modules = filter(lambda x: x.IsSelected(), all_modules) # if anything is selected if len(selected_tracks) > 0 or len(selected_zones) > 0 or len(selected_modules) > 0: # show dialog dlg = DeleteLayoutDialog(_pcbnew_frame) res = dlg.ShowModal() # if user clicked OK if res == wx.ID_OK: if dlg.chkbox_tracks.GetValue(): for track in selected_tracks: board.RemoveNative(track) if dlg.chkbox_zones.GetValue(): for zone in selected_zones: board.RemoveNative(zone) if dlg.chkbox_modules.GetValue(): for mod in selected_modules: board.RemoveNative(mod) # if nothing is selected a messagebox else: caption = 'Delete selected' message = "Nothing is selected !" dlg = wx.MessageDialog(_pcbnew_frame, message, caption, wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() pass
def Run(self): #self.pcb = GetBoard() pcbObj = pcbnew.GetBoard() wx.LogMessage("ciao1") viaOffset = pcbnew.FromMM(2) viaPitch = pcbnew.FromMM(1) netId = pcbObj.GetHighLightNetCode() wx.LogMessage(str(netId)) layertable = {} numlayers = pcbnew.PCB_LAYER_ID_COUNT for i in range(numlayers): layertable[pcbnew.GetBoard().GetLayerName(i)] = i toplayer = layertable['F.Cu'] bottomlayer = layertable['B.Cu'] if (netId != -1): netTracks = pcbObj.TracksInNet(netId) wx.LogMessage("ciao1") trackList = [ [[t.GetStart()[0], t.GetStart()[1]], [t.GetEnd()[0], t.GetEnd()[1]]] for t in netTracks ] viaPoints = generateViaFence(trackList, viaOffset, viaPitch) for track in trackList: ## plt.plot(np.array(track).T[0], np.array(track).T[1], linewidth=1) #print track wx.LogMessage(str(track)) for via in viaPoints: ## plt.plot(via[0], via[1], 'o', markersize=10) newvia = pcbnew.VIA(pcbObj) pcbObj.Add(newvia) #newvia.SetNet(netId) #nc = net.GetNetClass() #newvia.SetWidth(nc.GetViaDiameter()) newvia.SetPosition(wxPoint(via[0],via[1])) #pad.GetCenter()) newvia.SetLayerPair(toplayer, bottomlayer) newvia.SetViaType(pcbnew.VIA_THROUGH) wx.LogMessage("via @: "+str(via[0])+";"+str(via[1])) #print via[0]; print via[1]) wx.LogMessage("ciao4")
def remove_gnd_tracks(pattern): """ Remove GND tracks between GND pads in each modules. @param pattern not used """ board = pcbnew.GetBoard() center_gnd_positions = [(sw.GetPosition().x, sw.GetPosition().y) for sw in ref_iter(board, pattern)] remove_tracks = [] for track in board.GetTracks(): pos = track.GetStart() start_pos = pos.x, pos.y if start_pos in center_gnd_positions: remove_tracks.append(track) for track in remove_tracks: board.Remove(track)
def OnFnished(self,event): board = pcbnew.GetBoard() ox,oy = board.GetAuxOrigin() for row in self.selected_attribute_parser: mod = board.FindModuleByReference(row["ref"]) if mod is not None: mod.SetPosition(pcbnew.wxPoint(int(ox+(1000000*row["x"])),int(oy+(-1000000*row["y"])))) mod.SetOrientationDegrees(row["rotation"]) if mod.IsFlipped(): if row["side"] == pick_place.attribute_parser.Side.TOP: mod.Flip(mod.GetPosition()) else: if row["side"] == pick_place.attribute_parser.Side.BOTTOM: mod.Flip(mod.GetPosition()) pcbnew.Refresh()
def CopyCourtyard(refs = None, brd = None, layer = pcbnew.F_Paste): ''' Copy board modules courtyard to the destination layer ''' if not brd: brd = pcbnew.GetBoard() if not refs: for m in brd.GetModules(): if m.GetReference().find('J') == -1: CopyModuleCourtyard(m, brd, layer) else: for ref in MakeRefs(refs): m = brd.FindModuleByReference(ref) if m: CopyModuleCourtyard(m, brd, layer) pcbnew.Refresh()
def __init__(self,fname=None): if fname == None: self.pcb = pcbnew.GetBoard() else: self.pcb=pcbnew.LoadBoard(fname) # Create new pcb layout with suffix "front-panel" self.panelFname=self.pcb.GetFileName().split(".kicad_pcb")[0]+"-front-panel.kicad_pcb" with open(self.pcb.GetFileName(),"r") as f: firstLine=f.readline()+")" #"x" --> No overwrite #"w" --> Overwrite with open(self.panelFname,"w") as f: f.write(firstLine) self.fp=pcbnew.LoadBoard(self.panelFname) self.getDimensions()
def Run(self): msg = "Loading Board\n" board = pcbnew.GetBoard() bbox = find_pcb_outline_bbox(board) center = bbox.Centre() # gndnet = find_net("GND") #remove all other nets #remove_all_nets_but("GND") msg += convert_and_delete_modules(center.x, pcbnew.F_Cu, board) msg += "\n" msg += "You may need to refresh the display now. Select Legacy mode, then Modern mode" + "\n"
def add_vias(): board = pcbnew.GetBoard() layertable = get_layertable() layertable = get_layertable() for x in range(0, 10 * SCALE, SCALE * 2): for y in range(0, 10 * SCALE, SCALE * 2): newvia = pcbnew.VIA(board) board.Add(newvia) newvia.SetLayerPair(layertable["F.Cu"], layertable["B.Cu"]) newvia.SetPosition(pcbnew.wxPoint(x, y)) newvia.SetViaType(pcbnew.VIA_THROUGH) newvia.SetWidth(1 * SCALE) pcbnew.Refresh()
def PlaceHoleCenter(typex=1, dim_cor=10): global g_startx global g_starty global g_width global g_height global hole_type x_coord = [0, 0] y_coord = [0, 0] if typex == 1: horizont = 1 vertic = 1 elif typex == 2: horizont = 1 vertic = 0 else: horizont = 0 vertic = 1 #horizontal holes board = pcbnew.GetBoard() global footprint_lib io = pcbnew.PCB_IO() point = pcbnew.wxPoint(0, 0) x_coord[0] = g_startx + g_width / 2 y_coord[0] = g_starty + dim_cor y_coord[1] = g_starty + g_height - dim_cor if horizont == 1: for yy in y_coord: mod = io.FootprintLoad(footprint_lib, hole_type) point.x = GetCoordinates(x_coord[0]) point.y = GetCoordinates(yy) mod.SetPosition(point) board.Add(mod) #vertical holes x_coord[0] = g_startx + dim_cor x_coord[1] = g_startx + g_width - dim_cor y_coord[0] = g_starty + g_height / 2 if vertic == 1: for xx in x_coord: mod = io.FootprintLoad(footprint_lib, hole_type) point.x = GetCoordinates(xx) point.y = GetCoordinates(y_coord[0]) mod.SetPosition(point) board.Add(mod) pcbnew.Refresh()
def CollectItemByName(filename=None): try: brd = pcbnew.LoadBoard(filename) except IOError: print 'Can not open ', filename filename = os.path.split( pcbnew.GetBoard().GetFileName())[0] + '\\' + filename print 'Try to open ', filename try: brd = pcbnew.LoadBoard(filename) except IOError: print 'Can not open ', filename return None bi = BoardItems() bi.Collect(brd) return bi
def GetOtherBoard(brd): r = brd curbrd = pcbnew.GetBoard() s = curbrd.GetFileName() if not brd: brd = curbrd elif type(brd) == str: if os.path.exists(brd): brd = pcbnew.LoadBoard(brd) elif os.path.exists(s[0:s.rfind('/')] + '/' + brd): brd = pcbnew.LoadBoard(s[0:s.rfind('/')] + '/' + brd) else: return None else: return brd return brd
def draw(): board = pcbnew.GetBoard() drawing = board.GetDrawings() offset = 1000000 for s, j in [(-1, 0), (1, offset / 2)]: for i in range(10): arc = pcbnew.DRAWSEGMENT(board) board.Add(arc) arc.SetShape(pcbnew.S_ARC) arc.SetCenter(pcbnew.wxPoint(j, 0)) arc.SetArcStart(pcbnew.wxPoint(s * (1000000 + offset * i), 0)) arc.SetAngle(1800) arc.SetLayer(0) arc.SetWidth(200000) board.Save(board.GetFileName()) pcbnew.Refresh()
def OnSMDpos(self, evt): num = self.list.GetCount() self.listData = [] for i in range(num): listvalue = self.list.GetString(i) self.listData.append(listvalue) board = pcbnew.GetBoard() posinfo, headinfo = KC().generalPosition(board) posinfo_filter = IgnoreHandle(self.listData, posinfo, VAL) KC().save_placement_info(board, posinfo_filter, headinfo, 'SMT') dlg = wx.MessageDialog(self, "完成", "aa", style=wx.OK) dlg.ShowModal() dlg.Destroy()
def MoveToLayer(pcb,layerId): found_selected=False for drw in pcb.GetDrawings(): if drw.IsSelected(): drw.SetLayer(layerId) found_selected=True if found_selected!=True: LogMsg="select drawings to be moved to new layer\n" LogMsg+="use GAL for selecting lines" wx.LogMessage(LogMsg) else: pcbnew.Refresh() layerName = pcbnew.GetBoard().GetLayerName(layerId) LogMsg="selected drawings moved to "+layerName+" layer" wx.LogMessage(LogMsg)