コード例 #1
0
ファイル: Form1.cs プロジェクト: ogamespec/psxdev
        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();
        }
コード例 #2
0
ファイル: Form1.cs プロジェクト: ogamespec/psxdev
        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);
                }
            }
        }
コード例 #3
0
ファイル: Form1.cs プロジェクト: ogamespec/psxdev
        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();
        }