關於 AutoLISP 相容性

AutoLISP 程式通常很少需要為了在最新版本中執行而變更。

但是,AutoLISP 程式在最新版本中可能無法正常執行,因為 AutoLISP 函數或 AutoCAD 系列產品的指令或系統變數已變更或已棄用。

註: 從 AutoCAD 2014 系列產品開始,自訂應用程式必須使用「安全模式」;當 SECURELOAD 系統變數設定為 1 或 2。在安全模式下進行作業時,AutoCAD 系列產品已限制為只能載入及執行包含來自可信任位置之代碼的檔案;可信任的位置是由 TRUSTEDPATHS 系統變數所指定。如需更多資訊,請參閱〈關於安全性及病毒防護〉。

一般資訊

舊型指令和系統變數

檢閱您的自訂程式是否有指令和系統變數已指定為「舊型」。在某些情況下,即使無法在指令提示下直接輸入或從使用者介面存取的舊型指令或系統變數,仍可由您的自訂程式使用。

註: 但即使舊型的指令或系統變數可能仍適用於自訂程式,也不保證能在未來版本的產品中繼續運作。建議您重新撰寫您的自訂程式以避免使用任何舊型的指令或系統變數。

嘗試在自訂程式中使用舊型指令或系統變數時,下列技巧可能有用:

  • 在指令名稱前面加上句點做為字首。例如,.BLIPMODE 允許使用 BLIPMODE 指令。
  • 避免使用 COMMAND 函數執行舊型系統變數,因為可能會導致發生「不明的指令」錯誤訊息,請改為使用 GETVARSETVAR 函數。例如,(getvar "BLIPMODE") 會傳回 BLIPMODE 系統變數的目前值。
註: 已自產品中移除的指令與系統變數無法使用上述技巧還原。

AutoCAD 2021 系列產品和更新版本

Unicode 支援

AutoLISP 環境已更新為支援 Unicode 字元,這會影響用來操控或傳回字串值的函數。如需哪些函數已更新為支援 Unicode 的更多資訊,請參閱 AutoLISP 的新增功能或變更功能

根據程式中使用的函數,您可能需要變更這些函數才能處理 Unicode 字元。例如,與舊版相比,當某個 Unicode 字元傳給 ASCII 函數時,傳回值現在可以大於 255 或不同。您可以使用 LISPSYS 系統變數來識別和控制載入至程式的預設 AutoLISP 環境;0 和 2 = MBCS 支援 (舊式環境),1 = Unicode 支援。

下列程式碼片段顯示如何判斷哪個 AutoLISP 環境目前已載入至程式,以及如何根據載入的環境控制程式碼執行:

(if (= (getvar "LISPSYS") 1)
  (alert (strcat 
             "Unicode support enabled"
             "\n(ASCII \"€\") returns 8364"
         )
  )
  (alert (strcat 
             "MBCS (Legacy) support enabled"
             "\n(ASCII \"€\") returns 128"
         )
  )
)
註: 使用 Visual LISP 整合開發環境 (VL IDE) 或 MAKELISPAPP 指令編譯 AutoLISP 原始 (LSP) 檔時,LISPSYS 系統變數的目前值會控制編譯檔案的格式。使用 LISPSYS 設定為 1 (Unicode 格式) 編譯的檔案,無法載入至 AutoCAD 2020 和更早版本中。在編譯檔案前將 LISPSYS 設定為 0 或 2,可確保檔案也能載入至舊版中,但這麼做會限制 Unicode 支援。

AutoCAD 2020 系列產品和更新版本

INSERT 指令

INSERT 指令現在會顯示「圖塊」選項板,而新的 CLASSICINSERT 指令會顯示「傳統」的「插入」對話方塊。如果您的 AutoLISP 程式必須使用「插入」對話方塊,則必須變更您現有的程式。您之前可能使用了以下 AutoLISP 陳述式顯示「插入」對話方塊:

(initdia)
(command "insert")

若要繼續使用 AutoLISP 程式顯示「插入」對話方塊,則必須變更您現有的程式使用以下其中一種方法:

  • (initcommandversion 2)
    (initdia)
    (command "insert")
  • (command "classicinsert")

