PDA

View Full Version : AutoLispで元のブロックの、、、



r.jin
2009-04-22, 02:21 AM
こんにちは。初めて質問させていただきます。

挿入したダイナミックブロックを元に、元のブロックのカスタムプロパティ値を取得する部分がうまくいかず悩んでいます。

AutoLispで作りたいコマンドは
「元に戻す」コマンド
「全て元に戻す」コマンド
というコマンドの2つです。

「全て元に戻す」コマンドは[ResetBlock メソッド]を割り当てることで可能ですが、
「元に戻す」コマンドは、1つの点パラメータを選択し、そのパラメータだけ元のブロックの位置に戻すという処理を行いたいため、元のブロックの点パラメータのデータを取得する必要があります。

図面に挿入した後のブロックから
[GetDynamicBlockProperties メソッド]を使用して値は取得できるのですが、
挿入した元のブロックを
[EffectiveName プロパティ]で元のブロック名を取得し、(entget)を使って
[GetDynamicBlockProperties メソッド]を使用すると、
使い方が間違っているのか、うまく使うことができません。

entgetから[INSERT]グループコード、[BLOCK]グループコード、[BLOCK_RECORD]までは取得できましたが、このデータをどのように使うのかも現在調べているところでなかなか進まない状態です。

以上の質問内容がわかりづらかったらすみません。。。
AutoCADは2009を使用し、AutoLispのHELPを見ながら日々苦戦しています。
何か良い方法、あるいは参考にできるサイトなどがありましたら教えていただきたいです!

よろしくお願いいたします。

y_hoshi
2009-04-23, 02:32 AM
図面に挿入した後のブロックから
[GetDynamicBlockProperties メソッド]を使用して値は取得できるのですが、
挿入した元のブロックを
[EffectiveName プロパティ]で元のブロック名を取得し、(entget)を使って
[GetDynamicBlockProperties メソッド]を使用すると、
使い方が間違っているのか、うまく使うことができません。


元のブロック名を取得して・・・ということは、ブロック参照(Blockref)ではなく、
ブロック(Block)に対して行おうとしているからではないですかね?

LISPは詳しくないので分かりませんが、一度、ブロックを同じ位置に挿入して
そのブロック参照から値を取ってみては如何でしょうか?

まと外れな回答だったらすいません。

liki.umrk
2009-05-14, 03:14 PM
>GetDynamicBlockProperties
これはあくまでBlockRef(INSERT図形)用のメソッドです。

(cdadr (member '(3 . "ACAD_ENHANCEDBLOCK") (entget (vlax-vla-object->ename (vla-GetExtensionDictionary BlockRecord)))))
てな感じで、ACAD_EVALUATION_GRAPHを取得。
(mapcar 'cdr (vl-remove-if '(lambda (x) (= (car x) 360)) (entget AcadEvaluationGragh)))
で、パラメータとかアクションなどを取得。
後は(entget)で眺めてみるとパラメータ値がどこにあるかわかるはず。
その値を最初のBlockRefに反映させればいいはず。

r.jin
2009-05-18, 07:54 AM
元のブロック名を取得して・・・ということは、ブロック参照(Blockref)ではなく、
ブロック(Block)に対して行おうとしているからではないですかね?

LISPは詳しくないので分かりませんが、一度、ブロックを同じ位置に挿入して
そのブロック参照から値を取ってみては如何でしょうか?

まと外れな回答だったらすいません。

回答ありがとうございます!
AUGIフォーラムに慣れていないのと、業務優先でなかなかお返事できませんでした。申し訳ないです。

y_hoshiさんに教えていただいた方法で試したところ、思い通りの動作ができました!
ありがとうございますっ!
ただ、やはりコマンドの中で処理してしまうとはいえ、
使わないブロックを挿入して値を取得し、最後に(entdel (entlast))で削除する動作を
しない方がスマートかと思うので、その方法があればそちらでも試してみたいと思います。
もし他の方法ができなければ、動作はできているのでこのまま使いたいと思います(^^)
ありがとうございました!

r.jin
2009-05-18, 08:02 AM
>GetDynamicBlockProperties
これはあくまでBlockRef(INSERT図形)用のメソッドです。

(cdadr (member '(3 . "ACAD_ENHANCEDBLOCK") (entget (vlax-vla-object->ename (vla-GetExtensionDictionary BlockRecord)))))
てな感じで、ACAD_EVALUATION_GRAPHを取得。
(mapcar 'cdr (vl-remove-if '(lambda (x) (= (car x) 360)) (entget AcadEvaluationGragh)))
で、パラメータとかアクションなどを取得。
後は(entget)で眺めてみるとパラメータ値がどこにあるかわかるはず。
その値を最初のBlockRefに反映させればいいはず。

回答ありがとうございます!
ブロックエディタでの点パラメータ名を「Point」にした時に
Insertしたブロックのカスタムプロパティは「Point X」と「Point Y」という表示になってしまうので、
GetDynamicBlockPropertiesは違うんだろうなということはわかったのですが、
まさかliki.umrkさんに教えていただいたような方法があるとはビックリです。
サイト探してもヘルプにも出てこなかった情報です(^^;)
ぜひ参考にさせていただきます!
ありがとうございます!