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
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)
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)
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)
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)
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) ]
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