/// <summary> /// PSDファイルをトップレベルのレイヤグループ単位で分割します /// </summary> /// <param name="psd_in">入力PSD</param> /// <param name="split_anime_layer">アニメーションレイヤグループ(「@」から始まるレイヤグループ)の展開を許可します</param> /// <returns>分割したレイヤオブジェクト</returns> protected List <KeyValuePair <string, List <Layer> > > SplitPsd() { string animate_layer_prefix = "@"; //結果格納用 List <KeyValuePair <string, List <Layer> > > sprittedLayers = new List <KeyValuePair <string, List <Layer> > >(); //レイヤの階層を解析してツリー構造に LayerNode rootNode = LayerTreeParser.ParseLayerTree(InputPsdFile); //トップレベルのレイヤまたはレイヤグループについて処理 for (int i = 0; i < rootNode.Children.Count; i++) { LayerNode node = rootNode.Children[i]; if (SplitAnimeLayer && node.Name.StartsWith(animate_layer_prefix)) { var normalNodes = node.Children .Where(x => x.Layer == null || x.Layer.GetSectionType() == LayerSectionType.Layer); foreach (var anode in normalNodes) { sprittedLayers.Add(MakeResultItem(i, anode)); } } else { sprittedLayers.Add(MakeResultItem(i, node)); } } return(sprittedLayers); }
public static LayerNode ParseLayerTree(PsdFile psd) { LayerNode root = new LayerNode(); ParseLayerTree(psd.Layers.GetEnumerator(), root); return(root); }
private static void ParseLayerTree(IEnumerator <Layer> layers, LayerNode parentNode) { while (layers.MoveNext()) { Layer currentLayer = layers.Current; //ノード作成&追加 LayerNode newNode = new LayerNode(currentLayer); parentNode.AddChildNode(newNode); //レイヤ種類を取得 LayerSectionInfo sec = currentLayer.AdditionalInfo .OfType <LayerSectionInfo>().FirstOrDefault(); LayerSectionType secType = LayerSectionType.Layer; if (sec != null) { secType = sec.SectionType; } //レイヤ種類別処理 switch (secType) { case LayerSectionType.SectionDivider: //フォルダ終了(逆順に並んでいるため、こちらが先に来る) //ひとつ下の階層として以降のレイヤーを処理 newNode.Layer = null; newNode.AddChildNode(new LayerNode(currentLayer)); ParseLayerTree(layers, newNode); break; case LayerSectionType.OpenFolder: case LayerSectionType.ClosedFolder: //フォルダ開始(逆順に並んでいるため、こちらが後に来る) parentNode.Name = currentLayer.Name; //処理終了(再帰脱出条件) return; case LayerSectionType.Layer: default: //通常レイヤ break; } } }
protected KeyValuePair <string, List <Layer> > MakeResultItem(int index, LayerNode node) { string name = string.Format("{0:000}-{1}", index, node.GetPathString()); List <Layer> out_layer_list = node.GetAllLayers(); if (VisibleTopLevelGroup) { out_layer_list.Last().Visible = true; } return(new KeyValuePair <string, List <Layer> >( name, out_layer_list)); }
/// <summary> /// 子ノードを追加 /// </summary> /// <param name="node">追加するノード</param> public void AddChildNode(LayerNode node) { node.Parent = this; Children.Add(node); }