自作パワーディメンションコマンドLISP

  • URLをコピーしました!

パワーディメンションは、AutoCAD Mechanicalに搭載されている、並列寸法の間隔を自動で調整し配置機能です。

今回紹介する自作LISP「PD」は、その考え方を再現し、寸法を速く・整えて入力するための実務向けコマンドとして作成したものです。

仕組みとしては、基準となる寸法を選択したあとに新しく寸法を引くと、寸法間隔調整コマンド「DIMSPACE」が自動で実行されます。

その後は、直列寸法(DIMCONTINUE)でそのまま連続して寸法を入力することができます。

※このLISPは異尺度寸法を前提に作られています

参考動画

;;=================================================================
;; 寸法タイプ判定(DXF100 の最後)
;;=================================================================
(defun getDimClass (ent / dxf last100)
  (setq dxf (entget ent)
        last100 nil)
  (foreach x dxf
    (if (= (car x) 100)
      (setq last100 (cdr x))
    )
  )
  last100
)

;;=================================================================
;; メインコマンド PD
;; 寸法記入 + DIMSPACE 専用
;;=================================================================
(defun c:PD (/ baseEnt base-list oldlast new p1 p2 first done tmp
              oldDimLayer cmd dimclass)

  (vl-load-com)

  (prompt "\n=== 寸法記入 + DIMSPACE 専用 ===")

  ;;=======================================================
  ;; 寸法用レイヤー設定
  ;;=======================================================
  (setq oldDimLayer (getvar "DIMLAYER"))

  (if (not (tblsearch "LAYER" "SUNPOU"))
    (command "_.LAYER" "_M" "SUNPOU" "_C" "7" "" "")
  )

  (setvar "DIMLAYER" "SUNPOU")

  ;;=======================================================
  ;; 基準寸法選択
  ;; クリックした瞬間に確定
  ;;=======================================================
  (prompt "\n[DMSP] 基準寸法をクリックしてください。")
  (setq baseEnt (car (entsel "\n基準寸法を選択: ")))

  (if (or
        (null baseEnt)
        (/= (cdr (assoc 0 (entget baseEnt))) "DIMENSION")
      )
    (progn
      (prompt "\n寸法が選択されませんでした。終了します。")
      (setvar "DIMLAYER" oldDimLayer)
      (princ)
      (exit)
    )
  )

  (setq base-list (list baseEnt))

  ;;=======================================================
  ;; 基準寸法タイプを判定
  ;;=======================================================
  (setq dimclass (getDimClass (car base-list)))

  (cond
    ((= dimclass "AcDbAlignedDimension")
      (setq cmd "_.DIMALIGNED")
      (prompt "\n基準寸法:平行寸法 → DIMALIGNED")
    )

    ((= dimclass "AcDbRotatedDimension")
      (setq cmd "_.DIMLINEAR")
      (prompt "\n基準寸法:線形寸法 → DIMLINEAR")
    )

    (T
      (setq cmd "_.DIMLINEAR")
      (prompt
        (strcat
          "\n基準寸法タイプ不明("
          (if dimclass dimclass "nil")
          ") → DIMLINEAR"
        )
      )
    )
  )

  ;;=======================================================
  ;; 寸法作図ループ
  ;;=======================================================
  (setq first T
        done nil)

  (while (not done)

    (if first

      ;;===========================================
      ;; 初回寸法
      ;; 寸法位置は1点目 p1 を自動指定
      ;;===========================================
      (progn
        (setq p1 (getpoint "\n1点目を指定 : "))
        (if (null p1) (setq done T))

        (if (not done)
          (progn
            (setq p2 (getpoint "\n2点目を指定: " p1))
            (if (null p2) (setq done T))
          )
        )

        (if (not done)
          (progn
            (setq oldlast (entlast))

            ;; 寸法作図
            ;; 3点目の寸法位置は p1 を自動入力
            (command cmd p1 p2 p1)
            (setq new (entlast))

            ;; DIMSPACE 実行
            (command "_.DIMSPACE")
            (foreach b base-list
              (command b)
            )
            (command new)
            (command "")
            (command "")

            (setq first nil)
          )
        )
      )

      ;;===========================================
      ;; 2回目以降:直列寸法
      ;;===========================================
      (progn
        (prompt "\n直列寸法を続ける点をクリック : ")

        (setq oldlast (entlast))
        (command "_.DIMCONTINUE" pause)
        (setq tmp (entlast))

        ;; Enterで終了
        (if (= tmp oldlast)
          (setq done T)
          (setq new tmp)
        )
      )
    )
  )

  ;;=======================================================
  ;; DIMLAYER 元に戻す
  ;;=======================================================
  (setvar "DIMLAYER" oldDimLayer)

  (prompt "\n処理を終了しました。")
  (princ)
)
すぐできる設定手順
  • コマンド「PD」を入力
  • 基準の寸法を選択
  • 寸法の一点目と二点目を選択
  • 直列寸法に移行
仁(じん)

画像付きのSTEPは、下で確認できますよ!

Contents

操作手順

STEP
  • コマンド「PD」を入力します
  • 基準の寸法を選択します

※基準の寸法をクリックすると自動で決定します

凛(りん)

基準寸法選択で自動で決定するので工程が1つ減っています!

STEP
  • 寸法の1点目をクリックします
STEP
  • 寸法の2点目をクリックします
  • 2点目をクリックした時点で自動で最初の寸法が配置されます
STEP
  • 最初に寸法が自動で配置されます
  • そのまま「直列寸法記入」に移行します
STEP
  • 直列寸法を引き終わったらエンターで終了します

まとめ

  • DIMSPACEで寸法間隔を自動調整できる
  • DIMCONTINUEでそのまま直列寸法を連続入力できる

寸法の入力から整列までを一括で処理できるため、作業スピードと仕上がりの安定性が大きく向上します。

関連記事

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

コメント

コメントする

Contents