def mouseReleaseEvent(self, evt): pt = self.view.viewState.tfV2W(Point2(evt.pos())) aw = self.project.artwork.query_point(pt) aw_l = layer_for(aw) if aw is None: return if self.state == self.STATE_IDLE: self.pt0 = pt self.pt0_layer = aw_l self.state = self.STATE_WAIT_ADTL_POINT elif self.state == self.STATE_WAIT_ADTL_POINT: aw = Airwire(self.pt0, pt, self.pt0_layer, aw_l, None) self.project.artwork.merge_artwork(aw) # Here is where we emit the airwire if evt.modifiers() & QtCore.Qt.ShiftModifier: self.pt0 = pt self.pt0_layer = aw_l else: self.state = self.STATE_IDLE self.changed.emit()
def test_airwires(self): p = self.__setup_via_pairs_layers() n1 = Net() p.nets.add_net(n1) v = Via(Point2(3700, 2100), p.stackup.via_pairs[0], 31337, n1) v2 = Via(Point2(1234, 5678), p.stackup.via_pairs[1], 31339, n1) airwire = Airwire(v.pt, v2.pt, v.viapair.layers[0], v2.viapair.layers[0], n1) p.artwork.add_artwork(v) p.artwork.add_artwork(v2) p.artwork.add_artwork(airwire) p_new = self.__saverestore(p) aw_new = list(p_new.artwork.airwires)[0] v2_new = sorted(p_new.artwork.vias, key=lambda x: x.pt.x)[0] v_new = sorted(p_new.artwork.vias, key=lambda x: x.pt.x)[1] self.cmpMat(aw_new.p0, airwire.p0) self.cmpMat(aw_new.p1, airwire.p1) self.assertEqual(aw_new.p0_layer, v_new.viapair.layers[0]) self.assertEqual(aw_new.p1_layer, v2_new.viapair.layers[0]) self.assertEqual(aw_new.net, v_new.net)
def event_place(self, event): pt = event.world_pos # Find artwork aw = self.view.query_point(pt) # layer for the artwork aw_l = layer_for(aw) # No layer (no artwork) if aw is None: return if self.state == self.STATE_IDLE: self.pt0 = pt self.pt0_layer = aw_l self.state = self.STATE_WAIT_ADTL_POINT elif self.state == self.STATE_WAIT_ADTL_POINT: aw = Airwire(self.pt0, pt, self.pt0_layer, aw_l, None) self.submit(UndoMerge(self.project, aw, "Add Airwire")) self.state = self.STATE_IDLE self.changed.emit()
def test_remove_other_ep(self): airwire = Airwire(Point2(200, 201), Point2(50, 7000), self.top_layer, self.bottom_layer, None) self.p.artwork.merge_artwork(airwire) self.assertIn(airwire, self.p.artwork.airwires) self.p.artwork.remove_artwork(self.trace_bot) # Removal of endpoint geom should result in removal of airwire self.assertNotIn(airwire, self.p.artwork.airwires)
def test_basic_join(self): airwire = Airwire(Point2(200, 201), Point2(51, 7000), self.top_layer, self.bottom_layer, None) self.p.artwork.merge_artwork(airwire) # Validate airwire addition causes add self.assertEqual(self.trace_top.net, self.trace_bot.net) self.assertEqual(self.trace_top.net, airwire.net) self.p.artwork.remove_artwork(airwire) # Validate airwire removal causes unjoin self.assertNotEqual(self.trace_top.net, self.trace_bot.net)
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)