private void toolStripButton4_Click(object sender, EventArgs e) { OpenFileDialog of = new OpenFileDialog(); of.Filter = "RaspiDevice Files (*.rd) | *.rd"; if (of.ShowDialog() == System.Windows.Forms.DialogResult.OK) { RaspiDeviceFile data = importer.DeserializeDeviceFile(File.ReadAllText(of.FileName)); foreach (var v in designer1.Document.Elements.OfType <Dalssoft.DiagramNet.BaseElement>().ToArray()) { designer1.Document.DeleteElement(v); } linkedIOS.Clear(); elements.Clear(); Dictionary <string, Dalssoft.DiagramNet.BaseElement> groups = new Dictionary <string, Dalssoft.DiagramNet.BaseElement>(); foreach (var item in data.Elements) { var elem = importer.ElementsByType[item.InternalClassName]; var rect = GenericElement.GetGenericElement(elem); elem = rect.Tag as RaspiImporter.BaseElement; elem.Name = item.Name; groups.Add(elem.Name, rect); elements.Add(rect.Tag as RaspiImporter.BaseElement); designer1.Document.AddElement(rect); var props = item.GetType().GetProperties(); foreach (var prop in props) { prop.SetValue(elem, prop.GetValue(item)); } } foreach (var pos in data.Positions) { groups[pos.ElementName].Location = new Point(pos.X, pos.Y); } foreach (var link in data.Links) { var inputElement = groups[link.InputDevice] as RectangleGroup; var outputElement = groups[link.OutputDevice] as RectangleGroup; var input = (inputElement.Tag as RaspiImporter.BaseElement).Inputs.Where(i => i.InputName == link.InputName).FirstOrDefault(); var output = (outputElement.Tag as RaspiImporter.BaseElement).Outputs.Where(o => o.OutputName == link.OutputName).FirstOrDefault(); var inputLinkNode = (inputElement.Children[input.InputName] as NodeElement).Connectors[link.InputLinkOnLeft ? 1 : 0]; var outputLinkNode = (outputElement.Children[output.OutputName] as NodeElement).Connectors[link.OutputLinkOnLeft ? 1 : 0]; var lnk = designer1.Document.AddLink(inputLinkNode, outputLinkNode); Guid g = Guid.NewGuid(); var lnkI = new BaseElementLink { Input = input, Output = output }; linkedIOS.Add(g.ToString(), lnkI); lnk.Tag = lnkI; } } }
void designer1_ElementsWillConnect(object sender, Designer.ElementsLinkedArgs e) { NodeElement node1 = e.Element1 as NodeElement; NodeElement node2 = e.Element2 as NodeElement; ConnectorElement connector1 = e.Connector1; ConnectorElement connector2 = e.Connector2; ElementInputType input = null; ElementOutputType output = null; bool inputOnRight = false; bool outputOnRight = false; BaseLinkElement outputLink = null; if (e.Element1.Tag is ElementInputType) { inputOnRight = node1.Connectors[1] == connector1; input = (ElementInputType)e.Element1.Tag; } if (e.Element2.Tag is ElementInputType) { inputOnRight = node2.Connectors[1] == connector2; input = (ElementInputType)e.Element2.Tag; } if (e.Element1.Tag is ElementOutputType) { outputOnRight = node1.Connectors[1] == connector1; output = (ElementOutputType)e.Element1.Tag; } if (e.Element2.Tag is ElementOutputType) { outputOnRight = node2.Connectors[1] == connector2; output = (ElementOutputType)e.Element2.Tag; } if (input == null) { e.Cancel = true; MessageBox.Show("Cannot connect two outputs"); return; } if (output == null) { e.Cancel = true; MessageBox.Show("Cannot connect two inputs"); return; } if (input.InputType != output.OutputType) { e.Cancel = true; MessageBox.Show("Cannot connect an input of type " + input.InputType + " to an output of type " + output.OutputType); return; } Guid g = Guid.NewGuid(); var lnk = new BaseElementLink { Input = input, InputOnLeft = !inputOnRight, Output = output, OutputOnLeft = !outputOnRight }; linkedIOS.Add(g.ToString(), lnk); e.NewLink.Tag = lnk; }