示例#1
0
        public void ToXml(XmlWriter w, bool backup)
        {
            if (!backup)
            {
                ToXml(w);
            }

            if (loaded)
            {
                int    pathEnd  = ((IObjectCollectionParent)parent).WorldFilePath.LastIndexOf('\\');
                string pathName = ((IObjectCollectionParent)parent).WorldFilePath.Substring(0, pathEnd);
                w.WriteStartElement("WorldObjectCollection");
                w.WriteAttributeString("Version", app.Config.XmlSaveFileVersion.ToString());
                foreach (IWorldObject obj in objectList)
                {
                    if (String.Equals(obj.ObjectType, "Collection"))
                    {
                        WorldObjectCollection worldCollection = (WorldObjectCollection)obj;
                        worldCollection.Path = pathName;
                        // write the XML into the top level world file
                        w.WriteStartElement("WorldCollection");
                        if (worldCollection.Filename == "")
                        {
                            int startIndex      = pathEnd + 1;
                            int subStringLength = WorldFilePath.LastIndexOf(".mwc") - startIndex;
                            worldCollection.Filename = String.Format("{0}-{1}.mwc", WorldFilePath.Substring(startIndex,
                                                                                                            subStringLength), worldCollection.Name);
                        }
                        w.WriteAttributeString("Name", worldCollection.Name);
                        string filename = worldCollection.Filename.Insert((worldCollection.Filename.LastIndexOf(".")), "~");
                        w.WriteAttributeString("Filename", filename);
                        w.WriteEndElement();

                        // create a file for the collection
                        if (worldCollection.Loaded)
                        {
                            try
                            {
                                XmlWriter childWriter = XmlWriter.Create(String.Format("{0}\\{1}", pathName,
                                                                                       filename), app.XMLWriterSettings);
                                worldCollection.ToXml(childWriter, backup);
                                childWriter.Close();
                            }
                            catch (Exception e)
                            {
                                LogManager.Instance.Write(e.ToString());
                                MessageBox.Show(String.Format("Unable to open the file for writing.  Use file menu \"Save As\" to save to another location.  Error: {0}", e.Message), "Error Saving File", MessageBoxButtons.OK);
                            }
                        }
                    }
                    else
                    {
                        obj.ToXml(w);
                    }
                }
                w.WriteEndElement();
            }
        }
