疑難雜症天地.JPG (6233 bytes)


要如何以LISP繪制製一個正弦波(R14)

  • (defun c:sintest()
      (setvar "cmdecho" 0)
      (setq angs (getangle "區間起始角度
    <0>"))
      (if (null angs)(setq angs 0))
      (setq ange (getangle "區間終止角度
    <360>"))
      (if (null ange)(setq ange (* pi 2)))
      (setq angadd(getangle "計算增量
    <1>"))
      (if (null angadd)(setq angadd (/ pi 180)))
      (setq sinpt (getpoint '中心原點
    :"))
      (setvar "cecolor" "3")
      (command "pline")
      (setq x angs)
      (while (<= x ange)
         (setq y (sin x))
         (command (mapcar '+ sinpt (list x y)))
         (setq x (+ x angadd))
         (princ (angtos x))
      )
      (command "")
      (setvar "cecolor" "1")
      (command "line" sinpt (polar sinpt 0 (+ x 1)) "")
      (command "line" sinpt (polar sinpt (* pi 0.5) 2) "")
      (prin1)
    )

請問如何在LT95環境中.將系統變數`DWGNAME`之值.自動顯示於圖面之固定位置?

  • R14的AutoLISP寫法很簡單,一行可以輕易解決 (grtext -1 (strcat (getvar "dwgprefix") (getvar "dwgname"))) LT Sorry!!!專業的AutoCAD工程師是不玩 LT 的,我們也都不鼓勵學員 玩AutoCAD LT 因為:
    1. LT不支援擴充(AutoLISP&DCL,ADS,ARX...) AutoCAD的應用無法自訂功能提昇效率
    2. CAD已經進入3D的時代,LT不支援3D
    3. LT不能升級到AutoCAD專業版 4.......

  • LT的優點:
    1. 便宜(1/5專業版的價格),用來補充合法套數,負擔較輕
    2. 不錯的2D軟體
    3. 適合主管級觀看&檢查圖面,(可完全相容開啟AutoCAD圖檔)

AutoLISP中可否使用外觀鎖點,可以的話程式碼該如寫?

  • (inters p1 p2 p3 p4) --> 只能抓到真實交點 (inters p1 p2 p3 p4 nil) --> 能抓到真實交點&外觀無限延伸交點

[ BALLOON ]^C^C^P(if (null c:balloon)(xload `balloon`)) balloon 以上為功能表中所敘述,R12中可使用,但於R14中卻無法使用,何解?

  • R12 ADS 需經過重新CompileR14可接受的格式

  • 還得留意R12R14有一些函數上的不同

  • 圖元也有些差異,lwpolylinespline,ellipse...等 您得仔細檢查才行

請問是否有可以用LISP呼叫EXCEL中的某一儲存格中的資料,或有其他的方法呢?

  • AutoLISP不能呼叫EXCEL某一個欄位,但可以將EXCEL呼叫出來 其語法為:(startapp "應用程式名稱")

  • 補充另一中呼叫EXCEL的方式: (command "start" "excel")

請問*.exp檔如何在r14使用? 如何在 lisp 中呼叫其他的lisp

  • exp是由ADS應用程式所定義的AutoCAD指令,載入的方式為 (xload "ADS檔名"),釋放的方式為(xunload "ADS檔名")

  • 要在LISP呼叫其它的LISP方法如下:
    (defun c:aa() (c:bb) )
    (defun c:bb() ..... )

讀取圖面中的孔位置寫出座標至檔案中?

  • 您可以用記事本建立下列程式檔名cirpt.lsp:

    • (defun c:cirpt()
        (setq ffn (getfile "選取檔案
      " "" "txt" 1))
        (setq ff (open ffn "w"))
        (princ "\n選取孔穴
      :")
        (setq ss (ssget)) (setq i 0)
        (repeat (sslength ss)
          (setq ssn (ssname ss i))
          (setq sstyp (cdr (assoc 0 (entget ssn))))
          (if (= sstyp "CIRCLE")
            (progn
               (setq c_pt (cdr (assoc 10 (entget ssn))))
               (princ (car c_pt) ff) (princ "" ff)
               (princ (cadr c_pt) ff) (princ "" ff)
               (princ (caddr c_pt) ff) (princ "\n" ff) )
            )
          )
        (setq i (1+ i)) )
        (close ff)
        (princ (strcat "\n檔案名稱
      ==>" ffn))
        (prin1)
      )

  • 輸入完成後載入指令(load "cirpt"),執行指令cirpt即可 執行完成後選取圓即將中心座標寫至檔案

請問一下 最近在看一些論文的發表!!! 看到有人在使用lisp 用到了 `*`!! 如下表示 ex (setq aaa *rectangle* ) 這樣的*rectangle* 符號代表什麼定義呢??? 還有一個就是 (setq samness 't) 這樣的 't 是否也表什麼定義呢?? 煩請大家指教一下!!謝謝

  • *rectangle*是一個副程式名稱

  • t是宣告該函數為ture

複線型式的矩形,由cad 本身的list可以找到許多圖元性質,如周長,面積.... 但要如何由lisp程式去計算其周長及面積?

  • 您所謂的複線形式矩形,是否為POLYLINE的物件(例如由RECTANG、 POLYGON、PLINE或BPOLY所產生),如果是,您可以用下列方式取得:
    (setq en (car (entsel "\選取物件
    : ")))
    (command "area" "o" en)
    (setq ans_area (getvar "area"))
    (setq ans_per (getvar "perimeter"))

    ans_area 為面積
    (實數),ans_per為周長(實數)

請問各位visual LISP有書好看嗎 ? 如果有請問那一家出版社阿 那個作者ㄚ 謝謝各位的相告

  • 國外有關介紹 Visual LISP 的書也不多,或可去找找看 美國 www.autodesk.com 也有一些討論區 & FAQ <純英文> 建議你努力試看看該軟體的 ON-LINE HELP 由於 Visual LISP 仍存在著不少問題與功能遺憾,若能有效解決後 本中心也許會開相關特訓課程,或我們會在完成 AutoLISP & DCL 精華寶典後,撰寫該手冊!!! 當然,要玩好 Visual LISP ,最重要的還是要有厚實的 AutoLISP 功力 因為 ON-LINE HELP 內幾乎有 1/2 還是在教學 LISP 寫法

最近由國外站台下載 lisp程式,令我感興趣的是這些lisp程式附有由winhlp32.exe執行的 .hlp檔,我對lsp及dcl已有粗淺了解,若有.hlp檔做說明會使程式更 完美!期待各位先進告訴小弟製作.hlp檔的工具或入門書

  • 製作 WIN HELP 的工具軟體再往站上有很多種,(檔案都不大) 請到 www.download.com 下 SEARCH 找 winhelp 自行抓取吧!!! 製作完成的 *.HLP 檔,在 AutoCAD 的呼叫方式
    1. (help "檔名.HLP")
    2. (startapp "winhlp32" "檔名.HLP")

如何利用getfiled函數叫出標準交談框做出如new函數的功能,即開一個新檔或另存一 個新檔,這段lisp該如何寫呢?請能指教?謝謝!

  • getfiled語法如:(getfiled <標題> <內定檔名> <延伸檔名> <旗號>) 旗號的設定功能如下
    1 如果選取檔案存在
    ,則會警告是否更換檔案(用於建立新檔)
    2 抑制輸入檔案功能
    ,只能選取任意檔案不警告(用於開啟舊檔)
    4 允許輸入其它的延伸檔名
    ,或根本不輸入延伸檔名 
    8 依目前內定路徑來搜尋
    ,傳回時去除路徑只顯示檔名

  •  建立新檔範例說明: (setq ffn (getfiled "建立新檔" "" "dwg" 1))

我寫了一個Block Manager只用一個檔一個串列記錄所有資料, 它會無限增大....一個目錄最多可容納幾個檔,及幾個byte.

  • 應該沒有限制!!! 但是你以一個檔案一個串列管理圖塊,並不利於<分類>&自由增減圖塊資料 之最好以 DCL 中的 LIST_BOX 配合讀寫檔分類,並可讓 USER 自行新增 或刪除其所須的圖塊,必要時以 IMAGE & IMAGE BUTTON 配合 SLD 檔韁管理.... ACAD2000 中,對圖檔的管理,有很突破性的發展,我們正在整理中,很快會 公告於網站上,與大家分享!!!

您好: 我是AuCad R14的用戶, 最近用ActiveX automation撰寫簡單的程式 若有疑問要向誰請教呢? 市面上是否有相關書籍?

像是擷取系統日期,檔案名稱於圖框上顯示出來要怎麼弄呢?

  • 首先在圖框中(如 A3base.dwg 圖框建立一個 DATE 屬性

    • (defun cr_date()
        (setq cdate (rtos (getvar "cdate") 2 0))
        (setq date_yy (rtos (- (atoi (substr cdate 1 4)) 1911) 2 0))
        (setq date_mm (substr cdate 5 2))
        (setq date_dd (substr cdate 7 2))
        (setq cdate (strcat date_yy "-" date_mm "-" date_dd))
      )

  • 再配合於主程式中加入 (command "insert" "a3base" '(0 0) 1 1 0 cdate) 對了,希望你很熟悉 屬性 & AutoLISP

AutoCAD r14中有附屬檔名為arx的檔案 其作用及作成方法為何?

  • ARXAuotLISP語言都是用來發展各種AutoCAD補強功能, 它是以C語言為主,一般建議資訊本科較容易上手, 而一般USER建議使用AutoLISP

請問我要如何擷取block中的元體資料,例如:圓之直徑大,線之起始點。 又有那本書可以取得此類資料? 

  • 1.您用下列方式來擷取block圖元內部資料:

    • (defun c:blk()
        (setq nn (getstring "\n??block??: "))
        (setq blkn (tblsearch "block" nn))
        (if (/= blkn nil)?(setq bbn (cdr (assoc -2 blkn))))
        (while (/= bbn nil) (setq endata (entget bbn))
          (princ endata)
          (princ "\n")
          (setq bbn (entnext bbn))
        )
      )

AutoLISP可否call另一lisp程式作為副程式,如何用法,有何限制?

  • 當然可以,如在abc.lsp 中定義有三個副程式
    (defun c:aa()...) & (defun bb()...) & (defun cc(x y) .....)
    其他LISP程式呼叫此三含數的方式分別是
    (c:aa)、(bb)、(cc 引數1 引數2)

  • 但須注意,必須先將 abc.lsp 載入在前,才不會出現空函數訊息

請問R14裡有C++的範例嗎?

  • You can download ObjectARX SDK from web site http://www.autodesk.com/products/acadr14/compapps/objarx.htm It's about 8.4M file size

我想在撰寫 AutoLISP 程式中,如何取得R14序號,以便做為輸入密碼之參考控制,請問該如何取得AutoCAD R14的完整軟體序號呢???如 220-xxxxxxxx!!

  • (getvar "_pkser") 即可取得

AutoLISP中有 (polar 基準點 角度 距離)求另一座標點,但怎麼找不到【增減量表示法】呢???我現在的作法是已知 pta & ww & hh,欲求出 ptb(setq pt1 (polar pta 0 ww))(setq ptb (polar pta (/ pi 2) hh)) 請問有無更快的方法呢???

  • 一行可以解決 (setq ptb(mapcar '+ pta (list ww hh 0)))

這個問題困擾我很久了,也許貴網站有高手可以協助我,謝謝!!!
(defun c:test()
  (command "line")
  (setq pt1 (getpoint "???:"))
  (while pt1 (command pt1)
  (setq pt1 (getpoint pt1 "???:")) )
  (command "")
  (princ "OK!!!")
)

可是這個程式並不能如標準 LINE 一樣靈活打入 C 或 U能否在程式中直接呼叫 LINE 指令,等到 LINE 指令畫完再接續後面的其它副程式呢??? 應用其它的AutoCAD指令也是有同樣的問題???

  • 這是我認為最酷最漂亮的解決密笈,請大家參考運用之!!!

  • (defun c:test()
      (command "line")
      (while (= (getvar "cmdactive") 1)
         (command pause)
      )
      (princ "OK!!!")
    )

我想autolisp 做個雙向 offset 的功能不知如何做??就是輸入偏移數值,他會將他均分(2)在所選線的兩端!!

  • 這是很簡單的AutoLISP程式
    1.
    算出線的角度
    2.
    該角度各加減 pi/2 分別算出 OFFSET 方向點 p1,p2
    3.
    offset指令將該線往二旁
    4.
    大功告成

請問:我想用lisp寫一個圖對圖連結的程式不知如何寫?PS:(例如:我畫了一棟房屋..當我點取二樓的外觀時就會 跑出二樓的平面圖..諸如此類的)

  • 將整張圖檔建立DWF(大小約為dwg檔之1/6 1/10)  並建立起相關的VIEW1F,2F,3F,4F

  • 本圖中,以延伸資料庫的模式加入dwf檔案的訊息

  • 程式中呼叫的開啟的方式如下  (startapp `explorer` `c:\\14dwg\\88test1.dwf`)

  • 觀看dwf檔真的狠酷,可以瀏覽器觀看ZOOM 縮放&PAN,依據 view  layer看圖(必須加入whip模組,可在R14Support資料夾找到,或到   www.autodesk.com去免費download) 

請教:
1.
如何撰寫lisp程式,以求算一方格(或表格)與數條聚合線的交點數?
2.
如何在兩條不等間距的聚合線取線中,插入(5)條平分各區段間距的聚合線? 

  • 問題一 ssget fence 處理過濾是不錯的方式

  • 問題二 divide等分即可,若用程式處理,理論可行,但要傷點神
    1.
    深入pline圖元資料,擷取長度取點
    2.
    divide,將增加的點資料判斷過濾成一串列
    3.
    lengthen協助

  • 你的需求若是坡度分析,可就沒那麼單純了我們當初開發時花了近三個月才完成 

請問cad可否像word一樣,開啟時是我所指定的路徑,感謝各位的回答.

  • 你桌面``AutoCAD``捷徑圖示-->`內容`-->`捷徑`-->`開始位置`輸入指定你所要的路徑.  

  • 除上述方法是正統的外,更酷更彈性的做法是運用AutoLISP來解決
    請參考本中心委由松崗出版的

    AutoLISP & DCL
    精華寶典<整合應用篇>
    -->AutoLISP
    更上一層樓六十大密笈-->範例51
    -->
    網友可直接拿程式來研究&修改或直接使用

  • 若想AutoCAD更上一層樓,可參加本中心的AutoCAD高階工程師特訓(一季只開一個班,每季收8位學員) 

請問我該如何解開.ARX檔變為LSP,請問我如何將只能用於AUTOCAD2000的內部LISP,轉成AUTOCAD14可用格式

  • ARX 無法轉成 LSP

  • 大部分的LISP都可跨越2000&R14二版本,但少部分是不盡相同的,除了細心測試調整外,似乎無捷徑  (Autodesk 也沒有整理出這樣的差異對照資料給用戶) 

我如何在Autolisp參數中將物件鎖點的功能關掉呢?因為在電腦繪製我的程式的時候,距離的計算都會被鎖點干擾而有錯誤,每次要執行我寫的程式之前都要關閉物件鎖點,很麻煩....

  • 你的問題很簡單!
    (setq old_osmode (getvar `osmode`)) ;;;
    先將原物件鎖點模式值儲存
    (setvar `osmpode` 0) ;;;<--
    強迫取消物件鎖點
    ...........
    ..........

    (setvar `osmode` old_osmode)  ;;
    還原物件鎖點設定

AutoCAD r14 ,使用`對齊式標註``傾斜式標註`功能時,utoLisp程式中,  何下指令(command ` _ _ _`  ..........)?

  • (command `dim1` `ali` ......)&(command `dim1` `rot` ...)

有那些因素會影響到AutoLisp `undo` `mark``undo` `back`之功能?(在程式迴圈前有(command `undo` `mark`) 及迴圈中有(command `undo` `back`)指令,但於迴圈中執行(command `undo` `back`)指令時,則並未作用.於跳出AutoLisp回到AutoCAD,`undo` `back`指令,則會回到`undo` `mark`位置.

  • 請用 (command `undo` `be`)
           
    .........
           
    .........
          
    (command `undo` `e`)

  •   爾後執行回復時,只要用 U 即可

我寫了一個dcl程式.....其中是要設計很多個radio_button供選擇....但因為我的radio_button蠻多的...多到必須要換行......我就先用了:row{
                       
:cloumn{}
                       
:column{}
                           
}

結果變成兩行獨立的
radio_button!!!就是一行radio_button各可以選一個選項...但我不是要這樣的....我要的是只能選取一個....

  • 1.過多的radio_button建議改用 list_box 更具彈性

  • 2.再不然就必須於每 action_tile radio_button ,執行一次set_tile 全部 radio_button 設為 `0`(除了所選的之外)可以副程式批次處理 

因工作需要請問在AUTOLISPDCL檔中如果需加入(”)英吋符號時該對話框無法執行如果在對話框選單要出現(”)英吋符號而且要出現在執行結果中我該如何例如在AUTOLISP精華寶典整合應用篇之EXP18選單的火車站在對話框要變成火車站” 執行結果為  火車站” 該如何做

  • 加上一個反斜線即可 -->label= ”火車站\””;

請問我分別寫了兩個不同的AUTOLISP為何第二個程式使用原本均不會有任何問題,但兩個程式混合使用時第一個程式使用過後再執行第二個程式時卻會執行第一個程式 (以上均用mnu載入檔名也沒重覆,程式是利用令存新檔改變數)會有相互干擾的情形,有時母程式和子程式也會

  • 注意程式的變數,或使用區域變數解之

請問為何在AUTOLISP精華寶點文字搜尋相同相符合即亮顯請問亮顯是那一個變數或指令我為何找不到?

  •  ssget可自動處理高亮度顯示,或用(redraw ...)函數

請問如何關閉AUTOCAD最下一行之狀態列?

  •  F10 顯示開關,但無法完全將之消失

`lwplyline`圖元中會有許多頂點座標,圖元資料中(10.   ****,****)會有好幾個,但利用(assoc 10 圖元名稱)卻都只能取得第一個頂點而已,在r12中因為聚合線是`polyline`型式,可以利用(entnext)取得每個頂點,請大家幫我想想要如何在`lwplyline`圖元中取得各頂點座標!

  • 請參考AutoLISP & DCL精華寶典<基礎篇>之實用精選AutoLISP範例 47 ->寫出PLINE頂點座標並佈點&佈點寫出至外部檔案

請問我用LISP寫一個繪圖程式後我如要將某一線段修改為虛線我該如何修改加入那些程式?

  • 1.(command `chprop` ..... `lt` ....)      <-- 強迫改線型
    2.(command `chprop` ..... `la`
    虛線層 ...) <-- 換至虛線層
    3.修改圖元資料群碼 6 ,可強制更換線型,效果同 1

我目前用 R14為何別人的寫 LISP 拿到我的電腦,就不能用了..有些直接不能執行...大部份均可執行,且可以選點啦,線啦.. 不過最終的結果都是會被取消這個功能...例如我要標一條線的斜度,選好線後,他要求我給他一點(就是給他要顯示的字擺那)等那點我一點下去,就取消了... 就是這功能失效...好多LISP都有類似這情形... 請問有人能告訴我這是什原因嗎??

  • 可能原因有四:
    1.
    LSP系統應該是有些保護措施,除非通過其偵測,否則某些重要的副程式將不被載入有些是用硬體鎖保護,所以換一台電腦也就幾近全軍覆沒了
    2.
    未加入適當的支援路徑
    3.
    其程式有指定路徑資料夾
    4.
    相關程式未完全複製齊全

請問如何以AutoLISP抓出目前圖面中有哪些配置名稱?

  • 程式中加入一行 (setq lista (layoutlist)) 即可取得配置串列

如何用程式切換這些不同配置?敬請不吝指教!謝謝

  • (setvar `ctab` 已存在的配置名稱)
    因為 model 已經是固定的呼叫模式了(不能更名,不能刪除)
    所以
    (layoutlist)有無將之包含於中已無所謂了,重要的是那些自訂的配置,可以快速的抓取若想寫一個list_box popup_list 選單,則可輕鬆的以cons model 加入串列即可

請問如何在Autolisp程式中改變標註的形式呢?

  • 請用 (command `dimstyle` ....)即可,若是切換標註型式只要用 (command `dim` `style` ...)即可

請問你一個問題我寫了幾個把它整合在一起用對話框可以達到目的但我點選後沒有選確定只選上面它便開始執行如我要選確定在執行請問我應做何修正其程式內容或有少了什麼東西?

  • 其他DCL物件的 action_tile 後都不要加 done_dialog只在觸動選擇 accept 時再加即可AutoLISP & DCL 精華寶典<整合應用篇>有相當多的範例可以參考

arx 有何作用?

  • 補強AutoCAD功能,AutoLISP--> LSP Visual C ++ -> ARX

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  •  

  •