お知らせ

--------------------------------------------------

プログラム作成/コンサルティングの申し込みはこちら

--------------------------------------------------

2010年8月13日金曜日

.NET(サンプル プログラム) - 「点オブジェクトと似た動作をするブロックの作成」(AutoCAD 2011)

久しぶりに .NET の勉強のため、サンプル プログラムを作ってみました。

しばらくやらないと、せっかく勉強したこともなかなか思い出せなくてダメですね。

DDPTYPE[点スタイル管理 D] コマンドで点オブジェクトの表示スタイルを変更できますが、表示スタイルは AutoCAD が用意したものしか使えないので、ブロックを点オブジェクトと似た動作をするようにしてみました。

ただし、ブロックなので、レイアウトで複数のビューポートがあるときは、点オブジェクトと違った動きになります。

プログラムの内容としては、今まで勉強してきた以下の機能を使ってみました。
ディクショナリの登録
ブロックに Xrecord を追加
イベント
などなど
作ったコマンドはこんな感じです。
AVDO_DDPTYPE(または AVD)コマンド : [点スタイル管理(AVDO_Point)] ダイアログを表示するコマンド
AVDO_POINT(または AVP)コマンド : ブロックを点として挿入するコマンド
AVDO_POINT_EVENT(または AVPE)コマンド : イベントを登録するコマンド
AVDO_POINT_EVENT_REMOVE(または AVPER)コマンド : イベントの登録を解除するコマンド

動作の詳細は、動画を見てみてください。



DLL は こちら、ソースは こちら にあります。

※ レイアウトでモデル空間をアクティブにしても、ペーパー空間にブロックが作成されてしまう間違いを修正してファイルを置き換えました。(2010/08/14)
※ ロックされた画層に点ブロックがあって再作図すると大きさが変わらない現象も見つけたので修正してファイルを置き換えました。(2010/08/14)

6 件のコメント:

  1. ビューをロックしたときにも同じように動作しますか?

    返信削除
  2. はい。ビューをロックしたときはズームしてもビューの大きさが変わらないので、通常の点オブジェクトと同じように再作図を行っても大きさが変わることはないです。

    ただ、ロックとは関係なく、ビューでは通常の点オブジェクトとちょっと違った動きになることがあります。ブロックで作成しているので、モデルで再作図を行うと、レイアウトのビュー内でのブロックの大きさも変わってしまいます。(ビューで再度再作図すれば通常の点オブジェクトと同じ大きさになります。)

    返信削除
  3. 返信ありがとうございます。
    すみません。点オブジェクトの表示動作をよく把握していませんでした。

    実は、ビューロックのときにも大きさが変わると良いなと思ったのです。
    自作コマンドで、VIEWSIZE と SCREENSIZE を使って画面上いつも同じピクセルサイズでマーカーを表示させているのがあるのですが、それの参考にならないかなと思ったのです。
    割込ズーム中でもリアルタイムで変わるという意味ではありません。そういうのは難しそうなので。

    システム変数の VIEWSIZE がロックされた状態で可能なのか、可能ならその方法は? あるいは、一時的にビューロックを解除しているのか? そのメカニズムを知りたかったのです。
    私が使えるのはLispだけなので限界はあると思いますが。

    返信削除
  4. もう一回やってみたのですが…あれっ?…点オブジェクトはビューがロックされているときに大きさ変わることもあるし変わらないこともあるみたいです。ビューの SCREENSIZE と レイアウトの SCREENSIZE を比較して、小さい方を元に大きさを計算しているような感じがします。

    ところで、私は匿名さんのやりたい動作がまだ分かっていないようです。ごめんなさい。

    ビューをロックということですので、やろうとしていることは、レイアウトでですよね。

    このとき、アクティブなのはモデル空間(MSPACE コマンドを実行した状態)でしょうか。それともペーパー空間(PSPACE コマンドを実行した状態)でしょうか。

    もしモデル空間がアクティブな状態なら、大きさを決めるために、モデル空間がアクティブな状態でペーパー空間の VIEWSIZE の値を取得する必要がありますよね。それさえ分かれば尺度を変えるだけなのでできると思いますが、それがどこから取ってこれるかは調べてみないと分からないです。

    もしペーパー空間がアクティブな状態なら、現在の空間ではないモデル空間のオブジェクトを更新しなきゃいけないですよね。AutoLISP ではできないように思います。.NET ならおそらく可能だと思います。

    匿名さんのやりたい動作をちゃんと理解できたら調べてみようかと思いますので、何度もすみませんが、もう一度どんな動きにしたいか詳しく教えてもらえないでしょうか。

    返信削除
  5. 説明不足ですみません。
    ペーパー空間からモデル空間に入って作業しているときのことです。確か、「現在の浮動モデル空間」。
    例えば、円をマーカー(目印)代わりに使うとして、画面上の見た目をいつも同じ大きさで作図したいのです。一時的なものなのでコマンドが終了するときには削除します。

    >ペーパー空間の VIEWSIZE の値を取得する必要がありますよね。
    そうか、それも加味して考えれば良いのか? ちょっと悩んでみます。

    なるほど、ビューがロックされていると、浮動モデル空間で作業していても、ズームコマンドが発行されると、いったんペーパー空間に切り替えてズームが終了したら元の浮動モデル空間に戻るというからくりのようですね。今いじっていて気付きました。
    これで、VIEWSIZE が固定されたままである理由が解りました。

    返信削除
  6. ペーパー空間からモデル空間に入って作業ですね。
    となると、ペーパー空間の VIEWSIZE の値をどうやって取得するかってことですね。
    いったんペーパー空間に切り替えて取得という方法で行けるかも知れないですね。
    また何かあればご遠慮なくお知らせください。

    返信削除