🕌
AutoCADで集計する(コード1)
集計するストーリー
簡単にいえば、集計する文字を選択→全部合計処理→描き出す こんな感じです。
もう少し詳細に考えると
1.選択する文字
文字を選択 選択する文字には、記号「A=」とか「L=」とかあったりするかな?
また、「m2」とか「m」とかの単位があるかな?って事が気になる
もしあったら、その記号や単位を削除する手間が沢山かかるよね!
2.選択の仕方
選択は、1個づつか? いっぺんに選択するか? いっぺんに選択できる方が楽
3.描き出す場所
描き出す時に、クリックして場所を指定しなくっちゃ!
1.選択する文字
選択する文字から頭に記号が付いていたら削除する設定
;-----------------------------------記号を入力
(setq aa (getstring "\n 先頭の記号を入力(記号なしはEnter): "))
(if (= aa "")
(setq aa "") ; 記号なし
(setq aa (strcat aa "=")) ; 入力された記号に "=" を付加
)
先頭の記号「A=」なら「A」を入力 無い時は、そのままエンター
strcatで Aと=を合わせて「A=」にしてくれます
(defun remove-units (txt units)
(if (and txt (listp units))
(progn
(foreach u units
(if (and (stringp u) (stringp txt))
(setq txt (vl-string-right-trim u txt))
)
)
txt
)
"" ; txtがnilなら空文字を返す
)
)
defun remove-units で、単位を削除させる関数にします
2.選択の仕方 処理します
;-----------------------------------選択セット取得
(setq ss (ssget '((0 . "*TEXT"))))
(princ "\n 集計する数値を選択...")
(setq i 0)
(if ss
(progn
(princ "\n 合計は...")
(repeat (sslength ss)
(setq ename (ssname ss i))
(setq elist (entget ename))
(setq txt (cdr (assoc 1 elist)))
(setq tsz (cdr (assoc 40 elist)))
(setq layn (cdr (assoc 8 elist)))
(setq ttypen (cdr (assoc 7 elist)))
;-----------------------------------記号と単位の削除
(setq txt (vl-string-left-trim aa txt))
(setq txt (remove-units txt unitList))
;-----------------------------------数値変換と集計
(if (= i 0)
(setq stxt (atof txt))
(setq stxt (+ stxt (atof txt)))
)
(setq i (+ i 1))
)
)
)
選択セットにいれて、文字から 記号と単位を(remove-units関数を使って)削除 数値に変換して集計
3.描き出す場所
;-----------------------------------結果描画
(setq lay (getvar "clayer"))
(command-s "._-LAYER" "_S" layn "")
(setq ttype (getvar "TEXTSTYLE"))
(setvar "TEXTSTYLE" ttypen)
(setq stxt (rtos stxt 2 3))
(setq p1 (getpoint "\n 集計結果の描出し点をクリック!:"))
(setq scol (getvar "cecolor"))
(if (or (= scol 256) (= scol 0)) (setq scol "BYLAYER"))
(command "._TEXT" "J" "L" p1 tsz "0" stxt)
(command "._-LAYER" "_S" lay "")
(setvar "TEXTSTYLE" ttype)
(redraw)
まーま いろいろやっちゃいましたー
これがあれば、動画のような集計ができるようになるがよー
ほいたらねー
Discussion