Пример #1
0
        public static void Reconnect(ICanvas canvas,
            ILine line, IElement splitPin,
            double x, double y,
            List<Connection> connections,
            ILine currentLine,
            IDiagramCreator creator)
        {
            var wire1 = connections[0].Wires.FirstOrDefault();
            var wire2 = connections[1].Wires.FirstOrDefault();
            var startRoot = (wire1.Start != null ? wire1.Start : wire2.Start) as IElement;
            var endRoot = (wire1.End != null ? wire1.End : wire2.End) as IElement;

            PointEx start;
            PointEx end;
            GetLocation(wire1, wire2, out start, out end);

            if (start != null && end != null)
            {
                var startLine = Connect(canvas, startRoot, currentLine, start.X, start.Y, creator);
                var splitLine = Connect(canvas, splitPin, startLine, x, y, creator);
                var endLine = Connect(canvas, splitPin, splitLine, x, y, creator);

                Connect(canvas, endRoot, endLine, start.X + end.X, start.Y + end.Y, creator);

                startLine.SetStartVisible(line.GetStartVisible());
                startLine.SetStartIO(line.GetStartIO());
                endLine.SetEndVisible(line.GetEndVisible());
                endLine.SetEndIO(line.GetEndIO());
            }
            else
            {
                throw new InvalidOperationException("LineEx must have Start and End points.");
            }
        }
Пример #2
0
        public static void Redo(ICanvas canvas, IDiagramCreator creator, bool pushUndo)
        {
            var history = Get(canvas);
            var undo    = history.Undo;
            var redo    = history.Redo;

            if (redo.Count <= 0)
            {
                return;
            }

            // save current model
            if (pushUndo == true)
            {
                var current = ModelEditor.GenerateDiagram(canvas, null, canvas.GetProperties());
                undo.Push(current);
            }

            // restore previous model
            var model = redo.Pop();

            ModelEditor.Clear(canvas);
            ModelEditor.Parse(model,
                              canvas, creator,
                              0, 0,
                              false, true, false, true);

            NotifyCanvasHistoryChanged(new CanvasHistoryChangedEventArgs()
            {
                Canvas = canvas,
                Undo   = undo,
                Redo   = redo
            });
        }
        public static TreeItemType SwitchItems(ICanvas canvas,
                                               IDiagramCreator creator,
                                               ITreeItem oldItem,
                                               ITreeItem newItem,
                                               Action <DiagramProperties> setProperties)
        {
            if (newItem == null)
            {
                return(TreeItemType.None);
            }

            var oldItemType = GetTreeItemType(oldItem == null ? null : oldItem.GetUid());
            var newItemType = GetTreeItemType(newItem == null ? null : newItem.GetUid());

            if (oldItemType == TreeItemType.Diagram)
            {
                ModelEditor.Store(canvas, oldItem);
            }

            if (newItemType == TreeItemType.Diagram)
            {
                ModelEditor.Load(canvas, creator, newItem);

                if (setProperties != null)
                {
                    setProperties(canvas.GetProperties());
                }
            }

            return(newItemType);
        }
Пример #4
0
        public static void Reconnect(ICanvas canvas,
                                     ILine line, IElement splitPin,
                                     double x, double y,
                                     List <Connection> connections,
                                     ILine currentLine,
                                     IDiagramCreator creator)
        {
            var wire1     = connections[0].Wires.FirstOrDefault();
            var wire2     = connections[1].Wires.FirstOrDefault();
            var startRoot = (wire1.Start != null ? wire1.Start : wire2.Start) as IElement;
            var endRoot   = (wire1.End != null ? wire1.End : wire2.End) as IElement;

            PointEx start;
            PointEx end;

            GetLocation(wire1, wire2, out start, out end);

            if (start != null && end != null)
            {
                var startLine = Connect(canvas, startRoot, currentLine, start.X, start.Y, creator);
                var splitLine = Connect(canvas, splitPin, startLine, x, y, creator);
                var endLine   = Connect(canvas, splitPin, splitLine, x, y, creator);

                Connect(canvas, endRoot, endLine, start.X + end.X, start.Y + end.Y, creator);

                startLine.SetStartVisible(line.GetStartVisible());
                startLine.SetStartIO(line.GetStartIO());
                endLine.SetEndVisible(line.GetEndVisible());
                endLine.SetEndIO(line.GetEndIO());
            }
            else
            {
                throw new InvalidOperationException("LineEx must have Start and End points.");
            }
        }
        public static IElement AndGate(ICanvas canvas, IPoint point, IDiagramCreator creator, bool snap)
        {
            var thumb = creator.CreateElement(Constants.TagElementAndGate,
                                              new object[] { canvas.GetCounter().Next() },
                                              point.X, point.Y, snap) as IThumb;

            canvas.Add(thumb);

            return(thumb);
        }
