スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

デザインドール

デザインドールというソフトの紹介。

3Dのモデルを動かしてデッサン人形代わりにしたり3Dモデルを書き出せるソフト。
頭身や筋肉のつき方が変えられるのも特徴。

http://terawell.net
読み込み以外のほぼすべての機能が無料で使える。

・デッサンなどのポーズ集は好きなポーズがなかなか見つからない
・3Dソフトは無駄に覚える事が多すぎて面倒

と言う人には是非お勧め

スポンサーサイト

Null結合演算子

(hoge ?? "")


(hoge == null ? "" : hoge)

と同意

ねよっと。

foreachで同じ型だけ取り出したい時

foreachで同じ型だけ取り出したい時、以下のように書かずに

foreach (var item in Items)
{
Button b = item as Button;
if (b == null) continue;
//処理
}


OfTypeを使うとシンプルに書けます!

foreach (var b in Items.OfType<Button>())
{
//処理
}


最後の()を忘れると??ってなったりします。(これを忘れないためにメモとしてこの記事を書いてたり・・・。)

ねよっと。

C#で関数の途中で処理を中断→再開する方法

ループ処理の最中でメインスレッドの流れを止めずにある関数を中断しておきたいことはたまにありますよね?
俗にいうコルーチンってやつですな。

このような時、C#ではyieldってものを使って実装できるっぽい!

早速調べてみたのでサンプルを。
こんな感じにIEnumerator を返す関数をコルーチンのように見立てて利用。
        static IEnumerator TestAction = GetTestAction();
static IEnumerator GetTestAction()
{
while (true)
{
Console.WriteLine("1");
yield return null;
Console.WriteLine("2");
yield return null;
Console.WriteLine("3");
yield return null;
}
}

上記を使う時はループ処理の中でこんなかんじに。
            while (true)
{
Console.Write("A");
TestAction.MoveNext();
Thread.Sleep(1000);
}


実行すると1秒ごとに
A1
A2
A3
A1
A2
A3

とちゃんと表示されてますね。
結構便利?!
try catchの中では使えないみたいなのでご注意を。


実行する手順は決まってるけどあるステータスの時だけ処理を止めたい・・・でもメインの流れを止めたくない・・・。
そん時に便利な機能だと思います!
実際に使う時はこんな感じになるのかな
        static IEnumerator TestAction = GetTestAction();
static IEnumerator GetTestAction()
{
while (true)
{
startAction();
while (state == hoge)//一定の状態の場合は待機
{
yield return null;
}
endAction();
yield return null;
}
}


ねよっと。

Reactive Extensions

C#にてイベントを制御する際に「Reactive Extensions」に興味を持ったので調べてみた


【まずはインストール方法】
プロジェクトを右クリック → NuGetパッケージの管理 から Reactive Extensionsを探してInstall


【イベントの扱い方】
Rxでイベントを扱うためにはIObservableオブジェクトの作成が必要
Observableクラスにstaticな生成関数が用意されている
調査してみると
FromEvent
FromEventPattern

の二種類がある

二つの関数を歴史的にみると名前が置き換わってたりしていて結構ややこしい
似たようなことをしてるけどFromEventPatternのほうがすっきり書けることが多い

マウスダウンイベントをIObservableオブジェクトへと変換する場合以下のようになる

Observable.FromEventPattern
var mouseDown = Observable.FromEventPattern(this, "MouseDown");

Observable.FromEvent
var mouseDown = Observable.FromEvent(
h => (s, e) => h(e),
h => this.MouseDown += h,
h => this.MouseDown -= h);



【ドラッグ中に座標表示&離したらCompletedと表示するサンプル】
var mouseDown = Observable.FromEventPattern(this, "MouseDown");
var mouseUp = Observable.FromEventPattern(this, "MouseUp");
Observable.FromEventPattern(this, "MouseMove")
.SkipUntil(mouseDown)
.TakeUntil(mouseUp)
.Finally(() => textBlock.Text = "Completed")
.Repeat()
.Select(e => e.EventArgs.GetPosition(null))//座標を送る
.Subscribe(p => textBlock.Text = string.Format("X: {0}, Y:{1}", p.X, p.Y));
SkipUntil = 引数のIObservableから値が発行されるまで通行禁止
TakeUntil = 引数のIObservableから値が発行されるまで通行許可
Finally = 一連の処理が終わったタイミングで実行される
Repeat = Until系の制御を復活させるために追加(Finallyの後ろじゃないとダメ)

圧倒的にシンプルに書ける・・・ラムダ式との相性も抜群ですな
Doメソッドで目的のタイミングに処理を追加できるので、画面外でもキャプチしていたい場合は以下のようになる
.SkipUntil(mouseDown.Do(_ => this.CaptureMouse()))
.TakeUntil(mouseUp.Do(_ => this.ReleaseMouseCapture()))


【時間制御まわり】
イベントを流す際に時間を制御するものも豊富に用意されている
例)
Delay = 遅れて流す(指定時間経過してから流す)
Throttle = 落ち着いたら流す(指定した時間内に値がなければ値を流す)
Buffer = まとめて流す(指定時間内は値を溜めて最後にまとめて流す)
Timeout = 観測時間にリミットを付ける(指定した時間内に値がなければエラーにする)


【ファイルの更新監視サンプル】
FileSystemWatcherは書き込み時に複数のChangeイベントが発生して制御が面倒
そんなときはRXで解決!
var watcher = new FileSystemWatcher("C:\\", "test.txt") { EnableRaisingEvents = true };
var changed = Observable.FromEventPattern(watcher, "Changed")
.Throttle(TimeSpan.FromSeconds(1))
.Subscribe(_ => hogehoge);
Throttlenにより書き込みが落ち着いた時点でイベントが発行される




Rxはちょっと資料が少ないけれどかなり強力なライブラリなので今後も要チェックかも
日本語資料が少ない中、こちらのサイトにはお世話になりました
感謝感謝

ねよっと。
プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。