Esempio n. 1
0
 def event_place(self, evt: ToolActionEvent):
     # New object with dummy net
     if self.toolparammodel.current_layer_pair is not None:
         v = Via(evt.world_pos, self.toolparammodel.current_layer_pair,
                 self.toolparammodel.via_radius, None)
         self.submit(UndoMerge(self.project, v, "Add Via"))
     pass
Esempio n. 2
0
    def mousePressEvent(self, evt):
        pt_screen = Point2(evt.pos())
        pt_world = Point2(self.view.viewState.tfV2W(pt_screen))

        # New object with dummy net
        if self.toolparammodel.current_layer_pair is not None:
            v = Via(pt_world, self.toolparammodel.current_layer_pair, self.toolparammodel.radius, None)
            self.project.artwork.merge_artwork(v)
Esempio n. 3
0
    def test_add_via(self):
        p = self.p
        l1 = S.Layer(name="Top", color=(1, 1, 1, 0))
        l2 = S.Layer(name="Bot", color=(1, 1, 1, 0))

        vp = S.ViaPair(l1, l2)

        p.stackup.add_layer(l1)
        p.stackup.add_layer(l2)

        p.stackup.add_via_pair(vp)

        n = Net()
        p.nets.add_net(n)
        via = Via(Point2(0, 0), vp, 1, net=n)
        p.artwork.add_artwork(via)
Esempio n. 4
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)
Esempio n. 5
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)
Esempio n. 6
0
    def get_artwork(self) -> Tuple[Optional[Via], List[Trace]]:
        if self.view.current_layer_hack() is None:
            return None, []

        layer = self.view.current_layer_hack()

        # If no last-point is set, we return a trace stub 'circle' to visualize where the trace will go
        if self.last_pt is None:
            return None, [
                Trace(self.cur_pt, self.cur_pt, self.toolsettings.thickness,
                      layer, None)
            ]

        initial_via = None

        # If previous layer and current layer are the same, no via needed
        if self.last_layer != layer:
            # Look for a viapair between the layer @ self.last_layer
            vp = self.project.stackup.via_pair_for_layers(
                [self.last_layer, layer])

            if vp is not None:
                initial_via = Via(self.last_pt, vp,
                                  self.toolsettings.via_radius)

        # Single straight trace
        if self.routing_mode == RoutingMode.STRAIGHT:
            return initial_via, [
                Trace(self.last_pt, self.cur_pt, self.toolsettings.thickness,
                      layer, None)
            ]

        # 90 degree bend
        elif self.routing_mode == RoutingMode._90:

            # position of bend point
            if self.routing_dir:
                pa = Vec2(self.last_pt.x, self.cur_pt.y)
            else:
                pa = Vec2(self.cur_pt.x, self.last_pt.y)

            return initial_via, [
                Trace(self.last_pt, pa, self.toolsettings.thickness, layer,
                      None),
                Trace(pa, self.cur_pt, self.toolsettings.thickness, layer,
                      None)
            ]

        elif self.routing_mode == RoutingMode._45:

            d_v = self.cur_pt - self.last_pt

            d_nv = d_v.dup()

            if abs(d_v.y) < abs(d_v.x):
                if d_nv.x > 0:
                    d_nv.x = abs(d_v.y)
                else:
                    d_nv.x = -abs(d_v.y)
            else:
                if d_nv.y > 0:
                    d_nv.y = abs(d_v.x)
                else:
                    d_nv.y = -abs(d_v.x)

            d_vh = d_v - d_nv

            if self.routing_dir:
                pa = self.last_pt + d_nv
            else:
                pa = self.last_pt + d_vh

            return initial_via, [
                Trace(self.last_pt, pa, self.toolsettings.thickness, layer,
                      None),
                Trace(pa, self.cur_pt, self.toolsettings.thickness, layer,
                      None)
            ]
Esempio n. 7
0
File: geom.py Progetto: pcbre/pcbre
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