Пример #6
0
        public static IElement Pin(ICanvas canvas, IPoint point, IDiagramCreator creator, bool snap)
        {
            var thumb = creator.CreateElement(Constants.TagElementPin,
                new object[] { canvas.GetCounter().Next() },
                point.X, point.Y, snap) as IThumb;

            canvas.Add(thumb);

            return thumb;
        }
Пример #7
0
        public static void Load(ICanvas canvas, IDiagramCreator creator, ITreeItem item)
        {
            var tag = item.GetTag();

            Clear(canvas);

            if (tag != null)
            {
                LoadFromTag(canvas, creator, tag);
            }
        }
Пример #8
0
        public static void LoadFromTag(ICanvas canvas, IDiagramCreator creator, object tag)
        {
            var diagram = tag as Diagram;

            canvas.SetTag(diagram.History);

            Parse(diagram.Model,
                  canvas, creator,
                  0, 0,
                  false, true, false, true);
        }
Пример #9
0
        public static void SetGrid(ICanvas canvas, IDiagramCreator creator)
        {
            var prop = canvas.GetProperties();

            creator.CreateGrid(prop.GridOriginX,
                               prop.GridOriginY,
                               prop.GridWidth,
                               prop.GridHeight,
                               prop.GridSize);

            canvas.SetWidth(prop.PageWidth);
            canvas.SetHeight(prop.PageHeight);
        }
Пример #10
0
        public static ILine Connect(ICanvas canvas, IElement root, ILine line, double x, double y, IDiagramCreator creator)
        {
            var rootTag = root.GetTag();
            if (rootTag == null)
                root.SetTag(new Connection(root, new List<Wire>()));

            var connection = root.GetTag() as Connection;
            var wires = connection.Wires;

            if (line == null)
                return FirstConnection(canvas, root, x, y, wires, creator);
            else
                return SecondConnection(root, line, x, y, wires);
        }
Пример #11
0
        public static TreeSolution Parse(string model,
                                         ICanvas canvas, IDiagramCreator creator,
                                         double offsetX, double offsetY,
                                         bool appendIds, bool updateIds,
                                         bool select,
                                         bool createElements)
        {
            var parser = new Parser();

            var options = new ParseOptions()
            {
                OffsetX                                   = offsetX,
                OffsetY                                   = offsetY,
                AppendIds                                 = appendIds,
                UpdateIds                                 = updateIds,
                Select                                    = select,
                CreateElements                            = createElements,
                Counter                                   = canvas != null?canvas.GetCounter() : null,
                                               Properties = canvas != null?canvas.GetProperties() : null
            };

            var temp = creator.GetCanvas();

            creator.SetCanvas(canvas);

            var result = parser.Parse(model, creator, options);

            creator.SetCanvas(temp);

            if (updateIds == true)
            {
                canvas.SetCounter(options.Counter);
            }

            if (createElements == true)
            {
                canvas.SetProperties(options.Properties);
            }

            return(result);
        }
Пример #12
0
        private void Connect(ICanvas canvas, IThumb pin, IDiagramCreator creator)
        {
            if (pin == null)
            {
                return;
            }

            Context.CurrentRoot = pin.GetParent() as IThumb;

            double x;
            double y;

            ModelEditor.GetPinPosition(Context.CurrentRoot, pin, out x, out y);

            Context.CurrentLine = WireEditor.Connect(canvas,
                                                     Context.CurrentRoot, Context.CurrentLine,
                                                     x, y,
                                                     creator);

            if (Context.CurrentLine == null)
            {
                Context.CurrentRoot = null;
            }
        }
