レイヤ構造をそのままディレクトリ構造にしてみる


昨日の構造体の使い方
レイヤのツリー構造

例えばレイヤ構造をそのままディレクトリ構造に
レイヤ名は一意でなくてもよい (同一名が許容) されるので適当に番号だけにしている。

グループレイヤ=ディレクトリなので最大最小縮尺や表示状態は保持しない


public class MapPersist
{
    const string STRING_ZERO = "00000";

    private string m_BasePath = null;

    public MapPersist(string basePath)
    {
        this.m_BasePath = basePath;
        //存在しない場合はディレクトリを作成
        if (!Directory.Exists(basePath))
            Directory.CreateDirectory(basePath);
    }

    public void Save(IMap map)
    {
        string basePath = this.m_BasePath;

        var layerCt = new LayersCounter();
        IEnumerable<LayerAndPath> layers = layerCt.EnumLayerPath(map);

        foreach (var layerPath in layers)
        {
            if (layerPath.Layer is IGroupLayer &&
                layerPath.Layer is ICompositeLayer)
            {
                this.createDir(layerPath);
                continue;
            }

            string[] pathSt = Array.ConvertAll<int, string>(layerPath.Path,
                delegate(int value)
                {
                    return value.ToString(STRING_ZERO);
                });

            string dir = Path.Combine(this.m_BasePath, string.Join("\\" ,pathSt));
            dir += ".lyr";
            using (ComReleaser com = new ComReleaser())
            {
                ILayerFile layerFile = new LayerFileClass();
                com.ManageLifetime(layerFile);
                layerFile.New(dir);
                layerFile.ReplaceContents(layerPath.Layer);
                layerFile.Save();
                layerFile.Close();
            }

        }//end loop
    }//end method

    public void Load(IMap map)
    {
        string basePath = this.m_BasePath;

        this.loadDir(basePath, map);
    }

    private void loadDir(string baseDir, object parent)
    {
        string[] entries = Directory.GetFileSystemEntries(baseDir);

        //順列保持用にひっくり返す (MapでautoArrangeされる)
        if (parent is IMap)
        {
            List<string> lst = new List<string>(entries);
            lst.Reverse();
            entries = lst.ToArray();
            //クリア
            lst.Clear();
            lst = null;
        }

        //まわす
        foreach (var ent in entries)
        {
            ILayer layer = null;
            if (File.Exists(ent))
            {
                //ファイルからレイヤ呼び出し
                layer = loadFromFile(ent);
            }
            else
            {
                //ファイルでなければDirectory
                IGroupLayer gLayer = new GroupLayer();
                gLayer.Name = Path.GetFileName(ent);
                //再帰呼び
                this.loadDir(ent, gLayer);

                layer = (ILayer)gLayer;
            }//end if

            //((IMapLayers)parent).InsertLayer(layer, false, 0);
            //((IMap)parent).AddLayer(layer);
            if (parent is IMap)
                ((IMapLayers)parent).InsertLayer(layer, false, 0);
            else
                ((IGroupLayer)parent).Add(layer);
        }
    }

    private ILayer loadFromFile(string path)
    {
        ILayer layer = null;
        using (ComReleaser com = new ComReleaser())
        {
            ILayerFile layerFile = new LayerFileClass();
            com.ManageLifetime(layerFile);//c1-30237?放をマーク

            layerFile.Open(path);
            layer = layerFile.Layer;
            layerFile.Close();
        }//end com
        return layer;
    }

    private void createDir(LayerAndPath layerPath)
    {
        string dir = this.m_BasePath;
        foreach (int i in layerPath.Path)
        {
            dir = Path.Combine(dir, i.ToString(STRING_ZERO));
            if (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);
        }//end loop
    }//end method

}//end class
カテゴリー: 開発 タグ: パーマリンク