鋼材断面を側面ブロックに反映するLISP
鋼材の側面図を描くとき、断面ブロックの寸法や向きを見ながら側面ブロックを調整するのは手間がかかります。そこで作成したのが、基準となる断面ブロックAの情報を、複数の側面ブロックBへ一括反映するLISPです。
このLISPでは、最初に断面ブロックを1つ選び、その後コピー先となる側面ブロックを複数選択します。ブロック名から鋼材寸法を自動で解析し、高さ・幅・板厚・リップ長・外径などを取得します。さらに、表裏や長辺短辺、ウェブ側・フランジ側、端部なしの有無などは最初の1回だけ質問し、その結果を選択したすべての側面ブロックへまとめて反映します。
対応しているのは、アングル、H形鋼、角パイプ、丸棒、丸パイプ、Cチャン、I形鋼、チャンネルなど複数の鋼材です。断面を選ぶだけで側面ブロックの寸法や可視性を一括で揃えられるため、鋼材図作成のスピードと統一感を大きく向上できます。
;|鋼材(側面)パラメータ反映(AB1)|;
;;; ============================================================
;;; AB.lsp ― Aブロックの寸法/可視性を、選択した複数Bブロックへ一括反映
;;; – Aブロック:1つ選択
;;; – Bブロック:複数選択(窓選択OK、INSERTのみ)
;;; – ユーザー選択(表/裏、長辺/短辺、上面/表/裏、ウェブ/フランジ等)は
;;; 「最初の1回だけ質問」→ 選んだBすべてに同じ設定を反映
;;; – 対応パターン(全10種):
;;; 1) 不等辺山形鋼(アングル)
;;; 2) 等辺山形鋼(アングル)
;;; 3) H形鋼
;;; 4) 一般構造用角形鋼管(角パイプ)
;;; 5) 一般構造用角形鋼管(角パイプ、長方形)
;;; 6) 丸棒
;;; 7) SGP配管用炭素鋼鋼管(丸パイプ)
;;; 8) リップ溝形鋼(Cチャン)
;;; 9) I形鋼
;;; 10) 溝形鋼(チャンネル)
;;; – 文字列寸法解析:任意の非数値文字を区切りとして抽出(×/x/-/[] など何でもOK)
;;; ============================================================
;;————————————————————–
;; 寸法文字列を「数値のリスト」に変換
;; 例) “60x30x10x1.6” → (60.0 30.0 10.0 1.6)
;; “I-100×75×5×8” → (100.0 75.0 5.0 8.0)
;; 非数字(と小数点以外)はすべて区切りとみなす、安全・堅牢版
;;————————————————————–
(defun parseXvalues (str / s i c num out)
(setq s (vl-string-trim ” ” str)
out ‘()
num “”
i 1)
(while (<= i (strlen s))
(setq c (substr s i 1))
(if (wcmatch c “[0-9.]”)
(setq num (strcat num c)) ; 数字/小数点 → 連結
(progn ; その他 → 区切り
(if (/= num “”)
(progn
(setq out (append out (list (atof num))))
(setq num “”)
)
)
)
)
(setq i (1+ i))
)
(if (/= num “”) (setq out (append out (list (atof num)))))
out
)
;;==============================================================
;; エントリポイント:AB1コマンド
;;==============================================================
(defun c:AB1 ( / selA objA nameA propsA ssB
idx enB objB propsB
valA valB valC valT valT1 valOD valID thick
sideChoice faceChoice flangeChoice mode
visName vals pname)
;;——————————————–
;; 1) 基準ブロック A を範囲で選択(INSERTのみ)
;;——————————————–
(prompt “\nパラメータを取得する断面ブロックを1つ選択してください: “)
(setq ssA (ssget “_:L” ‘((0 . “INSERT”))))
(if (not ssA)
(progn (princ “\n基準ブロックAが選択されませんでした。”) (exit))
)
;; 最初の1つだけ取得して使用
(setq enA (ssname ssA 0))
(setq objA (vlax-ename->vla-object enA))
(setq nameA (vla-get-EffectiveName objA))
(setq propsA (vlax-invoke objA ‘GetDynamicBlockProperties))
;;——————————————–
;; 2) コピー先ブロック B を複数選択(INSERTのみ)
;;——————————————–
(setq ssB (ssget “_:L” ‘((0 . “INSERT”))))
(if (not ssB)
(progn (princ “\nコピー先ブロックが選択されませんでした。”) (exit))
)
;;==========================================================
;; パターン別に:Aから値取得 → ユーザー選択(必要な場合のみ1回)
;; その後、B複数へ一括反映 という順で実行
;;==========================================================
;;———————————————————-
;; 1) 不等辺山形鋼(アングル)
;; – ブロック名から L-A×B×t を抽出
;; – 質問:長辺(A)/短辺(B)、表(U)/裏(R)/表端部なし(U0)/裏端部なし(R0) → 1回だけ
;; – B:Hへ A or B、t→t1,t2、鋼材種類→アングル(表/裏/端部なし)
;;———————————————————-
(if (wcmatch nameA “*不等辺山形鋼(アングル)*”)
(progn
;; ブロック名から L-90×75×9 部分を抽出
(if (vl-string-search “_L-” nameA)
(setq dimStr (substr nameA (+ (vl-string-search “_L-” nameA) 3)))
(setq dimStr “”)
)
;; 数値を抽出(parseXvalues関数を使用)
(setq vals (parseXvalues dimStr))
(if (and vals (>= (length vals) 3))
(progn
(setq valA (nth 0 vals)) ; 長辺
(setq valB (nth 1 vals)) ; 短辺
(setq valT (nth 2 vals)) ; 板厚
)
(progn
(princ “\n寸法データを解析できませんでした。”) (exit)
)
)
;; 長辺/短辺の選択
(initget “A B”)
(setq sideChoice (getkword “\nどちらを基準にしますか? [長辺(A)/短辺(B)] <A>: “))
(if (not sideChoice) (setq sideChoice “A”))
;; 表裏+端部なしの選択
(initget “U R U0 R0”)
(setq faceChoice (getkword “\n可視性を選んでください [表(U)/裏(R)/表(端部なし)(U0)/裏(端部なし)(R0)] <U>: “))
(if (not faceChoice) (setq faceChoice “U”))
;; faceChoice に応じて可視性名を決定
(setq visName
(cond
((equal faceChoice “U”) “アングル(表)”)
((equal faceChoice “R”) “アングル(裏)”)
((equal faceChoice “U0”) “アングル(表)(端部なし)”)
((equal faceChoice “R0”) “アングル(裏)(端部なし)”)
)
)
;; Bブロック群に反映
(setq idx 0)
(repeat (sslength ssB)
(setq enB (ssname ssB idx)
objB (vlax-ename->vla-object enB)
propsB (vlax-invoke objB ‘GetDynamicBlockProperties))
(foreach q propsB
(cond
;; A or B → H に反映
((equal (vlax-get q ‘PropertyName) “H”)
(vlax-put q ‘Value (if (equal sideChoice “A”) valA valB)))
;; 板厚を反映
((member (vlax-get q ‘PropertyName) ‘(“t1” “t2”))
(vlax-put q ‘Value valT))
;; 可視性設定
((equal (vlax-get q ‘PropertyName) “鋼材種類”)
(vlax-put q ‘Value visName))
)
)
(setq idx (1+ idx))
)
(princ (strcat “\n不等辺山形鋼(アングル) [” visName “] を一括反映しました。”))
(princ) (exit)
)
)
;;———————————————————-
;; 2) 等辺山形鋼(アングル)
;; – ブロック名から L-A×A×t を抽出
;; – 質問:表(U)/裏(R)/表端部なし(U0)/裏端部なし(R0) → 1回だけ
;; – B:H、t→t1,t2、鋼材種類→アングル(表/裏/端部なし)
;;———————————————————-
(if (wcmatch nameA “*等辺山形鋼(アングル)*”)
(progn
;; ブロック名から L-50×50×5 部分を抽出
(if (vl-string-search “_L-” nameA)
(setq dimStr (substr nameA (+ (vl-string-search “_L-” nameA) 3)))
(setq dimStr “”)
)
;; 数値抽出(parseXvalues使用)
(setq vals (parseXvalues dimStr))
(if (and vals (>= (length vals) 2))
(progn
(setq valA (nth 0 vals))
(setq valT (nth (1- (length vals)) vals)) ; 最後の値を板厚として扱う
)
(progn
(princ “\n寸法データを解析できませんでした。”) (exit)
)
)
;; 表裏+端部なしの選択
(initget “U R U0 R0”)
(setq faceChoice (getkword “\n可視性を選んでください [表(U)/裏(R)/表(端部なし)(U0)/裏(端部なし)(R0)] <U>: “))
(if (not faceChoice) (setq faceChoice “U”))
;; faceChoice に応じて可視性名を決定
(setq visName
(cond
((equal faceChoice “U”) “アングル(表)”)
((equal faceChoice “R”) “アングル(裏)”)
((equal faceChoice “U0”) “アングル(表)(端部なし)”)
((equal faceChoice “R0”) “アングル(裏)(端部なし)”)
)
)
;; B複数へ一括反映
(setq idx 0)
(repeat (sslength ssB)
(setq enB (ssname ssB idx)
objB (vlax-ename->vla-object enB)
propsB (vlax-invoke objB ‘GetDynamicBlockProperties))
(foreach q propsB
(cond
;; A寸法 → H
((equal (vlax-get q ‘PropertyName) “H”)
(vlax-put q ‘Value valA))
;; 板厚 → t1,t2
((member (vlax-get q ‘PropertyName) ‘(“t1” “t2”))
(vlax-put q ‘Value valT))
;; 可視性
((equal (vlax-get q ‘PropertyName) “鋼材種類”)
(vlax-put q ‘Value visName))
)
)
(setq idx (1+ idx))
)
(princ (strcat “\n等辺山形鋼(アングル) [” visName “] を一括反映しました。”))
(princ) (exit)
)
)
;;———————————————-
;; 3) H形鋼(ブロック名 H形鋼_H-AxBxtxt1 形式に対応)
;; – ブロック名から数値抽出 (例: H形鋼_H-100x100x6x8)
;; – A=高さ, B=フランジ幅, t=ウェブ厚, t1=フランジ厚
;; – 質問:ウェブ側(W)/フランジ側(F)
;; – W:A→H、t→t1,t2、鋼材種類→H形鋼・I形鋼
;; – F:B→H、B/2→Web、t1→t3、鋼材種類→H形鋼・I形鋼(フランジ側)
;;———————————————-
(if (wcmatch nameA “*H形鋼*”)
(progn
;; “_H-“以降の寸法部を取得
(if (vl-string-search “_H-” nameA)
(setq dimStr (substr nameA (+ (vl-string-search “_H-” nameA) 3)))
(setq dimStr “”)
)
;; 数値を抽出(parseXvalues関数を使用)
(setq vals (parseXvalues dimStr))
(if (and vals (>= (length vals) 4))
(progn
(setq valA (nth 0 vals)) ; 高さ
(setq valB (nth 1 vals)) ; フランジ幅
(setq valT (nth 2 vals)) ; ウェブ厚
(setq valT1 (nth 3 vals)) ; フランジ厚
)
(progn
(princ “\n寸法データを解析できませんでした。”) (exit)
)
)
;; ウェブ/フランジ側の選択
(initget “W F”)
(setq flangeChoice (getkword “\nどちらを基準にしますか? [ウェブ側(W)/フランジ側(F)] <W>: “))
(if (not flangeChoice) (setq flangeChoice “W”))
;; 複数ブロックに一括反映
(setq idx 0)
(repeat (sslength ssB)
(setq enB (ssname ssB idx)
objB (vlax-ename->vla-object enB)
propsB (vlax-invoke objB ‘GetDynamicBlockProperties))
(cond
;; ウェブ側
((equal flangeChoice “W”)
(foreach q propsB
(setq pname (vlax-get q ‘PropertyName))
(cond
((equal pname “H”) (vlax-put q ‘Value valA))
((member pname ‘(“t1” “t2”)) (vlax-put q ‘Value valT))
((equal pname “鋼材種類”) (vlax-put q ‘Value “H形鋼・I形鋼”))
)
)
)
;; フランジ側
((equal flangeChoice “F”)
(foreach q propsB
(setq pname (vlax-get q ‘PropertyName))
(cond
((equal pname “H”) (vlax-put q ‘Value valB))
((member pname ‘(“Web”)) (vlax-put q ‘Value (/ valB 2.0)))
((equal pname “t3”) (vlax-put q ‘Value valT1))
((equal pname “鋼材種類”) (vlax-put q ‘Value “H形鋼・I形鋼(フランジ側)”))
)
)
)
)
(setq idx (1+ idx))
)
(princ (strcat “\nH形鋼 [” flangeChoice “] を一括反映しました。”))
(princ) (exit)
)
)
;;———————————————————-
;; 4) 一般構造用角形鋼管(角パイプ)
;; – ブロック名から寸法 A×A×t を抽出
;; – 質問:通常(N)/端部なし(N0) → 1回だけ
;; – B:H→A、t→t1,t2、鋼材種類→角パイプ・丸パイプ or (端部なし)
;;———————————————————-
(if (wcmatch nameA “*一般構造用角形鋼管(角パイプ)*”)
(progn
;; ブロック名から “100x100x12” 部分を抽出
(if (vl-string-search “_” nameA)
(setq dimStr (substr nameA (+ (vl-string-search “_” nameA) 2))) ; “_”の後ろを取得
(setq dimStr “”)
)
;; 数値を抽出(parseXvalues関数を利用)
(setq vals (parseXvalues dimStr))
(if (and vals (>= (length vals) 2))
(progn
(setq valA (nth 0 vals)) ; 一辺A
(setq valT (nth (1- (length vals)) vals)) ; 最後の値をtとして扱う
)
(progn
(princ “\n寸法データを解析できませんでした。”) (exit)
)
)
;; 通常/端部なしの選択
(initget “N N0”)
(setq pipeChoice (getkword “\n可視性を選んでください [通常(N)/端部なし(N0)] <N>: “))
(if (not pipeChoice) (setq pipeChoice “N”))
;; 可視性名を決定
(setq visName
(if (equal pipeChoice “N”)
“角パイプ・丸パイプ”
“角パイプ・丸パイプ(端部なし)”
)
)
;; Bブロック群に一括反映
(setq idx 0)
(repeat (sslength ssB)
(setq enB (ssname ssB idx)
objB (vlax-ename->vla-object enB)
propsB (vlax-invoke objB ‘GetDynamicBlockProperties))
(foreach q propsB
(cond
;; 寸法A → Hに反映
((equal (vlax-get q ‘PropertyName) “H”)
(vlax-put q ‘Value valA))
;; 板厚t → t1,t2に反映
((member (vlax-get q ‘PropertyName) ‘(“t1” “t2”))
(vlax-put q ‘Value valT))
;; 可視性設定
((equal (vlax-get q ‘PropertyName) “鋼材種類”)
(vlax-put q ‘Value visName))
)
)
(setq idx (1+ idx))
)
(princ (strcat “\n一般構造用角形鋼管(角パイプ) [” visName “] を一括反映しました。”))
(princ) (exit)
)
)
;;———————————————————-
;; 5) 一般構造用角形鋼管(角パイプ、長方形)
;; – ブロック名から寸法 A×B×t を抽出
;; – A=長辺 / B=短辺 に正規化(数値を比較して決定)
;; – 質問①:長辺(A)/短辺(B)
;; – 質問②:通常(N)/端部なし(N0)
;; – B:Hへ A or B、t→t1,t2、鋼材種類→角パイプ・丸パイプ or (端部なし)
;;———————————————————-
(if (wcmatch nameA “*一般構造用角形鋼管(角パイプ、長方形)*”)
(progn
;; ブロック名から “100x20x1.6” 部分を抽出
(if (vl-string-search “_” nameA)
(setq dimStr (substr nameA (+ (vl-string-search “_” nameA) 2)))
(setq dimStr “”)
)
;; 数値抽出(parseXvalues)
(setq vals (parseXvalues dimStr))
(if (and vals (>= (length vals) 3))
(progn
(setq n1 (nth 0 vals)) ; 1つ目
(setq n2 (nth 1 vals)) ; 2つ目
(setq valT (nth 2 vals)) ; 板厚
;; 長辺/短辺に正規化
(if (>= n1 n2)
(progn (setq valA n1) (setq valB n2)) ; A=長辺, B=短辺
(progn (setq valA n2) (setq valB n1))
)
)
(progn
(princ “\n寸法データを解析できませんでした。”) (exit)
)
)
;; 長辺/短辺の選択
(initget “A B”)
(setq sideChoice (getkword “\nどちらを基準にしますか? [長辺(A)/短辺(B)] <A>: “))
(if (not sideChoice) (setq sideChoice “A”))
;; 通常/端部なしの選択
(initget “N N0”)
(setq pipeChoice (getkword “\n可視性を選んでください [通常(N)/端部なし(N0)] <N>: “))
(if (not pipeChoice) (setq pipeChoice “N”))
;; 可視性名
(setq visName
(if (equal pipeChoice “N”)
“角パイプ・丸パイプ”
“角パイプ・丸パイプ(端部なし)”
)
)
;; 一括反映
(setq idx 0)
(repeat (sslength ssB)
(setq enB (ssname ssB idx)
objB (vlax-ename->vla-object enB)
propsB (vlax-invoke objB ‘GetDynamicBlockProperties))
(foreach q propsB
(cond
;; Hへ反映:A=長辺 / B=短辺
((equal (vlax-get q ‘PropertyName) “H”)
(vlax-put q ‘Value (if (equal sideChoice “A”) valA valB)))
;; t→t1,t2
((member (vlax-get q ‘PropertyName) ‘(“t1” “t2”))
(vlax-put q ‘Value valT))
;; 可視性
((equal (vlax-get q ‘PropertyName) “鋼材種類”)
(vlax-put q ‘Value visName))
)
)
(setq idx (1+ idx))
)
(princ (strcat “\n一般構造用角形鋼管(角パイプ、長方形) [” visName “] を一括反映しました。”))
(princ) (exit)
)
)
;;———————————————————-
;; 6) 丸棒
;; – ブロック名から寸法 A を抽出
;; – 質問:通常(N)/端部なし(N0)
;; – B:H→A、鋼材種類→丸棒 or 丸棒(端部なし)
;;———————————————————-
(if (wcmatch nameA “*丸棒*”)
(progn
;; ブロック名から “10” 部分を抽出
(if (vl-string-search “_” nameA)
(setq dimStr (substr nameA (+ (vl-string-search “_” nameA) 2))) ; “_”の後ろを取得
(setq dimStr “”)
)
;; 数値抽出(parseXvalues関数を使用)
(setq vals (parseXvalues dimStr))
(if (and vals (> (length vals) 0))
(setq valA (nth 0 vals)) ; 直径
(progn
(princ “\n寸法データを解析できませんでした。”) (exit)
)
)
;; 通常 or 端部なしを選択
(initget “N N0”)
(setq barChoice (getkword “\n可視性を選んでください [通常(N)/端部なし(N0)] <N>: “))
(if (not barChoice) (setq barChoice “N”))
;; 可視性名を設定
(setq visName
(if (equal barChoice “N”)
“丸棒”
“丸棒(端部なし)”
)
)
;; 複数ブロックに反映
(setq idx 0)
(repeat (sslength ssB)
(setq enB (ssname ssB idx)
objB (vlax-ename->vla-object enB)
propsB (vlax-invoke objB ‘GetDynamicBlockProperties))
(foreach q propsB
(cond
;; 直径A → Hに反映
((equal (vlax-get q ‘PropertyName) “H”)
(vlax-put q ‘Value valA))
;; 可視性
((equal (vlax-get q ‘PropertyName) “鋼材種類”)
(vlax-put q ‘Value visName))
)
)
(setq idx (1+ idx))
)
(princ (strcat “\n丸棒 [” visName “] を一括反映しました。”))
(princ) (exit)
)
)
;;———————————————————-
;; 7) SGP配管用炭素鋼鋼管(丸パイプ)
;; – ブロック名から (Φ外径×t板厚) を抽出
;; – 安定版:型チェック付き
;;———————————————————-
(if (wcmatch nameA “*SGP配管用炭素鋼鋼管(丸パイプ)*”)
(progn
;;————————————
;; 最後の括弧を探して Φ34×t3.2 のみ抽出
;;————————————
(setq startPos -1 pos 0)
(while (setq pos (vl-string-search “(” nameA (+ pos 1)))
(setq startPos pos)
)
(setq endPos (vl-string-search “)” nameA startPos))
(if (and startPos endPos)
(setq dimStr (substr nameA (+ startPos 2) (- endPos startPos 2)))
(setq dimStr “”)
)
;;————————————
;; 文字整形
;;————————————
(setq dimStr (vl-string-subst ” ” “Φ” dimStr))
(setq dimStr (vl-string-subst ” ” “t” dimStr))
(setq dimStr (vl-string-subst ” ” “×” dimStr))
(setq dimStr (vl-string-subst ” ” “x” dimStr))
(setq dimStr (vl-string-trim ” ” dimStr))
;;————————————
;; 数値抽出と変換
;;————————————
(setq vals (read (strcat “(” dimStr “)”)))
(if (and vals (>= (length vals) 2))
(progn
(setq valOD (atof (rtos (nth 0 vals) 2 6))) ; 外径 数値化
(setq valT (atof (rtos (nth 1 vals) 2 6))) ; 板厚 数値化
)
(progn
(princ (strcat “\n寸法データを解析できませんでした。dimStr=” dimStr))
(exit)
)
)
;;————————————
;; 可視性選択
;;————————————
(initget “N N0”)
(setq pipeChoice (getkword “\n可視性を選んでください [通常(N)/端部なし(N0)] <N>: “))
(if (not pipeChoice) (setq pipeChoice “N”))
(setq visName
(if (equal pipeChoice “N”)
“角パイプ・丸パイプ”
“角パイプ・丸パイプ(端部なし)”
)
)
;;————————————
;; Bブロック反映処理(型チェック付)
;;————————————
(setq idx 0)
(repeat (sslength ssB)
(setq enB (ssname ssB idx))
(setq idx (1+ idx))
(if (= (cdr (assoc 0 (entget enB))) “INSERT”)
(progn
(setq objB (vlax-ename->vla-object enB))
(setq propsB (vlax-invoke objB ‘GetDynamicBlockProperties))
(foreach q propsB
(setq pname (vlax-get q ‘PropertyName))
(cond
;; H に外径を反映
((equal pname “H”)
(vlax-put q ‘Value valOD))
;; t1 / t2 に板厚を反映
((member pname ‘(“t1” “t2”))
(vlax-put q ‘Value valT))
;; 鋼材種類 が文字列型のときのみ代入
((and (equal pname “鋼材種類”)
(= (type (vlax-get q ‘Value)) ‘STR))
(vlax-put q ‘Value visName))
)
)
)
)
)
(princ (strcat “\nSGP配管用炭素鋼鋼管(丸パイプ) [” visName “] を一括反映しました。”))
(princ) (exit)
)
)
;;———————————————————-
;; 8) リップ溝形鋼(Cチャン)
;; – ブロック名: リップ溝形鋼(Cチャン)_100x50x20x1.6
;; – A=高さ, B=幅, C=リップ長, t=板厚
;;———————————————————-
(if (wcmatch nameA “*リップ溝形鋼(Cチャン)*”)
(progn
;;————————————
;; 寸法文字列を抽出(最後の “_” 以降)
;;————————————
(setq underPos (vl-string-search “_” nameA))
(while (setq pos (vl-string-search “_” nameA (+ underPos 1)))
(setq underPos pos)
)
(setq dimStr (substr nameA (+ underPos 2))) ; 例: “100x50x20x1.6”
;;————————————
;; 数値抽出(安全版)
;;————————————
(setq vals (parseXvalues dimStr))
(if (< (length vals) 4)
(progn
(princ (strcat “\n寸法データを解析できませんでした: ” dimStr))
(exit)
)
)
(setq valA (atof (rtos (nth 0 vals) 2 6))) ; 高さ
(setq valB (atof (rtos (nth 1 vals) 2 6))) ; 幅
(setq valC (atof (rtos (nth 2 vals) 2 6))) ; リップ長
(setq valT (atof (rtos (nth 3 vals) 2 6))) ; 板厚
;;————————————
;; 方向選択
;;————————————
(initget “上面 表 裏”)
(setq mode (getkword “\nCチャンの向きを選んでください [上面/表/裏] <上面>: “))
(if (not mode) (setq mode “上面”))
;;————————————
;; Bブロック群に反映
;;————————————
(setq idx 0)
(repeat (sslength ssB)
(setq enB (ssname ssB idx))
(setq idx (1+ idx))
(if (= (cdr (assoc 0 (entget enB))) “INSERT”)
(progn
(setq objB (vlax-ename->vla-object enB))
(setq propsB (vlax-invoke objB ‘GetDynamicBlockProperties))
(foreach q propsB
(setq pname (vlax-get q ‘PropertyName))
(cond
;;————————————
;; 寸法反映
;;————————————
;; 上面:幅(B)を高さ(H)へ
((and (equal mode “上面”) (equal pname “H”))
(vlax-put q ‘Value valB))
;; 表:高さ(A)をHへ
((and (equal mode “表”) (equal pname “H”))
(vlax-put q ‘Value valA))
;; 裏:高さ(A)をHへ
((and (equal mode “裏”) (equal pname “H”))
(vlax-put q ‘Value valA))
;; 板厚→t1,t2
((member pname ‘(“t1” “t2”))
(vlax-put q ‘Value valT))
;; リップ長→Lip1,Lip2
((member pname ‘(“Lip1” “Lip2”))
(vlax-put q ‘Value valC))
;;————————————
;; 可視性反映
;;————————————
((and (equal pname “鋼材種類”)
(= (type (vlax-get q ‘Value)) ‘STR))
(cond
((equal mode “上面”)
(vlax-put q ‘Value “角パイプ・丸パイプ”))
((equal mode “表”)
(vlax-put q ‘Value “Cチャン(表)”))
((equal mode “裏”)
(vlax-put q ‘Value “Cチャン(裏)”))
))
)
)
)
)
)
(princ (strcat “\nリップ溝形鋼(Cチャン) [” mode “] を一括反映しました。”))
(princ) (exit)
)
)
;;———————————————————-
;; 10) 溝形鋼(チャンネル)
;; – ブロック名: 溝形鋼(チャンネル)_[-100×50×5
;; – 数値形式: [-A×B×t] → (A=高さ, B=幅, t=板厚)
;; – 質問①:向き → W1(ウェブ表) / W2(ウェブ裏) / F(フランジ側)
;; – 質問②:端部 → 通常(N) / 端部なし(N0)
;; – 可視性:
;; W1 → 角パイプ・丸パイプ(通常/端部なし)
;; W2 → H形鋼・I形鋼
;; F → アングル(表)/(端部なし)
;;———————————————————-
(if (wcmatch nameA “*溝形鋼(チャンネル)*”)
(progn
;;————————————
;; 寸法部分を抽出:[-100×50×5 → “100×50×5”
;;————————————
(setq dashPos (vl-string-search “[” nameA))
(if dashPos
(setq dimStr (substr nameA (+ dashPos 2))) ; “[“と”-“を飛ばす
(setq dimStr “”)
)
(setq dimStr (vl-string-trim ” ]” dimStr)) ; 末尾の “]”を削除
(setq vals (parseXvalues dimStr))
(if (< (length vals) 3)
(progn
(princ (strcat “\n寸法データを解析できませんでした: ” dimStr))
(exit)
)
)
(setq valA (atof (rtos (nth 0 vals) 2 6))) ; 高さ
(setq valB (atof (rtos (nth 1 vals) 2 6))) ; 幅
(setq valT (atof (rtos (nth 2 vals) 2 6))) ; 板厚
;;————————————
;; 向き選択
;;————————————
(initget “W1 W2 F”)
(setq mode (getkword
“\nチャンネルの向きを選んでください [ウェブ表側(W1)/ウェブ裏側(W2)/フランジ側(F)] <W1>: “
))
(if (not mode) (setq mode “W1”))
;;————————————
;; W1またはFのとき端部なし選択
;;————————————
(if (or (equal mode “W1”) (equal mode “F”))
(progn
(initget “N N0”)
(setq edgeChoice (getkword
“\n可視性を選んでください [通常(N)/端部なし(N0)] <N>: “
))
(if (not edgeChoice) (setq edgeChoice “N”))
)
(setq edgeChoice “N”)
)
;;————————————
;; 可視性文字列を決定
;;————————————
(setq visName
(cond
((and (equal mode “W1”) (equal edgeChoice “N0”))
“角パイプ・丸パイプ(端部なし)”)
((equal mode “W1”) “角パイプ・丸パイプ”)
((equal mode “W2”) “H形鋼・I形鋼”)
((and (equal mode “F”) (equal edgeChoice “N0”))
“アングル(表)(端部なし)”)
((equal mode “F”) “アングル(表)”)
)
)
;;————————————
;; 一括反映
;;————————————
(setq idx 0)
(repeat (sslength ssB)
(setq enB (ssname ssB idx))
(setq idx (1+ idx))
(if (= (cdr (assoc 0 (entget enB))) “INSERT”)
(progn
(setq objB (vlax-ename->vla-object enB))
(setq propsB (vlax-invoke objB ‘GetDynamicBlockProperties))
(foreach q propsB
(setq pname (vlax-get q ‘PropertyName))
(cond
;;————————————
;; W1:ウェブ表側
;;————————————
((equal mode “W1”)
(cond
((equal pname “H”) (vlax-put q ‘Value valA))
((member pname ‘(“t1” “t2”)) (vlax-put q ‘Value valT))
((equal pname “鋼材種類”) (vlax-put q ‘Value visName))
)
)
;;————————————
;; W2:ウェブ裏側
;;————————————
((equal mode “W2”)
(cond
((equal pname “H”) (vlax-put q ‘Value valA))
((member pname ‘(“t1” “t2”)) (vlax-put q ‘Value valT))
((equal pname “鋼材種類”) (vlax-put q ‘Value visName))
)
)
;;————————————
;; F:フランジ側
;;————————————
((equal mode “F”)
(cond
((equal pname “H”) (vlax-put q ‘Value valB))
((equal pname “t1”) (vlax-put q ‘Value valT))
((equal pname “鋼材種類”) (vlax-put q ‘Value visName))
)
)
)
)
)
)
)
(princ (strcat “\n溝形鋼(チャンネル) [” visName “] を一括反映しました。”))
(princ) (exit)
)
)
;;———————————————————-
;; 該当パターンが無かった場合
;;———————————————————-
(princ (strcat “\n未対応のブロックです: ” nameA))
(princ)
)

コメント