;------------------------------------------------------------------
; mychangeコマンドの制限事項
; 1. 色変更オプションで色は色番号で与える必要があります。
; 2. 線種変更オプションでは変更する線種が既に登録されている必要があ
;   ります。
;------------------------------------------------------------------
; -----------------------------
; mychange コマンドメイン関数
; -----------------------------
(defun C:mychange() 
  (setq ss1 (getobj))    ; 変更するエンティティを選択する
  (setq ret (getctype))  ; オプションを選択する

  ; オプションにより処理を分岐させる
  (if (= (type ret) 'STR)
    (propchange ret ss1 )  ; 特性変更オプション
    (locatechange)  ; 変更位置オプション
  )
)

; ----------------------------
; エンティティ選択関数
;-----------------------------
(defun getobj()
  (ssget)
)

;-----------------------------
; オプション選択関数
;-----------------------------
(defun getctype( / flag ret )
  (setq flag 1)
  (while flag
    (progn
    (initget 128 "Prop") ;(getxxx)関数で任意入力を許します
    (setq ret (getpoint "P=特性/<変更位置を指示>:"))
    (if (and (= (type ret) 'STR)(= ret "Prop"))
      (progn
        (initget 1 "Color hEight LAyer LType Thick")
        (setq ret (getkword "変更する特性 (C=色/E=高度/LA=画層/LT=線種/T=厚さ) ?"))
      (setq flag nil)
      )
    )
    (if (= (type ret) 'LIST) (setq flag nil))
    )
  )
  (setq ret ret)
)

; ---------------------------
; 特性変更オプション関数
;----------------------------
(defun propchange( option ss1 )
    (if (= option "Color")  ;色変更
      (colorchange ss1 )
    )
    (if (= option "hEight") ;高度変更
      (heightchange ss1)
    )
    (if (= option "LAyer")  ;画層変更
      (layerchange ss1 )
    )
    (if (= option "LType")  ;線種変更
      (ltypechange ss1 )
    )
    (if (= option "Thick")  ;厚さ変更
      (thickchange ss1 )
    )
  (setq a nil)
)

;----------------------------
; 変更位置オプション関数
;----------------------------
(defun locatechange()
  (prompt "変更位置が選択されました")
)

;---------------------------
; 色変更関数
;---------------------------
;(defun colorchange( ss1 )
(defun colorchange( ss1 / i flag tmp1 tmp2 elist )
  (setq i 0) (setq flag 0)
  (setq tmp1 nil) (setq tmp2 nil)
  
  ; 現在の属性を調べる
  (while (if (setq ename (ssname ss1 i)) = nil)
    (setq tmp1 (cdr (getprop ename 62)))
    (if (and (/= tmp1 tmp2) (/= tmp2 nil))
       (progn
         (setq flag 1) 
       )
    )
    (setq tmp2 tmp1)
    (setq i (+ i 1))
  )

  ; 選択したエンティティ内に2色以上の色属性がある場合
  (if (= flag 1)
    (progn
      (setq newc (getstring "新しい色<既定値>:"))
    )
  )

  ; 選択した全エンティティに色属性が付加されていない場合
  (if (and (= flag 0) (= tmp1 nil))
    (progn
      (setq newc (getstring "新しい色<BYLAYER>:"))
    )
  )

  ; 選択した全エンティティが同一の色属性を持つ場合
  (if (and (= flag 0) (/= tmp1 nil))
    (progn
      (princ "新しい色<")(princ tmp1)
      (setq newc (getstring ">:"))
    )
  )
  ; 属性を変更する
  (setq i 0)
  (if (and (/= newc nil) (/= newc ""))
    (progn
      (while (if (setq ename (ssname ss1 i)) = nil)
        (setq elist (entget ename))
        (setq tmp2 (cons 62 (atoi newc)))
        (setq tmp1 (list tmp2))
        (setq tmp2 (append elist tmp1))
        (entmod tmp2)
        (setq i (+ i 1))
      )
    )
  )
)

;---------------------------
; 高度変更関数
;---------------------------
(defun heightchange( ss1 / i flag tmp1 tmp2 elist )
;(defun heightchange( ss1 )

  (setq i 0) (setq flag 0)
  (setq tmp1 0.0) (setq tmp2 nil)
  
  ; 現在の属性を調べる
  (while (if (setq ename (ssname ss1 i)) = nil)
    (setq list10 (getprop ename 10))
    (setq list11 (getprop ename 11))
    (setq tmp1 (cadddr list10))
    (if (and (/= tmp1 tmp2) (/= tmp2 nil))
       (progn
         (setq flag 1) 
       )
    )
    (setq tmp2 tmp1)
    (setq i (+ i 1))
  )

  ; 選択したエンティティ内に2つ以上の高度属性がある場合
  (if (= flag 1)
    (progn
      (setq newc (getstring "新しい高度<既定値>:"))
    )
  )

  ; 選択した全エンティティに高度属性が付加されていない(つまり0.0)場合
  (if (and (= flag 0) (= tmp1 nil))
    (progn
      (setq newc (getstring "新しい高度<0.0>:"))
    )
  )

  ; 選択した全エンティティが同一の高度属性を持つ場合
  (if (and (= flag 0) (/= tmp1 nil))
    (progn
      (princ "新しい高度<")(princ tmp1)
      (setq newc (getstring ">:"))
    )
  )
  ; 属性を変更する
  (setq i 0)
  (if (and (/= newc nil) (/= newc ""))
    (progn
      (while (if (setq ename (ssname ss1 i)) = nil)
        (setq list10 (getprop ename 10))
        (setq list11 (getprop ename 11))
        (setq tmp1 (list 10 (cadr list10) (caddr list10) (atof newc)))
        (setq tmp2 (list 11 (cadr list11) (caddr list11) (atof newc)))
        (setq tmp (setprop ename tmp1))
        (entmod tmp)
        (setq tmp (setprop ename tmp2))
        (entmod tmp)
        (setq i (+ i 1))
      )
    )
  )
)

;---------------------------
; 画層変更関数
;---------------------------
(defun layerchange( ss1 / i flag tmp1 tmp2 elist )
;(defun layerchange( ss1 )

  (setq i 0) (setq flag 0)
  (setq tmp1 nil) (setq tmp2 nil)
  
  ; 現在の属性を調べる
  (while (if (setq ename (ssname ss1 i)) = nil)
  ;(while (if (setq ename (ssname ss1 i) = nil))
    (setq tmp1 (cdr (getprop ename 8)))
    (if (and (/= tmp1 tmp2) (/= tmp2 nil))
       (progn
         (setq flag 1) 
       )
    )
    (setq tmp2 tmp1)
    (setq i (+ i 1))
  )

  ; 選択したエンティティ内に2つ以上の画層属性がある場合
  (if (= flag 1)
    (progn
      (setq newc (getstring "新しい画層<既定値>:"))
    )
  )

  ; 選択した全エンティティに画層属性が付加されていない場合
  (if (and (= flag 0) (= tmp1 nil))
    (progn
      (setq newc (getstring "新しい画層<BYLAYER>:"))
    )
  )

  ; 選択した全エンティティが同一の画層属性を持つ場合
  (if (and (= flag 0) (/= tmp1 nil))
    (progn
      (princ "新しい画層<")(princ tmp1)
      (setq newc (getstring ">:"))
    )
  )
  ; 属性を変更する
  (setq i 0)
  (if (and (/= newc nil) (/= newc ""))
    (progn
      (while (if (setq ename (ssname ss1 i)) = nil)
        (setq elist (entget ename))
        (setq tmp2 (cons 8 newc))
        (setq tmp1 (list tmp2))
        (setq tmp2 (append elist tmp1))
        (entmod tmp2)
        (setq i (+ i 1))
      )
    )
  )
)

;---------------------------
; 線種変更関数
;---------------------------
(defun ltypechange( ss1 / i flag tmp1 tmp2 elist )
  (setq i 0) (setq flag 0)
  (setq tmp1 nil) (setq tmp2 0)
  
  ; 現在の属性を調べる
  (while (if (setq ename (ssname ss1 i)) = nil)
    (setq tmp1 (cdr (getprop ename 6)))
    (if (and (/= tmp1 tmp2) (/= tmp2 0))
       (progn
         (setq flag 1) 
       )
    )
    (setq tmp2 tmp1)
    (setq i (+ i 1))
  )

  ; 選択したエンティティ内に2つ以上の線種属性がある場合
  (if (= flag 1)
    (progn
      (setq newc (getstring "新しい線種<既定値>:"))
    )
  )

  ; 選択した全エンティティに線種属性が付加されていない場合
  (if (and (= flag 0) (= tmp1 nil))
    (progn
      (setq newc (getstring "新しい線種<BYLAYER>:"))
    )
  )

  ; 選択した全エンティティが同一の線種属性を持つ場合
  (if (and (= flag 0) (/= tmp1 nil))
    (progn
      (princ "新しい線種<")(princ tmp1)
      (setq newc (getstring ">:"))
    )
  )
  ; 属性を変更する
  (setq i 0)
  (if (and (/= newc nil) (/= newc ""))
    (progn
      (while (if (setq ename (ssname ss1 i)) = nil)
        (setq elist (entget ename))
        (setq tmp2 (cons 6 newc))
        (setq tmp1 (list tmp2))
        (setq tmp2 (append elist tmp1))
        (entmod tmp2)
        (setq i (+ i 1))
      )
    )
  )

)

;---------------------------
; 厚さ変更関数
;---------------------------
(defun thickchange( ss1 / i flag tmp1 tmp2 elist )
  (setq i 0) (setq flag 0)
  (setq tmp1 nil) (setq tmp2 nil)
  
  ; 現在の属性を調べる
  (while (if (setq ename (ssname ss1 i)) = nil)
    (setq tmp1 (cdr (getprop ename 39)))
    (if (and (/= tmp1 tmp2) (/= tmp2 nil))
       (progn
         (setq flag 1) 
       )
    )
    (setq tmp2 tmp1)
    (setq i (+ i 1))
  )

  ; 選択したエンティティ内に2つ以上の厚さ属性がある場合
  (if (= flag 1)
    (progn
      (setq newc (getstring "新しい厚さ<既定値>:"))
    )
  )

  ; 選択した全エンティティに厚さ属性が付加されていない場合
  (if (and (= flag 0) (= tmp1 nil))
    (progn
      (setq newc (getstring "新しい厚さ<0.0>:"))
    )
  )

  ; 選択した全エンティティが同一の厚さ属性を持つ場合
  (if (and (= flag 0) (/= tmp1 nil))
    (progn
      (princ "新しい厚さ<")(princ tmp1)
      (setq newc (getstring ">:"))
    )
  )
  ; 属性を変更する
  (setq i 0)
  (if (and (/= newc nil) (/= newc ""))
    (progn
      (while (if (setq ename (ssname ss1 i)) = nil)
        (setq elist (entget ename))
        (setq tmp2 (cons 39 (atof newc)))
        (setq tmp1 (list tmp2))
        (setq tmp2 (append elist tmp1))
        (entmod tmp2)
        (setq i (+ i 1))
      )
    )
  )
)

;---------------------------
; 属性取得関数
;---------------------------
(defun getprop(entname grpcode / elist)
  (setq elist (entget entname))
  (assoc grpcode elist)
)

;---------------------------
; 属性設定関数
;---------------------------
(defun setprop(entname grplist / elist grpcode olidlist elist2 )
  (setq elist (entget entname))
  (setq grpcode (car grplist))
  (setq oldlist (assoc grpcode elist))
  (setq elist2 (subst grplist oldlist elist))
)