コミュニティ
AutoCAD LT - 日本語
製品テクニックや情報を共有、質問、解答したり、情報を検索など使い方は様々です。お役立てください。
キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

autolispの改行での置換について

4件の返信4
返信
メッセージ1/5
travinyan
124 件の閲覧回数, 4 件の返信

autolispの改行での置換について

質問です。わかる人が退職してしまったためどなたかわかる方がいたら教えてほしいのですがautolispでテキストの置換をしていました。このコードでは改行されたマルチテキストで置換ができないようなのですが出来るようにならないでしょうか。通常はリストに”123”,”455”のようにして置換前の文字を置換していました。これを改行されたマルチテキストでも出来るようにしたいです。よろしくお願いします。

 

 

(defun replace-mtext (replacement-list)
(foreach pair replacement-list
(setq old-str (car pair))
(setq new-str (cadr pair))
(setq ss (ssget "X" (list (cons 0 "MTEXT") (cons 1 (strcat "*" old-str "*")))))
(if ss
(progn
(setq i 0)
(repeat (sslength ss)
(setq ent (ssname ss i))
(setq entdata (entget ent))
(setq text (cdr (assoc 1 entdata)))
(setq new-text (vl-string-subst new-str old-str text))
(setq entdata (subst (cons 1 new-text) (assoc 1 entdata) entdata))
(entmod entdata)
(setq i (1+ i))
)
)
)
)
(princ)
)

4件の返信4
メッセージ2/5
N.H1971
次のアカウントへの返信: travinyan

試してみましたが、このコードでは、同一マルチテキスト内に置換対象文字列が複数あった場合、最初の文字列しか変換されません。

 

>このコードでは改行されたマルチテキストで置換ができないようなのですが出来るようにならないでしょうか。

改行されていても、その文字列が最初であれば置換されますが、質問者さんの環境では、改行されていると最初の文字列でも置換されないのでしょうか。

 

置換前後の文字列の状態を示していただくことはできませんか?



H N
AUG-JP Staff
AUG-JP

メッセージ3/5
N.H1971
次のアカウントへの返信: travinyan

マルチテキスト内の対象文字列を全て置換する場合、以下のようになります。

(defun replace-mtext (replacement-list)
  (foreach pair replacement-list
    (setq old-str (car pair))
    (setq new-str (cadr pair))
    (setq ss (ssget "X" (list (cons 0 "MTEXT") (cons 1 (strcat "*" old-str "*")))))
    (if ss
      (progn
        (setq i 0)
        (repeat (sslength ss)
          (setq ent (ssname ss i))
          (setq entdata (entget ent))
          (setq text (cdr (assoc 1 entdata)))
          (while (vl-string-search  old-str text)
            (setq text (vl-string-subst new-str old-str text))
          )
          (setq entdata (subst (cons 1 text) (assoc 1 entdata) entdata))
          (entmod entdata)
          (setq i (1+ i))
        )
      )
   )
  )
(princ)
)


H N
AUG-JP Staff
AUG-JP

メッセージ4/5
travinyan
次のアカウントへの返信: N.H1971

返信ありがとうございます!最初の文字列は置換されます。マルチテキスト内に複数あるわけではなく

 

置換前:

1-002

置換後:

1-002

 

このように改行されているマルチテキストを置換したいのですが、有→無と置換すると他の置換したくない有も置き換わってしまうため

 

1-002\n有→1-002\n無

 

のようにマルチテキスト内の改行も含めて置換できないかなと模索していました。

申し訳ありません、私の説明が下手でうまく伝えられないかもしれません。。

メッセージ5/5
N.H1971
次のアカウントへの返信: travinyan

>1-002\n有→1-002\n無

>のようにマルチテキスト内の改行も含めて置換できないかなと模索していました。

 

改行文字も「文字」ですから・・・

それを置換の場合だけ無視というのは、ちょっとイレギュラーな扱いです。

意図的な改行ではなく、マルチテキストの幅の影響で自動改行になっているものは、普通に置換できますし。

 

お使いのLispで改行しているものを対象にしたい場合は、置換前後の文字列を「1-002\P有」「1-002\P無」とすれば、改行を含んで置換できます。(「\P」がマルチテキストの改行コードです)

Lisp内で、1-002有のあらゆる改行パターンを総当たりさせることもできますが、そうすると意図しない文字列も変換されそうなので、個人的にはお薦めできないです。

 

 



H N
AUG-JP Staff
AUG-JP

お探しの情報が見つからないときは、コミュニティで質問しましょう。困っている人がいたら、情報を教えてあげましょう。

フォーラムに投稿