Пример #13
0
        public static void Undo(ICanvas canvas, IDiagramCreator creator, bool pushRedo)
        {
            var history = Get(canvas);
            var undo = history.Undo;
            var redo = history.Redo;

            if (undo.Count <= 0)
                return;

            // save current model
            if (pushRedo == true)
            {
                var current = ModelEditor.GenerateDiagram(canvas, null, canvas.GetProperties());
                redo.Push(current);
            }

            // restore previous model
            var model = undo.Pop();

            ModelEditor.Clear(canvas);
            ModelEditor.Parse(model,
                canvas, creator,
                0, 0,
                false, true, false, true);

            NotifyCanvasHistoryChanged(new CanvasHistoryChangedEventArgs()
            {
                Canvas = canvas,
                Undo = undo,
                Redo = redo
            });
        }
        public TreeSolution Parse(string model, IDiagramCreator creator, ParseOptions options)
        {
            if (model == null || creator == null || options == null)
            {
                return(null);
            }

            double       offsetX        = options.OffsetX;
            double       offsetY        = options.OffsetY;
            bool         appendIds      = options.AppendIds;
            bool         updateIds      = options.UpdateIds;
            bool         select         = options.Select;
            bool         createElements = options.CreateElements;
            string       name           = null;
            string       root           = null;
            var          counter        = new IdCounter();
            var          total          = new IdCounter();
            var          elements       = new List <object>();
            Child        child          = null;
            var          dict           = new Dictionary <string, Child>();
            TreeSolution solution       = null;
            TreeProjects projects       = null;
            TreeProject  project        = null;
            TreeDiagrams diagrams       = null;
            TreeDiagram  diagram        = null;

            var lines = model.Split(Environment.NewLine.ToCharArray(),
                                    StringSplitOptions.RemoveEmptyEntries);

            foreach (var line in lines)
            {
                var args = GetArgs(line);

                int length = args.Length;
                if (length < 2)
                {
                    continue;
                }

                root = args[0];
                name = args[1];

                // root element
                if (StringUtil.Compare(root, Constants.PrefixRoot))
                {
                    // Solution
                    if (StringUtil.StartsWith(name, Constants.TagHeaderSolution) &&
                        (length == 2 || length == 3 || length == 4))
                    {
                        int id = int.Parse(name.Split(Constants.TagNameSeparator)[1]);
                        counter.Set(Math.Max(counter.Count, id + 1));

                        total.Next();

                        string tagFileName   = (length == 3) ? args[2] : null;
                        string tableFileName = (length == 4) ? args[3] : null;

                        projects = new TreeProjects();
                        solution = new TreeSolution(name, tagFileName, tableFileName, projects);
                    }

                    // Project
                    else if (StringUtil.StartsWith(name, Constants.TagHeaderProject) &&
                             length == 2)
                    {
                        int id = int.Parse(name.Split(Constants.TagNameSeparator)[1]);
                        counter.Set(Math.Max(counter.Count, id + 1));

                        total.Next();

                        if (projects != null)
                        {
                            diagrams = new TreeDiagrams();
                            project  = new TreeProject(name, diagrams);
                            projects.Push(project);
                        }
                    }

                    // Diagram
                    else if (StringUtil.StartsWith(name, Constants.TagHeaderDiagram) &&
                             length == 13)
                    {
                        int id = int.Parse(name.Split(Constants.TagNameSeparator)[1]);
                        counter.Set(Math.Max(counter.Count, id + 1));

                        total.Next();

                        if (diagrams != null)
                        {
                            diagram = new TreeDiagram();
                            diagrams.Push(diagram);
                            diagram.Push(line);
                        }

                        if (createElements == true)
                        {
                            var prop = new DiagramProperties();

                            prop.PageWidth   = int.Parse(args[2]);
                            prop.PageHeight  = int.Parse(args[3]);
                            prop.GridOriginX = int.Parse(args[4]);
                            prop.GridOriginY = int.Parse(args[5]);
                            prop.GridWidth   = int.Parse(args[6]);
                            prop.GridHeight  = int.Parse(args[7]);
                            prop.GridSize    = int.Parse(args[8]);
                            prop.SnapX       = double.Parse(args[9]);
                            prop.SnapY       = double.Parse(args[10]);
                            prop.SnapOffsetX = double.Parse(args[11]);
                            prop.SnapOffsetY = double.Parse(args[12]);

                            creator.CreateDiagram(prop);

                            options.Properties = prop;
                        }
                    }

                    // Pin
                    else if (StringUtil.StartsWith(name, Constants.TagElementPin) &&
                             length == 4)
                    {
                        if (diagram != null)
                        {
                            diagram.Push(line);
                        }

                        total.Next();

                        if (createElements == true)
                        {
                            double x  = double.Parse(args[2]);
                            double y  = double.Parse(args[3]);
                            int    id = int.Parse(name.Split(Constants.TagNameSeparator)[1]);

                            counter.Set(Math.Max(counter.Count, id + 1));

                            var element = creator.CreateElement(Constants.TagElementPin,
                                                                new object[] { id },
                                                                x + offsetX, y + offsetY, false);
                            elements.Add(element);

                            child = new Child(element, new List <Pin>());

                            if (dict.ContainsKey(name) == false)
                            {
                                dict.Add(name, child);
                            }
                            else
                            {
                                System.Diagnostics.Debug.Print("Dictionary already contains name key: {0}", name);
                            }
                        }
                    }

                    // Input
                    else if (StringUtil.StartsWith(name, Constants.TagElementInput) &&
                             (length == 4 || length == 5))
                    {
                        if (diagram != null)
                        {
                            diagram.Push(line);
                        }

                        total.Next();

                        if (createElements == true)
                        {
                            double x     = double.Parse(args[2]);
                            double y     = double.Parse(args[3]);
                            int    id    = int.Parse(name.Split(Constants.TagNameSeparator)[1]);
                            int    tagId = (length == 5) ? int.Parse(args[4]) : -1;

                            counter.Set(Math.Max(counter.Count, id + 1));

                            var element = creator.CreateElement(Constants.TagElementInput,
                                                                new object[] { id, tagId },
                                                                x + offsetX, y + offsetY, false);
                            elements.Add(element);

                            child = new Child(element, new List <Pin>());

                            if (dict.ContainsKey(name) == false)
                            {
                                dict.Add(name, child);
                            }
                            else
                            {
                                System.Diagnostics.Debug.Print("Dictionary already contains name key: {0}", name);
                            }
                        }
                    }

                    // Output
                    else if (StringUtil.StartsWith(name, Constants.TagElementOutput) &&
                             (length == 4 || length == 5))
                    {
                        if (diagram != null)
                        {
                            diagram.Push(line);
                        }

                        total.Next();

                        if (createElements == true)
                        {
                            double x     = double.Parse(args[2]);
                            double y     = double.Parse(args[3]);
                            int    id    = int.Parse(name.Split(Constants.TagNameSeparator)[1]);
                            int    tagId = (length == 5) ? int.Parse(args[4]) : -1;

                            counter.Set(Math.Max(counter.Count, id + 1));

                            var element = creator.CreateElement(Constants.TagElementOutput,
                                                                new object[] { id, tagId },
                                                                x + offsetX, y + offsetY, false);
                            elements.Add(element);

                            child = new Child(element, new List <Pin>());

                            if (dict.ContainsKey(name) == false)
                            {
                                dict.Add(name, child);
                            }
                            else
                            {
                                System.Diagnostics.Debug.Print("Dictionary already contains name key: {0}", name);
                            }
                        }
                    }

                    // AndGate
                    else if (StringUtil.StartsWith(name, Constants.TagElementAndGate) &&
                             length == 4)
                    {
                        if (diagram != null)
                        {
                            diagram.Push(line);
                        }

                        total.Next();

                        if (createElements == true)
                        {
                            double x  = double.Parse(args[2]);
                            double y  = double.Parse(args[3]);
                            int    id = int.Parse(name.Split(Constants.TagNameSeparator)[1]);

                            counter.Set(Math.Max(counter.Count, id + 1));

                            var element = creator.CreateElement(Constants.TagElementAndGate,
                                                                new object[] { id },
                                                                x + offsetX, y + offsetY, false);
                            elements.Add(element);

                            child = new Child(element, new List <Pin>());

                            if (dict.ContainsKey(name) == false)
                            {
                                dict.Add(name, child);
                            }
                            else
                            {
                                System.Diagnostics.Debug.Print("Dictionary already contains name key: {0}", name);
                            }
                        }
                    }

                    // OrGate
                    else if (StringUtil.StartsWith(name, Constants.TagElementOrGate) &&
                             length == 4)
                    {
                        if (diagram != null)
                        {
                            diagram.Push(line);
                        }

                        total.Next();

                        if (createElements == true)
                        {
                            double x  = double.Parse(args[2]);
                            double y  = double.Parse(args[3]);
                            int    id = int.Parse(name.Split(Constants.TagNameSeparator)[1]);

                            counter.Set(Math.Max(counter.Count, id + 1));

                            var element = creator.CreateElement(Constants.TagElementOrGate,
                                                                new object[] { id },
                                                                x + offsetX, y + offsetY, false);
                            elements.Add(element);

                            child = new Child(element, new List <Pin>());

                            if (dict.ContainsKey(name) == false)
                            {
                                dict.Add(name, child);
                            }
                            else
                            {
                                System.Diagnostics.Debug.Print("Dictionary already contains name key: {0}", name);
                            }
                        }
                    }

                    // Wire
                    else if (StringUtil.StartsWith(name, Constants.TagElementWire) &&
                             (length == 6 || length == 8 || length == 10))
                    {
                        if (diagram != null)
                        {
                            diagram.Push(line);
                        }

                        total.Next();

                        if (createElements == true)
                        {
                            double x1           = double.Parse(args[2]);
                            double y1           = double.Parse(args[3]);
                            double x2           = double.Parse(args[4]);
                            double y2           = double.Parse(args[5]);
                            bool   startVisible = (length == 8 || length == 10) ? bool.Parse(args[6]) : false;
                            bool   endVisible   = (length == 8 || length == 10) ? bool.Parse(args[7]) : false;
                            bool   startIsIO    = (length == 10) ? bool.Parse(args[8]) : false;
                            bool   endIsIO      = (length == 10) ? bool.Parse(args[9]) : false;
                            int    id           = int.Parse(name.Split(Constants.TagNameSeparator)[1]);

                            counter.Set(Math.Max(counter.Count, id + 1));

                            var element = creator.CreateElement(Constants.TagElementWire,
                                                                new object[]
                            {
                                x1 + offsetX, y1 + offsetY,
                                x2 + offsetX, y2 + offsetY,
                                startVisible, endVisible,
                                startIsIO, endIsIO,
                                id
                            },
                                                                0.0, 0.0, false);
                            elements.Add(element);

                            child = new Child(element, new List <Pin>());

                            if (dict.ContainsKey(name) == false)
                            {
                                dict.Add(name, child);
                            }
                            else
                            {
                                System.Diagnostics.Debug.Print("Dictionary already contains name key: {0}", name);
                            }
                        }
                    }
                }

                // child element
                else if (StringUtil.Compare(root, Constants.PrefixChild))
                {
                    if (StringUtil.StartsWith(name, Constants.TagElementWire) &&
                        length == 3)
                    {
                        if (diagram != null)
                        {
                            diagram.Push(line);
                        }

                        if (createElements == true && child != null)
                        {
                            var pins = child.Pins;

                            pins.Add(new Pin(name, args[2]));
                        }
                    }
                }
            }

            if (createElements == true)
            {
                creator.UpdateConnections(dict);

                if (appendIds == true)
                {
                    creator.AppendIds(elements);
                }

                if (updateIds == true)
                {
                    creator.UpdateCounter(options.Counter, counter);
                }

                creator.InsertElements(elements, select, offsetX, offsetY);
            }

            return(solution);
        }
