Chuyển đến nội dung
Diễn đàn CADViet
anhGeodesy

[Nhờ Edit Code đọc thống kê dữ lệu ATT trong Dynamic]

Các bài được khuyến nghị

Nhờ các cao thủ chỉnh sửa giùm em đoạn code thống kê này cho ra 1 list như trong file cad dưới đây. cảm ơn các bác. em viết mà gặp cái Dynamic có tới 3 dữ liệu em chưa biết cách duyệt lây nó ra như thế nào. xin nhờ các bác chỉ giáo.

Block Feild TKT DAM New_hoi CV.dwg

 

(defun c:00 (/ Bang_Thong_ke doc)
  (vl-load-com)
  (Setvar "CMDECHO" 0)
  ;(command "TEXTSCR" "")
 (princ "\nChon Block can tong hop\n :")
  (if (setq ss (ssget (list (cons 0 "INSERT") (cons 66 1))))
    (ATTB_ThepDam ss) 
  )
  ;(AT:Table_Thongkethep Bang_Thong_ke 220 100 "")
  (SETVAR "OSMODE" 16383)
  (princ))

(defun GetTagVal (obj tagName);By Gia_Bach
  (foreach att (vlax-invoke obj 'GetAttributes)
    (if (= tagName (vla-get-tagstring att))
      (setq str (vla-get-TextString att) ) ) )
  str)

(defun ChangeTagVal (obj tagName val)
  (foreach att (vlax-invoke obj 'GetAttributes)
    (if (= tagName (vla-get-tagstring att))
      (progn
    (vla-put-textstring att val)
    (vla-update att)  ) ) ) )

(defun ATTB_ThepDam (ss / SH DK SC TCD Khoiluong Bang_Thong_ke) 
  (vl-load-com)
  (defun *error* (msg)
    (if    Olmode
      (setvar 'osmode Olmode)
    )
    (if    (not (member msg '("*BREAK,*CANCEL*,*EXIT*")))
      (princ (strcat "\nError: " msg))
    )
    (princ)
  )
  (setq Olmode (getvar "OSMODE"))
  (setvar "CMDECHO" 0)
  (setvar "OSMODE" 0)
  (setq Bang_Thong_ke (list))
  (setq i 0)
  
  (while (< i (sslength ss))
      (setq ent (ssname ss i))
      (setq obj    (vlax-ename->vla-object ent)
      )   
(if (AND (GetTagVal obj "DK")(GetTagVal obj "DK1")(GetTagVal obj "DK2"))
    (Progn
      (Setq SH (GetTagVal obj "SH"))
      (Setq DK (atoi(GetTagVal obj "DK")))
      (Setq DK (atoi(GetTagVal obj "DK1")))
      (Setq DK (atoi(GetTagVal obj "DK2")))
      (Setq SC (atoi(GetTagVal obj "SC")))
      (Setq SC (atoi(GetTagVal obj "SC1")))
      (Setq SC (atoi(GetTagVal obj "SC2")))
      (Setq TCD (atof(GetTagVal obj "TCD")))
      (Setq TCD (atof(GetTagVal obj "TCD1")))
      (Setq TCD (atof(GetTagVal obj "TCD2")))
         (setq
         Khoiluong
          (* (* (* (* pi (expt (/ (* DK 0.001) 2) 2))
               (* TCD 0.001)
            )
            7850
         )
         SC
          )
       )

      (setq Bang_Thong_ke
         (append
           Bang_Thong_ke
           (list (cons SH
               (list DK
                 SC
                 TCD
                 Khoiluong
               )
             )
           )
         )
      )
      (setq i (1+ i))
    );end Progn
    (Alert (strcat "\nKhong tim thay du lieu")) 
       )
    
  )
          Bang_Thong_ke
      (Princ Bang_Thong_ke)
  )

 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
15 giờ trước, anhGeodesy đã nói:

Nhờ các cao thủ chỉnh sửa giùm em đoạn code thống kê này cho ra 1 list như trong file cad dưới đây. cảm ơn các bác. em viết mà gặp cái Dynamic có tới 3 dữ liệu em chưa biết cách duyệt lây nó ra như thế nào. xin nhờ các bác chỉ giáo.

Block Feild TKT DAM New_hoi CV.dwg

 


(defun c:00 (/ Bang_Thong_ke doc)
  (vl-load-com)
  (Setvar "CMDECHO" 0)
  ;(command "TEXTSCR" "")
 (princ "\nChon Block can tong hop\n :")
  (if (setq ss (ssget (list (cons 0 "INSERT") (cons 66 1))))
    (ATTB_ThepDam ss) 
  )
  ;(AT:Table_Thongkethep Bang_Thong_ke 220 100 "")
  (SETVAR "OSMODE" 16383)
  (princ))

(defun GetTagVal (obj tagName);By Gia_Bach
  (foreach att (vlax-invoke obj 'GetAttributes)
    (if (= tagName (vla-get-tagstring att))
      (setq str (vla-get-TextString att) ) ) )
  str)

(defun ChangeTagVal (obj tagName val)
  (foreach att (vlax-invoke obj 'GetAttributes)
    (if (= tagName (vla-get-tagstring att))
      (progn
    (vla-put-textstring att val)
    (vla-update att)  ) ) ) )

(defun ATTB_ThepDam (ss / SH DK SC TCD Khoiluong Bang_Thong_ke) 
  (vl-load-com)
  (defun *error* (msg)
    (if    Olmode
      (setvar 'osmode Olmode)
    )
    (if    (not (member msg '("*BREAK,*CANCEL*,*EXIT*")))
      (princ (strcat "\nError: " msg))
    )
    (princ)
  )
  (setq Olmode (getvar "OSMODE"))
  (setvar "CMDECHO" 0)
  (setvar "OSMODE" 0)
  (setq Bang_Thong_ke (list))
  (setq i 0)
  
  (while (< i (sslength ss))
      (setq ent (ssname ss i))
      (setq obj    (vlax-ename->vla-object ent)
      )   
(if (AND (GetTagVal obj "DK")(GetTagVal obj "DK1")(GetTagVal obj "DK2"))
    (Progn
      (Setq SH (GetTagVal obj "SH"))
      (Setq DK (atoi(GetTagVal obj "DK")))
      (Setq DK (atoi(GetTagVal obj "DK1")))
      (Setq DK (atoi(GetTagVal obj "DK2")))
      (Setq SC (atoi(GetTagVal obj "SC")))
      (Setq SC (atoi(GetTagVal obj "SC1")))
      (Setq SC (atoi(GetTagVal obj "SC2")))
      (Setq TCD (atof(GetTagVal obj "TCD")))
      (Setq TCD (atof(GetTagVal obj "TCD1")))
      (Setq TCD (atof(GetTagVal obj "TCD2")))
         (setq
         Khoiluong
          (* (* (* (* pi (expt (/ (* DK 0.001) 2) 2))
               (* TCD 0.001)
            )
            7850
         )
         SC
          )
       )

      (setq Bang_Thong_ke
         (append
           Bang_Thong_ke
           (list (cons SH
               (list DK
                 SC
                 TCD
                 Khoiluong
               )
             )
           )
         )
      )
      (setq i (1+ i))
    );end Progn
    (Alert (strcat "\nKhong tim thay du lieu")) 
       )
    
  )
          Bang_Thong_ke
      (Princ Bang_Thong_ke)
  )

 

Cái này bạn lấy được list của các block rồi, giờ chỉ cần duyệt qua list đó lấy những giá trị rồi ghi ra thôi

(setq lstthep (ATTB_ThepDam ss))
(foreach ent lstthep
(command "Text" Point chieucaochu goc (nth i ent))
)

 

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
1 giờ trước, huunhantvxdts đã nói:

Cái này bạn lấy được list của các block rồi, giờ chỉ cần duyệt qua list đó lấy những giá trị rồi ghi ra thôi

  • cadvietlisp.lsp
    lisp help
  •  

(setq lstthep (ATTB_ThepDam ss))
(foreach ent lstthep
(command "Text" Point chieucaochu goc (nth i ent))
)

 

@huunhantvxdts

(foreach ent lstthep     :   ent ở đâu vậy ạ?

(command "Text" Point chieucaochu goc (nth i ent)) :      i ở đâu vậy ạ?

  • Vote giảm 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình ko rành về kết cấu lắm nên các thông số ko biết

Nhưng xem đoạn code thì biến str trong hàm GetTagVal bạn nên để vào biến cục bộ thì mới áp dụng được cho các block khác

(defun GetTagVal (obj tagName / str );By Gia_Bach
  (foreach att (vlax-invoke obj 'GetAttributes)
    (if (= tagName (vla-get-tagstring att))
      (setq str (vla-get-TextString att) ) ) )
  str)

Mình chưa test lisp vì ko rành file kết cấu, bạn thử xem lại có được ko nhé

 

PS: bạn sửa thêm phần này để khi ko tìm thấy dữ liệu còn thoát vòng lặp

thay (Alert (strcat "\nKhong tim thay du lieu")) bằng

(progn

(setq i (sslength ss))

(Alert (strcat "\nKhong tim thay du lieu"))

)

 

Chưa hiểu đoạn setq 3 cái (setq DK ....)  liền nhau để làm gì vì nó sẽ nhận cái sau cùng ?

Nếu 3 block đó chung tag thì có cộng giá trị của các tag đó ko, nếu ko thì phải duyệt qua từng block hoặc gán tag khác nhau để thóng kê ?

Và để setq các thông số thì phải đủ điều kiện (and "DK" "DK1" "Dk2" ), mà ko có block nào có tag đủ điều kiện này ?

 

  • Like 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
24 phút trước, anhGeodesy đã nói:

@huunhantvxdts

(foreach ent lstthep     :   ent ở đâu vậy ạ?

(command "Text" Point chieucaochu goc (nth i ent)) :      i ở đâu vậy ạ?

ent là nó duyệt qua các phần tử của list trả về bạn nhé

nó là list của block của thép mà bạn lấy ra đó

i là số tứ thự trong list mà mình lấy ra

i=0 là số hiệu

i=1 là đường kính

i=2 là số lượng

....

bạn viết tiếp có chi mình hướng dẫn thêm

  • Like 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
2 giờ trước, huunhantvxdts đã nói:

ent là nó duyệt qua các phần tử của list trả về bạn nhé

nó là list của block của thép mà bạn lấy ra đó

i là số tứ thự trong list mà mình lấy ra

i=0 là số hiệu

i=1 là đường kính

i=2 là số lượng

....

bạn viết tiếp có chi mình hướng dẫn thêm

image.thumb.png.19a611ea24e49c0884010aafab12e553.png

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
2 giờ trước, Biet ve CAD đã nói:

Mình ko rành về kết cấu lắm nên các thông số ko biết

Nhưng xem đoạn code thì biến str trong hàm GetTagVal bạn nên để vào biến cục bộ thì mới áp dụng được cho các block khác

(defun GetTagVal (obj tagName / str );By Gia_Bach
  (foreach att (vlax-invoke obj 'GetAttributes)
    (if (= tagName (vla-get-tagstring att))
      (setq str (vla-get-TextString att) ) ) )
  str)

Mình chưa test lisp vì ko rành file kết cấu, bạn thử xem lại có được ko nhé

 

PS: bạn sửa thêm phần này để khi ko tìm thấy dữ liệu còn thoát vòng lặp

thay (Alert (strcat "\nKhong tim thay du lieu")) bằng

(progn

(setq i (sslength ss))

(Alert (strcat "\nKhong tim thay du lieu"))

)

 

Chưa hiểu đoạn setq 3 cái (setq DK ....)  liền nhau để làm gì vì nó sẽ nhận cái sau cùng ?

Nếu 3 block đó chung tag thì có cộng giá trị của các tag đó ko, nếu ko thì phải duyệt qua từng block hoặc gán tag khác nhau để thóng kê ?

Và để setq các thông số thì phải đủ điều kiện (and "DK" "DK1" "Dk2" ), mà ko có block nào có tag đủ điều kiện này ?

 

image.thumb.png.b4be645b120faeb33f35610af78300e0.png@image.thumb.png.b4be645b120faeb33f35610af78300e0.png

 

@Biet ve CAD Mình muốn lấy thông tin của 3 đoạn này trong 1 Block. bạn bắt đúng sóng rồi đó. nhờ bạn hướng dẫn mình thêm nhé, cảm ơn nhiều

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
1 giờ} trướ}c, anhGeodesy đã nói:

image.thumb.png.b4be645b120faeb33f35610af78300e0.png@image.thumb.png.b4be645b120faeb33f35610af78300e0.png

 

@Biet ve CAD Mình muốn lấy thông tin của 3 đoạn này trong 1 Block. bạn bắt đúng sóng rồi đó. nhờ bạn hướng dẫn mình thêm nhé, cảm ơn nhiều

Cũng đoán mò ý đồ của tác giả vì ko biết cái thống kê ấy ra cái gì nữa ^^

Bạn xem đúng ý chưa nhé, chọn được cả 3 loại block trong bản vẽ và princ ra 1 list theo yêu cầu

(defun c:00 ( )
  (vl-load-com)
  (Setvar "CMDECHO" 0)
  ;(command "TEXTSCR" "")
 (princ "\nChon Block can tong hop\n :")
  (if (setq ss (ssget (list (cons 0 "INSERT") (cons 66 1))))
    (princ(ATTB_ThepDam ss)) 
  )
  ;(AT:Table_Thongkethep Bang_Thong_ke 220 100 "")
  (SETVAR "OSMODE" 16383)
  (princ))

(defun btk_lst( SH* DK* SC* TCD* / Khoiluong*)
  (setq Khoiluong*
          (* (* (* (* pi (expt (/ (* DK* 0.001) 2) 2))
               (* TCD* 0.001)
            )
            7850
         )
         SC*
          )
       )
  (setq Bang_Thong_ke
         (append
           Bang_Thong_ke
           (list (cons SH*
               (list DK*
                 SC*
                 TCD*
                 Khoiluong*
               )
             )
           )
         )
      )
  )

(defun GetTagVal (obj tagName / str);By Gia_Bach
  (foreach att (vlax-invoke obj 'GetAttributes)
    (if (= tagName (vla-get-tagstring att))
      (setq str (vla-get-TextString att) ) ) )
  str)

(defun ChangeTagVal (obj tagName val)
  (foreach att (vlax-invoke obj 'GetAttributes)
    (if (= tagName (vla-get-tagstring att))
      (progn
    (vla-put-textstring att val)
    (vla-update att)  ) ) ) )

(defun ATTB_ThepDam (ss / SH DK SC TCD Khoiluong Bang_Thong_ke) 
  (vl-load-com)
  (defun *error* (msg)
    (if    Olmode
      (setvar 'osmode Olmode)
    )
    (if    (not (member msg '("*BREAK,*CANCEL*,*EXIT*")))
      (princ (strcat "\nError: " msg))
    )
    (princ)
  )
  (setq Olmode (getvar "OSMODE"))
  (setvar "CMDECHO" 0)
  (setvar "OSMODE" 0)
  (setq Bang_Thong_ke (list))
  (setq i 0)
  
  (while (< i (sslength ss))
      (setq ent (ssname ss i))
      (setq obj (vlax-ename->vla-object ent))   
(if (AND (GetTagVal obj "DKN")(GetTagVal obj "DK1")(GetTagVal obj "DK2"))
    (Progn
      (Setq SH (GetTagVal obj "SH"))
      (Setq DK (atoi(GetTagVal obj "DKN")))
      (Setq SC (atoi(GetTagVal obj "SCN")))
      (Setq TCD (atof(GetTagVal obj "TCDN")))
      (btk_lst SH DK SC TCD)
      (Setq DK (atoi(GetTagVal obj "DK1")))
      (Setq SC (atoi(GetTagVal obj "SC1")))
      (Setq TCD (atof(GetTagVal obj "TCD1")))
      (btk_lst SH DK SC TCD)
      (Setq DK (atoi(GetTagVal obj "DK2")))
      (Setq SC (atoi(GetTagVal obj "SC2")))
      (Setq TCD (atof(GetTagVal obj "TCD2")))
      (btk_lst SH DK SC TCD)
    );end Progn
  (if (AND (GetTagVal obj "DK")(GetTagVal obj "SC")(GetTagVal obj "TCD"))
    (Progn
      (Setq SH (GetTagVal obj "SH"))
      (Setq DK (atoi(GetTagVal obj "DK")))
      (Setq SC (atoi(GetTagVal obj "SC")))
      (Setq TCD (atof(GetTagVal obj "TCD")))
      (btk_lst SH DK SC TCD)
    );end Progn
  (princ (strcat "\nKhong tim thay du lieu")) 
  )
  )
   (setq i (1+ i)) 
  )
  Bang_Thong_ke
  )

PS: ko biết cho vào thẻ lisp, bạn nào biết chỉ giùm

Chỉnh sửa theo Biet ve CAD

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
1 giờ} trướ}c, Biet ve CAD đã nói:

Cũng đoán mò ý đồ của tác giả vì ko biết cái thống kê ấy ra cái gì nữa ^^

Bạn xem đúng ý chưa nhé, chọn được cả 3 loại block trong bản vẽ và princ ra 1 list theo yêu cầu


(defun c:00 ( )
  (vl-load-com)
  (Setvar "CMDECHO" 0)
  ;(command "TEXTSCR" "")
 (princ "\nChon Block can tong hop\n :")
  (if (setq ss (ssget (list (cons 0 "INSERT") (cons 66 1))))
    (princ(ATTB_ThepDam ss)) 
  )
  ;(AT:Table_Thongkethep Bang_Thong_ke 220 100 "")
  (SETVAR "OSMODE" 16383)
  (princ))

(defun btk_lst( SH* DK* SC* TCD* / Khoiluong*)
  (setq Khoiluong*
          (* (* (* (* pi (expt (/ (* DK* 0.001) 2) 2))
               (* TCD* 0.001)
            )
            7850
         )
         SC*
          )
       )
  (setq Bang_Thong_ke
         (append
           Bang_Thong_ke
           (list (cons SH*
               (list DK*
                 SC*
                 TCD*
                 Khoiluong*
               )
             )
           )
         )
      )
  )

(defun GetTagVal (obj tagName / str);By Gia_Bach
  (foreach att (vlax-invoke obj 'GetAttributes)
    (if (= tagName (vla-get-tagstring att))
      (setq str (vla-get-TextString att) ) ) )
  str)

(defun ChangeTagVal (obj tagName val)
  (foreach att (vlax-invoke obj 'GetAttributes)
    (if (= tagName (vla-get-tagstring att))
      (progn
    (vla-put-textstring att val)
    (vla-update att)  ) ) ) )

(defun ATTB_ThepDam (ss / SH DK SC TCD Khoiluong Bang_Thong_ke) 
  (vl-load-com)
  (defun *error* (msg)
    (if    Olmode
      (setvar 'osmode Olmode)
    )
    (if    (not (member msg '("*BREAK,*CANCEL*,*EXIT*")))
      (princ (strcat "\nError: " msg))
    )
    (princ)
  )
  (setq Olmode (getvar "OSMODE"))
  (setvar "CMDECHO" 0)
  (setvar "OSMODE" 0)
  (setq Bang_Thong_ke (list))
  (setq i 0)
  
  (while (< i (sslength ss))
      (setq ent (ssname ss i))
      (setq obj (vlax-ename->vla-object ent))   
(if (AND (GetTagVal obj "DKN")(GetTagVal obj "DK1")(GetTagVal obj "DK2"))
    (Progn
      (Setq SH (GetTagVal obj "SH"))
      (Setq DK (atoi(GetTagVal obj "DKN")))
      (Setq SC (atoi(GetTagVal obj "SCN")))
      (Setq TCD (atof(GetTagVal obj "TCDN")))
      (btk_lst SH DK SC TCD)
      (Setq DK (atoi(GetTagVal obj "DK1")))
      (Setq SC (atoi(GetTagVal obj "SC1")))
      (Setq TCD (atof(GetTagVal obj "TCD1")))
      (btk_lst SH DK SC TCD)
      (Setq DK (atoi(GetTagVal obj "DK2")))
      (Setq SC (atoi(GetTagVal obj "SC2")))
      (Setq TCD (atof(GetTagVal obj "TCD2")))
      (btk_lst SH DK SC TCD)
    );end Progn
  (if (AND (GetTagVal obj "DK")(GetTagVal obj "SC")(GetTagVal obj "TCD"))
    (Progn
      (Setq SH (GetTagVal obj "SH"))
      (Setq DK (atoi(GetTagVal obj "DK")))
      (Setq SC (atoi(GetTagVal obj "SC")))
      (Setq TCD (atof(GetTagVal obj "TCD")))
      (btk_lst SH DK SC TCD)
    );end Progn
  (princ (strcat "\nKhong tim thay du lieu")) 
  )
  )
   (setq i (1+ i)) 
  )
  Bang_Thong_ke
  )

PS: ko biết cho vào thẻ lisp, bạn nào biết chỉ giùm

Trước tiên xin chân thành cảm ơn bạn @Biet ve CAD đã nhiệt tình giúp đỡ.

1)  Đoạn code bạn sửa đọc 1 Block cho ra 2 phần tử trùng nhau :     ((B2 20 4 4650.0 45.8704))((B2 20 4 4650.0 45.8704))

2) để gắn thẻ ai đó bấm @ trước nickname.

Mình đã làm được rồi.

(defun c:22 (/ Bang_Thong_ke doc)
  (vl-load-com)
  (Setvar "CMDECHO" 0)
  ;(command "TEXTSCR" "")
 (princ "\nChon Block can tong hop\n :")
  (if (setq ss (ssget (list (cons 0 "INSERT") (cons 66 1))))
 (setq Bang_Thong_ke (ATTB_ThepDam ss))
  )
  ;(AT:Table_Thongkethep Bang_Thong_ke 220 100 "")
  (SETVAR "OSMODE" 16383)
  (princ))

(defun GetTagVal (obj tagName / str);By Gia_Bach
  (foreach att (vlax-invoke obj 'GetAttributes)
    (if (= tagName (vla-get-tagstring att))
      (setq str (vla-get-TextString att) ) ) )
  str)

(defun ChangeTagVal (obj tagName val)
  (foreach att (vlax-invoke obj 'GetAttributes)
    (if (= tagName (vla-get-tagstring att))
      (progn
    (vla-put-textstring att val)
    (vla-update att)  ) ) ) )

(defun ATTB_ThepDam (ss / SH DK SC TCD Khoiluong Bang_Thong_ke) 
  (vl-load-com)
  (defun *error* (msg)
    (if    Olmode
      (setvar 'osmode Olmode)
    )
    (if    (not (member msg '("*BREAK,*CANCEL*,*EXIT*")))
      (princ (strcat "\nError: " msg))
    )
    (princ)
  )
  (setq Olmode (getvar "OSMODE"))
  (setvar "CMDECHO" 0)
  (setvar "OSMODE" 0)
  (setq Bang_Thong_ke (list))
  (setq i 0)
  
  (while (< i (sslength ss))
      (setq ent (ssname ss i))
      (setq obj    (vlax-ename->vla-object ent)
      )
;===========================================================================================================
;TK THEP CHU DAM
(if (and (GetTagVal obj "DK") (GetTagVal obj "SC") (GetTagVal obj "TCD") (NOT(GetTagVal obj "A")))
    (Progn
      (Setq SH (GetTagVal obj "SH"))
      (Setq DK (atoi (GetTagVal obj "DK")))
      (Setq SC (atoi (GetTagVal obj "SC")))
      (Setq TCD (atof (GetTagVal obj "TCD")))
      (setq
         Khoiluong
          (*(* (* (* pi (expt (/ (* DK 0.001) 2) 2))
            (* TCD 0.001)
         )
         7850
          )SC)
       )
      (setq Bang_Thong_ke
         (append
           Bang_Thong_ke
           (list (cons SH
               (list (atoi (rtos DK 2 0))
                 (atoi (rtos SC 2 0))
                 (atoi (rtos TCD 2 0))
                 Khoiluong
               )
             )
           )
         )
      )     
    )
  )
;===========================================================================================================
;DAI DAM 1 DOAN    
(if (and (GetTagVal obj "SH")(GetTagVal obj "SC")(GetTagVal obj "DK") (GetTagVal obj "A")(GetTagVal obj "TCD"))
    (Progn
      (Setq SH (GetTagVal obj "SH"))
      (Setq DK (atoi (GetTagVal obj "DK")))
      (Setq SC (atoi (GetTagVal obj "SC")))
      (Setq TCD (atof (GetTagVal obj "TCD")))
      (Setq A (atof (GetTagVal obj "A")))
      (Setq B (atof (GetTagVal obj "B")))
      (Setq H (atof (GetTagVal obj "H")))
      ;'''''''''''''''''''''''''''''''''''
      (setq L_1dai (+(+(- B 80)(- H 80))100))
      (setq
         Khoiluong
          (*(* (* (* pi (expt (/ (* DK 0.001) 2) 2))
            (* L_1dai 0.001)
         )
         7850
          )SC)
       )
      ;'''''''''''''''''''''''''''''''''''
      (setq Bang_Thong_ke
         (append
           Bang_Thong_ke
           (list (cons SH
               (list (atoi (rtos DK 2 0))
                 (atoi (rtos SC 2 0))
                 (atoi (rtos(* L_1dai SC) 2 0))
                 Khoiluong
               )
             )
           )
         )
      )
    )
  )
;===========================================================================================================
;DAI DAM 3 DOAN
;===========================================================================================================
    (if (GetTagVal obj "AN")
    (Progn
      (Setq SH (GetTagVal obj "SH"))
      (Setq DK (atoi (GetTagVal obj "DKN")))
      (Setq SC (atoi (GetTagVal obj "SCN")))
      (Setq TCD (atof (GetTagVal obj "TCDN")))
      (Setq AN (atof (GetTagVal obj "AN")))
      (Setq B (atof (GetTagVal obj "B")))
      (Setq H (atof (GetTagVal obj "H")))
            ;'''''''''''''''''''''''''''''''''''
      (setq L_1dai (+(+(- B 80)(- H 80))100))
      (setq
         Khoiluong
          (*(* (* (* pi (expt (/ (* DK 0.001) 2) 2))
            (* L_1dai 0.001)
         )
         7850
          )SC)
       )
      ;'''''''''''''''''''''''''''''''''''
      (setq Bang_Thong_ke
         (append
           Bang_Thong_ke
           (list (cons SH
               (list (atoi (rtos DK 2 0))
                 (atoi (rtos SC 2 0))
                 (atoi (rtos(* L_1dai SC) 2 0))
                 Khoiluong
               )
             )
           )
         )
      )
      )
    )
    
    (if (GetTagVal obj "A1")
    (Progn
      (Setq SH (GetTagVal obj "SH"))
      (Setq DK (atoi (GetTagVal obj "DK1")))
      (Setq SC (atoi (GetTagVal obj "SC1")))
      (Setq TCD (atof (GetTagVal obj "TCD1")))
      (Setq A1 (atof (GetTagVal obj "A1")))
      (Setq B (atof (GetTagVal obj "B")))
      (Setq H (atof (GetTagVal obj "H")))
      ;'''''''''''''''''''''''''''''''''''
      (setq L_1dai (+(+(- B 80)(- H 80))100))
      (setq
         Khoiluong
          (*(* (* (* pi (expt (/ (* DK 0.001) 2) 2))
            (* L_1dai 0.001)
         )
         7850
          )SC)
       )
      ;'''''''''''''''''''''''''''''''''''
      (setq Bang_Thong_ke
         (append
           Bang_Thong_ke
           (list (cons SH
               (list (atoi (rtos DK 2 0))
                 (atoi (rtos SC 2 0))
                 (atoi (rtos(* L_1dai SC) 2 0))
                 Khoiluong
               )
             )
           )
         )
      )
    )
      )
    
    (if (GetTagVal obj "A2")
    (Progn
      (Setq SH (GetTagVal obj "SH"))
      (Setq DK (atoi (GetTagVal obj "DK2")))
      (Setq SC (atoi (GetTagVal obj "SC2")))
      (Setq TCD (atof (GetTagVal obj "TCD2")))
      (Setq A1 (atof (GetTagVal obj "A2")))
      ;'''''''''''''''''''''''''''''''''''
      (setq L_1dai (+(+(- B 80)(- H 80))100))
      (setq
         Khoiluong
          (*(* (* (* pi (expt (/ (* DK 0.001) 2) 2))
            (* L_1dai 0.001)
         )
         7850
          )SC)
       )
      ;'''''''''''''''''''''''''''''''''''
      (setq Bang_Thong_ke
         (append
           Bang_Thong_ke
           (list (cons SH
               (list (atoi (rtos DK 2 0))
                 (atoi (rtos SC 2 0))
                 (atoi (rtos(* L_1dai SC) 2 0))
                 Khoiluong
               )
             )
           )
         )
      )
    )
      )
;===========================================================================================================
      (setq i (1+ i))
    
  )
          Bang_Thong_ke
      (Princ Bang_Thong_ke)
  )

 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

hi, @anhGeodesy bạn có thể thay hàm if bằng hàm cond cho gọn, và thay hàm xử lý thằng "(setq  Bang_Thong_ke (append" bằng 1 defun khác cũng để cho gọn và tiện sửa

chỗ cuối hàm (defun c:22...... bạn để (setq Bang_Thong_ke (ATTB_ThepDam ss)), mà phần cuối (defun ATTB_ThepDam........ là (princ Bang_Thong_ke, nên suy ra  Bang_Thong_ke = (princ Bang_Thong_ke) suy ra nữa là Bang_Thong_ke sẽ ko còn là list nữa (nếu bạn có ý định dùng list này để xuất text hay làm gì nữa sẽ ko được)

PS: vừa thử Bang_Thong_ke = (princ Bang_Thong_ke) vẫn là 1 list ^^

Chỉnh sửa theo Biet ve CAD

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
14 phút trước, anhGeodesy đã nói:

Trước tiên xin chân thành cảm ơn bạn @Biet ve CAD đã nhiệt tình giúp đỡ.

1)  Đoạn code bạn sửa đọc 1 Block cho ra 2 phần tử trùng nhau :     ((B2 20 4 4650.0 45.8704))((B2 20 4 4650.0 45.8704))

2) để gắn thẻ ai đó bấm @ trước nickname.

Mình đã làm được rồi.


(defun c:22 (/ Bang_Thong_ke doc)
  (vl-load-com)
  (Setvar "CMDECHO" 0)
  ;(command "TEXTSCR" "")
 (princ "\nChon Block can tong hop\n :")
  (if (setq ss (ssget (list (cons 0 "INSERT") (cons 66 1))))
 (setq Bang_Thong_ke (ATTB_ThepDam ss))
  )
  ;(AT:Table_Thongkethep Bang_Thong_ke 220 100 "")
  (SETVAR "OSMODE" 16383)
  (princ))

(defun GetTagVal (obj tagName / str);By Gia_Bach
  (foreach att (vlax-invoke obj 'GetAttributes)
    (if (= tagName (vla-get-tagstring att))
      (setq str (vla-get-TextString att) ) ) )
  str)

(defun ChangeTagVal (obj tagName val)
  (foreach att (vlax-invoke obj 'GetAttributes)
    (if (= tagName (vla-get-tagstring att))
      (progn
    (vla-put-textstring att val)
    (vla-update att)  ) ) ) )

(defun ATTB_ThepDam (ss / SH DK SC TCD Khoiluong Bang_Thong_ke) 
  (vl-load-com)
  (defun *error* (msg)
    (if    Olmode
      (setvar 'osmode Olmode)
    )
    (if    (not (member msg '("*BREAK,*CANCEL*,*EXIT*")))
      (princ (strcat "\nError: " msg))
    )
    (princ)
  )
  (setq Olmode (getvar "OSMODE"))
  (setvar "CMDECHO" 0)
  (setvar "OSMODE" 0)
  (setq Bang_Thong_ke (list))
  (setq i 0)
  
  (while (< i (sslength ss))
      (setq ent (ssname ss i))
      (setq obj    (vlax-ename->vla-object ent)
      )
;===========================================================================================================
;TK THEP CHU DAM
(if (and (GetTagVal obj "DK") (GetTagVal obj "SC") (GetTagVal obj "TCD") (NOT(GetTagVal obj "A")))
    (Progn
      (Setq SH (GetTagVal obj "SH"))
      (Setq DK (atoi (GetTagVal obj "DK")))
      (Setq SC (atoi (GetTagVal obj "SC")))
      (Setq TCD (atof (GetTagVal obj "TCD")))
      (setq
         Khoiluong
          (*(* (* (* pi (expt (/ (* DK 0.001) 2) 2))
            (* TCD 0.001)
         )
         7850
          )SC)
       )
      (setq Bang_Thong_ke
         (append
           Bang_Thong_ke
           (list (cons SH
               (list (atoi (rtos DK 2 0))
                 (atoi (rtos SC 2 0))
                 (atoi (rtos TCD 2 0))
                 Khoiluong
               )
             )
           )
         )
      )     
    )
  )
;===========================================================================================================
;DAI DAM 1 DOAN    
(if (and (GetTagVal obj "SH")(GetTagVal obj "SC")(GetTagVal obj "DK") (GetTagVal obj "A")(GetTagVal obj "TCD"))
    (Progn
      (Setq SH (GetTagVal obj "SH"))
      (Setq DK (atoi (GetTagVal obj "DK")))
      (Setq SC (atoi (GetTagVal obj "SC")))
      (Setq TCD (atof (GetTagVal obj "TCD")))
      (Setq A (atof (GetTagVal obj "A")))
      (Setq B (atof (GetTagVal obj "B")))
      (Setq H (atof (GetTagVal obj "H")))
      ;'''''''''''''''''''''''''''''''''''
      (setq L_1dai (+(+(- B 80)(- H 80))100))
      (setq
         Khoiluong
          (*(* (* (* pi (expt (/ (* DK 0.001) 2) 2))
            (* L_1dai 0.001)
         )
         7850
          )SC)
       )
      ;'''''''''''''''''''''''''''''''''''
      (setq Bang_Thong_ke
         (append
           Bang_Thong_ke
           (list (cons SH
               (list (atoi (rtos DK 2 0))
                 (atoi (rtos SC 2 0))
                 (atoi (rtos(* L_1dai SC) 2 0))
                 Khoiluong
               )
             )
           )
         )
      )
    )
  )
;===========================================================================================================
;DAI DAM 3 DOAN
;===========================================================================================================
    (if (GetTagVal obj "AN")
    (Progn
      (Setq SH (GetTagVal obj "SH"))
      (Setq DK (atoi (GetTagVal obj "DKN")))
      (Setq SC (atoi (GetTagVal obj "SCN")))
      (Setq TCD (atof (GetTagVal obj "TCDN")))
      (Setq AN (atof (GetTagVal obj "AN")))
      (Setq B (atof (GetTagVal obj "B")))
      (Setq H (atof (GetTagVal obj "H")))
            ;'''''''''''''''''''''''''''''''''''
      (setq L_1dai (+(+(- B 80)(- H 80))100))
      (setq
         Khoiluong
          (*(* (* (* pi (expt (/ (* DK 0.001) 2) 2))
            (* L_1dai 0.001)
         )
         7850
          )SC)
       )
      ;'''''''''''''''''''''''''''''''''''
      (setq Bang_Thong_ke
         (append
           Bang_Thong_ke
           (list (cons SH
               (list (atoi (rtos DK 2 0))
                 (atoi (rtos SC 2 0))
                 (atoi (rtos(* L_1dai SC) 2 0))
                 Khoiluong
               )
             )
           )
         )
      )
      )
    )
    
    (if (GetTagVal obj "A1")
    (Progn
      (Setq SH (GetTagVal obj "SH"))
      (Setq DK (atoi (GetTagVal obj "DK1")))
      (Setq SC (atoi (GetTagVal obj "SC1")))
      (Setq TCD (atof (GetTagVal obj "TCD1")))
      (Setq A1 (atof (GetTagVal obj "A1")))
      (Setq B (atof (GetTagVal obj "B")))
      (Setq H (atof (GetTagVal obj "H")))
      ;'''''''''''''''''''''''''''''''''''
      (setq L_1dai (+(+(- B 80)(- H 80))100))
      (setq
         Khoiluong
          (*(* (* (* pi (expt (/ (* DK 0.001) 2) 2))
            (* L_1dai 0.001)
         )
         7850
          )SC)
       )
      ;'''''''''''''''''''''''''''''''''''
      (setq Bang_Thong_ke
         (append
           Bang_Thong_ke
           (list (cons SH
               (list (atoi (rtos DK 2 0))
                 (atoi (rtos SC 2 0))
                 (atoi (rtos(* L_1dai SC) 2 0))
                 Khoiluong
               )
             )
           )
         )
      )
    )
      )
    
    (if (GetTagVal obj "A2")
    (Progn
      (Setq SH (GetTagVal obj "SH"))
      (Setq DK (atoi (GetTagVal obj "DK2")))
      (Setq SC (atoi (GetTagVal obj "SC2")))
      (Setq TCD (atof (GetTagVal obj "TCD2")))
      (Setq A1 (atof (GetTagVal obj "A2")))
      ;'''''''''''''''''''''''''''''''''''
      (setq L_1dai (+(+(- B 80)(- H 80))100))
      (setq
         Khoiluong
          (*(* (* (* pi (expt (/ (* DK 0.001) 2) 2))
            (* L_1dai 0.001)
         )
         7850
          )SC)
       )
      ;'''''''''''''''''''''''''''''''''''
      (setq Bang_Thong_ke
         (append
           Bang_Thong_ke
           (list (cons SH
               (list (atoi (rtos DK 2 0))
                 (atoi (rtos SC 2 0))
                 (atoi (rtos(* L_1dai SC) 2 0))
                 Khoiluong
               )
             )
           )
         )
      )
    )
      )
;===========================================================================================================
      (setq i (1+ i))
    
  )
          Bang_Thong_ke
      (Princ Bang_Thong_ke)
  )

 

1.Mình kiểm tra rồi, lisp bác @Biet ve CAD chạy đúng theo yêu cầu không có 2 ra phần tử giống nhau

2. Với Lisp này của bạn không chạy được trên bản vẽ của bạn cấp nhé

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Dòng lệnh

(setq
  Khoiluong
   (* (* (* (* pi (expt (/ (* DK 0.001) 2) 2))
        (* TCD 0.001)
     ) 
     7850
      ) 
      SC
   )
)

 

Thay bằng dòng lênh sau cho nó trực quan và dễ hiểu (2 hằng số 0.001 và 7850 thay bằng 7.85)
(setq
  Khoiluong
   (* pi
      (expt (/ (* DK 0.001) 2) 2)
      TCD
      0.001
      7850
      SC
   ) 
)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

@ anhGeodesy nếu bạn muốn lọc theo tag mà của nhiều block thì nên tạo 1 cái tag và gán value mới (ví dụ là bl1 cho block1, bl2 cho block2)

khi lọc thì chỉ cần (if (= tag "bl1).....rồi gán hay set value của block đó tiện hơn là if hàng loạt tag của block đó

( có thể lọc theo tên block nhưng code dài và phụ thuộc vào tên block, ko cơ động)

PS: gắn @ mà vẫn ko thấy nickname

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
2 phút trước, Biet ve CAD đã nói:

@ anhGeodesy nếu bạn muốn lọc theo tag mà của nhiều block thì nên tạo 1 cái tag và gán value mới (ví dụ là bl1 cho block1, bl2 cho block2)

khi lọc thì chỉ cần (if (= tag "bl1).....rồi gán hay set value của block đó tiện hơn là if hàng loạt tag của block đó

( có thể lọc theo tên block nhưng code dài và phụ thuộc vào tên block, ko cơ động)

PS: gắn @ mà vẫn ko thấy nickname

@Biet ve CAD  1) Khi nhấn nhấn @ Space rồi gõ nickname sẽ có list các tên hiện lên.

                            2) Code mình vẫn còn rườm rà vì với Block thì tên Block bị đổi thành *..... nên cái tên block mình đặt ko get đc.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
9 phút trước, tien2005 đã nói:

Dòng lệnh

(setq
  Khoiluong
   (* (* (* (* pi (expt (/ (* DK 0.001) 2) 2))
        (* TCD 0.001)
     ) 
     7850
      ) 
      SC
   )
)

 

Thay bằng dòng lênh sau cho nó trực quan và dễ hiểu (2 hằng số 0.001 và 7850 thay bằng 7.85)
(setq
  Khoiluong
   (* pi
      (expt (/ (* DK 0.001) 2) 2)
      TCD
      0.001
      7850
      SC
   ) 
)

@tien2005 Cảm ơn bạn. nhìn đỡ rối mắt hơn rồi.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
1 giờ trước, anhGeodesy đã nói:

@tien2005 Cảm ơn bạn. nhìn đỡ rối mắt hơn rồi.

Ngắn gọn hơn: (setq Khoiluong (* pi (expt DK 2) 0.25 TCD 7850 SC 1e-9))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

@anhGeodesy Bạn xem 3 hàm này nhé

(defun AttFill (obj lsttag lstval / n att)
  (mapcar '(lambda (Att)
	     (if
	       (setq n (vl-position (strcase (vla-get-TagString att)) lsttag))
		(vla-put-textstring att (nth n lstval))
	     )
	   )
	  (vlax-invoke Obj 'GetAttributes)
  )
)

;(GetAtts(vlax-ename->vla-object(car(entsel))))
;return list(("tag1" . "value1")("tag2" . "value2")...)
(defun GetAtts (Obj)
  (mapcar '(lambda (Att)
	     (cons (vla-get-TagString Att) (vla-get-TextString Att))
	   )
	  (vlax-invoke Obj 'GetAttributes)
  )
)
(defun GetAtt (obj tag / n att #str);return string
  (mapcar
	'(lambda (a) (if(equal(vla-get-TagString a)tag)(setq #str (vla-get-textstring a))))
	(vlax-invoke Obj 'GetAttributes)
      )
  #str
)

lấy tên block thì hàm của Lee

;; Effective Block Name  -  Lee Mac
;; obj - [vla] VLA Block Reference object

(defun LM:effectivename ( obj )
    (vlax-get-property obj
        (if (vlax-property-available-p obj 'effectivename)
            'effectivename
            'name
        )
    )
)

 

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
17 giờ trước, tien2005 đã nói:

@anhGeodesy Bạn xem 3 hàm này nhé

  • cadvietlisp.lsp
    lisp help
  •  

(defun AttFill (obj lsttag lstval / n att)
  (mapcar '(lambda (Att)
	     (if
	       (setq n (vl-position (strcase (vla-get-TagString att)) lsttag))
		(vla-put-textstring att (nth n lstval))
	     )
	   )
	  (vlax-invoke Obj 'GetAttributes)
  )
)

;(GetAtts(vlax-ename->vla-object(car(entsel))))
;return list(("tag1" . "value1")("tag2" . "value2")...)
(defun GetAtts (Obj)
  (mapcar '(lambda (Att)
	     (cons (vla-get-TagString Att) (vla-get-TextString Att))
	   )
	  (vlax-invoke Obj 'GetAttributes)
  )
)
(defun GetAtt (obj tag / n att #str);return string
  (mapcar
	'(lambda (a) (if(equal(vla-get-TagString a)tag)(setq #str (vla-get-textstring a))))
	(vlax-invoke Obj 'GetAttributes)
      )
  #str
)

lấy tên block thì hàm của Lee

  • cadvietlisp.lsp
    lisp help
  •  

;; Effective Block Name  -  Lee Mac
; obj - [vla] VLA Block Reference object

(defun LM:effectivename ( obj )
    (vlax-get-property obj
        (if (vlax-property-available-p obj 'effectivename)
            'effectivename
            'name
        )
    )
)

 

@tien2005 @Biet ve CAD @NTHAHT Luôn tiện cho mình hỏi có Hàm nào đọc cái Linear parameter không nhỉ?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
18 giờ trước, tien2005 đã nói:

@anhGeodesy Bạn xem 3 hàm này nhé

  • cadvietlisp.lsp
    lisp help
  •  

(defun AttFill (obj lsttag lstval / n att)
  (mapcar '(lambda (Att)
	     (if
	       (setq n (vl-position (strcase (vla-get-TagString att)) lsttag))
		(vla-put-textstring att (nth n lstval))
	     )
	   )
	  (vlax-invoke Obj 'GetAttributes)
  )
)

;(GetAtts(vlax-ename->vla-object(car(entsel))))
;return list(("tag1" . "value1")("tag2" . "value2")...)
(defun GetAtts (Obj)
  (mapcar '(lambda (Att)
	     (cons (vla-get-TagString Att) (vla-get-TextString Att))
	   )
	  (vlax-invoke Obj 'GetAttributes)
  )
)
(defun GetAtt (obj tag / n att #str);return string
  (mapcar
	'(lambda (a) (if(equal(vla-get-TagString a)tag)(setq #str (vla-get-textstring a))))
	(vlax-invoke Obj 'GetAttributes)
      )
  #str
)

lấy tên block thì hàm của Lee

  • cadvietlisp.lsp
    lisp help
  •  

;; Effective Block Name  -  Lee Mac
; obj - [vla] VLA Block Reference object

(defun LM:effectivename ( obj )
    (vlax-get-property obj
        (if (vlax-property-available-p obj 'effectivename)
            'effectivename
            'name
        )
    )
)

 

@tien2005  Bạn chỉ mình cách gọi 

Hàm này của LEE MAC  với nhé.

;; Get Visibility Parameter Name - Lee Mac 
;; Returns the name of the Visibility Parameter of a Dynamic Block (if present) 
;; blk - [vla] VLA Dynamic Block Reference object 
;; Returns: [str] Name of Visibility Parameter, else nil 
(defun LM:getvisibilityparametername ( blk / vis ) 
(if (and (vlax-property-available-p blk 'effectivename) 
(setq blk (vla-item (vla-get-blocks (vla-get-document blk)) 
(vla-get-effectivename blk) ) ) 
(= :vlax-true (vla-get-isdynamicblock blk)) 
(= :vlax-true (vla-get-hasextensiondictionary blk)) 
(setq vis (vl-some '(lambda ( pair ) (if (and (= 360 (car pair)) 
(= "BLOCKVISIBILITYPARAMETER" (cdr (assoc 0 (entget (cdr pair))))) ) (cdr pair) ) ) 
(dictsearch (vlax-vla-object->ename (vla-getextensiondictionary blk)) "ACAD_ENHANCEDBLOCK" ) ) ) ) 
(cdr (assoc 301 (entget vis))) ) )

 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
 ;; Get Dynamic Block Property Value  -  Lee Mac
;; Returns the value of a Dynamic Block property (if present)
;; blk - [vla] VLA Dynamic Block Reference object
;; prp - [str] Dynamic Block property name (case-insensitive)
;;;
(Defun c:test ()
(LM:getdynpropvalue (vlax-ename->vla-object(car(entsel))) "L")
)
(defun LM:getdynpropvalue ( blk prp )
    (setq prp (strcase prp))
    (vl-some '(lambda ( x ) (if (= prp (strcase (vla-get-propertyname x))) (vlax-get x 'value)))
        (vlax-invoke blk 'getdynamicblockproperties)
    )
)

À nó đây rồi. đã lấy đc giá trị Linear parameter  trong Dynamic.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×