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

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

image.png.0e388f7c3546f5f20fb3acb1db8e6603.png

 

blocreference(insert) -> blockrecord -> xdict -> acad_evaluation_graph -> blockvisibilityparameter  (dxf 360) -> filter dxf 333 (*parameter)

 

tham khảo bài viết của Gile: https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/get-list-of-parameters-being-used-in-block-without-vla-vlax/m-p/8461420#M378276

http://poleshchuk.spb.ru/cad/2009/tainypod08e.htm

  • 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

(("BLOCKLINEARPARAMETER" (303 . "DisplacementX") (304 . "DisplacementY") (305 . "Distance1") (306 . "") (307 . ""))
 ("BLOCKLINEARPARAMETER" (303 . "DisplacementX") (304 . "DisplacementY") (305 . "Distance2") (306 . "") (307 . ""))
 ("BLOCKVISIBILITYPARAMETER" (301 . "Visibility1") (302 . "") (303 . "State1") (303 . "State2")))

Bước tách cặp ("State1" "Distance1") thì sao a?

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 đang nghiên cứu ra rồi nhé. sử dụng hàm (getpropertyvalue [ename] [property]) 

property là string có dạng "AcDbDynBlockProperty" + "distance..."

nếu có giá trị là hiện nếu error là ẩn. 

đi kèm với cặp lệnh vl-catch-all-error-p vl-catch-all-apply thì ok luôn.

(defun c:test (/ ent lst lstcheck lstparavisible )
  (setq 
    ent (car (entsel))
    lst (LM:getdynprops (vlax-ename->vla-object ent))
    lst (vl-remove-if-not '(lambda (x) (eq 'REAL (type (cdr x)))) lst)
    lst (mapcar '(lambda (x) (strcat "AcDbDynBlockProperty" (car x)) ) lst)
    lstcheck (mapcar '(lambda (x) (vl-catch-all-apply 'getpropertyvalue (list ent x))) lst)
    lstparavisible (mapcar 
                     '(lambda (a b) 
                        (if (not (vl-catch-all-error-p b))
                          (cons (substr a 21) b)
                        )
                      )
                    lst lstcheck
                   )
  )
  (vl-remove nil lstparavisible)
)

(defun LM:getdynprops (blk)
  (mapcar '(lambda (x)
	     (cons (vla-get-propertyname x) (vlax-get x 'value))
	     )
	  (vlax-invoke blk 'getdynamicblockproperties)
	  )
  )
  • Like 1
  • 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
30 phút trước, tannguyen291 đã nói:

Mình đang nghiên cứu ra rồi nhé. sử dụng hàm (getpropertyvalue [ename] [property]) 

property là string có dạng "AcDbDynBlockProperty" + "distance..."

nếu có giá trị là hiện nếu error là ẩn. 

đi kèm với cặp lệnh vl-catch-all-error-p vl-catch-all-apply thì ok luôn.


(defun c:test (/ ent lst lstcheck lstparavisible )
  (setq 
    ent (car (entsel))
    lst (LM:getdynprops (vlax-ename->vla-object ent))
    lst (vl-remove-if-not '(lambda (x) (eq 'REAL (type (cdr x)))) lst)
    lst (mapcar '(lambda (x) (strcat "AcDbDynBlockProperty" (car x)) ) lst)
    lstcheck (mapcar '(lambda (x) (vl-catch-all-apply 'getpropertyvalue (list ent x))) lst)
    lstparavisible (mapcar 
                     '(lambda (a b) 
                        (if (not (vl-catch-all-error-p b))
                          (cons (substr a 21) b)
                        )
                      )
                    lst lstcheck
                   )
  )
  (vl-remove nil lstparavisible)
)

(defun LM:getdynprops (blk)
  (mapcar '(lambda (x)
	     (cons (vla-get-propertyname x) (vlax-get x 'value))
	     )
	  (vlax-invoke blk 'getdynamicblockproperties)
	  )
  )

Excellent!

Sao anh tìm ra được cái AcDbDynBlockPropertyDistance?

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
3 phút trước, limfx đã nói:

Excellent!

Sao anh tìm ra được cái AcDbDynBlockPropertyDistance?

Mình quên mất 2 hàm dumpallproperties  và  getpropertyvalue

tại ít dùng quá nên không nghĩ đến. không ngờ lại có tác dụng 

Dùng dump là biết ename có các dữ liệu nào đi kèm thôi

  • 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
25 phút trước, tannguyen291 đã nói:

Mình quên mất 2 hàm dumpallproperties  và  getpropertyvalue

tại ít dùng quá nên không nghĩ đến. không ngờ lại có tác dụng 

Dùng dump là biết ename có các dữ liệu nào đi kèm thôi

Ủa sao (dumpAllProperties (car (entsel)) 1) nó trả về nil anh?

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
6 phút trước, limfx đã nói:

Ủa sao (dumpAllProperties (car (entsel)) 1) nó trả về nil anh?

dump luôn trả về nil. lệnh này chủ yếu để người dùng theo dõi các thông tin của đối tượng để nghiên cứu thôi. nó giống vlax-dump-object đó

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 phút trước, tannguyen291 đã nói:

dump luôn trả về nil. lệnh này chủ yếu để người dùng theo dõi các thông tin của đối tượng để nghiên cứu thôi. nó giống vlax-dump-object đó

Vậy sao anh nói biết dữ liệu đi kèm như:

(vlax-dump-object (vlax-ename->vla-object (car (entsel))) [T])

image.png.e41eac57622a64248b99972b0ef91fe5.png

Hình như dumpAllProperties  chỉ có trên cad 2024?

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

Mình đang nghiên cứu ra rồi nhé. sử dụng hàm (getpropertyvalue [ename] [property]) 

property là string có dạng "AcDbDynBlockProperty" + "distance..."

nếu có giá trị là hiện nếu error là ẩn. 

đi kèm với cặp lệnh vl-catch-all-error-p vl-catch-all-apply thì ok luôn.


(defun c:test (/ ent lst lstcheck lstparavisible )
  (setq 
    ent (car (entsel))
    lst (LM:getdynprops (vlax-ename->vla-object ent))
    lst (vl-remove-if-not '(lambda (x) (eq 'REAL (type (cdr x)))) lst)
    lst (mapcar '(lambda (x) (strcat "AcDbDynBlockProperty" (car x)) ) lst)
    lstcheck (mapcar '(lambda (x) (vl-catch-all-apply 'getpropertyvalue (list ent x))) lst)
    lstparavisible (mapcar 
                     '(lambda (a b) 
                        (if (not (vl-catch-all-error-p b))
                          (cons (substr a 21) b)
                        )
                      )
                    lst lstcheck
                   )
  )
  (vl-remove nil lstparavisible)
)

