コード例 #1
0
        /// <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);
        }
コード例 #2
0
        public static LayerNode ParseLayerTree(PsdFile psd)
        {
            LayerNode root = new LayerNode();

            ParseLayerTree(psd.Layers.GetEnumerator(), root);

            return(root);
        }
コード例 #3
0
        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;
                }
            }
        }
コード例 #4
0
        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));
        }
コード例 #5
0
 /// <summary>
 /// 子ノードを追加
 /// </summary>
 /// <param name="node">追加するノード</param>
 public void AddChildNode(LayerNode node)
 {
     node.Parent = this;
     Children.Add(node);
 }