AutoCAD顧問
還沒有註冊嗎...即日起免費註冊,所有最完整的AutoCAD討論、教學及資源都在論壇裡喔~

【發帖精華】在線段自動標示號碼(lisp)

1頁(共2頁) 1, 2  下一步

上一篇主題 下一篇主題 向下

【發帖精華】在線段自動標示號碼(lisp)

發表 由 litung 于 2009-11-06, 11:04

小弟想要作一個,在線段中心點上方標示號碼的功能
代碼:

;;線段自動標示號碼
(defun c:linedt   ()
  (prompt "依序選擇線段:")
  (setq en (ssget))
  (setq   n (sslength en)
   i 0
  )
  (setq a (getreal "編號:"))
  (setq h (getvar "dimtxt"))
  (repeat n
    (setq en1 (entget (ssname en i))
     p1  (cdr (assoc 10 en1))
     p2  (cdr (assoc 11 en1))
     p3  (polar p1 (angle p1 p2) (/ (distance p1 p2) 2.0))
    )
    (setq an (angle p1 p2))
    (if   (= an pi)
      (setq an (- an pi))
      (if (= an (* pi 1.5))
   (setq an (* pi 0.5))
   (if (and (> an (* pi 0.5)) (< an pi))
     (setq an (+ an pi))
   )
      )
    )
    (setq an1 (* (/ 180 pi) an)
     p3  (polar p3 (+ an (* pi 0.5)) (* h 0.15))
    )
    (setvar "osmode" 0)
    (command "text" "c" p3 h an1 (rtos a))
    (setq a (+ a 1)
     i (+ i 1)
    )
  )
)

測試時,有時是正常的,有時是不正常
在新開的dwg檔中是正常的
代碼:

指令: _linedt 依序選擇線段:
選取物件: 找到 1 個

選取物件: 找到 1 個,共 2

選取物件: 找到 1 個,共 3

選取物件: 找到 1 個,共 4

選取物件:  編號:3 text
目前的文字型式:「Standard」文字高度:  2.5000  可註解:  否
指定文字的起點或 [對正(J)/型式(S)]: c
指定文字的中心點:
指定高度 <2.5000>: 2.500000000000000
指定文字的旋轉角度 <0>: 0.000000000000000
輸入文字: 3
指令: text
目前的文字型式:「Standard」文字高度:  2.5000  可註解:  否
指定文字的起點或 [對正(J)/型式(S)]: c
指定文字的中心點:
指定高度 <2.5000>: 2.500000000000000
指定文字的旋轉角度 <0>: 0.000000000000000
輸入文字: 4
指令: text
目前的文字型式:「Standard」文字高度:  2.5000  可註解:  否
指定文字的起點或 [對正(J)/型式(S)]: c
指定文字的中心點:
指定高度 <2.5000>: 2.500000000000000
指定文字的旋轉角度 <0>: 0.000000000000000
輸入文字: 5
指令: text
目前的文字型式:「Standard」文字高度:  2.5000  可註解:  否
指定文字的起點或 [對正(J)/型式(S)]: c
指定文字的中心點:
指定高度 <2.5000>: 2.500000000000000
指定文字的旋轉角度 <0>: 0.000000000000000
輸入文字: 6

若是使用在舊的圖檔,則會不正常
代碼:

指令: _linedt 依序選擇線段:
選取物件: 指定對角點: 找到 0 個
選取物件: 指定對角點: 找到 1 個

選取物件: 指定對角點: 找到 1 個,共 2

選取物件: 指定對角點: 找到 1 個,共 3

選取物件: 指定對角點: 找到 1 個,共 4

選取物件: 指定對角點: 找到 1 個,共 5

選取物件: 指定對角點: 找到 1 個,共 6

選取物件: 指定對角點: 找到 1 個,共 7

選取物件: 指定對角點: 找到 1 個,共 8

選取物件:  編號:20 text
目前的文字型式:「STANDARD2」文字高度:  2.20  可註解:  否
指定文字的起點或 [對正(J)/型式(S)]: c
指定文字的中心點:
指定文字的旋轉角度 <0>: 10.00000000000000
輸入文字: 0.000000000000000
指令: 20 不明的指令「20」。請按 F1 取得說明。

指令: text
目前的文字型式:「STANDARD2」文字高度:  2.20  可註解:  否
指定文字的起點或 [對正(J)/型式(S)]: c
指定文字的中心點:
指定文字的旋轉角度 <10>: 10.00000000000000
輸入文字: 0.000000000000000
指令: 21 不明的指令「21」。請按 F1 取得說明。

