SCALEコマンドのCオプションをやめ、コピーの場合はレイアウトを使って処理することにしました。
処理用のレイアウトとして、tmpというレイアウトを作成します。
同名のレイアウトを使用している場合は、
(setq ln "tmp")
ここの tmp を別名にしてください。
(defun c:cpore (/ pt1 pt2 bpt ss en_b ent pt_list gcpt sc cnt flg #osmode ln pt3 pt4)
;ARES
(initget "C D")
(or (setq flg (getkword "\n[コピー(C)/削除(D)] <コピー>:")) (setq flg "C"))
(setq pt1 (getpoint "\n一方のコーナーを指定:"))
(setq pt2 (getcorner pt1 "\nもう一方のコーナーを指定:"))
(if (= (strcase flg) "C")
(setq bpt (getpoint "\n基点を指定:"))
)
(setq ln "tmp")
(command "undo" "be")
;(setvar "cmdecho" 0)
(setq #osmode (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq ss (ssget "_C" pt1 pt2))
(if (= (strcase flg) "C")
(progn
(setq sc 1.001)
(setq pt3 '(0 0 0))
(setq pt4 (mapcar '(lambda (x1 x2) (- x2 x1)) pt1 pt2))
;レイアウトへ移動
(command "copybase" pt1 ss "")
(command "-layout" "n" ln)
(setvar "ctab" ln)
(command "erase" "all" "")
(command "pasteclip" "0,0,0")
(command "zoom" "e")
)
(progn
(setq sc 0.999)
(setq pt3 pt1)
(setq pt4 pt2)
(setq ss (ssget "_W" pt1 pt2))
(command "erase" ss "")
)
)
(setq gcpt (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) pt3 pt4))
(command "rectang" pt3 pt4)
(setq en_b (entlast))
;トリムを4回繰り返す
(repeat 4
(command "rectang" pt3 pt4)
(command "scale" "l" "" gcpt sc)
(setq ent (entget (entlast)))
(repeat 4
(setq pt_list (append pt_list (list (cdr (assoc 10 ent))))) ;頂点のリスト
(setq ent (cdr (member (assoc 10 ent) ent)))
)
(entdel (entlast))
(command "trim" en_b "" "f" (nth 0 pt_list) (nth 1 pt_list) "" "")
(command "trim" en_b "" "f" (nth 1 pt_list) (nth 2 pt_list) "" "")
(command "trim" en_b "" "f" (nth 2 pt_list) (nth 3 pt_list) "" "")
(command "trim" en_b "" "f" (nth 3 pt_list) (nth 0 pt_list) "" "")
(setq sc (* sc sc))
(setq pt_list nil)
)
(entdel en_b)
(if (= (strcase flg) "C")
(progn
(setq ss (ssget "_C" pt3 pt4))
(command "copybase" pt3 ss "")
(command "undo" "e")
(command "undo" "1")
(command "ctab" "model")
(command "pasteclip" pause)
)
(progn
(command "undo" "e")
)
)
(setvar "OSMODE" #OSMODE)
(princ)
)
- LUNE
- 2025/11/17 (Mon) 14:36:24