Beispiel #1
0
    def test_intersect(self):
        p = Polygon(self.l1, self.ext1)
        p2 = Polygon(self.l1, self.ext2)
        p3 = Polygon(self.l1, self.ext3)

        d = distance(p, p2)
        self.assertLessEqual(d, 0)

        d = distance(p2, p3)
        self.assertLessEqual(d, 0)

        d1 = distance(p, p3)
        self.assertGreater(d1, 0)
Beispiel #2
0
def dist_polygon_pad(poly: Polygon, pad: 'Pad') -> float:
    if not pad.is_through():
        if pad.layer != poly.layer:
            return float("inf")

    # ignoring typing here since we don't have stubs for the polygon lib
    return poly.get_poly_repr().distance(pad.get_poly_repr())  # type: ignore
Beispiel #3
0
    def test_inner_ring(self):
        ext = [Point2(0, 0), Point2(10, 0), Point2(10, 10), Point2(0, 10)]
        inner = [Point2(3, 3), Point2(7, 3), Point2(7, 7), Point2(3, 7)]

        inner2 = [Point2(4, 4), Point2(6, 4), Point2(6, 6), Point2(4, 6)]

        outer_ring = Polygon(self.l1, ext, [inner])
        inner_ring = Polygon(self.l1, inner2)

        self.assertAlmostEqual(distance(outer_ring, inner_ring), 1)

        outer_ring.get_tris_repr()
        inner_ring.get_tris_repr()
Beispiel #4
0
    def test_polyons(self):
        p = self.__setup_via_pairs_layers()
        n1 = Net()
        p.nets.add_net(n1)
        n2 = Net()
        p.nets.add_net(n2)

        ext = [Point2(0,0), Point2(10,0), Point2(10,10), Point2(0, 10)]
        int1 = [Point2(1,1), Point2(2,1), Point2(2,2), Point2(1,2)]
        int2 = [Point2(4,1), Point2(5,1), Point2(5,2), Point2(4,2)]


        po = Polygon(p.stackup.layers[0], ext, [int1, int2], n1)

        p.artwork.add_artwork(po)

        p_new = self.__saverestore(p)

        pols = p_new.artwork.polygons

        self.assertEqual(len(pols), 1)
        pol_new = list(pols)[0]
        self.assertIsInstance(pol_new, Polygon)

        r = pol_new.get_poly_repr()

        # All LineRings contain the first element as the last, so we drop during the comparison

        pb = po.get_poly_repr()
        self.assertListEqual(list(r.exterior.coords), [tuple(i) for i in pb.exterior.coords])
        interiors = r.interiors
        self.assertEqual(len(interiors), 2)
        self.assertListEqual(list(interiors[0].coords), [tuple(i) for i in pb.interiors[0].coords])
        self.assertListEqual(list(interiors[1].coords), [tuple(i) for i in pb.interiors[1].coords])

        self.assertIsNotNone(pol_new.net)
        self.assertIsNotNone(pol_new.layer)
Beispiel #5
0
    def deserialize(self, msg: ser.Artwork) -> None:
        for i_via in msg.vias:
            v = Via(deserialize_point2(i_via.point),
                    self.__project.scontext.get(i_via.viapairSid), i_via.r,
                    self.__lookup_net_helper(i_via.netSid))

            self.add_artwork(v)

        for i_trace in msg.traces:
            t = Trace(deserialize_point2(i_trace.p0),
                      deserialize_point2(i_trace.p1), i_trace.thickness,
                      self.__project.scontext.get(i_trace.layerSid),
                      self.__lookup_net_helper(i_trace.netSid))
            self.add_artwork(t)

        for i_poly in msg.polygons:
            exterior = [deserialize_point2(j) for j in i_poly.exterior]
            interiors = [[deserialize_point2(k) for k in j]
                         for j in i_poly.interiors]

            p = Polygon(self.__project.scontext.get(i_poly.layerSid), exterior,
                        interiors, self.__lookup_net_helper(i_poly.netSid))

            self.add_artwork(p)

        for i_airwire in msg.airwires:
            aw = Airwire(deserialize_point2(i_airwire.p0),
                         deserialize_point2(i_airwire.p1),
                         self.__project.scontext.get(i_airwire.p0LayerSid),
                         self.__project.scontext.get(i_airwire.p1LayerSid),
                         self.__project.scontext.get(i_airwire.netSid))
            self.add_artwork(aw)

        for i_cmp in msg.components:
            if i_cmp.which() == "dip":
                cmp = DIPComponent.deserialize(self.__project, i_cmp)
            elif i_cmp.which() == "sip":
                cmp = SIPComponent.deserialize(self.__project, i_cmp)

            elif i_cmp.which() == "smd4":
                cmp = SMD4Component.deserialize(self.__project, i_cmp)
            elif i_cmp.which() == "passive2":
                cmp = Passive2Component.deserialize(self.__project, i_cmp)
            else:
                raise NotImplementedError()

            self.add_component(cmp)
