AutoCAD 環境には、現在の図面に関連付けられている日時情報や現在のシステム日時を取得するために使用できるいくつかのシステム変数が用意されています。
現在のシステム日時の取得は、タイトル ブロックの日付フィールドに入力するときに役立ちます。一方、経過時間の計算は、プロセスの完了までに要した時間をユーザに知らせたり、カスタム プログラムの基本的な投資利益率(ROI)解析を提供する際に役立ちます。AutoCAD 環境の日時の値は実数形式で格納され、これらの値は日時をグレゴリオ歴と修正ユリウス日という 2 つの異なる形式で表します。実数の整数部(小数点の左側)は日付を表し、実数の小数部(小数点の右側)は時刻を表します。
たとえば、システム変数 CDATE が返す現在のシステム日時の例を次に示します。
20170306.15023500
20170306 = 日付: 2017 年 3 月 6 日
15023500 = 時刻: 午後 3 時 2 分 35 秒 00
このセクションでは、現在の図面に関連付けられている現在のシステム日時、または日時の値の取得に関するシステム変数を一覧表示します。
GETVAR 関数を使用して実数を格納するシステム変数の値を取得する場合、コマンド プロンプトへの出力時の値は、指数表記で表示されます。指数表記によって AutoCAD プログラムで大きな 10 進数を簡単に表示できますが、読みやすく理解しやすくはなりません。RTOS 関数を使用すると、GETVAR 関数が返す実数の有効数字をすべて表示することができます。
Command: (getvar "cdate") 2.01703e+07 Command: (rtos (getvar "cdate") 2 6) "20170306.175302"
CDATE に格納される実数は、コード化された十進形式で現在のシステム日時を表します。この実数を文字列に変換すると、特定の桁を簡単に抽出することができます。SUBSTR 関数を使用すると、文字列の一部を返すことができます。
Command: (setq cdate_val (rtos (getvar "cdate") 2 6)) "20170306.175302" Command: (substr cdate_val 1 4) "2017"
各桁の意味は、次のとおりです。
次のサンプル コードは、CDATE が返す値の異なる日付と時刻の部分を抽出するために使用できる関数の例を示しています。
; Returns or outputs the current date and time ; bOutput = T - Output the string to the Command prompt ; bOutput = nil - Return a string in the MM/DD/YYYY HH:MM:SS format ; Usage: (CurDate T) ; Usage: (CurDate nil) (defun CurDate (bOuput / cdate_val YYYY M D HH MM SS) ; Get the current date/time (setq cdate_val (rtos (getvar "CDATE") 2 6)) ; Break up the string into its separate date and time parts (setq YYYY (substr cdate_val 1 4) M (substr cdate_val 5 2) D (substr cdate_val 7 2) HH (substr cdate_val 10 2) MM (substr cdate_val 12 2) SS (substr cdate_val 14 2) ) ; Output the current date and time to the Command ; prompt or return the formatted output as a string (if bOuput (progn (prompt (strcat "\nDate: " M "/" D "/" YYYY "\nTime: " HH ":" MM ":" SS ) ) (princ) ) (strcat M "/" D "/" YYYY " " HH ":" MM ":" SS) ) )
CurDate 関数の出力または戻り値は、次のようになります。
(CurDate T) Date: 02/14/2017 Time: 14:38:57 (CurDate nil) "02/14/2017 14:39:04"
CDATE と MILLISECS 以外のすべての日時関連のシステム変数は、日時を修正ユリウス日形式で格納します。修正ユリウス日形式の日付部分は数値の整数部(小数点の左側)で、紀元前 4713 年 1 月 1 日正午からの日数を表します。一方、時刻は数値の小数部(小数点の右側)で、小数部に 86,400 を掛けて計算した値が、午前 0 時からの経過時間を表します。
修正ユリウス日形式の値をより意味のある形式に変換するための計算は複雑かもしれませんが、Express Tools には日時に関する 5 つの便利な AutoLISP 関数が用意されています。日時に関する関数は、Julian.lsp ファイルが AutoCAD 環境にロードされた後にのみ使用でき、DATE コマンドまたは AutoLISP の LOAD 関数を使用してロードすることができます。
Julian.lsp ファイルがロードされた後に使用できる日時に関する AutoLISP 関数は次のとおりです。
JTOC と JTOD 関数の例を次に示します。
Command: (jtoc (getvar "date")) (2017 2 22 9 21 27.0) Command: (rtos (jtod (getvar "date")) 2 6) "20170222.092127"
経過時間の計算は、2 つの異なる日時の値、または単に時刻のみの値を減算して行うことができます。必要な精度に基づいて、システム変数 CDATE または MILLISECS に格納されている値を使用することができます。時間の変化が 1 秒未満と非常に小さい場合は、システム変数 MILLISECS に格納されている値が最適です。
Command: (setq start (getvar "MILLISECS")) 25494432 Command: (setq end (getvar "MILLISECS")) 25499471 Command: (- end start) 5039
次のサンプル コードは、異なる開始時間と終了時間を表す 2 つの値の差を、ミリ秒単位で取得するために使用できる関数の例を示しています。
; Takes two values that represent milliseconds and returns ; the difference as an integer/long or double/float ; ; bMilliseconds = T - Return value as milliseconds ; bMilliseconds = nil - Return value as seconds ; ; Usage: (TimeDiff T1 T2 T) - Milliseconds example ; Usage: (TimeDiff T1 T2 nil) - Seconds example (defun TimeDiff (nStart nEnd bReturnMilliseconds / nDiff) ; Get the time difference (if (> nStart nEnd) (setq nDiff (- nStart nEnd)) (setq nDiff (- nEnd nStart)) ) ; Return the time difference in milliseconds or seconds (if (= bReturnMilliseconds nil) (/ nDiff 1000.0) nDiff ) )
TimeDiff 関数の戻り値は、次のようになります。
(setq T1 24092498) (setq T2 24188267) (TimeDiff T1 T2 T) 95769 (TimeDiff T1 T2 nil) 95.769