/// <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);
            }
        }