Пример #15
0
        private void Connect(ICanvas canvas, IThumb pin, IDiagramCreator creator)
        {
            if (pin == null)
                return;

            Context.CurrentRoot = pin.GetParent() as IThumb;

            double x;
            double y;
            ModelEditor.GetPinPosition(Context.CurrentRoot, pin, out x, out y);

            Context.CurrentLine = WireEditor.Connect(canvas,
                Context.CurrentRoot, Context.CurrentLine,
                x, y,
                creator);

            if (Context.CurrentLine == null)
                Context.CurrentRoot = null;
        }
Пример #16
0
        private static ILine FirstConnection(ICanvas canvas, IElement root, double x, double y, List<Wire> wires, IDiagramCreator creator)
        {
            var counter = canvas.GetCounter();
            string rootUid = root.GetUid();

            bool startIsIO = StringUtil.StartsWith(rootUid, Constants.TagElementInput)
                || StringUtil.StartsWith(rootUid, Constants.TagElementOutput);

            var line = creator.CreateElement(Constants.TagElementWire,
                new object[]
                {
                    x, y, x, y,
                    false, false,
                    startIsIO, false,
                    counter.Next()
                },
                0.0, 0.0, false) as ILine;

            wires.Add(new Wire(line, root, null));

            canvas.Add(line);

            if (line != null || !(line is ILine))
                line.SetTag(root);

            return line;
        }
