通り芯記号自動入力&連番配置

  • URLをコピーしました!

通り芯記号自動入力&連番配置

通り芯記号は、毎回文字を入力してブロック属性に反映していると手間がかかります。そこで私は、メニューから文字を組み立てて、そのまま通り芯ブロックに反映し、連続配置できるLISPを作成して使っています。

このLISPでは、A〜ZやN1〜N20をメニューから選び、必要に応じてOTHERで任意文字も追加できます。例えば「A」「1」「B」ではなく、通り芯として使いたい文字列を順番に選んで組み立て、その内容をブロック属性へ自動入力します。確定後は同じ文字列のまま連続で挿入できるため、同じ通り芯記号を複数箇所に配置する作業もスムーズです。Enterで文字選択に戻れるので、次の符号への切り替えも簡単です。

ブロック名と属性TAGを指定してあるため、社内標準の通り芯ブロックに合わせて運用しやすいのも特徴です。通り芯記号の入力ミスを減らし、配置作業を効率化できる実務向けLISPです。

(vl-load-com)

;;; ================================

;;; 通り芯:メニューで文字列を組み立て → 属性反映 → 挿入

;;; コマンド: TSIN

;;; ================================

;; ———- 設定 ———-

(setq *TSIN_BlockName* “異尺度対応通り芯”) ; ブロック名

(setq *TSIN_AttrTag*   “通り芯符号”)       ; 属性TAG(入らない時はTAG要確認)

;; ————————–

(defun tsin-alpha-AZ ( / i r)

  (setq i 65 r ‘())

  (while (<= i 90)

    (setq r (cons (chr i) r))

    (setq i (1+ i))

  )

  (reverse r)

)

(defun tsin-num-N1-20 ( / i r)

  (setq i 1 r ‘())

  (while (<= i 20)

    (setq r (cons (strcat “N” (itoa i)) r))

    (setq i (1+ i))

  )

  (reverse r)

)

(defun tsin-join (lst sep / r)

  (if lst

    (progn

      (setq r (car lst))

      (foreach s (cdr lst) (setq r (strcat r sep s)))

      r

    )

    “”

  )

)

(defun tsin-key->text (k / up)

  ;; N12 → 12 へ変換(属性へ入れる用)

  (setq up (strcase k))

  (if (and (> (strlen k) 1) (= (substr up 1 1) “N”))

    (substr k 2)

    k

  )

)

(defun tsin-set-attr (blk tag val / a)

  (if (and blk (vlax-method-applicable-p blk ‘GetAttributes))

    (foreach a (vlax-invoke blk ‘GetAttributes)

      (if (= (strcase (vla-get-TagString a)) (strcase tag))

        (vla-put-TextString a val)

      )

    )

  )

)

(defun tsin-insert (blkName ipt / doc space bref)

  (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))

  (setq space

    (if (= 1 (getvar “CVPORT”))

      (vla-get-PaperSpace doc)

      (vla-get-ModelSpace doc)

    )

  )

  (setq bref

    (vla-InsertBlock

      space

      (vlax-3d-point (list (car ipt) (cadr ipt) 0.0))

      blkName

      1.0 1.0 1.0 0.0

    )

  )

  bref

)

(defun tsin-build-string ( / alpha nums menuKeys ans out promptText add)

  ;; 何回でも選択して out に追加。Enterで確定(=ans nil)

  (setq alpha (tsin-alpha-AZ))

  (setq nums  (tsin-num-N1-20))

  (setq menuKeys (append alpha nums (list “OTHER”)))

  (setq out “”)

  (while

    (progn

      (setq promptText

        (strcat

          “\n追加する文字を選択 [“

          (tsin-join (append alpha nums (list “OTHER(手入力)”)) “/”)

          “]  現在: \”” out “\””

          “\n(Enterで確定): “

        )

      )

      (initget (tsin-join menuKeys ” “))

      (setq ans (getkword promptText))

      ans

    )

    (cond

      ((= (strcase ans) “OTHER”)

       (setq add (getstring T “\n追加したい文字を手入力: “))

       (setq out (strcat out add))

      )

      (T

       (setq out (strcat out (tsin-key->text ans)))

      )

    )

  )

  out

)

(defun c:TSIN ( / val ipt blk)

  (prompt (strcat “\n=== 通り芯挿入(” *TSIN_BlockName* “)=== “))

  ;; 外側:文字列作成 → 挿入 → また文字列作成…

  (while

    (progn

      (setq val (tsin-build-string))     ; Enterで確定

      (if (= val “”)

        (progn (prompt “\n空のまま確定したので終了。”) nil)

        T

      )

    )

    ;; 内側:同じ文字列で連続挿入(Enterで文字選択に戻る)

    (while (setq ipt (getpoint (strcat “\n挿入点を指示 [” val “] (Enterで文字選択に戻る): “)))

      (setq blk (tsin-insert *TSIN_BlockName* ipt))

      (tsin-set-attr blk *TSIN_AttrTag* val)

    )

  )

  (princ)

)

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

Contents