一括表示 |
---|
AutoCAD2004です。 |
もしかしてデベロッパの方で AutoCAD はあまり知らない方なのかな? 最近結構多いですよね、案件で AutoCAD を使うことになったが AutoCAD VBA だと図中の特定図形にどうアクセスすればよいか全く判らんという人。 さて図形にアクセスするには、実に色々な方法があります。例えば 1・ハンドル 2・図形名 3・オブジェクトID 4・座標から検索 5・XDATA 6・画層 7・文字内容 etc・・・ 問題はその文字がどのようにして作成されたかによって アクセス方法もまた変わってくるのですが・・・ |
早速の回答ありがとうございます。 > 問題はその文字がどのようにして作成されたかによって > アクセス方法もまた変わってくるのですが・・・ 文字はテキスト文字とマルチテキスト文字(複数行にわたる)です。 画層は同じ画層。 属性定義はしていません。 単純にk1、k2のような言葉が図面内にあちこち記入されています。 手動でやると 置換ダイアログボックスにてそれぞれの文字を別の文字に置き換えるわけですが、 この作業が毎図毎図出てくるので、 しかもリスト内の選択で可能な言葉なので、 なんとか独自のダイアログボックスから それらの文字にアクセスしたいのです。 ダイアログボックスはもうすでに作ってしまってあり、 あとは、図面とアクセスする方法さえわかれば、、、、です。 すみませんが、またよろしくお願いします。 |
現在開かれている複数図面のモデル空間のみの オブジェクト総当り方式ですが、Stringの二つの変数の説明は 釈迦に説法なので省きますよ。レイヤーの指定はacEntのLayerプロパティ といえばお判りになるかと。 しかし問題はMTEXTです。例えば"P4"という文字列を置換したい場合 そのMTEXTの文字列が"123\P456"だった場合には"123"と"456"の間には 改行コード"\P"が入っていますが、うかつに置換すると改行コードが ぶっとびますので、そのあたりの対応もしていただくことになります。 Sub macro() Dim acDoc As AcadDocument Dim acEnt As AcadEntity Dim CompareStr As String, ReplaceStr As String For Each acDoc In Documents For Each acEnt In acDoc.ModelSpace If (TypeOf acEnt Is AcadText) Or (TypeOf acEnt Is AcadMText) Then acEnt.TextString = Replace(acEnt.TextString, CompareStr, ReplaceStr) End If Next acEnt Next acDoc End Sub |
回答ありがとうございましす。 > 現在開かれている複数図面のモデル空間のみの 新規図面毎に処理をするので、開かれているのは1図面で、 アクティブになっている図面のみです。 なので For Each acDoc In Documents Next acDoc の行はいらないのですよね。 > しかし問題はMTEXTです。例えば"P4"という文字列を置換したい場合 > そのMTEXTの文字列が"123\P456"だった場合には"123"と"456"の間には > 改行コード"\P"が入っていますが、うかつに置換すると改行コードが > ぶっとびますので、そのあたりの対応もしていただくことになります。 その部分は単純に"123\P456"と考えていたのですが、 そうではないのですね。 この対応というのは、 "123\P456"を "123/P456"にするとか "123" & \P & "456"または "123" & Chr(13) & "456" という事でしょうか。 それとも別に ダイアログボックス内のテキストボックスが 複数行になるように設定してある場合、 \Pを使わずに、単純に右から左というわけにはいかないのでしょうか。 それと複数行になる場合、行間隔の尺度を 5行に対して1.5 6行に対して1 ・・・・ というように設定するには どのようにしたらいいのでしょうか。 ようは行の高さを固定したいのです。 すみません、何度も何度も。 よろしくお願いします。 |
> その部分は単純に"123\P456"と考えていたのですが、 > そうではないのですね。 > この対応というのは、 > "123\P456"を > "123/P456"にするとか > "123" & \P & "456"または > "123" & Chr(13) & "456" > という事でしょうか。 いやいや、例えば "P" を "B" とかに置換えすると "123\P456" が "123\B456" になって 改行コードがなくなってしまうという意味だと思います。 > それと複数行になる場合、行間隔の尺度を > 5行に対して1.5 > 6行に対して1 > ・・・・ > というように設定するには > どのようにしたらいいのでしょうか。 > ようは行の高さを固定したいのです。 文字列内に "\P" がどれだけあるか、その出現回数を調べて、 LineSpacingFactor プロパティの設定を変えればいいでしょう。 |
ありがとうございます。 |
こんにちは。 なんとかText文字のみは置き換える事が出来たのですが、 MTEXTが化けてしまいました。 その上、その文字上に4本線が出来ていて、 スクロールを動かすたびに上下に移動します。 それを削除する事も出来ません。 3Dで見ても何か浮遊物が図面上にあるのです。 これは何なんでしょうか。 ちなみにマクロは下記の通りです。 長いので一部省略していますが、 MTEXT部分だけ書きました。 置き換えをする前に、メッセージボックスで、 Textの内容を確認してあるのですが、 その時には問題なく表示されます。 Sub macro() Dim acEnt As AcadEntity Dim CompareStr As String, ReplaceStr As String With me k = 0 ReplaceStr= .K1.value If .K2.value <> "" Then ReplaceStr= ReplaceStr & "\P" & .K2.value k = k + 1 End If If .K3.value <> "" Then ReplaceStr= ReplaceStr & "\P" & .K3.value k = k + 1 End If If .K4.value <> "" Then ReplaceStr= ReplaceStr & "\P" & .K4.value k = k + 1 End If End with For Each acEnt In ActiveDocument.ModelSpace If (TypeOf acEnt Is AcadText) Or (TypeOf acEnt Is AcadMText) Then acEnt.TextString = Replace(acEnt.TextString, "S1", ReplaceStr) End If Next acEnt End Sub 変数kは行間の設定をするために拾ってあるのですが、 まだマクロには反映していません。 |
結局図面のベースとなるテンプレートにちょっと手を加えて、 なんとかMTEXTの方も無事置き換える事が出来ました。 別の投函でもお世話になりましたが、 結局ダイアログボックスをExcelの方に移し、 Excelのデータを無事にモデル空間、ペーパー空間に反映することが出来ました。 ありがとうございました。 |