;;;レイヤーを１つづつ順番に表示させる
;;;左手でゲーム風に操作。いつでも０レイヤーに戻れるので
;;;CLAYERからスタートする。
;;;ESCキーで終了した場合は最初の状態に戻る

;Shusei Hayashi
;OffshoreCad&Management Inc.
;10F Jaka Bldg., 6780 Ayala Ave.,
;Makati, Philippines
;http://www.offshorecad.com.ph/
;http://www.offshore-management.com.ph/

(defun c:SD_302( /	NewLayers NS TotalNS KW2 *error*)
	(if (= SD:Lang "E")
		(princ "\n Show only one layer and go to next layer by pressing A and D")
		(princ "\n レイヤーを１つづつ順番に表示させる")
	)	
	(princ "\n **********************************")
	(setq *error* *210_error*)
	(SD1028)
	
	(setvar "EXPERT" 1)
	(SaveLayerSet_202)		;SD_202 現在の表示状態を保存
	(setq NewLayers (MakeLayerList_210))	;使われているレイヤーのリストを作成
	(setq TotalNS (length NewLayers))
	(setq KW2 '(0 0))
	(setq NS (vl-position (getvar "CLAYER") NewLayers))
		(if (= SD:Lang "E")
			(progn
				(princ "\n [D] Next Layer")
				(princ "\n [A] Previous Layer")
				(princ "\n [W] Go to 0")
				(princ "\n [S] Quit Coomand\n")
			)
			(progn
				(princ "\n [D] 次のレイヤー")
				(princ "\n [A] 前のレイヤー")
				(princ "\n [W] 0レイヤーに行く")
				(princ "\n [S] コマンド終了\n")
			)
		)	
			
	(while (/= (nth 1 KW2) 115)
		(command "layer" "off" "*" "on" (nth NS NewLayers) "")
		(setq KW2 (grread nil 2 0))
		(cond 		((or (= (nth 1 KW2) 97)(= (nth 1 KW2) 65))(setq NS (1- NS)))
					((or (= (nth 1 KW2) 115)(= (nth 1 KW2) 83))(print "Quit"))
					((or (= (nth 1 KW2) 100)(= (nth 1 KW2) 68))(setq NS (1+ NS)))
					((or (= (nth 1 KW2) 119)(= (nth 1 KW2) 87))(setq NS 0))
					(T	 (princ "Again"))
		)
		(if ( = NS TotalNS)(setq NS 0))
		(if ( = NS -1			)(setq NS (1- TotalNS)))
		(princ "\r                                                                     ")
		(princ (strcat "\r----------------" (nth NS NewLayers)))
	)
	(RecallLayerSet_210)
	(if (= SD:Lang "E")
		(princ "\nNow You can recall Layer Set Which was saved before this command")
		(princ "\nコマンド開始前のレイヤー表示状態に戻りました")
	)

	(SD2056)
	(setq *error* nil)
	(princ)
)

;;;+------------------MakeLayerList_210--------------------+
;;;レイヤーのリストを作成し並べ替え。
;;;【引き数】なし
;;;【戻り値】NewLayers：リスト
;;;+---------------------------------------------------+

(defun MakeLayerList_210 ( / Obj1 NewLayers i)

	(setq Obj1 (tblnext "layer" T))
	(setq NewLayers (list(cdr(assoc 2 Obj1))))
	(setq i 1)
	(setq Obj1 (tblnext "layer"))
	(while 	Obj1
		(setq NewLayers (append NewLayers (list(cdr(assoc 2 Obj1)))))
		(setq Obj1 (tblnext "layer") i (1+ i))
	)
	(setq NewLayers (acad_strlsort NewLayers))
	NewLayers
)


;;;+-------------------------------------------------------------------+
;エラー時に最初の表示に戻す

(defun *210_error* (msg)
	(setq *error* nil)
	(RecallLayerSet_210)
	(SD2056)
	(princ)
)

;****************RecallLayerSet_203と同じ
(defun RecallLayerSet_210()

	(setq Destination (strcat (getvar "tempprefix") "SD_202.txt"))
	(setq FN (findfile Destination))
	(if FN
		(if (= SD:Lang "E")
			(princ "\n Layer Set found")
			(princ "\n レイヤーセットが見つかりました")
		)
		(if (= SD:Lang "E")
			(progn (alert "no Layer Set")(exit))
			(progn (alert "レイヤーセットがありません")(exit))
		)
	)

	(setq f (open Destination "r"))
	(setq n 1)
	(setq Layer1 t)

	(while Layer1
		(setq Layer1 (read-line f))
		(setq OnOff1 (read-line f))
		(setq Freeze1 (read-line f))	; bit 1
		(setq Lock1 (read-line f))		; bit 4
		(if (and Layer1 (tblobjname "layer" Layer1))
				(progn
							(setq Data1 (entget (tblobjname "layer" Layer1)))
							(setq Data1 (subst 	(cons 62 (* (abs(cdr(assoc 62 Data1))) (read OnOff1)))
																			(assoc 62 Data1)	Data1))
						 	(setq Data1 (subst 	(cons 70 (logior (cdr(assoc 70 Data1)) (* (read Freeze1) 1)))
																			(assoc 70 Data1)	Data1))
							(setq Data1 (subst 	(cons 70 (logior (cdr(assoc 70 Data1)) (* (read Lock1) 4)))
																			(assoc 70 Data1)	Data1))
						 	(entmod Data1)
				 )
		 )
	)

	(close f)
)
(defun SaveLayerSet_202 ( / Obj1 List1 Layer_0_Name Layer_0_On Layer_0_Freeze Layer_0_Lock
						  Destination f n m )

	(setq Obj1 (tblnext "layer" t))
	(setq List1 (GetLayerset Obj1))		;1つ目のレイヤーテーブル読み込み

	(setq Layer_0_Name 		(car List1))
	(setq Layer_0_On	 	(cadr List1))
	(setq Layer_0_Freeze 	(caddr List1))
	(setq Layer_0_Lock 		(cadddr List1))

	(setq n 1)

	(setq Obj1 (tblnext "layer" ))

	(while Obj1
		(setq List1 (GetLayerset Obj1))
		(set (read (strcat "Layer_" (itoa n) "_Name"))(car List1))
		(set (read (strcat "Layer_" (itoa n) "_On"))(cadr List1))
		(set (read (strcat "Layer_" (itoa n) "_Freeze"))(caddr List1))
		(set (read (strcat "Layer_" (itoa n) "_Lock"))(cadddr List1))
		(setq Obj1 (tblnext "layer" ))
		(setq n (1+ n))
	)

	(setq Destination (strcat (getvar "tempprefix") "SD_202.txt"))
	(if (= SD:Lang "E")
		(print "Layer Set Saved")
		(print "レイヤーセットが保存されました")
	)
	(setq f (open Destination "w"))
	(setq m 0)

	(repeat n
		(write-line (eval(read(strcat "Layer_" (itoa m) "_Name"))) f)
		(write-line (itoa(eval(read(strcat "Layer_" (itoa m) "_On")))) f)
		(write-line (itoa(eval(read(strcat "Layer_" (itoa m) "_Freeze")))) f)
		(write-line (itoa(eval(read(strcat "Layer_" (itoa m) "_Lock")))) f)
		(setq m(1+ m))
	)

	(close f)

)


;;;-------------------GetLayerSet------------------------------+
;;;レイヤー状態をリストに記憶する
;;;【引き数】レイヤーテーブルデータ
;;;【戻り値】(レイヤー名　OnOff　Freeze　Lock） ("LAYER" 1 0 1)


(defun GetLayerSet(Obj1 / Layer1 OnOff FrThaw LockUnlock List1)

	(setq Layer1 (cdr (assoc 2 Obj1)))
	(cond 	((> (cdr (assoc 62 Obj1)) 0) 	(setq OnOff 1))
			(T 								(setq OnOff -1)))

	(cond 	((= (logand  (cdr (assoc 70 Obj1)) 1) 1) (setq FrThaw 1))
			(T										 (setq FrThaw 0)))
	(cond 	((= (logand  (cdr (assoc 70 Obj1)) 4) 4) (setq LockUnlock 1))
			(T										 (setq LockUnlock 0)))
	(setq List1 (List Layer1 OnOff FrThaw LockUnlock))
	List1
)
;共通コマンド
(defun SD1028 ()
  (setq OldCmdEcho (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)
  (command "undo" "be")
  (setq OldOsmode (getvar "OSMODE"))
  (setq OldLayer (getvar "CLAYER"))
  (setq OldLType (getvar "CeLType"))
  (setq OldCeLWeight (getvar "CeLWeight"))
  (setq OldColor (getvar "CeColor"))
  (setq OldOrtho (getvar "ORTHOMODE"))
  (setq OldDStyle  (getvar "DIMSTYLE"))
  (setq OldExpert (getvar "Expert"))
  (setvar "EXPERT" 0)
  (setq Path_Lang "HKEY_CURRENT_USER\\Software\\SpeedDraftLT")
  (if (vl-registry-read Path_Lang "SD_Language" )
  	(setq SD:Lang (vl-registry-read Path_Lang "SD_Language" ))
  	(progn	(setq SD:Lang "J")
  			(vl-registry-write Path_Lang "SD_Language" "J")
  	)
  )
  (princ)
)
;********************************
(defun SD2056 ()
  (setvar "OSMODE" OldOsmode)
  (command "undo" "end")
  (setvar "CLAYER" OldLayer)
  (setvar "CeLType" OldLType)
  (setvar "CeLWeight" OldCeLWeight)
  (setvar "CeColor" OldColor)
  (setvar "ORTHOMODE" OldOrtho)
  (setvar "Expert" OldExpert)
  (if (and (/= (getvar "DIMSTYLE") OldDStyle)(tblsearch "DIMSTYLE" OldDStyle))
  	(command "-dimstyle" "Restore" OldDStyle)
  )
  (princ "\n (C)OffshoreCad&Management")
  (setvar "CMDECHO" OldCmdEcho)
  (princ)
)

;********************************
(defun *myerror* (msg)
	(setq *error* nil)
	(SD2056)
	(princ "\n Error in SpeedDraftLT")
	(princ)
)
(if (= SD:Lang "E")
	(princ "\n Command Name: SD_302 Show only one layer and go to next layer by pressing A and D\n")
	(princ "\n コマンド名：SD_302 レイヤーを１つづつ順番に表示させる\n")
)
(princ)

