public void FlipSelectedWires() { List <CanvasItem> selected = canvasControl1.GetSelected(); foreach (var item in selected) { if (item.UserData is WireMeta) { WireMeta meta = (WireMeta)item.UserData; meta.wire.Flip(); // Canvas item List <PointF> pathrev = new List <PointF>(); for (int i = item.Points.Count - 1; i >= 0; i--) { pathrev.Add(new PointF(item.Points[i].X, item.Points[i].Y)); } item.Points.Clear(); item.Points = pathrev; WireDirection(meta.wire, meta); } } canvasControl1.Invalidate(); }
public void WireDirection(LogisimConverter.LogisimWire wire, WireMeta meta) { if (meta.dir1 != null) { canvasControl1.RemoveItem(meta.dir1); } if (meta.dir2 != null) { canvasControl1.RemoveItem(meta.dir2); } // Direction Point last = wire.To(); Point prev = wire.path[wire.path.Count - 2]; int dx = 4; if (last.X == prev.X) { if (last.Y > prev.Y) { // Down meta.dir1 = new CanvasLine( new PointF(last.X, last.Y - 1), new PointF(last.X - dx, last.Y - dx), Color.Black); meta.dir2 = new CanvasLine( new PointF(last.X, last.Y - 1), new PointF(last.X + dx, last.Y - dx), Color.Black); canvasControl1.AddItem(meta.dir1); canvasControl1.AddItem(meta.dir2); } else { // Up meta.dir1 = new CanvasLine( new PointF(last.X, last.Y + 1), new PointF(last.X - dx, last.Y + dx), Color.Black); meta.dir2 = new CanvasLine( new PointF(last.X, last.Y + 1), new PointF(last.X + dx, last.Y + dx), Color.Black); canvasControl1.AddItem(meta.dir1); canvasControl1.AddItem(meta.dir2); } } else { if (last.X > prev.X) { // Right meta.dir1 = new CanvasLine( new PointF(last.X - 1, last.Y), new PointF(last.X - dx, last.Y - dx), Color.Black); meta.dir2 = new CanvasLine( new PointF(last.X - 1, last.Y), new PointF(last.X - dx, last.Y + dx), Color.Black); canvasControl1.AddItem(meta.dir1); canvasControl1.AddItem(meta.dir2); } else { // Left meta.dir1 = new CanvasLine( new PointF(last.X + 1, last.Y), new PointF(last.X + dx, last.Y - dx), Color.Black); meta.dir2 = new CanvasLine( new PointF(last.X + 1, last.Y), new PointF(last.X + dx, last.Y + dx), Color.Black); canvasControl1.AddItem(meta.dir1); canvasControl1.AddItem(meta.dir2); } } }
private void VisualizeLogisim(LogisimConverter.LogisimModel model) { canvasControl1.RemoveAllItems(); // Comps foreach (var comp in model.comps) { CanvasRect rect = new CanvasRect((PointF)comp.loc, LogisimConverter.CompSize, LogisimConverter.CompSize, Color.Gold); rect.Text = comp.name; if (comp.name == "Text") { // Skip labels continue; } else if (comp.name == "1") { rect.FrontColor = Color.Tomato; } else if (comp.name == "0") { rect.FrontColor = Color.LimeGreen; } #if DEBUG rect.Text += " #" + comp.id.ToString(); #endif canvasControl1.AddItem(rect); } // Wires foreach (var wire in model.wires) { List <PointF> path = new List <PointF>(); foreach (var p in wire.path) { path.Add(p); } CanvasPolyLine line = new CanvasPolyLine(path, 1, Color.Black); line.Text = wire.name; WireMeta meta = new WireMeta(); meta.wire = wire; line.UserData = meta; canvasControl1.AddItem(line); WireDirection(wire, meta); } // Vias foreach (var vias in model.viases) { CanvasPoint point = new CanvasPoint(vias.loc, 5, Color.Gold); #if DEBUG //point.Text = vias.id.ToString(); //point.TextColor = Color.DeepPink; #endif canvasControl1.AddItem(point); } canvasControl1.Invalidate(); }