コード例 #1
0
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)
コード例 #2
0
ファイル: klonorsch.py プロジェクト: Arie001/klonor-kicad
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)
コード例 #3
0
ファイル: libdict.py プロジェクト: tkuester/klonor-kicad
    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
コード例 #4
0
ファイル: fixsch.py プロジェクト: Arie001/klonor-kicad
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)
コード例 #5
0
ファイル: klonorbrd.py プロジェクト: Arie001/klonor-kicad
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)
コード例 #6
0
#!/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))
コード例 #7
0
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)
コード例 #8
0
ファイル: klonorbrd.py プロジェクト: tkuester/klonor-kicad
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)
コード例 #9
0
ファイル: stripdates.py プロジェクト: Arie001/klonor-kicad
#!/usr/bin/env python2.6
'''
Strip the dates out of schematic and library files for easier
interoperability with subversion.

Just run this before using subversion diff or checkin, and
unchanged files will remain unchanged.

'''

import os
import glob
import find_kipy
from kipy.fileobjs import LibFile, SchFile
from kipy.utility import FileAccess

root ='.'

for fn in glob.glob(os.path.join(root, '*-cache.lib')):
        fn = FileAccess(fn)
        lib = LibFile(fn)
        lib.topline = lib.topline.split(' Date: ')[0].strip()
        fn.write(lib)

for fn in glob.glob(os.path.join(root, '*.sch')):
        fn = FileAccess(fn)
        sch = SchFile(fn)
        sch.page_header.linetext = sch.page_header.linetext.split(' date ')[0].strip()
        fn.write(sch)
コード例 #10
0
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)