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

[討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

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

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

[討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 tarpon 于 2010-07-28, 02:03

[問題]選取圖塊計算數量後將表格繪製於圖面上並插入圖塊

q1:此程式會計算圖面所有圖塊,如何改成只有選取範圍內圖塊
q2:含屬性圖塊如不將其過濾排除,就必須分解才可插入於圖表
有沒有辦法將含屬性圖塊及其值一併繒製插入於表格內[表格須加屬性值欄位]


---------------------------------------------------------------------------------
希望未來cad版本資料萃取有自動將圖塊插入於表格的功能那就太棒了 竊喜
---------------------------------------------------------------------------------



程式
代碼:
(defun c:bombl()
  (setvar "cmdecho" 0)
  (setq os (getvar "osmode"))
  (setvar "osmode" 0)
  (setq pt1 (getpoint "\n表格左上角插入點: "))
  (setq ww 1200.0);表格總寬度
  (setq hh 100.0);表格高度
  (setq pt2 (polar pt1 0 ww));表格右上角點
  (setq pt3 (polar pt2 (* pi 1.5) hh));表格右下角點
  (setq pt4 (polar pt1 (* pi 1.5) hh))表格左下角點
  (command "pline" pt1 pt2 pt3 pt4 "c");繪表格框線
  (setq pt5 (polar pt1 0 (/ ww 4)));表格第1格右上角點
  (setq pt6 (polar pt5 (* pi 1.5) hh));表格第1格右下角點
  (command "line" pt5 pt6 "");繪表格第1格分隔線
  (setq pt7 (polar pt5 0 (/ ww 2)));表格第2格右上角點
  (setq pt8 (polar pt7 (* pi 1.5) hh));表格第2格右下角點
  (command "line" pt7 pt8 "");繪表格第2格分隔線
  (command "text" "m" (inters pt1 pt6 pt4 pt5) (/ hh 2) 0 "圖塊符號");表格第1格標題
  (command "text" "m" (inters pt5 pt8 pt6 pt7) (/ hh 2) 0 "圖塊名稱");表格第2格標題
  (command "text" "m" (inters pt7 pt3 pt8 pt2) (/ hh 2) 0 "圖塊數量");表格第3格標題
  (setq blk (tblnext "block" t));取出第一個block圖元內含性質
  (while blk
    ;(setq blk1 (assoc 70 blk));取出block屬性
    ;(if(/= (setq blk2 (itoa(cdr blk1))) "2");排除含屬性block
    (progn
      (setq blkn (assoc 2 blk));取出block名稱
      (setq blk_key (substr (cdr blkn) 1 1));取出block名稱
      (if (/= blk_key "*")
        (progn
       (setq ss (ssget "X" (list blkn)));建立過濾block選集
            (if (null ss)
              (setq ssn 0);歸零
              (setq ssn (sslength ss));計算block選集數量           
            )
            (setq blknn (cdr blkn));取出block名稱
       (setq pt1 pt4 pt5 pt6 pt2 pt3 pt7 pt8);點1=點4 點5=點6 依此類推
            (setq pt4 (polar pt1 (* pi 1.5) hh));
            (setq pt6 (polar pt5 (* pi 1.5) hh));
            (setq pt3 (polar pt2 (* pi 1.5) hh));
       (setq pt8 (polar pt7 (* pi 1.5) hh));
       (setq pt9 (polar pt1 (angle pt1 pt6) (/ (distance pt1 pt6) 2.0)));
            (command "pline" pt2 pt3 pt4 pt1 "");
            (command "line" pt5 pt6 "");
       (command "line" pt7 pt8 "");
       (command "text" "m" (inters pt5 pt8 pt6 pt7) (/ hh 2) 0 blknn);寫出block名稱
            (command "text" "m" (inters pt7 pt3 pt8 pt2) (/ hh 2) 0 (itoa ssn));寫出block數量
       (setq blknn (strcat "*" blknn));block名稱加星號分解
       (command "insert" blknn pt9 "1" "1" "0");插入block符號
        )
      )
      ;(setq blk (tblnext "block"));old計算下一個block
    );progn
    ;);if
    (setq blk (tblnext "block"));new計算下一個block
  );while
  (setvar "osmode" os)
  (prompt "bombl")
  (prin1)
)
avatar
tarpon
中級會員
中級會員

文章總數 : 201
年齡 : 27
來自 : 台北
職業 : 設計
愛好 : 打球
個性 : 溫和
使用年資 : 5年
使用版本 : 2006
積分 : 6
經驗值 : 3590
威望值 : 238
注冊日期 : 2010-07-01
串連貼紙成功 男 巨蟹座 馬

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 阿希 于 2010-07-29, 09:30

tarpon 寫到:[問題]選取圖塊計算數量後將表格繪製於圖面上並插入圖塊
q1:此程式會計算圖面所有圖塊,如何改成只有選取範圍內圖塊
q2:含屬性圖塊如不將其過濾排除,就必須分解才可插入於圖表
有沒有辦法將含屬性圖塊及其值一併繒製插入於表格內[表格須加屬性值欄位]

---------------------------------------------------------------------------------
希望未來cad版本資料萃取有自動將圖塊插入於表格的功能那就太棒了 竊喜
---------------------------------------------------------------------------------
程式
代碼:
(defun c:bombl()
  (setvar "cmdecho" 0)
  (setq os (getvar "osmode"))
  (setvar "osmode" 0)
  (setq pt1 (getpoint "\n表格左上角插入點: "))
  (setq ww 1200.0);表格總寬度
  (setq hh 100.0);表格高度
  (setq pt2 (polar pt1 0 ww));表格右上角點
  (setq pt3 (polar pt2 (* pi 1.5) hh));表格右下角點
  (setq pt4 (polar pt1 (* pi 1.5) hh))表格左下角點
  (command "pline" pt1 pt2 pt3 pt4 "c");繪表格框線
  (setq pt5 (polar pt1 0 (/ ww 4)));表格第1格右上角點
  (setq pt6 (polar pt5 (* pi 1.5) hh));表格第1格右下角點
  (command "line" pt5 pt6 "");繪表格第1格分隔線
  (setq pt7 (polar pt5 0 (/ ww 2)));表格第2格右上角點
  (setq pt8 (polar pt7 (* pi 1.5) hh));表格第2格右下角點
  (command "line" pt7 pt8 "");繪表格第2格分隔線
  (command "text" "m" (inters pt1 pt6 pt4 pt5) (/ hh 2) 0 "圖塊符號");表格第1格標題
  (command "text" "m" (inters pt5 pt8 pt6 pt7) (/ hh 2) 0 "圖塊名稱");表格第2格標題
  (command "text" "m" (inters pt7 pt3 pt8 pt2) (/ hh 2) 0 "圖塊數量");表格第3格標題
  (setq blk (tblnext "block" t));取出第一個block圖元內含性質
  (while blk
    ;(setq blk1 (assoc 70 blk));取出block屬性
    ;(if(/= (setq blk2 (itoa(cdr blk1))) "2");排除含屬性block
    (progn
      (setq blkn (assoc 2 blk));取出block名稱
      (setq blk_key (substr (cdr blkn) 1 1));取出block名稱
      (if (/= blk_key "*")
        (progn
       (setq ss (ssget "X" (list blkn)));建立過濾block選集
            (if (null ss)
              (setq ssn 0);歸零
              (setq ssn (sslength ss));計算block選集數量           
            )
            (setq blknn (cdr blkn));取出block名稱
       (setq pt1 pt4 pt5 pt6 pt2 pt3 pt7 pt8);點1=點4 點5=點6 依此類推
            (setq pt4 (polar pt1 (* pi 1.5) hh));
            (setq pt6 (polar pt5 (* pi 1.5) hh));
            (setq pt3 (polar pt2 (* pi 1.5) hh));
       (setq pt8 (polar pt7 (* pi 1.5) hh));
       (setq pt9 (polar pt1 (angle pt1 pt6) (/ (distance pt1 pt6) 2.0)));
            (command "pline" pt2 pt3 pt4 pt1 "");
            (command "line" pt5 pt6 "");
       (command "line" pt7 pt8 "");
       (command "text" "m" (inters pt5 pt8 pt6 pt7) (/ hh 2) 0 blknn);寫出block名稱
            (command "text" "m" (inters pt7 pt3 pt8 pt2) (/ hh 2) 0 (itoa ssn));寫出block數量
       (setq blknn (strcat "*" blknn));block名稱加星號分解
       (command "insert" blknn pt9 "1" "1" "0");插入block符號
        )
      )
      ;(setq blk (tblnext "block"));old計算下一個block
    );progn
    ;);if
    (setq blk (tblnext "block"));new計算下一個block
  );while
  (setvar "osmode" os)
  (prompt "bombl")
  (prin1)
)
這程式 ~ 您自己寫的 ?

阿希
高級會員
高級會員

文章總數 : 335
年齡 : 36
來自 : 台北
職業 : 水電設計
愛好 : autolisp
個性 : 和平主義者
使用年資 : 5
使用版本 : 2008
積分 : 19
經驗值 : 4140
威望值 : 196
發帖精華 : 1
注冊日期 : 2008-09-22
男 摩羯座 猴

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 tarpon 于 2010-07-29, 16:39

我參考吳永進老師autocad程式設計一書中的程式自行加以修改的 害羞
lisp都是看書自修有些程序回圈邏輯不是很了解 暈倒
avatar
tarpon
中級會員
中級會員

文章總數 : 201
年齡 : 27
來自 : 台北
職業 : 設計
愛好 : 打球
個性 : 溫和
使用年資 : 5年
使用版本 : 2006
積分 : 6
經驗值 : 3590
威望值 : 238
注冊日期 : 2010-07-01
串連貼紙成功 男 巨蟹座 馬

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 ginse0727 于 2010-07-30, 16:38

您的第一個問題.
只要把這一行,
(setq ss (ssget "X" (list blkn)))
換成
(setq ss (ssget '((0 . "insert"))))
就可以由框選來節篩圖塊選集,
不過建議要把這一行放在插入表格那一行之前....
感覺比較合邏輯,
第二個問題,是我的想法....我還沒花時間試出來...所以只能提供想法供參考吧,

在插入屬性圖塊時,緊接著會要求您輸入屬性值,以完成insert動作,
因為先前在處理圖塊時,已經有把圖塊的一些屬性值都抓出來結合成串列了..
有图塊名稱,有屬性值,只要把對應值取出填入,
那插入屬性圖塊應該就可以完成了,
只是屬性值分類處理,要花點時間試程式.
以上是我的想法,不曉得前輩們有沒有更有效率的方法,可以提出來分享. 感激
avatar
ginse0727
高級會員
高級會員

文章總數 : 256
年齡 : 43
來自 : 台北巿
職業 : 帷幕牆
愛好 : 電玩,漫畫,網路小說
個性 : 宅男/正直/死腦筋
使用年資 : 退伍後工作迄今,10年以上
使用版本 : 2012
積分 : 14
經驗值 : 4229
威望值 : 492
發帖精華 : 1
注冊日期 : 2010-07-12
經典問與答讀者 藍鵲61號
2011聚會勳章 男 獅子座 虎

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 tarpon 于 2010-07-30, 17:26

我有另一個想法將含屬性圖塊先過濾出來
在修改上次boxbom程式結合在一起
不過boxbom程式只單獨對同一圖塊名稱作計算
修改測試回圈好複雜頭好痛 努力中

如果能完成在圖面材料計算上會省很多時間 認同
avatar
tarpon
中級會員
中級會員

文章總數 : 201
年齡 : 27
來自 : 台北
職業 : 設計
愛好 : 打球
個性 : 溫和
使用年資 : 5年
使用版本 : 2006
積分 : 6
經驗值 : 3590
威望值 : 238
注冊日期 : 2010-07-01
串連貼紙成功 男 巨蟹座 馬

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 ginse0727 于 2010-08-04, 17:59

屬性圖塊統計列表,邊查書邊測試, 翻桌 搞了很久總算皇天不負苦心人,讓我給試出來了 嘆氣 ,我把你的程式拆解成幾個副程式方便解讀,另外再加上一些對屬性資料處理的副程式, 答對了 你再測試看看,提供給有需要的人依需求修改 好開心
代碼:
(defun c:bombl()
  (setvar "cmdecho" 0)
  (setq os (getvar "osmode"))
  (setvar "osmode" 0)
  (setq ss (ssget '((0 . "insert"))))            ;建立圖塊選集
  (setq n (sslength ss))
  (setq   i 0
   blk_num_list
    '()
  )
  (repeat n
    (setq blk (ssname ss i))               
    (if   (= (cdr (assoc 0 (entget (entnext blk)))) "ATTRIB")   ;過濾屬性圖塊
      (progn
   (get_attribs blk)
   (setq blk_num_list (cons #bna_as1_as2 blk_num_list))   ;將屬性值結合到串列中
   (setq i (1+ i))
      )
      (setq i (1+ i))
    )                        ;if
  )                        ;repeat
  (cal_ast_blk blk_num_list)               ;統計數量
  (draw_tab)
  )


(defun draw_tab()
  (setq pt1 (getpoint "\n表格左上角插入點: "))
  (setq ww 1200.0)                  ;表格總寬度
  (setq hh 100.0)                  ;表格高度
  (setq pt2 (polar pt1 0 ww))               ;表格右上角點
  (setq pt3 (polar pt2 (* pi 1.5) hh))            ;表格右下角點
  (setq pt4 (polar pt1 (* pi 1.5) hh))            ;表格左下角點
  (command "pline" pt1 pt2 pt3 pt4 "c")            ;繪表格框線
  (setq pt5 (polar pt1 0 (/ ww 4)))            ;表格第1格右上角點
  (setq pt6 (polar pt5 (* pi 1.5) hh))            ;表格第1格右下角點
  (command "line" pt5 pt6 "")               ;繪表格第1格分隔線
  (setq pt7 (polar pt5 0 (/ ww 2)))            ;表格第2格右上角點
  (setq pt8 (polar pt7 (* pi 1.5) hh))            ;表格第2格右下角點
  (command "line" pt7 pt8 "")               ;繪表格第2格分隔線
  (command "text" "m" (inters pt1 pt6 pt4 pt5) (/ hh 2) 0 "圖塊符號");表格第1格標題
  (command "text" "m" (inters pt5 pt8 pt6 pt7) (/ hh 2) 0 "圖塊名稱");表格第2格標題
  (command "text" "m" (inters pt7 pt3 pt8 pt2) (/ hh 2) 0 "圖塊數量");表格第3格標題
  (setq i 0)
  (repeat (length sumlist)
    (setq blk (nth i sumlist))               ;取出第i個block串列
    (setq blkn (car blk))               ;取出block符號
    (setq blk_key1 (cadr blk))               ;取出block_屬性1
    (setq blk_key2 (caddr blk))               ;取出block_屬性2
    (setq blk_k1+k1(strcat blk_key1 " " blk_key2))      ;取出block名稱
    (setq blk_num (cadddr blk))               ;取出block數量
    (setq pt1 pt4 pt5 pt6 pt2 pt3 pt7 pt8)         ;點1=點4 點5=點6 依此類推
    (setq pt4 (polar pt1 (* pi 1.5) hh));
    (setq pt6 (polar pt5 (* pi 1.5) hh));
    (setq pt3 (polar pt2 (* pi 1.5) hh));
    (setq pt8 (polar pt7 (* pi 1.5) hh));
    (setq pt9 (polar pt1 (angle pt1 pt6) (/ (distance pt1 pt6) 2.0)));
    (command "pline" pt2 pt3 pt4 pt1 "");
    (command "line" pt5 pt6 "");
    (command "line" pt7 pt8 "")
    (command "-insert" blkn pt9 "1" "1" "0" blk_key1 blk_key2)      ;插入block符號
    (command "text" "m" (inters pt5 pt8 pt6 pt7) (/ hh 2) 0 blk_k1+k1)   ;寫出block名稱
    (command "text" "m" (inters pt7 pt3 pt8 pt2) (/ hh 2) 0 blk_num)   ;寫出block數量
    (setq i(1+ i))
    );repeat
  (setvar "osmode" os)
  (prompt "bombl")
  (prin1)
  )

(defun get_attribs(#blk)                  ;取得圖塊的屬性
  (setq #bkname (cdr (assoc 2 (entget #blk))))            
  (setq #bk_1 (entnext #blk))                  
  (setq #bk_2 (entnext #bk_1))                  
  (setq #bk_as1 (cdr (assoc 1 (entget #bk_1))))            
  (setq #bk_as2 (cdr (assoc 1 (entget #bk_2))))            
  (setq #bna_as1_as2 (list #bkname #bk_as1 #bk_as2))         
  )

(defun cal_ast_blk(#tmplist)         ;計算圖塊的加總
  (setq   sumlist '() nextlist '() onnum 0 num 0)
  (setq txttbase (nth 0 #tmplist))      
  (while txttbase            
    (repeat (length #tmplist)
      (setq txtt (nth onnum #tmplist))
      (if (= (strcat (car txttbase) " " (cadr txttbase)" " (caddr txttbase))
       (strcat (car txtt) " " (cadr txtt) " " (caddr txtt)))
   (setq num (1+ num))         
   (setq nextlist (cons txtt nextlist))   
   );if
      (setq onnum (+ 1 onnum))
      );repeat
    (setq sumlist (cons (list (car txttbase) (cadr txttbase) (caddr txttbase) (itoa num)) sumlist))
    (setq #tmplist nextlist nextlist '())   
    (setq onnum 0 num 0)
    (if   (= #tmplist nil)         
      (setq txttbase nil)
      (setq txttbase (nth 0 #tmplist))
    );if
  );while
  )

Tiger&蘋果爸 寫到:讚啦!! 謝謝熱心程式分享~< 積分 +1>
[公告]關於團隊成員的回文及貢獻


Tiger&蘋果爸 在 2010-08-05, 03:29 作了第 1 次修改 (原因 : 加分囉~)
avatar
ginse0727
高級會員
高級會員

文章總數 : 256
年齡 : 43
來自 : 台北巿
職業 : 帷幕牆
愛好 : 電玩,漫畫,網路小說
個性 : 宅男/正直/死腦筋
使用年資 : 退伍後工作迄今,10年以上
使用版本 : 2012
積分 : 14
經驗值 : 4229
威望值 : 492
發帖精華 : 1
注冊日期 : 2010-07-12
經典問與答讀者 藍鵲61號
2011聚會勳章 男 獅子座 虎

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 ginse0727 于 2010-08-05, 13:20

不好意思,程式處理的不夠完善,仍有部份需做修改:

請把底下過濾圖塊判斷式的這一行更正,才不會在一併選取非屬性圖塊時,程式產生錯誤,

以下回復可見... 三條線2



avatar
ginse0727
高級會員
高級會員

文章總數 : 256
年齡 : 43
來自 : 台北巿
職業 : 帷幕牆
愛好 : 電玩,漫畫,網路小說
個性 : 宅男/正直/死腦筋
使用年資 : 退伍後工作迄今,10年以上
使用版本 : 2012
積分 : 14
經驗值 : 4229
威望值 : 492
發帖精華 : 1
注冊日期 : 2010-07-12
經典問與答讀者 藍鵲61號
2011聚會勳章 男 獅子座 虎

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 tarpon 于 2010-08-05, 14:18

最近在忙一個新案子一直沒上來看
謝謝ginse0727提供的程式
我這兩天找時間測試一下再上來報告
感恩呢 感激
avatar
tarpon
中級會員
中級會員

文章總數 : 201
年齡 : 27
來自 : 台北
職業 : 設計
愛好 : 打球
個性 : 溫和
使用年資 : 5年
使用版本 : 2006
積分 : 6
經驗值 : 3590
威望值 : 238
注冊日期 : 2010-07-01
串連貼紙成功 男 巨蟹座 馬

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 長陳 于 2010-10-24, 09:55

最近工作剛好有需要用到
謝謝ginse0727提供的程式
avatar
長陳
新手上路
新手上路

文章總數 : 8
年齡 : 48
來自 : 高雄
職業 : 工程
愛好 : cad
個性 : ok
使用年資 : 2
使用版本 : 2008
經驗值 : 2576
威望值 : 0
注冊日期 : 2010-10-23
男 雙魚座 雞

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 adslwang 于 2010-10-25, 14:14

一定要來看一下這個修改後的程式 買了書 確一直沒有好好的研究
avatar
adslwang
高級會員
高級會員

文章總數 : 372
年齡 : 39
來自 : 台南
職業 : 自由業
愛好 : 電腦、旅行
個性 : 樂觀
使用年資 : 1年
使用版本 : 2009
積分 : 17
經驗值 : 4600
威望值 : 355
回帖精華 : 1
注冊日期 : 2008-10-02
藍鵲88號
男 處女座 馬

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 bruce79 于 2010-10-28, 01:37

感謝大大的無私分享!!!!!~~~ 害羞

bruce79
初級會員
初級會員

文章總數 : 162
年齡 : 38
來自 : 南投
職業 : 工程師
愛好 : 運動
個性 : O型-樂觀
使用年資 : 5年
使用版本 : 2008
積分 : 3
經驗值 : 3708
威望值 : 9
未回應主題 : 1
注冊日期 : 2008-09-12
顧問外掛程式 男 巨蟹座 羊

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 avenir 于 2011-02-25, 02:04

工作常常用的到~~但我還是有點看不懂也~~~ 害羞
avatar
avenir
初級會員
初級會員

文章總數 : 31
年齡 : 34
來自 : 台中
職業 : 水電
愛好 : 攝影
個性 : 安靜
使用年資 : 4年
使用版本 : 2008
積分 : 1
經驗值 : 3023
威望值 : 12
注冊日期 : 2009-11-02
藍鵲574號
串連貼紙成功 女 白羊座 豬

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 jack0615.tw 于 2011-02-25, 02:47

這一定要來試試看,普渡眾生呀!
avatar
jack0615.tw
中級會員
中級會員

文章總數 : 206
年齡 : 56
來自 : Taipei
職業 : 可憐的上班族
愛好 : 照相
個性 : 善良
使用年資 : 3
使用版本 : 2011&2012
積分 : 7
經驗值 : 3801
威望值 : 377
注冊日期 : 2010-03-07
經典問與答讀者 藍鵲7號
男 天秤座 牛

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 tarpon 于 2011-03-09, 08:06

同一圖塊內含一個以上屬性仍無法解決再繼續用功 努力中

-------------------------------------------------
屬性萃取2006較簡單2007以後選項一堆很多都用不到
彼而變複雜了軟體應該越來越簡便
可是autocad一些簡單指令好像越來越複雜了ex 3d旋轉,屬性萃取

avatar
tarpon
中級會員
中級會員

文章總數 : 201
年齡 : 27
來自 : 台北
職業 : 設計
愛好 : 打球
個性 : 溫和
使用年資 : 5年
使用版本 : 2006
積分 : 6
經驗值 : 3590
威望值 : 238
注冊日期 : 2010-07-01
串連貼紙成功 男 巨蟹座 馬

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 shenhung 于 2011-03-10, 02:55

屬性圖塊資料的輸出..是很多人會遇到的問題..
各公司的輸出表格型式也大不相同.一直以來感覺上都須要客製化的程式來處理
有沒有人可以提供一下含有屬性的圖檔..
以及.輸出表格的型式...有空我來當家庭作業..練習一下..
avatar
shenhung
高級會員
高級會員

文章總數 : 238
年齡 : 50
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 5003
威望值 : 913
注冊日期 : 2009-06-03
男 摩羯座 馬

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 tarpon 于 2011-03-10, 23:37

shenhung 寫到:屬性圖塊資料的輸出..是很多人會遇到的問題..
各公司的輸出表格型式也大不相同.一直以來感覺上都須要客製化的程式來處理
有沒有人可以提供一下含有屬性的圖檔..
以及.輸出表格的型式...有空我來當家庭作業..練習一下..


需求
圈選所要計算圖塊選集計算數量
表格繪製於cad圖面
參考圖檔請到免費空間下載如下連結

第一載點
內含一個以上屬性圖塊
http://www.badongo.com/file/25190704
內含一個屬性圖塊
http://www.badongo.com/file/25190728
無屬性圖塊
http://www.badongo.com/file/25190733

第二載點


第一欄>>圖塊[插入圖塊]
第二欄>>圖塊名稱
第三欄>>屬性值[若含有一個以上屬性自動增加欄位,若無屬性即無此欄位]
第四欄>>圖塊數量[沒屬性及不同屬性分別計算]

如果完成真是萬分感激您 害羞
avatar
tarpon
中級會員
中級會員

文章總數 : 201
年齡 : 27
來自 : 台北
職業 : 設計
愛好 : 打球
個性 : 溫和
使用年資 : 5年
使用版本 : 2006
積分 : 6
經驗值 : 3590
威望值 : 238
注冊日期 : 2010-07-01
串連貼紙成功 男 巨蟹座 馬

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 shenhung 于 2011-03-11, 04:48

tarpon
你的圖檔.是原始檔案..
你能不能.將這些有屬性的..插入一張圖裡..直接輸入屬性資料..
我想知道你的資料長度.和內容..
第三欄.屬性值[若含有一個以上屬性自動增加欄位,若無屬性即無此欄 位]
這點不太懂..能不能請你直接畫你要表格給我..!!有欄位.和無欄位的..
這樣子..會比較了解.




avatar
shenhung
高級會員
高級會員

文章總數 : 238
年齡 : 50
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 5003
威望值 : 913
注冊日期 : 2009-06-03
男 摩羯座 馬

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 tarpon 于 2011-03-11, 16:33

shenhung 寫到:tarpon
你的圖檔.是原始檔案..
你能不能.將這些有屬性的..插入一張圖裡..直接輸入屬性資料..
我想知道你的資料長度.和內容..
第三欄.屬性值[若含有一個以上屬性自動增加欄位,若無屬性即無此欄 位]
這點不太懂..能不能請你直接畫你要表格給我..!!有欄位.和無欄位的..
這樣子..會比較了解.





已mail給您麻煩您了
怕您沒收到下載點
第一載點
http://www.badongo.com/file/25193519

第二載點
avatar
tarpon
中級會員
中級會員

文章總數 : 201
年齡 : 27
來自 : 台北
職業 : 設計
愛好 : 打球
個性 : 溫和
使用年資 : 5年
使用版本 : 2006
積分 : 6
經驗值 : 3590
威望值 : 238
注冊日期 : 2010-07-01
串連貼紙成功 男 巨蟹座 馬

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 shenhung 于 2011-03-13, 06:28

抓點模式.和圖層鎖住排除..程式已修正..
程式更新檔載點..(0314)
http://db.tt/5910EfY


代碼:

;----計算圖塊並列表--------------
;--------------------------------
;指令  dbom
;
;僅以屬性數量做基本排序----------
;--------------------------------
;屬性值排序未指定位置,無法排序---
;--------------------------------
;更新抓點模式.和圖層鎖住圖塊排除-
;--------------------------------
(defun dbom_err(st)
(if osmode (setvar "osmode" osmode))
(setq *error* old_err)
(setvar "cmdecho" 1)
(princ) 
)
;-----------------------------------------------------------------------
(defun c:dbom(/)
  (setvar "cmdecho" 0)
  (setq osmode (getvar "osmode"))
  (getbom_block)
  (draw_bom)
  (setq *error* old_err)
  (setvar "osmode" osmode)
  (setvar "cmdecho" 1)
  (princ)
 
)
;--------------------------------------------------------------------------
;----選擇圖塊.並過濾圖塊..-------------------------------------------------
(defun getbom_block( / bom_str bom_str1 bom_en bb_name  m-ent en2 att_nae att_val w i bb_layer layer_list)
    (setq old_err *error* *error* dbom_err)
    (setq bom_ss(ssget '((0 . "INSERT"))))
    (setq i 0  @att_lng 0)
    (setq bom_f1 '())  ;無屬性數量串列
    (setq bom_att '())  ;有屬性串列
    (setq bom_str "")  ;屬性字串
    (setq bom_str1 '()) ; 屬性串列
    (repeat (sslength bom_ss)
            (setq bom_en (ssname bom_ss i))
            (setq bb_name  (dxfa 2  bom_en))
            (setq bb_layer (dxfa 8  bom_en))  ;圖層
            (setq layer_list (tblsearch "layer" bb_layer))
        (if (= (cdr (assoc 70 layer_list)) 0)  ;過濾掉圖層鎖住的物件  (70 .4) 為鎖住.
            (progn      
            (setq m-ent (dxfa -1 bom_en))
            (setq en2 (entnext m-ent))
       (if (/= en2 nil)
      (progn
       (if (= (dxfa 0 en2) "ATTRIB") ;有屬性圖塊
          (progn
          (setq w 0) 
          (while(/= (dxfa 0 en2) "SEQEND")
                     (setq att_name (dxfa 2 en2))  ;屬性名
                (setq att_val  (dxfa 1 en2))  ;屬性值
                (if  (= w 0)
                 (progn
                 (setq bom_str  (strcat bb_name "|" att_name "," att_val))
            (setq bom_str1 (cons bb_name bom_str1))
            (setq bom_str1 (cons (strcat att_name att_val) bom_str1))
            )
                 (progn
                      (setq bom_str  (strcat bom_str  "|" att_name "," att_val))
                 (setq bom_str1 (cons (strcat att_name att_val) bom_str1))
            )
              
           ) 
                     (setq en2 (entnext en2))
                (setq w (1+ w))
          );WHILE
          (setq bom_att (cons (list (reverse bom_str1) bom_str) bom_att)) ;將圖塊屬性.放到bom_att串列內
          (setq bom_str ""  bom_str1 '())  ; 設初始變數
          (if (> w @att_lng) (setq @att_lng w))  ;設置屬性數量
          );progn
          (bom-none)
       );  if
       ) ;PROGN  處理有屬性圖塊結束~
             (bom-none)   
       ) 
      ));if progn  圖層打開.才處理過濾
      
          (setq i (1+ i))
    );repeat
   


;---------------------------------------------------------------------------------
(defun draw_bom()
    (setq th  50)      ;字高
    (setq bom_ht  100)  ;欄框高度
    (setq bom_wid1 400)  ;圖例寬度
    (setq bom_wid2 1000) ;圖塊名稱寬度
    (setq bom_wid3 400)  ;數量度
    (setq bom_wid4 400)  ;屬性度
    (setq long_list '(400 1000 400)) ;wid1 wid2 wid3
    (setq bom_text '("圖  例" "圖塊名稱" "數量"))
    (setq att_text '("屬性標籤+值-" "屬性標籤+值二" "屬性標籤+值三" "屬性標籤+值四"  "屬性標籤+值五"))
    (setq base_long (+ bom_wid1 bom_wid2 bom_wid3))
   
;--------------------------------------------------------------------------------
    (setq spt (getpoint "\n插入點:"))
    (cond ((= @att_lng nil)  ;無屬性塊
     (setq all_long base_long)
     )
     ((/= @att_lng nil)  ;有屬性塊加入屬性寬度x屬性數量
     (setq all_long (+ base_long (* @att_lng bom_wid4)))
     )
    )
;---------畫檔頭-------------------------------------------------------------------
  (setvar "osmode" 0)
  (draw_bom_val nil nil)
 
;----------------------------------------------------------------------------------
            (if (/= bom_f1 nil)                      ;無屬性圖塊..畫出.
           (progn
       (setq mm 0)
       (repeat (length bom_f1)
          (setq f1_en (nth mm bom_f1))
          (setq block_name (car f1_en))
          (setq block_quan (cdr f1_en))
          (setq bom_text (list "" block_name block_quan))
          (setq att_text '(""))
          (draw_bom_val block_name 0)
          (setq mm (1+ mm))
       );repeat
       )
       ); if
            (if (/= bom_att nil)                      ;有屬性圖快畫出
           (progn
      (setq bom_att (sort_bom1 bom_att))  ; 屬性長度排序
      (setq bom_qu (reverse (sort_bomx bom_att))) ;計算有屬性圖塊塊量
      
      (setq mm 0)
      (repeat (length bom_qu)
              (setq f1_temp (nth mm bom_qu))
              (setq en_qu  (cdr f1_temp))
              (setq val_list (cutstr_plus (nth 0 (car f1_temp)) '("|")))
              (setq block_name (nth 0 val_list))
              (setq att_val  (nth 1 val_list))
              (setq bom_text (list "" block_name en_qu))
              (setq oo 1 att_text '())
              (repeat (1- (length val_list))
                 (setq att_text (cons (nth oo val_list) att_text))
                 (setq oo (1+ oo))
         ) 
              (setq att_text (reverse att_text) att_qu 1)
              (draw_bom_val block_name 1)
              (setq mm (1+ mm))
      )
      );progn
          )

;---------------------------------------------------------------------------------
;------畫欄框---------------------------------------------------------------------
(defun draw_bom_val(bk_name key /  ii jj pt1 pt2 pt3 pt4 Q txt1 txt2 lpt1 lpt2)
    ; key  識別..有屬性為1 .無屬性為o..標題欄字 nil
    ;bk_name  -->block name
    (setq ii 0 jj 0)
    (setq an (* pi (/ 270.0 180.0)))
    (setq pt1 spt)
    (setq pt2 (polar pt1 0 all_long))
    (setq pt3 (polar pt1 an bom_ht))
    (setq pt4 (polar pt2 an bom_ht))
    (command "pline" pt1 pt2 pt4 pt3 pt1 "")
    (if (/= @att_lng nil)
        (setq Q (+ 3 @att_lng))
        (setq Q 3)
    ) 
   
    (setq tx1 pt1)
    (setq lpt1 pt1 lpt2 pt3)
    (repeat Q
            (cond ((< ii 2)
          (setq lpt1 (polar lpt1 0 (nth ii long_list)))
                    (setq lpt2 (polar lpt2 0 (nth ii long_list)))
          (setq tx2 lpt2)
          (cond ((and (= key 0)(= ii 0)) ;無屬性block 迴圈第1次..插入圖塊
           (command "insert" bk_name (midpt tx1 tx2) "" "" "")
                          )
           ((and (= key 1)(= ii 0)) ;有屬性block,迴圈第1次..插入圖塊
                   (setq k 0)
                   (setvar "attdia" 0)  ;交談框輸入關閉
                   (command "_insert" bk_name (midpt tx1 tx2) "1" "1" "0")
                           (repeat (length att_text)  ;輸入屬性值..
                             (command  (nth 1 (cutstr_plus (nth k att_text) '(",")))
                            
                   )  ;
                               (setq k (1+ k))
                           )
                                                  
           ) ;
               )            
          (setvar "attdia" 1)   
          (command "line" lpt1 lpt2 "")
          (command "text" "m" (midpt tx1 tx2) th  0 (nth ii bom_text))
           
                  )
                ((and (< 1 ii (+ 2 @att_lng)) (/= @att_lng 0))
      
        (setq lpt1 (polar lpt1 0 bom_wid4))
                  (setq lpt2 (polar lpt2 0 bom_wid4))
        (setq tx2 lpt2)
             (command "line" lpt1 lpt2 "")
        (if (and (= key 1) (< jj (length att_text)))
            (command "text" "m" (midpt tx1 tx2) th  0 (vl-string-subst "" "," (nth jj att_text)))
            (command "text" "m" (midpt tx1 tx2) th  0 (nth jj att_text))
         
        ) 
             (setq jj (1+ jj))      
       )
           (T
      
        (setq lpt1 (polar lpt1 0 (nth 2 long_list)))
        (setq lpt2 (polar lpt2 0 (nth 2 long_list)))
        (setq tx2 lpt2)
        (command "text" "m" (midpt tx1 tx2) th  0 (nth 2 bom_text))  ; 最後一個..直接寫入數量抬頭..
                )
         
         
     )
     (setq tx1 lpt1)    
          (setq ii (1+ ii))       
    );repeat
    (setq spt pt3)

;-------無屬性圖塊.直接計算數量-----------------------------------------------------
(defun bom-none( / bktrue bom_quan new_bk_list)
            (setq bk_true (assoc bb_name bom_f1)) ;檢查圖塊是否在數量串列內..
       (if (= bk_true nil)
           (setq bom_f1 (cons (cons bb_name 1) bom_f1))  ;如果不存在..加入圖塊..數量設為1
           (progn
           (setq bom_quan (cdr bk_true))                 
           (setq new_bk_list (cons bb_name (1+ bom_quan)))  ;如果存在.取出串列內 資料..數量加1
           (setq bom_f1 (subst new_bk_list bk_true bom_f1))  ;替換 串列
           )
       )
          
)
;---------------------------------------------------------------------------------
;-------有屬性圖塊.以屬性數量做為排序----------------------------------------------
(defun sort_bom1 (x_list / a b)
    (vl-sort x_list '(lambda (a b)
         (< (length (car a))  (length (car b)))))
)

;------計算屬性數量-------------------------------------------------------------------
(defun sort_bomx (x_list / temp i ss val val_true bom_quan new_bk_list)
            (setq temp '() i 0)
            (repeat (length x_list)
               (setq ss (nth i x_list))
               (setq val (cdr ss))
               (setq val_true (assoc val temp))  ;檢查 屬性資料串是否在串列內
               (if (= val_true nil)
                   (setq temp (cons (cons val 1) temp))  ;如果不存在..加入屬性資料串.數量設為1
                   (progn
                   (setq bom_quan (cdr val_true))
                   (setq new_bk_list (cons val (1+ bom_quan)))  ;如果存在.取出串列內 資料..數量加1
                   (setq temp (subst new_bk_list val_true temp)) ;替換 串列
         )
               )
          (setq i (1+ i))
       )
(if temp temp)

)
;-以下為副程式---------------------------------------------------------------------
;----------------------------------------------------------------------------------
;-取得dxf 碼-----------------------------------------------------------------------
(defun dxfa (code entity / dxf_lis)
  (setq dxf_lis (cdr (assoc code (entget entity (list "*")))))
)
;----2點取中點--------------------------------------------------------------------
(defun midpt (first_pt end_pt)
    (setq mpt (polar first_pt (angle first_pt end_pt) (/ (distance first_pt end_pt) 2)))
    (if mpt mpt)
)
;---------------------------------------------------------------------------------
;------------中文字串轉成串列----------------------------------------------------
(defun cutstr_plus(txt# lis / bs ii ww b al key_code str_int str_length)
      (setq al '())
      (setq bs "")
      (setq ii 0 ww 1)
      (setq key_code (ascii (nth 0 lis)))
      (setq str_code (vl-string-elt txt# ii)) ;找出ascii 碼
      (setq str_length (strlen txt#))
      (while (/= ii  str_length)
     
      (if    (and (or (<=  65 str_code 90)  ; A-Z        英文字
            (<=  97 str_code 122) ; a-z
            (<=  48 str_code 57) ; 0-9
            (=  str_code  32) ;空白
            (=  str_code  34) ;  " 引號
            (=  str_code  40) ;(                 
            (=  str_code  41) ;)
            (=  str_code  46) ; _
            (=  str_code  45) ; -
            (=  str_code 61)  ;=
        )
        (/=  str_code key_code)
            )
       (progn
             (setq bs (strcat bs (substr txt# ww 1) ))
             (setq ww (1+ ww) ii (1+ ii))
       )
            (if (= str_code key_code)
           (progn
          (if (/= ii 0)
          (setq al (cons bs al));如果遇到斷字元..就把字串加入
                    )
          (setq bs "")
          (setq ww (1+ ww) ii (1+ ii))
       )
           (progn
       (setq bs (strcat bs (substr txt# ww 2))) ;中文字
       (setq ww (+ ww 2) ii (+ ii 2))
       ) 
       )
    ) ;if
        (if (/= ii  str_length)
   (setq str_code (vl-string-elt txt# ii)) ;找出ascii碼
   ) 
      );while
      (setq al (reverse (cons bs al)))
     
    (if al al)
) ;defun
;---------------------------------------------------------------------------------
(princ)

Tiger&蘋果爸 寫到:讚啦!! 謝謝熱心程式分享~< 積分 +1>
[公告]關於團隊成員的回文及貢獻


Tiger&蘋果爸 在 2011-03-15, 03:01 作了第 6 次修改 (原因 : 太酷啦~)
avatar
shenhung
高級會員
高級會員

文章總數 : 238
年齡 : 50
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 5003
威望值 : 913
注冊日期 : 2009-06-03
男 摩羯座 馬

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 tarpon 于 2011-03-13, 22:51

shenhung
太感謝您了
我的lisp太肉腳了
[需要好好學習一下]
您這程式造福太多人了
除了感謝還是感謝

-----------------------
如果有設物件鎖定會發生錯誤
開頭取消物件鎖定加
(setvar "osmode" 0)
結尾回復物件鎖定
(setvar "osmode" 55)
-----------------------
另外要如何排除鎖住圖層圖塊?
avatar
tarpon
中級會員
中級會員

文章總數 : 201
年齡 : 27
來自 : 台北
職業 : 設計
愛好 : 打球
個性 : 溫和
使用年資 : 5年
使用版本 : 2006
積分 : 6
經驗值 : 3590
威望值 : 238
注冊日期 : 2010-07-01
串連貼紙成功 男 巨蟹座 馬

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 Tiger&蘋果爸 于 2011-03-15, 03:00

shenhung 寫到:抓點模式.和圖層鎖住排除..程式已修正..
程式更新檔載點..(0314)
http://db.tt/5910EfY
真的是太專業了~
論壇的其他朋友有用到要記得感恩!
好舒服

____________________________________________________________________________________
avatar
Tiger&蘋果爸
系統管理員
系統管理員

文章總數 : 17191
年齡 : 41
來自 : 台北市文山區
職業 : AutoCAD顧問
愛好 : 蹓狗/戶外活動/拍照
個性 : 幽默/樂觀/善良
使用年資 : 15↑
使用版本 : AutoCAD 2016
經驗值 : 64603
威望值 : 12753
注冊日期 : 2008-04-23
2D基礎函授 2D進階函授 3D基礎函授 https://i11.servimg.com/u/f11/19/71/67/71/2d3d10.png2D+3D線上 顧問外掛程式 經典問與答讀者 藍鵲1號
2009聚會勳章 2010聚會勳章 2011聚會勳章 2012聚會勳章 2013勳章-2D基礎 2014聚會勳章 2015聚會勳章 2016聚會勳章 串連貼紙成功 男 水瓶座 兔

http://mypaper.pchome.com.tw/kv1012tiger

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 pizg 于 2011-03-28, 09:58

shenhung 提供的程式能夠快速統計圖塊數量,
值得讚賞.

惟若系統變數「ATTREQ」值為0時,
此程式會產生一點小小的問題.

另外, 表格如果能夠考慮到不同尺寸的圖塊,
就更完美了

avatar
pizg
高級會員
高級會員

文章總數 : 253
年齡 : 52
來自 : 桃園縣
職業 : 建築設計;程式設計
愛好 : 音樂;攝影;繪畫;棋奕;電腦
個性 : 隨和
使用年資 : 20↑
使用版本 : 2010
積分 : 10
經驗值 : 4084
威望值 : 320
發帖精華 : 1
注冊日期 : 2010-04-16
串連貼紙成功 男 摩羯座 龍

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 阿德 于 2011-04-04, 16:09

我不會寫 lisp 程式,但 lisp 程式有輔助 cad 在各別領域製圖上的幫助.各位高手們所提供的見解、說明及 lisp 程式,對於我在工作上有所幫助,非常感謝各位大大們無私的分享.

讚啦!!
avatar
阿德
初級會員
初級會員

文章總數 : 22
年齡 : 53
來自 : 台北縣
職業 : 水電工程
愛好 : 聽音樂
個性 : 內向
使用年資 : 15
使用版本 : 2008
積分 : 1
經驗值 : 2782
威望值 : 12
注冊日期 : 2010-05-24
男 處女座 龍

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 ginse0727 于 2011-04-22, 15:04

副程式的分類很清楚,註解的也很詳細,
感謝前輩無私的方享程式碼,
觀摩這麼有條理的程式,讓我這種半桶水的後輩獲益良多,
謝謝. 謝謝囉
avatar
ginse0727
高級會員
高級會員

文章總數 : 256
年齡 : 43
來自 : 台北巿
職業 : 帷幕牆
愛好 : 電玩,漫畫,網路小說
個性 : 宅男/正直/死腦筋
使用年資 : 退伍後工作迄今,10年以上
使用版本 : 2012
積分 : 14
經驗值 : 4229
威望值 : 492
發帖精華 : 1
注冊日期 : 2010-07-12
經典問與答讀者 藍鵲61號
2011聚會勳章 男 獅子座 虎

回頂端 向下

回復: [討論]圖塊計算數量後將表格繪製於圖面上並插入圖塊

發表 由 gill0923 于 2011-05-27, 17:24

謝大大的無私分享!!!!!~~~

gill0923
初級會員
初級會員

文章總數 : 88
年齡 : 42
來自 : 台灣
職業 : 工程
愛好 : 機電工程
個性 : 內向
使用年資 : 六年
使用版本 : 2012
積分 : 1
經驗值 : 3491
威望值 : 6
注冊日期 : 2008-06-13
藍鵲425號
男 天秤座 兔

回頂端 向下

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

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


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