指令: text
目前的文字型式:「STANDARD2」文字高度:  2.20  可註解:  否
指定文字的起點或 [對正(J)/型式(S)]: c
指定文字的中心點:
指定文字的旋轉角度 <10>: 10.00000000000000
輸入文字: 0.000000000000000
指令: 22 不明的指令「22」。請按 F1 取得說明。

指令: text
目前的文字型式:「STANDARD2」文字高度:  2.20  可註解:  否
指定文字的起點或 [對正(J)/型式(S)]: c
指定文字的中心點:
指定文字的旋轉角度 <10>: 10.00000000000000
輸入文字: 0.000000000000000
指令: 23 不明的指令「23」。請按 F1 取得說明。

指令: text
目前的文字型式:「STANDARD2」文字高度:  2.20  可註解:  否
指定文字的起點或 [對正(J)/型式(S)]: c
指定文字的中心點:
指定文字的旋轉角度 <10>: 10.00000000000000
輸入文字: 0.000000000000000
指令: 24 不明的指令「24」。請按 F1 取得說明。

指令: text
目前的文字型式:「STANDARD2」文字高度:  2.20  可註解:  否
指定文字的起點或 [對正(J)/型式(S)]: c
指定文字的中心點:
指定文字的旋轉角度 <10>: 10.00000000000000
輸入文字: 0.000000000000000
指令: 25 不明的指令「25」。請按 F1 取得說明。

指令: text
目前的文字型式:「STANDARD2」文字高度:  2.20  可註解:  否
指定文字的起點或 [對正(J)/型式(S)]: c
指定文字的中心點:
指定文字的旋轉角度 <10>: 10.00000000000000
輸入文字: 0.000000000000000
指令: 26 不明的指令「26」。請按 F1 取得說明。

指令: text
目前的文字型式:「STANDARD2」文字高度:  2.20  可註解:  否
指定文字的起點或 [對正(J)/型式(S)]: c
指定文字的中心點:
指定文字的旋轉角度 <10>: 10.00000000000000
輸入文字: 0.000000000000000
指令: 27 不明的指令「27」。請按 F1 取得說明。

錯誤的地方,在輸文文字那邊都顯示, 0.000000000000000,而小弟要的編號則顯示在下一次的指令那邊。
不知為何會這樣。
是在文字型式設定上有問題嗎?還是程式那邊要作修改。

剛按太快,忘了改標題顏色 ^_^



答對了 恭喜您的主題獲選為發帖精華文章! < 積分+1、威望+3 >

[公告]關於論壇的文章價值


Tiger&蘋果爸 在 2010-02-12, 01:35 作了第 3 次修改 (原因 : 精華文章)
avatar
litung
中級會員
中級會員

文章總數 : 224
年齡 : 42
來自 : 高雄市阿蓮區
職業 : PLC設計、HMI規劃、VB6、接案
愛好 : 電腦、卡通、桌球
個性 : 溫和、內向
使用年資 : 現在只出嘴
使用版本 : ACE 2015
積分 : 7
經驗值 : 3837
威望值 : 245
發帖精華 : 1
注冊日期 : 2009-10-30
串連貼紙成功 男 處女座 兔

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 張譽璋 于 2009-11-06, 12:19

建議你將程式改為以下內容
代碼:
(defun c:linedt ()
  (setq cmd (getvar "cmdecho"))
  (setq osm (getvar "osmode"))
  (setvar "cmdecho" 0)
  (prompt "依序選擇線段:")
  (setq en (ssget))
  (setq n (sslength en)
  i 0
  )
  (setq a (getreal "編號:"))
  (setq h (getvar "dimtxt"))
  (repeat n
    (setq en1 (entget (ssname en i))
    p1  (cdr (assoc 10 en1))
    p2  (cdr (assoc 11 en1))
    p3  (polar p1 (angle p1 p2) (/ (distance p1 p2) 2.0))
    )
    (setq an (angle p1 p2))
    (if  (= an pi)
      (setq an (- an pi))
      (if (= an (* pi 1.5))
  (setq an (* pi 0.5))
  (if (and (> an (* pi 0.5)) (< an pi))
    (setq an (+ an pi))
  )
      )
    )
    (setq an1 (* (/ 180 pi) an)
    p3  (polar p3 (+ an (* pi 0.5)) (* h 0.15))
    )
    (setvar "osmode" 0)
    (command "text" "c" p3 h an1 (rtos a))
    (setq a (+ a 1)
    i (+ i 1)
    )
  )
  (setvar "osmode" osm)
  (setvar "cmdecho" cmd)
  (princ)
)
1.我測試了一下你寫的程式都是正常的,我使用2010版測試,不管是新檔或是舊檔都是正常的,另外建議你程式執行時最好將cmdecho暫 時關閉,程式執行完成後再重新打開,這部分我已經加到程式中你可以參考一下.
2.你的STANDARD2字型應該是設定了固定字高,所以程式執行時並不會問"文字高度"這個項目,但是你的程式中給了字高,所以資料填入執行時項次不對所以程式就會出現錯誤.

