/// <summary> /// Unpacks a PinContainer into one List of Pins per X,Y rotation. /// </summary> /// <param name="container">The PinContainer to unpack</param> /// <returns>A dictionary mapping rotations to lists of pins</returns> public Dictionary<Tuple<int, int>, List<Pin>> Unpack(PinContainer container) { Dictionary<int, DissectionPinData> pins = new Dictionary<int, DissectionPinData>(); Dictionary<Tuple<int, int>, List<Pin>> output = new Dictionary<Tuple<int,int>,List<Pin>>(); // Build pin lookup table foreach (DissectionPinData pin in container.Pins) { pins[pin.Id] = pin; } foreach (FrameData frame in container.Frames) { Tuple<int, int> key = new Tuple<int, int>((int)frame.Rotation.X, (int)frame.Rotation.Y); List<Pin> framePins; if (output.ContainsKey(key)) { framePins = output[key]; } else { framePins = new List<Pin>(); output[key] = framePins; } foreach (FramePinData framePin in frame.Pins) { Pin pin = new Pin(); pin.X = (int)framePin.Offset.X; pin.Y = (int)framePin.Offset.Y; DissectionPinData pinData = pins[framePin.PinId]; pin.Name = pinData.Title; pin.Description = pinData.Description; pin.BioSystems = pinData.BioSystems; framePins.Add(pin); } } return output; }
/// <summary> /// Take a Dictionary of pins and write it to an XML file /// </summary> /// <param name="pinMap">A Dictionary of frame X and Y rotations to a list of pins on that frame</param> /// <param name="outfile">The file to write the formatted XML to</param> public void Pack(Dictionary<Tuple<int, int>, List<Pin>> pinMap, string outfile) { List<FrameData> frames = new List<FrameData>(); HashSet<DissectionPinData> pins = new HashSet<DissectionPinData>(); int nextId = 0; foreach (var pair in pinMap) { List<Pin> framePins = pair.Value; // All the pins on this frame Tuple<int, int> frame = pair.Key; // The 2D rotation of this frame FrameData frameData = new FrameData(); // Data for the frame to be represented in XML frameData.Rotation = new Vector3(frame.Item1, frame.Item2, 0.0f); List<FramePinData> framePinDatas = new List<FramePinData>(); // The links between this frame and its pins foreach (Pin pin in framePins) { DissectionPinData data = ConvertToData(pin); if (pins.Add(data)) { // This pin doesn't already exist, so give it an id data.Id = nextId++; } else { // This pin is in the HashSet so get the original instance data = pins.Single((DissectionPinData x) => { return x.Equals(data); }); } framePinDatas.Add(new FramePinData(new Vector2(pin.X, pin.Y), data.Id)); } frameData.Pins = framePinDatas.ToArray(); frames.Add(frameData); } PinContainer container = new PinContainer(); container.Frames = frames.ToArray(); container.Pins = pins.ToArray(); WriteXml(container, outfile); }
private void WriteXml(PinContainer container, string path) { XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; using (XmlWriter writer = XmlWriter.Create(path, settings)) { IntermediateSerializer.Serialize(writer, container, null); } }