Пример #17
0
        public TreeSolution Parse(string model, IDiagramCreator creator, ParseOptions options)
        {
            if (model == null || creator == null || options == null)
                return null;

            double offsetX = options.OffsetX;
            double offsetY = options.OffsetY;
            bool appendIds = options.AppendIds;
            bool updateIds = options.UpdateIds;
            bool select = options.Select;
            bool createElements = options.CreateElements;
            string name = null;
            string root = null;
            var counter = new IdCounter();
            var total = new IdCounter();
            var elements = new List<object>();
            Child child = null;
            var dict = new Dictionary<string, Child>();
            TreeSolution solution = null;
            TreeProjects projects = null;
            TreeProject project = null;
            TreeDiagrams diagrams = null;
            TreeDiagram diagram = null;

            var lines = model.Split(Environment.NewLine.ToCharArray(),
                StringSplitOptions.RemoveEmptyEntries);

            foreach (var line in lines)
            {
                var args = GetArgs(line);

                int length = args.Length;
                if (length < 2)
                    continue;

                root = args[0];
                name = args[1];

                // root element
                if (StringUtil.Compare(root, Constants.PrefixRoot))
                {
                    // Solution
                    if (StringUtil.StartsWith(name, Constants.TagHeaderSolution) &&
                        (length == 2 || length == 3 || length == 4))
                    {
                        int id = int.Parse(name.Split(Constants.TagNameSeparator)[1]);
                        counter.Set(Math.Max(counter.Count, id + 1));

                        total.Next();

                        string tagFileName = (length == 3) ? args[2] : null;
                        string tableFileName = (length == 4) ? args[3] : null;

                        projects = new TreeProjects();
                        solution = new TreeSolution(name, tagFileName, tableFileName, projects);
                    }

                    // Project
                    else if (StringUtil.StartsWith(name, Constants.TagHeaderProject) &&
                        length == 2)
                    {
                        int id = int.Parse(name.Split(Constants.TagNameSeparator)[1]);
                        counter.Set(Math.Max(counter.Count, id + 1));

                        total.Next();

                        if (projects != null)
                        {
                            diagrams = new TreeDiagrams();
                            project = new TreeProject(name, diagrams);
                            projects.Push(project);
                        }
                    }

                    // Diagram
                    else if (StringUtil.StartsWith(name, Constants.TagHeaderDiagram) &&
                        length == 13)
                    {
                        int id = int.Parse(name.Split(Constants.TagNameSeparator)[1]);
                        counter.Set(Math.Max(counter.Count, id + 1));

                        total.Next();

                        if (diagrams != null)
                        {
                            diagram = new TreeDiagram();
                            diagrams.Push(diagram);
                            diagram.Push(line);
                        }

                        if (createElements == true)
                        {
                            var prop = new DiagramProperties();

                            prop.PageWidth = int.Parse(args[2]);
                            prop.PageHeight = int.Parse(args[3]);
                            prop.GridOriginX = int.Parse(args[4]);
                            prop.GridOriginY = int.Parse(args[5]);
                            prop.GridWidth = int.Parse(args[6]);
                            prop.GridHeight = int.Parse(args[7]);
                            prop.GridSize = int.Parse(args[8]);
                            prop.SnapX = double.Parse(args[9]);
                            prop.SnapY = double.Parse(args[10]);
                            prop.SnapOffsetX = double.Parse(args[11]);
                            prop.SnapOffsetY = double.Parse(args[12]);

                            creator.CreateDiagram(prop);

                            options.Properties = prop;
                        }
                    }

                    // Pin
                    else if (StringUtil.StartsWith(name, Constants.TagElementPin) &&
                        length == 4)
                    {
                        if (diagram != null)
                            diagram.Push(line);

                        total.Next();

                        if (createElements == true)
                        {
                            double x = double.Parse(args[2]);
                            double y = double.Parse(args[3]);
                            int id = int.Parse(name.Split(Constants.TagNameSeparator)[1]);

                            counter.Set(Math.Max(counter.Count, id + 1));

                            var element = creator.CreateElement(Constants.TagElementPin,
                                new object[] { id },
                                x + offsetX, y + offsetY, false);
                            elements.Add(element);

                            child = new Child(element, new List<Pin>());

                            if (dict.ContainsKey(name) == false)
                                dict.Add(name, child);
                            else
                                System.Diagnostics.Debug.Print("Dictionary already contains name key: {0}", name);
                        }
                    }

                    // Input
                    else if (StringUtil.StartsWith(name, Constants.TagElementInput) &&
                        (length == 4 || length == 5))
                    {
                        if (diagram != null)
                            diagram.Push(line);

                        total.Next();

                        if (createElements == true)
                        {
                            double x = double.Parse(args[2]);
                            double y = double.Parse(args[3]);
                            int id = int.Parse(name.Split(Constants.TagNameSeparator)[1]);
                            int tagId = (length == 5) ? int.Parse(args[4]) : -1;

                            counter.Set(Math.Max(counter.Count, id + 1));

                            var element = creator.CreateElement(Constants.TagElementInput,
                                new object[] { id, tagId },
                                x + offsetX, y + offsetY, false);
                            elements.Add(element);

                            child = new Child(element, new List<Pin>());

                            if (dict.ContainsKey(name) == false)
                                dict.Add(name, child);
                            else
                                System.Diagnostics.Debug.Print("Dictionary already contains name key: {0}", name);
                        }
                    }

                    // Output
                    else if (StringUtil.StartsWith(name, Constants.TagElementOutput) &&
                        (length == 4 || length == 5))
                    {
                        if (diagram != null)
                            diagram.Push(line);

                        total.Next();

                        if (createElements == true)
                        {
                            double x = double.Parse(args[2]);
                            double y = double.Parse(args[3]);
                            int id = int.Parse(name.Split(Constants.TagNameSeparator)[1]);
                            int tagId = (length == 5) ? int.Parse(args[4]) : -1;

                            counter.Set(Math.Max(counter.Count, id + 1));

                            var element = creator.CreateElement(Constants.TagElementOutput,
                                new object[] { id, tagId },
                                x + offsetX, y + offsetY, false);
                            elements.Add(element);

                            child = new Child(element, new List<Pin>());

                            if (dict.ContainsKey(name) == false)
                                dict.Add(name, child);
                            else
                                System.Diagnostics.Debug.Print("Dictionary already contains name key: {0}", name);
                        }
                    }

                    // AndGate
                    else if (StringUtil.StartsWith(name, Constants.TagElementAndGate) &&
                        length == 4)
                    {
                        if (diagram != null)
                            diagram.Push(line);

                        total.Next();

                        if (createElements == true)
                        {
                            double x = double.Parse(args[2]);
                            double y = double.Parse(args[3]);
                            int id = int.Parse(name.Split(Constants.TagNameSeparator)[1]);

                            counter.Set(Math.Max(counter.Count, id + 1));

                            var element = creator.CreateElement(Constants.TagElementAndGate,
                                new object[] { id },
                                x + offsetX, y + offsetY, false);
                            elements.Add(element);

                            child = new Child(element, new List<Pin>());

                            if (dict.ContainsKey(name) == false)
                                dict.Add(name, child);
                            else
                                System.Diagnostics.Debug.Print("Dictionary already contains name key: {0}", name);
                        }
                    }

                    // OrGate
                    else if (StringUtil.StartsWith(name, Constants.TagElementOrGate) &&
                        length == 4)
                    {
                        if (diagram != null)
                            diagram.Push(line);

                        total.Next();

                        if (createElements == true)
                        {
                            double x = double.Parse(args[2]);
                            double y = double.Parse(args[3]);
                            int id = int.Parse(name.Split(Constants.TagNameSeparator)[1]);

                            counter.Set(Math.Max(counter.Count, id + 1));

                            var element = creator.CreateElement(Constants.TagElementOrGate,
                                new object[] { id },
                                x + offsetX, y + offsetY, false);
                            elements.Add(element);

                            child = new Child(element, new List<Pin>());

                            if (dict.ContainsKey(name) == false)
                                dict.Add(name, child);
                            else
                                System.Diagnostics.Debug.Print("Dictionary already contains name key: {0}", name);
                        }
                    }

                    // Wire
                    else if (StringUtil.StartsWith(name, Constants.TagElementWire) &&
                        (length == 6 || length == 8 || length == 10))
                    {
                        if (diagram != null)
                            diagram.Push(line);

                        total.Next();

                        if (createElements == true)
                        {
                            double x1 = double.Parse(args[2]);
                            double y1 = double.Parse(args[3]);
                            double x2 = double.Parse(args[4]);
                            double y2 = double.Parse(args[5]);
                            bool startVisible = (length == 8 || length == 10) ? bool.Parse(args[6]) : false;
                            bool endVisible = (length == 8 || length == 10) ? bool.Parse(args[7]) : false;
                            bool startIsIO = (length == 10) ? bool.Parse(args[8]) : false;
                            bool endIsIO = (length == 10) ? bool.Parse(args[9]) : false;
                            int id = int.Parse(name.Split(Constants.TagNameSeparator)[1]);

                            counter.Set(Math.Max(counter.Count, id + 1));

                            var element = creator.CreateElement(Constants.TagElementWire,
                                new object[]
                                {
                                    x1 + offsetX, y1 + offsetY,
                                    x2 + offsetX, y2 + offsetY,
                                    startVisible, endVisible,
                                    startIsIO, endIsIO,
                                    id
                                },
                                0.0, 0.0, false);
                            elements.Add(element);

                            child = new Child(element, new List<Pin>());

                            if (dict.ContainsKey(name) == false)
                                dict.Add(name, child);
                            else
                                System.Diagnostics.Debug.Print("Dictionary already contains name key: {0}", name);
                        }
                    }
                }

                // child element
                else if (StringUtil.Compare(root, Constants.PrefixChild))
                {
                    if (StringUtil.StartsWith(name, Constants.TagElementWire) &&
                        length == 3)
                    {
                        if (diagram != null)
                            diagram.Push(line);

                        if (createElements == true && child != null)
                        {
                            var pins = child.Pins;

                            pins.Add(new Pin(name, args[2]));
                        }
                    }
                }
            }

            if (createElements == true)
            {
                creator.UpdateConnections(dict);

                if (appendIds == true)
                    creator.AppendIds(elements);

                if (updateIds == true)
                    creator.UpdateCounter(options.Counter, counter);

                creator.InsertElements(elements, select, offsetX, offsetY);
            }

            return solution;
        }
