2012年11月8日木曜日

[Excel]コネクタの小技


ドキュメントはわかりやすさが肝。
わかりやすさという点で図形ほど直観的なものはない。(絵心にもよるが。。。)

Excelで図形をレイアウトするのは意外と時間がかかってしまう。

例えば1つの図形に複数のコネクタを接続した場合、重なってどの線がどの矢印かわからなくなってしまう。

こんなケース。



こんな感じ↓に見える。
A ->C
B<->C

が、実際は↓こう。
A ->C
B<- C


コネクタを外してわかるようにしても、


Cをずらすと線が離れちゃう。







そんなときの小技。

まずCの図形の端に小さい図形を配置し、最背面に移動させる



Cと小さい図形をグループ化


これで完了。
裏にいる小さい図形とコネクタを結べば



Cを移動させても矢印がついてきてくれる。




予め、沢山小さいやつを配置したのをひな形として作っておけば、


ドキュメントをきれいにスピーディーに作ることが出来るようになる。



例えるなら千手観音の働きだ、、、おもしろくなかった。



[C#][WPF][Silverlight]XAMLをロードしてプロパティ設定し、保存する


デザイナーさんに数百枚に及ぶの地図をXAMLで作成してもらい、埋め込まれている大量のカスタムコントロールのプロパティを設定することになった。デザイナーさんにプロパティ設定も一緒にお願いしたかったんだけど、それだけ工数がかかると費用もかかるっちゅうわけでなんとかならんか考えてみた。



ツールを作ろう。そう、京都に行こうみたいなのりだ。
XAML を読み込んで Excel とかで管理している情報からプロパティを埋め込んでに保存するやつ。


うーーーーん、ロードは XamlReader で読み込める。
でも Silverlight って XamlWriter なかったよなぁ。

よく考えてみると、XAML って要は XML じゃんという驚愕の新事実に気づく。
XML ファイルとしてロードして、プロパティ、つまり属性を追加して値を書き込めばいん
じゃねぇ?っていうことで、テストプロを作ってみた。


    string file = @"D:\hogehoge.xaml";
    string controlName = "hogehoge";
    string propertyName = "HogeProperty";
    string value = "ほげほげ";

    // カスタムコントロールの x:Name を検索するのに必要
    XNamespace x = "http://schemas.microsoft.com/winfx/2006/xaml";

    // ロード
    XElement root = XElement.Load(file);

    // 全要素検索
    foreach (var element in root.Descendants())
    {
        // 対象のコントロール名と一致したら、属性を設定(x:Nameっていう文字列にするとException!)
        if (element.Attribute(x + "Name") != null && element.Attribute(x + "Name").Value == controlName)
        {
            element.SetAttributeValue(propertyName, value);
            break;
        }
    }

    // XML宣言は無しでタブによるインデント
    var settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;
    settings.Indent = true;
    settings.IndentChars = "\t";

    // 保存
    using (var writer = XmlWriter.Create(file, settings))
    {
        root.Save(writer);
    }





おーけーおーけー、これで数百万円分の工数を稼げたな。
XML の操作なので Windowsアプリで作ればよくて、わざわざ Silverlight でブラウザ外
実行する云々考える必要もないしね。