luceda ipkiss教程 45:在版图上加LOGO

2023-12-13 16:54:24

**在设计版图时往往需要加上公司或者学校的LOGO,只需要LOGO的图片,通过代码就可以将LOGO加到版图上,比如:
在这里插入图片描述
**
通过代码可以得到版图上的LOGO:
!在这里插入图片描述
代码如下:

from si_fab import all as pdk
from ipkiss3 import all as i3

i3.TECH.PURPOSE.DF.POLYGON = i3.TECH.PURPOSE.DRAWING
i3.TECH.PROCESS.HFW = i3.TECH.PURPOSE.UNUSED

PIL_loaded = False
try:
    from PIL import Image

    PIL_loaded = True
except:
    pass

try:
    import Image

    PIL_loaded = True
except:
    pass


if not PIL_loaded:
    raise AssertionError(" PIL should be installed")


class BitmapGrating(i3.PCell):
    image = i3.DefinitionProperty()
    pixel = i3.ChildCellProperty()

    class Layout(i3.LayoutView):
        pixel_pitch = i3.Size2Property(default=(2.0, 2.0))

        def _generate_instances(self, insts):
            im = self.image
            w = im.size[0]
            h = im.size[1]
            pixels = im.getdata()

            period_x = self.pixel_pitch[0]
            period_y = self.pixel_pitch[1]

            for y in range(h):
                pen_down = False
                for x in range(w):
                    p = pixels[x + y * w]
                    if not pen_down:
                        if p == 0:
                            pen_down = True
                            start_x = x
                    elif not p == 0:
                        pen_down = False
                        n_x = x - start_x
                        if n_x > 1:
                            insts += i3.ARef(
                                reference=self.pixel,
                                origin=(start_x * period_x, -y * period_y),
                                period=(period_x, period_y),
                                n_o_periods=(n_x, 1),
                            )
                        else:
                            insts += i3.SRef(reference=self.pixel, position=(start_x * period_x, -y * period_y))
                if pen_down:
                    n_x = x - start_x + 1
                    if n_x > 1:
                        insts += i3.ARef(
                            reference=self.pixel,
                            origin=(start_x * period_x, -y * period_y),
                            period=(period_x, period_y),
                            n_o_periods=(n_x, 1),
                        )
                    else:
                        insts += i3.SRef(reference=self.pixel, position=(start_x * period_x, -y * period_y))

            return insts


class BitmapGratingFromFile(BitmapGrating):
    image = i3.LockedProperty()
    filename = i3.StringProperty()

    def _default_image(self):
        return Image.open(self.filename).convert("1")


class SquareBitmapGrating(BitmapGrating):
    pixel = i3.ChildCellProperty(locked=True)

    def _default_pixel(self):
        from picazzo3.phc.generic.holes import RectHole

        return RectHole(name="{}_pixel".format(self.name))

    class Layout(BitmapGrating.Layout):
        pixel_size = i3.Size2Property(default=(1.0, 1.0))
        layer = i3.LayerProperty(default=i3.TECH.PPLAYER.WG.TEXT)

        def _default_pixel(self):
            lv = self.cell.pixel.get_default_view(i3.LayoutView)
            lv.set(
                radii=(0.5 * self.pixel_size[0], 0.5 * self.pixel_size[1]),
                process=self.layer.process,
                purpose=self.layer.purpose,
            )
            return lv


class SquareBitmapGratingFromFile(BitmapGratingFromFile, SquareBitmapGrating):
    """Load a bitmap from file and convert it to a grating:
    SquareBitmapGratingFromFile(filename = "xxx", pixel_size = (x,y), pixel_pitch = (x,y))
    """

    pass
if __name__ == '__main__':
    logo = SquareBitmapGratingFromFile(name="logo_fudan", filename="fudan.png")
    logo_layout = logo.Layout(pixel_size=(1.5, 1.5), pixel_pitch=(3.0, 3.0))
    logo_layout.visualize()

文章来源:https://blog.csdn.net/qq_34316088/article/details/134903560
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。