def main(): oparser = initOptions() (opts, args) = oparser.parse_args() fn = opts.macrosch outfn = opts.schout xcopies = opts.xclones ycopies = opts.yclones xsize = opts.xsize ysize = opts.ysize if (fn == None) or (outfn == None): oparser.exit('File names must be specified, --help for help') if xcopies + ycopies == 0: oparser.exit('Specify more than zero copies in X and/or Y dimensions') if (xcopies > 0) and (xsize == 0): oparser.exit( 'Specify xsize of a clone in magic KiCad units, e.g. 8000; --help for help' ) if (ycopies > 0) and (ysize == 0): oparser.exit( 'Specify ysize of a clone in magic KiCad units, e.g. 2000; --help for help' ) print 'Going to make %s copies along X axis with spacing of %s' % (xcopies, xsize) print 'Going to make %s copies along Y axis with spacing of %s' % (ycopies, ysize) fn = FileAccess(fn) sch = SchFile(fn) newitems = [] for item in sch.items: clown = -1 for y in xrange(ycopies + 1): if y == ycopies: continue for x in xrange(xcopies + 1): clown = clown + 1 ii = CloneItem(item).items[0] newRefDes(item, ii, x, y + 1, xsize, ysize, clown) newitems.append(ii) sch.items = sch.items + newitems print 'Saving result to ', outfn output = FileAccess(outfn) output.write(sch)
def findlibs(self, cfgfile, projfname): if projfname is not None: projdir = projfname[-1] libdirs = [projdir] libdirs.extend(str(cfgfile.eeschema.libdir).split(';')) libdirs.append(kicad_root) libdirs = [FileAccess(x) for x in libdirs if x] libdirs[-1] |= 'library' liblist = cfgfile.eeschema.libraries liblist = [(x, getattr(liblist, x)) for x in liblist] for x in liblist: assert x[0].lower().startswith('libname') liblist = [(int(x[0][7:]), x[1]) for x in liblist] badlibs = [] # Check most important library first, in case components in more than one lib # Figure out which one of these to do at some point: # for sortorder, libname in reversed(sorted(liblist)): for sortorder, libname in sorted(liblist): libname = libname + '.lib' for testdir in libdirs: testname = testdir | libname if testname.exists: break else: badlibs.append(libname) continue yield testname if projfname is not None: cache_prefix = projdir | projfname.basename[:-4] for cache_suffix in ('-cache.lib', '.cache.lib'): cachelib = cache_prefix + cache_suffix if cachelib.exists: yield cachelib break if badlibs: warning = ( 'Warning: Could not find libraries:\n' + ' %s\n In path list:\n %s' % ('\n '.join(badlibs), '\n '.join(libdirs))) if self.warnlist: self.warnlist.append(warning) else: print warning
#!/usr/bin/env python2.6 ''' Create version of library files with the DRAW information sorted alphabetically for easier comparison between modified libraries. ''' import os import glob import find_kipy from kipy.utility import FileAccess from kipy.fileobjs.paths import kicad_lib_root from kipy.fileobjs import LibFile myproj = '.' dumpdir = FileAccess('sorted_lib') try: os.makedirs(dumpdir) except: pass for root in (myproj, kicad_lib_root): for fn in glob.glob(os.path.join(root, '*.lib')): fn = FileAccess(fn) lib = LibFile(fn) for comp in lib: comp.draw.sort(key=lambda x: str(x).upper()) (dumpdir | fn.basename).write(str(lib))
I had a schematic where my resistor parts had the values in the footprint field (because I incorrectly defined the library part). So this script replaces 'res' fields with the footprint fields. ''' import os import glob import find_kipy from kipy.fileobjs import SchFile from kipy.utility import FileAccess root = '.' for fn in glob.glob(os.path.join(root, '*.sch')): fn = FileAccess(fn) sch = SchFile(fn) changed = False for item in sch.items: if not isinstance(item, sch.Component): continue fields = item.fields if fields[1][0] == 'RES': fields[1] = fields[2] fields[2] = None changed = True if changed: fn.write(sch)
def main(): templateX = 20 oparser = initOptions() (opts, args) = oparser.parse_args() schfn = opts.macrosch brdfn = opts.brdin outfn = opts.brdout if (schfn == None) or (brdfn == None) or (outfn == None): oparser.exit('All three command-line arguments must be specified') sch = SchFile(FileAccess(schfn)) brd = BrdFile(FileAccess(brdfn)) print 'hello.jpg' # build a list of modules that are supposed to be placed in the template originalModRefs = [] clonedModRefs = [] for schi in sch.items: if schi.__class__ == Component: originalModRefs.append(schi.refdes) for suff in xrange(100): clonedModRefs.append(subRefDes(schi.refdes, suff)) print 'originalModRefs=', len(originalModRefs) print 'clonedModRefs=', len(clonedModRefs) templateMods = [] relocateMods = [] tracks = [] for placed in brd.items: if placed.__class__ == Module: if placed.refdes in originalModRefs: templateMods.append(placed) elif placed.refdes in clonedModRefs: relocateMods.append(placed) elif placed.__class__ == Track: track = placed elif placed.__class__ == CZoneOutline: if placed.layer == 25: print 'Found zone that defines the tracks to clone' zone = placed print 'templateMods=', len(templateMods) print 'relocateMods=', len(relocateMods) print 'tracks=', len(tracks) topleft = [10000, 10000] bottomright = [-1, -1] for c in zone.corners: if c[0] < topleft[0]: topleft[0] = c[0] if c[1] < topleft[1]: topleft[1] = c[1] if c[0] > bottomright[0]: bottomright[0] = c[0] if c[1] > bottomright[1]: bottomright[1] = c[1] print 'Found clone zone: (%s,%s)-(%s,%s)' % tuple(topleft + bottomright) templateX = (bottomright[0] - topleft[0]) print 'Using width %s as X offset for the clones' % templateX nclones = 0 nclonesmax = 20 for relocate in relocateMods: for template in templateMods: for x in xrange(nclonesmax): refdes = subRefDes(template.refdes, x) if refdes == relocate.refdes: #print 'refdes=', relocate.refdes if (x + 1) > nclones: nclones = x + 1 move(relocate, template.xpos + (x + 1) * templateX, template.ypos, template.orientation) print 'nclones=', nclones newpos = [] newdes = [] for po, de in zip(track.po, track.de): newpos.append(po) newdes.append(de) if (po.xstart > topleft[0]) and (po.ystart > topleft[1]) and \ (po.xend < bottomright[0]) and (po.yend < bottomright[1]): for x in xrange(nclones): newdes.append(de.clone()) newpo = po.clone() newpo.xstart = po.xstart + (x + 1) * templateX newpo.xend = po.xend + (x + 1) * templateX newpos.append(newpo) track.po = newpos track.de = newdes print 'Saving output to ', outfn output = FileAccess(outfn) output.write(brd)
def main(): mySVG = svg(0, 0, width="100%", height="100%") #~ proj = Project(projname) #~ if proj.topschfname: #~ try: #~ sch = ParseSchematic(proj) #~ if not proj.netfn.exists: #~ print "Netlist file %s not found" % proj.netfn #~ continue #~ netlistf = kicadnet.NetInfo(proj.netfn) #~ netlistf.checkparsed(sch.netinfo) #~ except Exception: #~ print traceback.format_exc() fn = FileAccess(schpath) sch = SchFile(fn) #~ printContents(sch) # iterate through items in sch, generate svg elements dbg = True for item in sch.items: if isinstance(item, sch.NoConn): if dbg: print "NoConn: ", item.posx, item.posy radius = 50 # radius in mils - just an indicator c = getCircle(item.posx, item.posy, radius, linewidth=0, fillcol='black') mySVG.addElement(c) if isinstance(item, sch.Connection): if dbg: print "Connection: ", item.posx, item.posy radius = 50 # radius in mils - just an indicator c = getCircle(item.posx, item.posy, radius, linewidth=2) mySVG.addElement(c) if isinstance(item, sch.Wire): # wiretype: Notes Line or Wire Line if dbg: print "Wire: ", item.startx, item.starty, item.endx, item.endy, item.wiretype myStyle = StyleBuilder() myStyle.setStrokeWidth(2) myStyle.setStroke('black') ci = numpy.array([item.startx, item.starty, item.endx, item.endy ]) * mils2inch l = line("%fin" % (ci[0]), "%fin" % (ci[1]), "%fin" % (ci[2]), "%fin" % (ci[3])) l.set_style(myStyle.getStyle()) mySVG.addElement(l) if isinstance(item, sch.Text): # texttype: Label if dbg: print "Text: ", item.style, item.orientation, item.text, item.posx, item.posy, item.texttype, item.size t = getText(item.text, item.posx, item.posy, item.size) mySVG.addElement(t) if isinstance(item, sch.Component): if dbg: print "Component: ", item.subpart, item.parttype, item.timestamp, item.altref, item.variant, item.transform, item.redundant_num, item.posx, item.posy, item.parsestate, item.refdes rsize = 500 # square size in mils - just an indicator r = getRect(item.posx, item.posy, rsize, rsize, linewidth=2) mySVG.addElement(r) for field in item.fields: i_xpos = field[2] i_ypos = field[3] i_fontsize = field[4] i_extranum = field[5] if field[0] == item.refdes: if dbg: print ".. refdes", field[ 0], i_xpos, i_ypos, i_fontsize, i_extranum t = getText(field[0], i_xpos, i_ypos, i_fontsize) mySVG.addElement(t) elif field[0] == item.parttype: if dbg: print ".. parttype", field[ 0], i_xpos, i_ypos, i_fontsize, i_extranum t = getText(field[0], i_xpos, i_ypos, i_fontsize) mySVG.addElement(t) else: if dbg: print ".. pcbdes", field[ 0], i_xpos, i_ypos, i_fontsize, i_extranum t = getText(field[0], i_xpos, i_ypos, i_fontsize) mySVG.addElement(t) #~ t=text("pySVG", x=0,y=100) #~ group=g() #~ group.set_transform("rotate(-30)") #~ t.set_stroke_width('1px') #~ t.set_stroke('#00C') #~ t.set_fill('none') #~ t.set_font_size("36") #~ group.addElement(t) #~ mySVG.addElement(group) #~ print mySVG.getXML() mySVG.save(svgpath)