(defun LM:getdynprops (blk)
  (mapcar '(lambda (x)
	     (cons (vla-get-propertyname x) (vlax-get x 'value))
	     )
	  (vlax-invoke blk 'getdynamicblockproperties)
	  )
  )
4 giờ trước, snowman.hms đã nói:

blocreference(insert) -> blockrecord -> xdict -> acad_evaluation_graph -> blockvisibilityparameter  (dxf 360) -> filter dxf 333 (*parameter)

tham khảo bài viết của Gile: https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/get-list-of-parameters-being-used-in-block-without-vla-vlax/m-p/8461420#M378276

http://poleshchuk.spb.ru/cad/2009/tainypod08e.htm

Tuyệt vời, cảm ơn các bác đã trợ giú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
12 phút trước, limfx đã nói:

Em đang quần cái chỗ lấy các đường polyline song song với đường pline màu tím như hình vẽ:

Xin cảm ơn a!

image.thumb.png.e20f046d6c5aeaf28f03de91514ce8ca.png

duong ss.dwg

Câu hỏi quá cẩu thả:
1. Hỏi cái gì chưa nói ra.
2. Các đường xanh và vàng toàn Line, không phải Pline
3. Không có khái niệm toán học Line và Pline song song nhau.

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

Xin lỗi vì câu hỏi chưa rõ nội dung:

Em muốn tìm các đường polyline song song với các đoạn polyline cho trước với một khoảng offset d với mục đích thống kê khối lượng.

image.png.eb6c5f239a26918f80c4182e8c4549ec.png

Những đoạn xanh vàng là polyline a!

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

Em tìm ra phương án rồi ạ: Lấy 2 điểm trên đối tượng, kiểm tra khoảng cách đến đường màu tím, nếu bằng nhau thì đường đó song song!

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
3 phút trước, limfx đã nói:

Em tìm ra phương án rồi ạ: Lấy 2 điểm trên đối tượng, kiểm tra khoảng cách đến đường màu tím, nếu bằng nhau thì đường đó song song!

image.thumb.png.2e31726ccea80467f0b9a59ccf8322b9.png

2 trường hợp này thi sao :)

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

Em tìm ra phương án rồi ạ: Lấy 2 điểm trên đối tượng, kiểm tra khoảng cách đến đường màu tím, nếu bằng nhau thì đường đó song song!

 

12 phút trước, limfx đã nói:

Cẩm ơn a tannguyen291 và amateurday: Thêm kiểm tra góc giữa 2 đường nữa là OK. Thanks!

 

trên polyline tính góc phức tạp hơn. Có thể kiểm tra  thêm khoảng cách: p1p3 = p2p4 và p1p2 = p3p4

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
48 phút trước, limfx đã nói:

Cẩm ơn a tannguyen291 và amateurday: Thêm kiểm tra góc giữa 2 đường nữa là OK. Thanks!

Kiểm tra nhiều thế làm gì chỉ đơn giản là tính tan(alpha) bằng nhau là xong mà. 

ngay từ đầu mình thấy bài đơn giản nên không định trả lời. không ngờ gây khó mọi người đến vậy.

image.png.d3ad49ad37da871e967d0203de2367ac.png

từ p1 p2 thì có rất nhiều cách để tìm ra px1 và px2.

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

Thế thì phải xét cạnh polyline theo vị trí pick rồi, thế thì viết code thành viết tập làm văn rồi. Dài khiếp đây.

 

Tốt nhất là trở về đối tượng của bài toán tìm đối tượng trùng hoặc cạnh nhau như bài em post. Đó là x tất cả cho là LINE hết. Sau undo lạ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

image.png.565661687e81936164c429d01b20c51a.png

Chỗ Center the plot thì hàm: (vla-put-CenterPlot lyout :vlax-true) 

Vậy các ac cho em hỏi để Fit to paper thì (vla-put ...) như thế nào em tìm chưa ra? Thanks!

 

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, limfx đã nói:

image.png.565661687e81936164c429d01b20c51a.png

Chỗ Center the plot thì hàm: (vla-put-CenterPlot lyout :vlax-true) 

Vậy các ac cho em hỏi để Fit to paper thì (vla-put ...) như thế nào em tìm chưa ra? Thanks!

 

Thử hàm (vla-Put-StandardScale lyout acScaleToFit)

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

Thử hàm (vla-Put-StandardScale lyout acScaleToFit)

Cảm ơn anh! 

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

×