REFEDITをLispで使うには

Lispでネストされたオブジェクトの編集を行うには、ブロックテーブルから、ネストされた図形のエンティティーを取り出し、編集するのだが、どうゆうわけだかDIMENSION の編集を行うと (nentsel) で選択できなくなるような、表示と実際のデータのオブジェクトの範囲にくいちがいが生じるような現象が見られる場合があるようです。(ARXだと大丈夫らしい・・・(-_-;) )
そこで、不本意ながら REFEDIT で編集を試みてみました。

編集するオブジェクトを指定するには

REFEDITを使ったことのある人なら解かると思いますが、ネストされたオブジェクトを編集する場合、そのオブジェクトと、ネスト階層を取得する必要があります。
通常の使用ではダイアログにてネスト階層を指定し、図面上でオブジェクトを指定します。
これをコマンドラインで指定するには

コマンド: -refedit

とすると、何を入力したらよいのかわかると思います。
AutoCADのバージョンにより入力項目が違うので注意してください。

また、(nentsel)で取得できる図形名と、実際にREFEDITで編集する図形名は異なります。
つまり、REFEDITでは、いったん編集対象のブロック定義を複製しておいて、編集後 REFCLOSE する際、元のブロック定義を書き換えているような感じ・・・・
したがって、REFEDITのネストされたオブジェクトを選択する場面で、再度図形を選択しなければなりません。

σ(^^)の場合は、編集対象が DIMENSION でしたので、次のように特定できました。

  ;************************************************************************************;
  ;サブルーチン  寸法オブジェクトの選択;
  (defun Jof_sel_dim ( / ent lst_ent)
    (while (not ent)
      (initget " ")
      (setq ent (nentselp "\n反転させる寸法を選択 [ 終了]:"))
      (cond	
	((= ent "") nil)
	((not (= 4 (length ent))) (setq ent nil))
	((not (setq lst_ent (Jof_lst_ent ent))) (setq ent nil))
	(t lst_ent)
	)      
      )
    )
    
  ;************************************************************************************;
  ;サブルーチン  lst_ent の取得 (寸法までのネスト階層の深さ 指示した点 寸法の図形名);
  (defun Jof_lst_ent ( ent / n lst_nen n_max en lst_ent)
    (setq n 0)
    (setq lst_nen (last ent))
    (setq n_max (length lst_nen))
    (while (and (not lst_ent) (< n n_max))
      (if (= "DIMENSION" (cdr (assoc 0 (entget (setq en (nth n lst_nen))))))
	(if (= (1+ n) n_max)
	  (setq lst_ent (list nil (cadr ent) en))
	  (setq lst_ent (list (- (- n_max 2) n ) (cadr ent) en))
	  )
	)
      (setq n (1+ n))
      )
    lst_ent 
    )
    
  ;************************************************************************************;
  ;サブルーチン  mode3:ブロックにネストされた寸法値の水平方向を反転;
  (defun Jos_dimt_rot3 ( / vno lst_ent )
    (setq vno (substr (getvar "ACADVER") 1 2))
    (while (setq lst_ent (Jof_sel_dim));ネスト階層を取得するためのオブジェクト選択;
      (cond
	((not (car lst_ent))
	 (Jos_dimt_rot (caddr lst_ent))
	 )
	((= vno "15")
	 (command "._-REFEDIT" (cadr lst_ent))
	 (repeat (car lst_ent)
	   (command "N")
	   )
	 (command "O" (cadr lst_ent) "" "N")
	 (setq lst_ent (Jof_lst_ent (nentselp (cadr lst_ent))));refeditコマンド内で編集対象ののオブジェクト選択;
	 (Jos_dimt_rot (caddr lst_ent))
	 (command "._REFCLOSE" "S")
	 )
	((= vno "16")
	 (command "._-REFEDIT" (cadr lst_ent))
	 (repeat (car lst_ent)
	   (command "N")
	   )
	 (command "O" "N" (cadr lst_ent) "" "N")
	 (setq lst_ent (Jof_lst_ent (nentselp (cadr lst_ent))));refeditコマンド内で編集対象ののオブジェクト選択;
	 (Jos_dimt_rot (caddr lst_ent))
	 (command "._REFCLOSE" "S")
	 )
	)
      )
    )

REFEDITが実行中かどうかの判定

ユーザーが REFEDIT を実行した場合、画面の明るさが変わったり、REFEDITツールバーが表示されるので、REFEDITが実行中であるという判断ができます。
しかし、Lispで実行した場合、この判断ができないと、正常終了しなかった場合、REFEDITを終了させることが出来ません。
この判断は、システム変数 REFEDITNAME により行うことが可能です。
値が "" の場合はREFEDIT実行中でないと判断できます。

REFEDITNAME

(読み込み専用)
タイプ: 文字列
保存先: なし
初期値: ""
図面が参照編集状態であるかどうかを示します。また、参照ファイル名も格納します。