示例#2
0
        protected void FromXml(XmlReader r, bool loadall)
        {
            string colfilename = "";
            string baseName    = WorldFilePath.Substring(0, WorldFilePath.LastIndexOf('\\'));

            do
            {
                r.Read();
            } while ((r.NodeType != XmlNodeType.Element) || !(String.Equals(r.Name, "WorldObjectCollection")));

            while (r.Read())
            {
                // look for the start of an element
                if (r.NodeType == XmlNodeType.Whitespace)
                {
                    continue;
                }
                if (r.NodeType == XmlNodeType.EndElement)
                {
                    break;
                }
                if (r.NodeType == XmlNodeType.Element)
                {
                    switch (r.Name)
                    {
                    case "Road":
                        RoadObject road = new RoadObject(r, this, app);
                        Add(road);
                        break;

                    case "StaticObject":
                        StaticObject obj = new StaticObject(this, app, r);
                        Add(obj);
                        break;

                    case "Waypoint":
                        Waypoint wp = new Waypoint(r, this, app);
                        Add(wp);
                        break;

                    case "Boundary":
                        Boundary b = new Boundary(r, this, app);
                        Add(b);
                        break;

                    case "PointLight":
                        PointLight pl = new PointLight(app, this, app.Scene, r);
                        Add(pl);
                        break;

                    case "TerrainDecal":
                        TerrainDecal d = new TerrainDecal(app, this, r);
                        Add(d);
                        break;

                    case "WorldCollection":
                        string collectionName = null;
                        colfilename = "";
                        for (int i = 0; i < r.AttributeCount; i++)
                        {
                            r.MoveToAttribute(i);
                            switch (r.Name)
                            {
                            case "Name":
                                collectionName = r.Value;
                                break;

                            case "Filename":
                                colfilename = r.Value;
                                break;
                            }
                        }
                        baseName = this.Path;
                        if (!loadall)
                        {
                            if (colfilename != "")
                            {
                                if (colfilename.EndsWith("~.mwc"))
                                {
                                    string autofilepath   = String.Format("{0}\\{1}", baseName, colfilename);
                                    string normalfilepath = String.Format("{0}\\{1}", baseName, colfilename.Remove(colfilename.LastIndexOf("~"), 1));
                                    if ((File.Exists(autofilepath) && File.Exists(normalfilepath) &&
                                         (new FileInfo(autofilepath)).LastWriteTime < (new FileInfo(normalfilepath).LastWriteTime)) ||
                                        (!File.Exists(autofilepath) && File.Exists(normalfilepath)))
                                    {
                                        colfilename = colfilename.Remove(filename.LastIndexOf("~"), 1);
                                    }
                                }
                                XmlReader             childReader = XmlReader.Create(String.Format("{0}\\{1}", baseName, colfilename), app.XMLReaderSettings);
                                WorldObjectCollection coll        = new WorldObjectCollection(childReader, collectionName, this, app, baseName, false);
                                while (colfilename.Contains("~"))
                                {
                                    colfilename = colfilename.Remove(colfilename.LastIndexOf("~"), 1);
                                }
                                coll.Filename = colfilename;
                                Add(coll);
                                childReader.Close();
                            }
                            else
                            {
                                XmlReader             childReader = XmlReader.Create(String.Format("{0}\\{1}.mwc", baseName, collectionName), app.XMLReaderSettings);
                                WorldObjectCollection coll        = new WorldObjectCollection(childReader, collectionName, this, app, baseName, false);
                                coll.Filename = collectionName + ".mwc";
                                Add(coll);
                                childReader.Close();
                            }
                        }
                        else
                        {
                            if (colfilename != "")
                            {
                                if (colfilename.EndsWith("~.mwc"))
                                {
                                    string autofilepath   = String.Format("{0}\\{1}", baseName, colfilename);
                                    string normalfilepath = String.Format("{0}\\{1}", baseName, colfilename.Remove(filename.LastIndexOf("~"), 1));
                                    if ((File.Exists(autofilepath) && File.Exists(normalfilepath) &&
                                         (new FileInfo(autofilepath)).LastWriteTime < (new FileInfo(normalfilepath).LastWriteTime)) ||
                                        (!File.Exists(autofilepath) && File.Exists(normalfilepath)))
                                    {
                                        colfilename = colfilename.Remove(colfilename.LastIndexOf("~"), 1);
                                    }
                                }
                                XmlReader             childReader = XmlReader.Create(String.Format("{0}\\{1}", baseName, colfilename), app.XMLReaderSettings);
                                WorldObjectCollection coll        = new WorldObjectCollection(childReader, collectionName, this, app, baseName);
                                while (colfilename.Contains("~"))
                                {
                                    colfilename = colfilename.Remove(colfilename.LastIndexOf("~"), 1);
                                }
                                coll.Filename = colfilename;
                                Add(coll);
                                childReader.Close();
                            }
                            else
                            {
                                XmlReader             childReader = XmlReader.Create(String.Format("{0}\\{1}.mwc", baseName, collectionName), app.XMLReaderSettings);
                                WorldObjectCollection coll        = new WorldObjectCollection(childReader, collectionName, this, app, baseName);
                                coll.Filename = collectionName + ".mwc";
                                Add(coll);
                                childReader.Close();
                            }
                        }

                        r.MoveToElement();

                        break;
                    }
                }
            }

            while (filename.Contains("~"))
            {
                filename = filename.Remove(filename.IndexOf("~"), 1);
            }
        }