public DiagramBlock duplicatePartOfDiagram(Nodes nodes, int layer = 0) { // get part of diagram for duplicate DiagramBlock diagramPart = this.getPartOfDiagram(nodes); List<MappedNode> maps = new List<MappedNode>(); Nodes duplicatedNodes = new Nodes(); foreach (Node node in diagramPart.nodes) { duplicatedNodes.Add(node.clone()); } // order nodes parent first (layer must exist when sub node is created) Nodes NewReorderedNodes = new Nodes(); this.nodesReorderNodes(layer, null, duplicatedNodes, NewReorderedNodes); int layerParent = 0; MappedNode mappedNode; Nodes createdNodes = new Nodes(); Node newNode = null; int oldId = 0; foreach (Node rec in NewReorderedNodes) { layerParent = layer; // find layer id for sub layer foreach (MappedNode mapednode in maps) { if (rec.layer == mapednode.oldId) { layerParent = mapednode.newNode.id; break; } } rec.layer = layerParent; rec.resize(); oldId = rec.id; newNode = this.createNode(rec); if (newNode != null) { mappedNode = new MappedNode(); mappedNode.oldId = oldId; mappedNode.newNode = newNode; createdNodes.Add(newNode); maps.Add(mappedNode); } } // fix layers and shortcuts foreach (Node rec in duplicatedNodes) { if (rec.shortcut != 0) { foreach (MappedNode mapednode in maps) { if (rec.shortcut == mapednode.oldId) { rec.shortcut = mapednode.newNode.id; break; } } } } Lines createdLines = new Lines(); Line newLine = null; foreach (Line line in diagramPart.lines) { foreach (MappedNode mapbegin in maps) { if (line.start == mapbegin.oldId) { foreach (MappedNode mapend in maps) { if (line.end == mapend.oldId) { // create new line by connecting new nodes newLine = this.Connect( mapbegin.newNode, mapend.newNode, line.arrow, line.color, line.width ); if (newLine != null) // skip invalid lines (perent not exist) { createdLines.Add(newLine); } } } } } } return new DiagramBlock(createdNodes, createdLines); }
/*************************************************************************************************************************/ // CLIPBOARD // paste part of diagram from clipboard public DiagramBlock AddDiagramPart(string DiagramXml, Position position, int layer) { Nodes NewNodes = new Nodes(); Lines NewLines = new Lines(); XmlReaderSettings xws = new XmlReaderSettings(); xws.CheckCharacters = false; string xml = DiagramXml; try { using (XmlReader xr = XmlReader.Create(new StringReader(xml), xws)) { XElement root = XElement.Load(xr); foreach (XElement diagram in root.Elements()) { if (diagram.HasElements) { if (diagram.Name.ToString() == "rectangles") { foreach (XElement block in diagram.Descendants()) { if (block.Name.ToString() == "rectangle") { Node R = new Node(); R.font = this.FontDefault; foreach (XElement el in block.Descendants()) { try { if (el.Name.ToString() == "id") { R.id = Int32.Parse(el.Value); } if (el.Name.ToString() == "text") { R.name = el.Value; } if (el.Name.ToString() == "note") { R.note = el.Value; } if (el.Name.ToString() == "x") { R.position.x = Int32.Parse(el.Value); } if (el.Name.ToString() == "y") { R.position.y = Int32.Parse(el.Value); } if (el.Name.ToString() == "color") { R.color.set(el.Value.ToString()); } if (el.Name.ToString() == "timecreate") { R.timecreate = el.Value; } if (el.Name.ToString() == "timemodify") { R.timemodify = el.Value; } if (el.Name.ToString() == "font") { R.font = Fonts.XmlToFont(el); } if (el.Name.ToString() == "fontcolor") { R.fontcolor.set(el.Value.ToString()); } if (el.Name.ToString() == "link") { R.link = el.Value; } if (el.Name.ToString() == "shortcut") { R.shortcut = Int32.Parse(el.Value); } if (el.Name.ToString() == "mark") { R.mark = bool.Parse(el.Value); } if (el.Name.ToString() == "transparent") { R.transparent = bool.Parse(el.Value); } if (el.Name.ToString() == "embeddedimage") { R.embeddedimage = bool.Parse(el.Value); } if (el.Name.ToString() == "imagedata") { R.image = new Bitmap(new MemoryStream(Convert.FromBase64String(el.Value))); R.height = R.image.Height; R.width = R.image.Width; R.isimage = true; } if (el.Name.ToString() == "image") { R.imagepath = el.Value.ToString(); if (Os.FileExists(R.imagepath)) { try { string ext = ""; ext = Os.getExtension(R.imagepath).ToLower(); if (ext == ".jpg" || ext == ".png" || ext == ".ico" || ext == ".bmp") // skratenie cesty k suboru { R.image = Media.getImage(R.imagepath); if (ext != ".ico") R.image.MakeTransparent(Color.White); R.height = R.image.Height; R.width = R.image.Width; R.isimage = true; } } catch (Exception ex) { Program.log.write("load image from xml error: " + ex.Message); } } else { R.imagepath = ""; } } if (el.Name.ToString() == "timecreate") { R.timecreate = el.Value; } if (el.Name.ToString() == "timemodify") { R.timemodify = el.Value; } if (el.Name.ToString() == "attachment") { R.attachment = el.Value; } if (el.Name.ToString() == "layer") { R.layer = Int32.Parse(el.Value); } if (el.Name.ToString() == "protect") { R.protect = bool.Parse(el.Value); } } catch (Exception ex) { Program.log.write("Data has wrong structure. : error: " + ex.Message); } } NewNodes.Add(R); } } } if (diagram.Name.ToString() == "lines") { foreach (XElement block in diagram.Descendants()) { if (block.Name.ToString() == "line") { Line L = new Line(); foreach (XElement el in block.Descendants()) { try { if (el.Name.ToString() == "start") { L.start = Int32.Parse(el.Value); } if (el.Name.ToString() == "end") { L.end = Int32.Parse(el.Value); } if (el.Name.ToString() == "arrow") { L.arrow = el.Value == "1" ? true : false; } if (el.Name.ToString() == "color") { L.color.set(el.Value.ToString()); } if (el.Name.ToString() == "width") { L.width = Int32.Parse(el.Value); } if (el.Name.ToString() == "layer") { L.layer = Int32.Parse(el.Value); } } catch (Exception ex) { Program.log.write("Data has wrong structure. : error: " + ex.Message); } } NewLines.Add(L); } } } } } } } catch (Exception ex) { Program.log.write("Data has wrong structure. : error: " + ex.Message); } List<MappedNode> maps = new List<MappedNode>(); Nodes NewReorderedNodes = new Nodes(); // order nodes parent first (layer must exist when sub node is created) this.nodesReorderNodes(0, null, NewNodes, NewReorderedNodes); int layerParent = 0; MappedNode mappedNode; Nodes createdNodes = new Nodes(); Node newNode = null; int oldId = 0; foreach (Node rec in NewReorderedNodes) { layerParent = 0; if (rec.layer == 0) { layerParent = layer; } else { foreach (MappedNode mapednode in maps) { if (rec.layer == mapednode.oldId) { layerParent = mapednode.newNode.id; break; } } } rec.layer = layerParent; rec.position.add(position); rec.resize(); oldId = rec.id; newNode = this.createNode(rec); if (newNode != null) { mappedNode = new MappedNode(); mappedNode.oldId = oldId; mappedNode.newNode = newNode; createdNodes.Add(newNode); maps.Add(mappedNode); } } // fix layers and shortcuts foreach (Node rec in NewNodes) { if (rec.shortcut != 0) { foreach (MappedNode mapednode in maps) { if (rec.shortcut == mapednode.oldId) { rec.shortcut = mapednode.newNode.id; break; } } } } Lines createdLines = new Lines(); Line newLine = null; foreach (Line line in NewLines) { foreach (MappedNode mapbegin in maps) { if (line.start == mapbegin.oldId) { foreach (MappedNode mapend in maps) { if (line.end == mapend.oldId) { newLine = this.Connect( mapbegin.newNode, mapend.newNode, line.arrow, line.color, line.width ); if (newLine != null) { createdLines.Add(newLine); } } } } } } return new DiagramBlock(NewNodes, createdLines); }