Beispiel #6
0
    def test_inner_ring(self):
        ext = [Point2(0,0), Point2(10, 0), Point2(10, 10), Point2(0, 10)]
        inner = [Point2(3,3), Point2(7, 3), Point2(7, 7), Point2(3, 7)]

        inner2 = [Point2(4,4), Point2(6, 4), Point2(6, 6), Point2(4, 6)]

        outer_ring = Polygon(self.l1, ext, [inner])
        inner_ring = Polygon(self.l1, inner2)

        self.assertAlmostEqual(distance(outer_ring, inner_ring), 1)

        outer_ring.get_tris_repr()
        inner_ring.get_tris_repr()
Beispiel #7
0
    def deserialize(self, msg):
        for i in msg.vias:
            v = Via(deserialize_point2(i.point),
                    self.__project.scontext.get(i.viapairSid), i.r,
                    self.__project.scontext.get(i.netSid))

            self.add_artwork(v)

        for i in msg.traces:
            t = Trace(deserialize_point2(i.p0), deserialize_point2(i.p1),
                      i.thickness, self.__project.scontext.get(i.layerSid),
                      self.__project.scontext.get(i.netSid))

            self.add_artwork(t)

        for i in msg.polygons:
            exterior = [deserialize_point2(j) for j in i.exterior]
            interiors = [[deserialize_point2(k) for k in j]
                         for j in i.interiors]

            p = Polygon(self.__project.scontext.get(i.layerSid), exterior,
                        interiors, self.__project.scontext.get(i.netSid))

            self.add_artwork(p)

        for i in msg.airwires:
            aw = Airwire(deserialize_point2(i.p0), deserialize_point2(i.p1),
                         self.__project.scontext.get(i.p0LayerSid),
                         self.__project.scontext.get(i.p1LayerSid),
                         self.__project.scontext.get(i.netSid))
            self.add_artwork(aw)

        for i in msg.components:
            if i.which() == "dip":
                cmp = DIPComponent.deserialize(self.__project, i)
            elif i.which() == "smd4":
                cmp = SMD4Component.deserialize(self.__project, i)
            else:
                raise NotImplementedError()

            self.add_component(cmp)
Beispiel #8
0
    def test_separate_layers(self):
        p = Polygon(self.l1, self.ext1)
        p2 = Polygon(self.l2, self.ext2)

        self.assertGreater(distance(p, p2), 0)
Beispiel #9
0
def dist_polygon_via(p: Polygon, v: Via) -> float:
    if p.layer not in v.viapair.all_layers:
        return float("inf")

    # ignoring typing here since we don't have stubs for the polygon lib
    return p.get_poly_repr().distance(v.get_poly_repr())  # type: ignore
Beispiel #10
0
def dist_polygon_polygon(p1: Polygon, p2: Polygon) -> float:
    if p1.layer != p2.layer:
        return float("inf")

    # ignoring typing here since we don't have stubs for the polygon lib
    return p1.get_poly_repr().distance(p2.get_poly_repr())  # type: ignore
Beispiel #11
0
def pt_inside_polygon(poly: Polygon, pt: Vec2) -> bool:
    pt = ShapelyPoint(pt)
    # ignoring typing because there's no stubs for polygon
    return poly.get_poly_repr().intersects(pt)  # type: ignore