Пример #18
0
        private static ILine FirstConnection(ICanvas canvas, IElement root, double x, double y, List <Wire> wires, IDiagramCreator creator)
        {
            var    counter = canvas.GetCounter();
            string rootUid = root.GetUid();

            bool startIsIO = StringUtil.StartsWith(rootUid, Constants.TagElementInput) ||
                             StringUtil.StartsWith(rootUid, Constants.TagElementOutput);

            var line = creator.CreateElement(Constants.TagElementWire,
                                             new object[]
            {
                x, y, x, y,
                false, false,
                startIsIO, false,
                counter.Next()
            },
                                             0.0, 0.0, false) as ILine;

            wires.Add(new Wire(line, root, null));

            canvas.Add(line);

            if (line != null || !(line is ILine))
            {
                line.SetTag(root);
            }

            return(line);
        }
Пример #19
0
        public static ILine Connect(ICanvas canvas, IElement root, ILine line, double x, double y, IDiagramCreator creator)
        {
            var rootTag = root.GetTag();

            if (rootTag == null)
            {
                root.SetTag(new Connection(root, new List <Wire>()));
            }

            var connection = root.GetTag() as Connection;
            var wires      = connection.Wires;

            if (line == null)
            {
                return(FirstConnection(canvas, root, x, y, wires, creator));
            }
            else
            {
                return(SecondConnection(root, line, x, y, wires));
            }
        }
