;; OSQDIM ;; 1) 選択円に外接する水平2本・鉛直2本を、各端Pだけ延長して作図(OSQDIM_HV相当) ;; 2) 作成した4本だけを、円の中心を基準に +45° 回転 (defun c:OSQDIM ( / ent obj cen r cx cy cz P xL xR yB yT omode curLay mkline eTop eBot eLft eRgt ss ) (vl-load-com) ;; LINEを確実に生成 (defun mkline (p q lay) (entmakex (list (cons 0 "LINE") (cons 8 lay) (cons 10 p) (cons 11 q)))) ;; 円を選択 (setq ent (car (entsel "\n外接線を作る円を選択: "))) (if (not (and ent (= (cdr (assoc 0 (entget ent))) "CIRCLE"))) (progn (prompt "\nCIRCLEを選択してください。") (princ)) (progn (setq obj (vlax-ename->vla-object ent) cen (vlax-get obj 'Center) r (vlax-get obj 'Radius) cx (car cen) cy (cadr cen) cz (caddr cen) curLay (getvar "CLAYER")) ;; 延長長さP (initget 6) (setq P (getreal "\n交点からの延長長さP(例 480): ")) (if (or (null P) (<= P 0.0)) (prompt "\nキャンセルしました。") (progn ;; OSNAPを一時OFF (setq omode (getvar "OSMODE")) (setvar "OSMODE" 0) ;; 基本座標(HV外接) (setq xL (- cx r) xR (+ cx r) yB (- cy r) yT (+ cy r)) ;; 4本作図(各端P延長)…作ったenameを保持 (setq eTop (mkline (list (- xL P) yT cz) (list (+ xR P) yT cz) curLay)) (setq eBot (mkline (list (- xL P) yB cz) (list (+ xR P) yB cz) curLay)) (setq eLft (mkline (list xL (- yB P) cz) (list xL (+ yT P) cz) curLay)) (setq eRgt (mkline (list xR (- yB P) cz) (list xR (+ yT P) cz) curLay)) ;; 4本だけ選択セットへ (setq ss (ssadd)) (foreach e (list eTop eBot eLft eRgt) (setq ss (ssadd e ss))) ;; 円の中心を基点に +45° 回転 (command "_.ROTATE" ss "" cen 45) ;; OSNAP復帰 (setvar "OSMODE" omode) (prompt "\nOSQDIM:HV外接線を作図し、中心基準で45°回転しました。") ) ) ) ) (princ) )