張譽璋
榮譽顧問
榮譽顧問

文章總數 : 303
年齡 : 47
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 4969
威望值 : 624
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
藍鵲12號
男 處女座 狗

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 litung 于 2009-11-06, 12:32

小弟是使用2008 sp1版。
開新檔是正常,但開以前的舊檔,就不正常。
一直找不到問題,才post上來請教大家。

謝謝你的修改,小弟再測試看看。

========================
剛剛測試還有是相同的問題,小弟己經上傳圖檔給蘋果爸了,
再麻煩蘋果爸將圖檔放上來。

avatar
litung
中級會員
中級會員

文章總數 : 224
年齡 : 42
來自 : 高雄市阿蓮區
職業 : PLC設計、HMI規劃、VB6、接案
愛好 : 電腦、卡通、桌球
個性 : 溫和、內向
使用年資 : 現在只出嘴
使用版本 : ACE 2015
積分 : 7
經驗值 : 3837
威望值 : 245
發帖精華 : 1
注冊日期 : 2009-10-30
串連貼紙成功 男 處女座 兔

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 張譽璋 于 2009-11-06, 13:29

請依照下圖中的指示修改即可正常執行程式

你的圖檔我已經測試過了,只要使用style指令,將預設好的字型名稱中如圖片中指示的字高改為0即可,每個字型名稱都要改喔!
你的圖檔顯示的範圍太小,所以你先執行Zoom指令,選 全部(A)後再測試.


張譽璋 在 2009-11-07, 00:36 作了第 1 次修改

張譽璋
榮譽顧問
榮譽顧問

文章總數 : 303
年齡 : 47
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 4969
威望值 : 624
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
藍鵲12號
男 處女座 狗

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 litung 于 2009-11-06, 13:59

為何會跟字型高度有關?想不透?

另外高度設定成0時,用屬性去看字型高度,字高是10,字變蠻大的。
小弟作圖範圍大部份都是A4紙張大小而己,字高設定大約都是2.2。
標註尺寸時才會用到10的字高。

字高都改成0的話,程式跑完,還要在作一次字高的修改。
avatar
litung
中級會員
中級會員

文章總數 : 224
年齡 : 42
來自 : 高雄市阿蓮區
職業 : PLC設計、HMI規劃、VB6、接案
愛好 : 電腦、卡通、桌球
個性 : 溫和、內向
使用年資 : 現在只出嘴
使用版本 : ACE 2015
積分 : 7
經驗值 : 3837
威望值 : 245
發帖精華 : 1
注冊日期 : 2009-10-30
串連貼紙成功 男 處女座 兔

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 litung 于 2009-11-06, 14:18

這部份的程式有辨法再修改成,不用設成字高=0的嗎?

小弟剛剛把程式中的字高設成固定的2.2,再重建一個字型
專門用來作線段編號用的(字高=0)。這樣出來的字高就2.2
了,省去在一次的修改字高。
但這方法感覺不怎麼好。
avatar
litung
中級會員
中級會員

文章總數 : 224
年齡 : 42
來自 : 高雄市阿蓮區
職業 : PLC設計、HMI規劃、VB6、接案
愛好 : 電腦、卡通、桌球
個性 : 溫和、內向
使用年資 : 現在只出嘴
使用版本 : ACE 2015
積分 : 7
經驗值 : 3837
威望值 : 245
發帖精華 : 1
注冊日期 : 2009-10-30
串連貼紙成功 男 處女座 兔

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 張譽璋 于 2009-11-06, 14:20

你應該在程式中將字高改寫成任意輸入的方式
你將此行 (setq h (getvar "dimtxt"))
改寫成 (setq h (getreal "\n請輸入字高:"))
這樣你在程式執行時就可以自由輸入字高了.

張譽璋
榮譽顧問
榮譽顧問

文章總數 : 303
年齡 : 47
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 4969
威望值 : 624
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
藍鵲12號
男 處女座 狗

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 litung 于 2009-11-06, 14:30

改成任意輸入,該字型一樣要先設成字高=0,才可以;
若不是0,跑出來的結果,一樣會錯誤。