Пример #20
0
        public static bool Split(ICanvas canvas, ILine line, ILine currentLine, IPoint point, IDiagramCreator creator, bool snap)
        {
            var    pin  = Insert.Pin(canvas, point, creator, snap);
            double x    = pin.GetX();
            double y    = pin.GetY();
            var    temp = Connect(canvas, pin, currentLine, x, y, creator);

            canvas.Remove(line);

            var connections = ModelEditor.RemoveWireConnections(canvas, line);

            if (connections != null && connections.Count == 2)
            {
                Reconnect(canvas, line, pin, x, y, connections, temp, creator);
            }
            else
            {
                throw new InvalidOperationException("LineEx should have only two connections: Start and End.");
            }

            return(true);
        }
Пример #21
0
        public static bool Split(ICanvas canvas, ILine line, ILine currentLine, IPoint point, IDiagramCreator creator, bool snap)
        {
            var pin = Insert.Pin(canvas, point, creator, snap);
            double x = pin.GetX();
            double y = pin.GetY();
            var temp = Connect(canvas, pin, currentLine, x, y, creator);

            canvas.Remove(line);

            var connections = ModelEditor.RemoveWireConnections(canvas, line);

            if (connections != null && connections.Count == 2)
                Reconnect(canvas, line, pin, x, y, connections, temp, creator);
            else
                throw new InvalidOperationException("LineEx should have only two connections: Start and End.");

            return true;
        }
Пример #22
0
        public static TreeItemType SwitchItems(ICanvas canvas,
            IDiagramCreator creator,
            ITreeItem oldItem, 
            ITreeItem newItem,
            Action<DiagramProperties> setProperties)
        {
            if (newItem == null)
                return TreeItemType.None;

            var oldItemType = GetTreeItemType(oldItem == null ? null : oldItem.GetUid());
            var newItemType = GetTreeItemType(newItem == null ? null : newItem.GetUid());

            if (oldItemType == TreeItemType.Diagram)
                ModelEditor.Store(canvas, oldItem);

            if (newItemType == TreeItemType.Diagram)
            {
                ModelEditor.Load(canvas, creator, newItem);

                if (setProperties != null)
                    setProperties(canvas.GetProperties());
            }

            return newItemType;
        }