AutoCAD 2019 系列產品和更新版本

LOCALE 系統變數

LOCALE 系統變數現在傳回的代碼包含代表目前語言的二字母或多字母縮寫,而不是代表語言和子語言的三字母縮寫。二字母或多字母縮寫是根據使用 LOCALE_SISO639LANGNAME 常數的 Windows GetLocaleInfo 函式。

在 AutoCAD 2019 系列產品之前,代碼是一個由 Windows GetLocaleInfo 函式使用 LOCALE_SABBREVLANGNAME 常數傳回的三字母縮寫。三字母縮寫是根據兩項資訊:二字母的語言縮寫,加上指出子語言的第三個字母。例如,ENU 代表英文語言 (EN) 與做為子語言的美國 (U) 的組合。

AutoCAD 2017 系列產品和更新版本

CDATE、DATE 和其他日期/時間相關系統變數

儲存在 CDATE 與 DATE 系統變數中的值不再以最接近的毫秒或百分之一秒來表示目前的日期/時間。這兩個系統變數現在都以最小的時間單位「秒」來表示值。如果您需要追蹤小於一秒的時間間隔,請考慮使用 MILLISECS 系統變數傳回的值,此變數儲存工作站自開機後的時間差,以毫秒為單位。

以下日期/時間相關系統變數也會受到移除毫秒的影響:

  • TDCREATE
  • TDINDWG
  • TDUCREATE
  • TDUPDATE
  • TDUSRTIMER
  • TDUUPDATE

如果您任何既有的程式需要最接近毫秒的時間差異,您可以取得儲存在 MILLISECS 系統變數中最後 2 位數或 3 位數的值,然後將它們附加到 CDATE 系統變數傳回的值,這樣產生的值就會與 AutoCAD 2016 系列產品和更早版本中 CDATE 系統變數傳回的值差不多。下列程式碼範例顯示如何根據目標 AutoCAD 版本,取得包括毫秒的日期/時間值:

; Returns a CDATE value that includes milliseconds based on release
; Usage: (CDate)
; Replaces (rtos (getvar "CDATE") 2 8)
(defun CDate ( / ms)
  ; Check to see which AutoCAD release is being used
  (if (<= (atof (getvar "ACADVER")) 22.0)
    (rtos (getvar "CDATE") 2 8)
    (progn
      ; Get the current milliseconds and append it to the CDATE value
      (setq ms (itoa (getvar "MILLISECS")))
      (strcat (rtos (getvar "CDATE") 2 6)(substr ms (- (strlen ms) 2)))
    )
  )
)
EPDFSHX 系統變數

隨 AutoCAD 2016 Update 1 引入的 EPDFSHX 系統變數已更名為 PDFSHX。因為名稱變更,所以必須修訂參考 EPDFSHX 系統變數的所有 AutoLISP 陳述式。在您的自訂程式中,以下這些函數最有可能受到此變更的影響:

  • GETVAR - 將傳回 nil 值,而不是 0 或 1 的整數值
  • SETVAR - 可能會終止程式的執行,並且產生錯誤訊息 ; error: AutoCAD variable setting rejected: "epdfshx"
  • COMMAND - 可能會終止程式的執行,並且產生錯誤訊息 EPDFSHX Unknown command "EPDFSHX"

AutoCAD 2016 系列產品和更新版本

以數位方式簽署的檔案

現在可以用數位方式簽署 AutoLISP 檔案。以數位方式簽署 AutoLISP 檔案,可以讓檔案載入至 AutoCAD 圖面環境中,而不會對使用者顯示檔案未受信任的警告訊息。已經過數位簽署的 VLX 檔案無法載入至 AutoCAD 2015 系列產品或更早版本的產品中。

osnap 函數

osnap 函數不再支援快速 (qui) 物件鎖點模式。在 AutoLISP 程式中,必須從使用 osnap 函數的所有陳述式移除 qui 模式的參考。如果未移除模式,osnap 函數會針對繪製區中的有效點傳回 nil,而不是座標值。