[リストへもどる]
一括表示
タイトルVBAで図面内の特定の文字を検索して置き換えたい
記事No934
投稿日: 2005/01/10(Mon) 19:09:20
投稿者おけい
AutoCAD2004です。

Excel、Word、Access等でVBAを多少使っていたのですが、
AutoCADでのVBAはなかなかイメージが湧きません。

私がやろうとしているのは、
図面内に

k1
k2

と文字を並べ、
作成したダイアログボックスを開き、
k1にはコンボボックスで文字を選択、
k2にはテキストボックスで文字を記入(複数行有り)して、
OKボタンを押した後、図面内のk1、k2の文字を
ダイアログボックスで記入した文字に置き換える
という作業をしたいのです。

ダイアログボックスを作る事が出来ても、
それをどのように図面内の文字にアクセスするのが、
さっぱりわかりません。

すみませんがよろしくお願いします。

タイトルRe: VBAで図面内の特定の文字を検索して置き換えたい
記事No939
投稿日: 2005/01/11(Tue) 10:41:44
投稿者WEBMASTER
もしかしてデベロッパの方で AutoCAD はあまり知らない方なのかな?
最近結構多いですよね、案件で AutoCAD を使うことになったが
AutoCAD VBA だと図中の特定図形にどうアクセスすればよいか全く判らんという人。

さて図形にアクセスするには、実に色々な方法があります。例えば

1・ハンドル
2・図形名
3・オブジェクトID
4・座標から検索
5・XDATA
6・画層
7・文字内容
etc・・・

問題はその文字がどのようにして作成されたかによって
アクセス方法もまた変わってくるのですが・・・

タイトルRe^2: VBAで図面内の特定の文字を検索して置き換えたい
記事No940
投稿日: 2005/01/11(Tue) 11:20:29
投稿者おけい
早速の回答ありがとうございます。

> 問題はその文字がどのようにして作成されたかによって
> アクセス方法もまた変わってくるのですが・・・

文字はテキスト文字とマルチテキスト文字(複数行にわたる)です。
画層は同じ画層。
属性定義はしていません。
単純にk1、k2のような言葉が図面内にあちこち記入されています。

手動でやると
置換ダイアログボックスにてそれぞれの文字を別の文字に置き換えるわけですが、
この作業が毎図毎図出てくるので、
しかもリスト内の選択で可能な言葉なので、
なんとか独自のダイアログボックスから
それらの文字にアクセスしたいのです。

ダイアログボックスはもうすでに作ってしまってあり、
あとは、図面とアクセスする方法さえわかれば、、、、です。

すみませんが、またよろしくお願いします。

タイトルRe^3: VBAで図面内の特定の文字を検索して置き換えたい
記事No951
投稿日: 2005/01/11(Tue) 22:06:11
投稿者 オリバー君
現在開かれている複数図面のモデル空間のみの
オブジェクト総当り方式ですが、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

タイトルRe^4: VBAで図面内の特定の文字を検索して置き換えたい
記事No952
投稿日: 2005/01/12(Wed) 05:29:09
投稿者おけい
回答ありがとうございましす。

> 現在開かれている複数図面のモデル空間のみの
新規図面毎に処理をするので、開かれているのは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
・・・・
というように設定するには
どのようにしたらいいのでしょうか。
ようは行の高さを固定したいのです。

すみません、何度も何度も。
よろしくお願いします。

タイトルRe^5: VBAで図面内の特定の文字を検索して置き換えたい
記事No956
投稿日: 2005/01/12(Wed) 10:11:42
投稿者WEBMASTER
> その部分は単純に"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 プロパティの設定を変えればいいでしょう。

タイトルRe^6: VBAで図面内の特定の文字を検索して置き換えたい
記事No964
投稿日: 2005/01/13(Thu) 05:15:17
投稿者おけい
ありがとうございます。
なんとか出来そうなのですが、
急ぎの仕事が入ってしまって、
マクロ作りは後回しになってしまいました。
なので、まだ試していません。
試した際にわからない事があったら質問すると思いますので、
その時はまたよろしくお願いします。

ありがとうございました。

タイトルMTEXTが文字化けしてしかも文字上に浮遊物が
記事No988
投稿日: 2005/01/16(Sun) 05:54:48
投稿者おけい
こんにちは。

なんとか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は行間の設定をするために拾ってあるのですが、
まだマクロには反映していません。

タイトル出来ました。ありがとうございました。
記事No989
投稿日: 2005/01/17(Mon) 09:50:53
投稿者おけい
結局図面のベースとなるテンプレートにちょっと手を加えて、
なんとかMTEXTの方も無事置き換える事が出来ました。
別の投函でもお世話になりましたが、
結局ダイアログボックスをExcelの方に移し、
Excelのデータを無事にモデル空間、ペーパー空間に反映することが出来ました。
ありがとうございました。