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

[Nhờ giúp đỡ code] Lấy chiều dài của đối tượng trong BLOCK động

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

Chào cả nhà, mình đang thử làm một block động thép và một Block ATTDEF với mục đích rải thép

 

Trong hình là hình ảnh của 2 đối tượng nêu trên

 

Mọi người cho hỏi mình cần dùng Code gì để có thể

 Lấy được chiều dài của tổng đối tượng có Layer "Thep doc" (màu đỏ trong hình) khi mà đối tượng này thuộc loại bị điều khiển bởi thuộc tính của block dynamic

 

 

Xin cảm ơn mọi người

 

 

3333.png

Rai thep.dwg

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

Các Parameter của bác ấy không tính ra tổng của chiều dài thép dọc, vì có 1 đoạn cuối bên phải chạy lung tung.

Viết tạm cái code này bác dùng tạm, nếu tổng các parameter cần thiết có thể tính ra chiều dài thép thì có thể dùng Field cũng rất tiện lợi

(vl-load-com)
(Defun c:te (/ ent ent2 ent3 lst tong)
  (setq ent (Car (entsel "Pick Block Dyn")))
  (setq ent2 (Car (entsel "Pick ATT Block")))
  (setq lst (mapcar '(lambda(x)  (vlax-vla-object->ename x) )
      (vlax-invoke (vlax-ename->vla-object ent) 'explode)))
  (setq tong 0.0)
  (foreach ent3 lst
    (IF (and (wcmatch (CDR (ASSOC 0 (ENTGET ENT3))) "*LINE")
	     (wcmatch (CDR (ASSOC 8 (ENTGET ENT3))) "THEPDOC"))
    (setq tong (+ tong (vla-get-length (vlax-ename->vla-object ent3)))) )
    (entdel ent3)
    )
  (ACET-INSERT-ATTRIB-SET ent2 (list (list "L" (rtos tong 2 0))) t)
  (princ)
  )

 

  • 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

Lâu ko viết lách nên mình viết ví dụ ntn, bạn tự hoàn chỉnh nhé:

(defun C:zz ()
  (setq obj (vlax-ename->vla-object (car (entsel))))
  (vlax-for each_obj (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (vla-get-Effectivename obj))
    (if (vl-catch-all-error-p (vl-catch-all-apply (function (lambda () (setq len (vla-get-Length each_obj))))))
      (setq len 0.00)
      )
    (print len)
    )
  (print)
  )

Nhân tiện cho mình hỏi vài câu:

1. Đoạn trong vlax-for có thể viết ngắn gọn và khoa học hơn chút ko ? lâu ko đụng cái này h quên hết r :((

2. Ai có thể viết lisp trên dựa theo hàm (entnext) để mình tham khảo chút đc ko ?

Mình xin cảm ơn !

 

PS: hề hề, cái trên bị sai vì block có visibility, bạn nào sửa dùm mình nhé, học hỏi chút !

  • 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

https://www.cadviet.com/forum/topic/14210-hỏi-về-lisp-thuật-toán-ý-tưởng-coding/?page=122&tab=comments#comment-430780

Hồi mình cũng có hỏi tương tự tại đây và đã được trả lời rồi. Xài đượ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

Cảm ơn mọi người đã quan tâm, mình đi xã cả ngày giờ mới online được mới đầu mình cũng đã nghĩ đến việc chắc phải gắn các chiều dài vào Pramateter để đo rồi dùng Lisp để lọc Parameter theo Visiabli, rồi lấy giá trị hiện tại

 

Cơ mà cách này:

 thủ công; và cách gán Prameter sẽ tương đối khó nếu đối tượng cung tròn (nói chung vẫn tính được, nhưng cần gán công thức chuyên dụng ứng với từng trường hợp); Khá rối loạn khi vào môi trường BE (block editor)

 

 

* không biết có cách nào khác không nhỉ

 

 

 

@Duong Nhat Duy Với code của bạn khi tính đường đối tượng đường cong có thể lỗi, có thể thay phần tính chiều dài bằng: 

(setq len (+ len (vlax-curve-getdistatparam each_obj (vlax-curve-getendparam each_obj))))

 

 

@Duong Nhat Duy Ví dụ với code Entnext 

(defun c:zz()
  (if(and (setq ss (ssget '(( 0 . "INSERT"))))
	  (setq dt (ssname ss 0))
	  (setq blk (vlax-ename->vla-object dt) i 0))
    (progn

      (setq tenblk (if (vlax-property-available-p blk 'effectivename)
		     (vla-get-effectivename blk)
		     (vla-get-name blk)
		     )
	    )
      (setq dt_bk (cdr (assoc -2 (tblsearch "Block" tenblk))))
      (while (/= "SEQEND" (cdr(assoc 0 (entget dt_bk))))	
	(princ (strcat "\nDoi tuong trong block thu " (rtos (setq i (1+ i)) 2 0) " la doi tuong: " (cdr(assoc 0 (entget dt_bk)))))
	(setq dt_bk (entnext dt_bk))
	)
      )
    )
  (princ)
  )

@duy782006 có vẻ cách của anh Duy là dùng Gán đối tượng cần lấy chiều dài cho Parameter sau đó dùng thủ thuật lấy giá trị của parameter; Như vậy trùng với cách ban đầu, cách này không tiện khi nhiều đối tượng -> nhiều parameter (thậm chí các parameter này cũng không có gán hành động luôn, chỉ cho vào để về sau get giá trị)

 

 

 

@Doan Nguyen Van Cách của bác theo em là hay nhất nhưng em chưa hiểu lời giải lắm, có vẻ như là nó tạo ra một tập hợp "ảo" gồm các phần từ đã explore từ Block đầu đúng không, sau đó dùng lệnh lọc qua để tìm chiều dài

 

Cách làm này tương đương ngoài thực tế làm Cad

B1/ chọn Block

B2/ "X" nổ đối tượng

B3/ Xét riêng tập sau khi nổ xong: duyệt qua từng thằng tính chiều dài thép 

B4/ Ghi lại giá trị tổng chiều dài, xóa đi toàn bộ tập đã tạo ra sau khi nổ ở B2

(P/S Linh hồn của Code này có lẽ là ở đoạn này: (vlax-invoke (vlax-ename->vla-object ent) 'explode)             )

 

Cảm ơn bác, mong bác giải thích kỹ hơn nếu không đúng

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
8 giờ trước, quansla đã nói:

 

 Cách của bác theo em là hay nhất nhưng em chưa hiểu lời giải lắm, có vẻ như là nó tạo ra một tập hợp "ảo" gồm các phần từ đã explore từ Block đầu đúng không, sau đó dùng lệnh lọc qua để tìm chiều dài

 

Cách làm này tương đương ngoài thực tế làm Cad

B1/ chọn Block

B2/ "X" nổ đối tượng

B3/ Xét riêng tập sau khi nổ xong: duyệt qua từng thằng tính chiều dài thép 

B4/ Ghi lại giá trị tổng chiều dài, xóa đi toàn bộ tập đã tạo ra sau khi nổ ở B2

(P/S Linh hồn của Code này có lẽ là ở đoạn này: (vlax-invoke (vlax-ename->vla-object ent) 'explode)             )

 

Cảm ơn bác, mong bác giải thích kỹ hơn nếu không đúng

Nó cũng gần tương tự như các bước của bác, chỉ có điều nó không phải tập ảo, mà là làm cho nổ đối tượng thật, nhưng không mất đi đối tượng ban đầu,

sau khi lọc rồi tính chiều dài thì phải xóa đi nếu không sẽ tạo ra rác trên đối tượng 

  • 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

Cảm ơn mọi người đã giúp đỡ, 

Cảm ơn @Doan Nguyen Van đã cho code rất phù hợp, thanks bác chúc bác và gia đình mạnh khỏe, công việc thuận lợi, cuộc sống nhiều niềm vui

  • 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

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

×