小弟原本是想直接抓取當時所選的字型高度設定來用。
avatar
litung
中級會員
中級會員

文章總數 : 224
年齡 : 42
來自 : 高雄市阿蓮區
職業 : PLC設計、HMI規劃、VB6、接案
愛好 : 電腦、卡通、桌球
個性 : 溫和、內向
使用年資 : 現在只出嘴
使用版本 : ACE 2015
積分 : 7
經驗值 : 3837
威望值 : 245
發帖精華 : 1
注冊日期 : 2009-10-30
串連貼紙成功 男 處女座 兔

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 張譽璋 于 2009-11-06, 14:34

我將你的程式改寫你試看看

代碼:
(defun c:linedt (/ hold)
  (setq cmd (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (princ "\nLINEDT 線條自動加編號")
  (setq a (getreal "\n起始編號:"))
  (setq hold h)
  (if (null hold) (setq hold 2.2))
  (princ "\n請輸入字高 <")
  (princ hold)
  (princ "> :")
  (setq h (getreal))
  (if (null h) (setq h hold))
  (prompt "\n依序選擇線段:")
  (setq en (ssget))
  (setq n (sslength en)
  i 0
  )
  (repeat n
    (setq en1 (entget (ssname en i))
    p1  (cdr (assoc 10 en1))
    p2  (cdr (assoc 11 en1))
    p3  (polar p1 (angle p1 p2) (/ (distance p1 p2) 2.0))
    )
    (setq an (angle p1 p2))
    (if  (= an pi)
      (setq an (- an pi))
      (if (= an (* pi 1.5))
  (setq an (* pi 0.5))
  (if (and (> an (* pi 0.5)) (< an pi))
    (setq an (+ an pi))
  )
      )
    )
    (setq an1 (* (/ 180 pi) an)
    p3  (polar p3 (+ an (* pi 0.5)) (* h 0.15))
    )
    (setvar "osmode" 0)
    (command "text" "c" p3 h an1 (rtos a))
    (setq a (+ a 1)
    i (+ i 1)
    )
  )
  (setvar "cmdecho" cmd)
  (princ)
)

張譽璋
榮譽顧問
榮譽顧問

文章總數 : 303
年齡 : 47
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 4969
威望值 : 624
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
藍鵲12號
男 處女座 狗

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 張譽璋 于 2009-11-06, 14:39

執行程式時請將字型的字高還是設為0
程式已經改些字高有預設值的功能,所以這樣你就可以使用的更方便了.
如果你想讓編號也有預設值,你可以參考程式中字高部份的寫法,就當作是
練習,以後你就會這個方法了.

張譽璋
榮譽顧問
榮譽顧問

文章總數 : 303
年齡 : 47
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 4969
威望值 : 624
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
藍鵲12號
男 處女座 狗

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 litung 于 2009-11-06, 14:45

測試結果:
所選的字型字高=0時,ok。
所選的字型字高不等於0時,一樣是會顯示0.0000000000.

了解了。所以字高一定要等於0,才可以。
有比之前方便了,感謝你 ^_^
avatar
litung
中級會員
中級會員

文章總數 : 224
年齡 : 42
來自 : 高雄市阿蓮區
職業 : PLC設計、HMI規劃、VB6、接案
愛好 : 電腦、卡通、桌球
個性 : 溫和、內向
使用年資 : 現在只出嘴
使用版本 : ACE 2015
積分 : 7
經驗值 : 3837
威望值 : 245
發帖精華 : 1
注冊日期 : 2009-10-30
串連貼紙成功 男 處女座 兔

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 張譽璋 于 2009-11-06, 14:49

好人做倒底再給你更好的


代碼:
(defun c:linedt (/ hold aold)
  (setq cmd (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (princ "\nLINEDT 線條自動加編號")
  (setq aold a)
  (if (null aold) (setq aold 1))
  (princ "\n起始編號 <")
  (princ aold)
  (princ "> :")
  (setq a (getint))
  (if (null a) (setq a aold))
  (setq hold h)
  (if (null hold) (setq hold 2.2))
  (princ "\n請輸入字高 <")
  (princ hold)
  (princ "> :")
  (setq h (getreal))
  (if (null h) (setq h hold))
  (prompt "\n依序選擇線段:")
  (setq en (ssget))
  (setq n (sslength en)
  i 0
  )
  (repeat n
    (setq en1 (entget (ssname en i))
    p1  (cdr (assoc 10 en1))
    p2  (cdr (assoc 11 en1))
    p3  (polar p1 (angle p1 p2) (/ (distance p1 p2) 2.0))
    )
    (setq an (angle p1 p2))
    (if  (= an pi)
      (setq an (- an pi))
      (if (= an (* pi 1.5))
  (setq an (* pi 0.5))
  (if (and (> an (* pi 0.5)) (< an pi))
    (setq an (+ an pi))
  )
      )
    )
    (setq an1 (* (/ 180 pi) an)
    p3  (polar p3 (+ an (* pi 0.5)) (* h 0.15))
    )
    (setvar "osmode" 0)
    (command "text" "c" p3 h an1 (rtos a))
    (setq a (+ a 1)
    i (+ i 1)
    )
  )
  (setvar "cmdecho" cmd)
  (princ)
)

張譽璋
榮譽顧問
榮譽顧問

文章總數 : 303
年齡 : 47
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 4969
威望值 : 624
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
藍鵲12號
男 處女座 狗

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 張譽璋 于 2009-11-06, 14:54

起始編號會自動接續的功能喔!
對了字型中設定字高不是一個好的解決字高的好方法,你會寫程式應該多利用程式解決問題會更好.
認同
其實你的程式寫的還不錯喔!
但是你應該沒學到如何讓程式的操作更人性化,
建議你多思考怎樣讓操作更簡便,這個部分會比
寫自動繪出圖形還更困難喔!多多研究吧!加油



讚啦!! 感恩熱心教學~< 積分 +1>

[公告]關於團隊成員的回文及貢獻


Tiger&蘋果爸 在 2009-11-07, 11:21 作了第 1 次修改 (原因 : 加分囉~)

張譽璋
榮譽顧問
榮譽顧問

文章總數 : 303
年齡 : 47
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 4969
威望值 : 624
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
藍鵲12號
男 處女座 狗

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 litung 于 2009-11-06, 15:05

感謝你,讓你忙了一晚,謝謝 ^_^

小弟說一下這個用途(電控設計方面):
通常在作線路編號時,不會一直連續編下去。
都會預留編號,避免電路設計錯誤或是要增加東西時,有編號可以加入。

如果一直連續編號的話,萬一設變時,中間要插入電路,編號會不一致。
看起來會比較不好看 ^_^

比如:
單元一,編號從20開始,編到35。
單元二,編號從50開始(不從36開始),避免萬一,單元一有新增線路時,
編號才有空間可以加入。
avatar
litung
中級會員
中級會員

文章總數 : 224
年齡 : 42
來自 : 高雄市阿蓮區
職業 : PLC設計、HMI規劃、VB6、接案
愛好 : 電腦、卡通、桌球
個性 : 溫和、內向
使用年資 : 現在只出嘴
使用版本 : ACE 2015
積分 : 7
經驗值 : 3837
威望值 : 245
發帖精華 : 1
注冊日期 : 2009-10-30
串連貼紙成功 男 處女座 兔

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 judyyai 于 2009-11-06, 15:08

2位真是太精采的討論!
一整晚看你們討論
雖然我不太懂程式,但是至少我會用這LISP!
張老師將程式,越改越好用
有2位程式討論!可以讓其他人包含我!可以較明白程式!
謝謝2位!



judyyai 在 2009-11-06, 15:34 作了第 1 次修改

____________________________________________________________________________________
avatar
judyyai
管理顧問
管理顧問

文章總數 : 7649
年齡 : 40
來自 : 台南
職業 : 機械製圖
愛好 : 電腦相關
個性 : think too much...
使用年資 : 10↑
使用版本 : AC2014(開始於2015九月底)
AutoCAD基礎篇等級 : 10星級
積分 : 392
最佳解答 : 1
經驗值 : 27271
威望值 : 3466
發帖精華 : 2
回帖精華 : 4
注冊日期 : 2008-11-19
2D基礎函授 3D基礎函授 顧問外掛程式 經典問與答讀者 藍鵲2號
2009聚會勳章 串連貼紙成功 女 巨蟹座 蛇

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 張譽璋 于 2009-11-06, 15:15

那也沒影響,因為你還是可以任意輸入,記得這種寫法會記憶你上次用過的值
所以如果不續邊可別直接按enter喔! 微笑
不過這支程式我可以教教我們公司那一堆不長進的電控設計人員,
你會想到這個程式真的是不錯,你應該是個很棒的電控設計人員喔!
一想到我公司那些電控人員就........ 火冒三丈

張譽璋
榮譽顧問
榮譽顧問

文章總數 : 303
年齡 : 47
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 4969
威望值 : 624
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
藍鵲12號
男 處女座 狗

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 litung 于 2009-11-06, 15:41

減輕自己的負擔,可以減少加班(沒加班費)的機會,準時下班 ^_^

雖然這些功能 AutoCAD Electrical 都有內建了,但ACE一套太貴了,買不起。
(ACE:線段自動編號、自動產生BOM表(努力用VBA完成中)、線段自動裁減(不會寫,暫時使用圖塊遮蔽來取代))
avatar
litung
中級會員
中級會員

文章總數 : 224
年齡 : 42
來自 : 高雄市阿蓮區
職業 : PLC設計、HMI規劃、VB6、接案
愛好 : 電腦、卡通、桌球
個性 : 溫和、內向
使用年資 : 現在只出嘴
使用版本 : ACE 2015
積分 : 7
經驗值 : 3837
威望值 : 245
發帖精華 : 1
注冊日期 : 2009-10-30
串連貼紙成功 男 處女座 兔

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 張譽璋 于 2009-11-07, 00:33

你說到重點了,我們公司的電控人員買了ACE花了很多錢,結果我去看他們的使用狀況時還跟我說很難用,所以不想用,繼續用以前的老方法去畫電控圖,真的被他們給氣的 火冒三丈 ,真的是浪費公司資源,不過具我瞭解,AutoCAD這些專業版的外掛通常不會很好用,因為他們寫軟體的根本不瞭解業界的使用習慣及方法,所以我現在工作的地方,大部分的外掛都是我和另一位同事寫的,說起我這位同事寫程式也是一把罩,只可惜他現在人在國外,所以程式的產量也就變少了,目前都靠我一個人在開發新外掛程式,總之好好的加油,相信你會有不少的收穫及成就,有空就上來這裡討論,增進大家對lisp程式的認識 微笑

張譽璋
榮譽顧問
榮譽顧問

文章總數 : 303
年齡 : 47
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 4969
威望值 : 624
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
藍鵲12號
男 處女座 狗

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 litung 于 2009-11-07, 02:19

ACE不好用哦? 驚嚇
被你一說,怕買來也沒在用,會被罵到臭頭,電控只有小弟一個人。

剛準備請高雄大塚來公司介紹而己。
介紹又不一定要買,先看看ACE怎麼用,有那些功能,適不適合自己。
畢竟小公司很少會買原版軟體的。
公司只有一電(小弟)一機。
avatar
litung
中級會員
中級會員

文章總數 : 224
年齡 : 42
來自 : 高雄市阿蓮區
職業 : PLC設計、HMI規劃、VB6、接案
愛好 : 電腦、卡通、桌球
個性 : 溫和、內向
使用年資 : 現在只出嘴
使用版本 : ACE 2015
積分 : 7
經驗值 : 3837
威望值 : 245
發帖精華 : 1
注冊日期 : 2009-10-30
串連貼紙成功 男 處女座 兔

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 litung 于 2009-11-11, 12:15

再請教一下,目前小弟把程式新增加了一點功能。(線號靠左,置中、靠右)。
但靠左或靠右,太邊邊了。要怎樣才能在原來點的位置向右或向左偏移指定的距離。

比如:
靠左時,p1位置向右2mm
靠右時,p2位置向左2mm

因有時線號不一定要在中間。
avatar
litung
中級會員
中級會員

文章總數 : 224
年齡 : 42
來自 : 高雄市阿蓮區
職業 : PLC設計、HMI規劃、VB6、接案
愛好 : 電腦、卡通、桌球
個性 : 溫和、內向
使用年資 : 現在只出嘴
使用版本 : ACE 2015
積分 : 7
經驗值 : 3837
威望值 : 245
發帖精華 : 1
注冊日期 : 2009-10-30
串連貼紙成功 男 處女座 兔

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 張譽璋 于 2009-11-11, 15:12

你的問題看似簡單其實還蠻複雜的,複雜的原因是你無法確定每一條線的起點及結束點是否在同一邊,你原來是設定在中間,因為在中間位置是最容易的也不需叫程式判斷每一條線那邊是起點那邊是結束點,但是往左或往右你就要注意那邊是起點的問題了,所以不是距離的問題了,你可以把新的程式內貼出來,我在幫你想想看.

張譽璋
榮譽顧問
榮譽顧問

文章總數 : 303
年齡 : 47
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 4969
威望值 : 624
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
藍鵲12號
男 處女座 狗

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 litung 于 2009-11-11, 15:41

代碼:

(defun c:linedt   (/ hold old_start_number)
  (setq cmd (getvar "cmdecho"))
  (setq osm (getvar "osmode"))
  (setvar "cmdecho" 0)
  (princ "\nLINEDT 線條自動加編號")
  (setq old_start_number start_number)
  (if (null old_start_number)
    (setq old_start_number 1)
  )
  (princ "\n起始編號 <")
  (princ old_start_number)
  (princ "> :")
  (setq start_number (getint))
  (if (null start_number)
    (setq start_number old_start_number)
  )
  (setq hold CharHigh)
  (if (null hold)
    (setq hold 2.2)
  )
  (princ "\n請輸入字高 <")
  (princ hold)
  (princ "> :")
  (setq CharHigh (getreal))
  (if (null CharHigh)
    (setq CharHigh hold)
  )
  (INITGET "L C R")
  (PRINC "\n選擇線號位置 左邊(L)/中間(C)/右邊(R) <C>:")
  (SETQ SelectPoint (GETKWORD))
  (IF (NULL SelectPoint)
    (SETQ SelectPoint "C")
  )
  (prompt "\n依序選擇線段:")
  (setq en (ssget))
  (setq   n (sslength en)
   i 0
  )
  (repeat n
    (setq en1 (entget (ssname en i))
     p1  (cdr (assoc 10 en1))
     p2  (cdr (assoc 11 en1))
     p3  (polar p1 (angle p1 p2) (/ (distance p1 p2) 2.0))
    )
    (setq an (angle p1 p2))
    (if   (= an pi)
      (setq an (- an pi))
      (if (= an (* pi 1.5))
   (setq an (* pi 0.5))
   (if (and (> an (* pi 0.5)) (< an pi))
     (setq an (+ an pi))
   )
      )
    )
    (setq CharAngle (* (/ 180 pi) an)
     p1       (polar p1 (+ an (* pi 0.5)) (* CharHigh 0.5))
     p2       (polar p2 (+ an (* pi 0.5)) (* CharHigh 0.5))
     p3       (polar p3 (+ an (* pi 0.5)) (* CharHigh 0.5))
    )
    (setvar "osmode" 0)
;;;方向判斷失敗   
;;;    (if (> p1 p2) (setq startpoint p1 endpoint p2))
;;;    (if (> p2 p1) (setq startpoint p2 endpoint p1))
    (COND
      ((= SelectPoint "L")
      (setq p1 (polar p1 0 2)) 
      (SETq CenterPoint p1)
      )
      ((= SelectPoint "C")
      (SETQ CenterPoint p3)
      )
      ((= SelectPoint "R")
      (setq p2 (polar p2 0 -2))
      (SETQ CenterPoint p2)
      )
    )
    (command "text"
       "c"
       CenterPoint
       CharHigh
       CharAngle
       (rtos start_number)
    )
    (setq start_number
     (+ start_number 1)
     i (+ i 1)
    )
  )
  (setvar "osmode" osm)
  (setvar "cmdecho" cmd)
  (princ)
)

目前暫時假設線段都是從左至右,角度固定為0度(角度會有誤差,暫時省略) ^_^
因為方向判斷失敗,還在模索。
avatar
litung
中級會員
中級會員

文章總數 : 224
年齡 : 42
來自 : 高雄市阿蓮區
職業 : PLC設計、HMI規劃、VB6、接案
愛好 : 電腦、卡通、桌球
個性 : 溫和、內向
使用年資 : 現在只出嘴
使用版本 : ACE 2015
積分 : 7
經驗值 : 3837
威望值 : 245
發帖精華 : 1
注冊日期 : 2009-10-30
串連貼紙成功 男 處女座 兔

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 張譽璋 于 2009-11-11, 16:59

我剛剛測試了很久發現你的程式條件不夠無法判斷角度的問題,所以我想必須另外想個方法才行.

張譽璋
榮譽顧問
榮譽顧問

文章總數 : 303
年齡 : 47
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 4969
威望值 : 624
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
藍鵲12號
男 處女座 狗

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 litung 于 2009-11-11, 17:10

靠左、靠右應該不用管角度了。
線段預設都是水平的。(個人繪制線路圖的習慣 ^_^)

只剩方向判斷,原本的想法
(SETQ X1 (CAR P1))
(SETQ X2 (CAR P2))
再來比較X1與X2,找出方向
IF (> X1 X2)... 線段由右至左
IF (< X1 X2)... 線段由左至右

測試時還是失敗。明天下班再試看看。
avatar
litung
中級會員
中級會員

文章總數 : 224
年齡 : 42
來自 : 高雄市阿蓮區
職業 : PLC設計、HMI規劃、VB6、接案
愛好 : 電腦、卡通、桌球
個性 : 溫和、內向
使用年資 : 現在只出嘴
使用版本 : ACE 2015
積分 : 7
經驗值 : 3837
威望值 : 245
發帖精華 : 1
注冊日期 : 2009-10-30
串連貼紙成功 男 處女座 兔

回頂端 向下

回復: 【發帖精華】在線段自動標示號碼(lisp)

發表 由 張譽璋 于 2009-11-11, 17:24

程式已經完成了你測試看看
代碼:
(defun c:linedt1 (/ hold old_start_number)
  (setq cmd (getvar "cmdecho"))
  (setq osm (getvar "osmode"))
  (setvar "cmdecho" 0)
  (princ "\nLINEDT 線條自動加編號")
  (setq old_start_number start_number)
  (if (null old_start_number)
    (setq old_start_number 1)
  )
  (princ "\n起始編號 <")
  (princ old_start_number)
  (princ "> :")
  (setq start_number (getint))
  (if (null start_number)
    (setq start_number old_start_number)
  )
  (setq hold CharHigh)
  (if (null hold)
    (setq hold 2.2)
  )
  (princ "\n請輸入字高 <")
  (princ hold)
  (princ "> :")
  (setq CharHigh (getreal))
  (if (null CharHigh)
    (setq CharHigh hold)
  )
  (INITGET "L C R")
  (PRINC "\n選擇線號位置 左邊(L)/中間(C)/右邊(R) <C>:")
  (SETQ SelectPoint (GETKWORD))
  (IF (NULL SelectPoint)
    (SETQ SelectPoint "C")
  )
  (prompt "\n依序選擇線段:")
  (setq en (ssget))
  (setq  n (sslength en)
  i 0
  )
  (repeat n
    (setq en1 (entget (ssname en i))
    p1  (cdr (assoc 10 en1))
    p2  (cdr (assoc 11 en1))
    p3  (polar p1 (angle p1 p2) (/ (distance p1 p2) 2.0))
    )
    (setq an (angle p1 p2))
    (setq am (angle p2 p1))
    (if (> an am) (setq CharAngle (* (/ 180 pi) am))
                  (setq CharAngle (* (/ 180 pi) an))
    )
    (if (> an am) (setq pp1 (polar p1 (+ am (* pi 0.5)) (* CharHigh 0.5))
                        pp1 (polar pp1 (+ am (* pi 1.0)) 2.0)
                        pp2 (polar p2 (+ am (* pi 0.5)) (* CharHigh 0.5))
                        pp2 (polar pp2 (+ am (* pi 0.0)) 2.0)
                  )
                  (setq pp1 (polar p1 (+ an (* pi 0.5)) (* CharHigh 0.5))
                        pp1 (polar pp1 (+ an (* pi 0.0)) 2.0)
                        pp2 (polar p2 (+ an (* pi 0.5)) (* CharHigh 0.5))
                        pp2 (polar pp2 (+ an (* pi 1.0)) 2.0)
                  )
    )
    (if (> an am) (setq p3 (polar p3 (+ am (* pi 0.5)) (* CharHigh 0.5)))
                  (setq p3 (polar p3 (+ an (* pi 0.5)) (* CharHigh 0.5)))
    )
    (setvar "osmode" 0)
    (COND
      ((= SelectPoint "L")
      (if (> an am) (SETq CenterPoint pp2)
                    (SETq CenterPoint pp1)
      )
      )
      ((= SelectPoint "C")
      (SETQ CenterPoint p3)
      )
      ((= SelectPoint "R")
      (if (> an am) (SETQ CenterPoint pp1)
                    (SETQ CenterPoint pp2)
      )
      )
    )
    (command "text"
      "c"
      CenterPoint
      CharHigh
      CharAngle
      (rtos start_number)
    )
    (setq start_number
    (+ start_number 1)
    i (+ i 1)
    )
  )
  (setvar "osmode" osm)
  (setvar "cmdecho" cmd)
  (princ)
)
這樣子你的線不管往那個方向畫都能正常了 微笑


*恭喜您升等為 高級會員,即日起可以瀏覽進階功能、進階資源分享區*

「說明」顧問論壇等級權限
http://www.autocad-tw.com/forum-f6/topic-t1403.htm


Tiger&蘋果爸 在 2009-11-12, 01:09 作了第 1 次修改 (原因 : 顧問論壇感謝您的支持與付出)

張譽璋
榮譽顧問
榮譽顧問

文章總數 : 303
年齡 : 47
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 4969
威望值 : 624
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
藍鵲12號
男 處女座 狗

回頂端 向下

1頁(共2頁) 1, 2  下一步

上一篇主題 下一篇主題 回頂端


 
這個論壇的權限:
無法 在這個版面回復文章