Đến nội dung


Hình ảnh
* * * - - 17 Bình chọn

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


  • Please log in to reply
2849 replies to this topic

#1201 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 25 June 2012 - 05:53 PM

2/- Giả sử có lst (("1" ( 1 2 0)) ("2" ( 2 3 0)) ....). có nghĩa ta có một list khá lớn mà mỗi phần tử có hai phần tử con. Để tìm một phần tử nào đó theo phần tử con thứ nhất ta hay dùng hàm assoc. VD (assoc "2" lst) -> ("2" (2 3 0)). Bây giờ muốn tìm theo đối số là phần tử thứ hai thì làm thế nào?

Thêm phương pháp đệ quy cho bác NgaMy text thử. em viết 2 hàm luôn cho bác lựa chọn tùy theo nhu cầu

1/ Hàm tổng quát, áp dụng với vị trí kiểm tra tìm kiếm bất kì.
Tham số: i là vị trí cần kiểm tra (phần tử đầu tiên bắt đầu là 0), find: giá trị cần tìm kiếm, lst: danh sách cần tìm
(defun assoc-nth (i find lst / lst1 )
(if (equal (nth i (car lst)) find)
(car lst)
(if (setq lst1 (cdr lst)) (assoc-nth i find lst1))))
TEST: (assoc-nth 1 2 '((1 4 4) (1 1 1) (3 2 3) (1 3 2))) -> (3 2 3)

2/ Hàm chỉ dùng cho vị trí kiểm tra là phần tử thứ 2
(defun assoc-2 (find lst / lst1 )
(if (equal (cadar lst) find)
(car lst)
(if (setq lst1 (cdr lst)) (assoc-2 find lst1))))
TEST: (assoc-2 2 '((1 4 4) (1 1 1) (3 2 3) (1 3 2))) -> (3 2 3)

Tất nhiên là hàm 2 sẽ nhanh hơn hàm 1 vì các hàm cdr và car chạy nhanh hơn hàm nth nhưng không tổng quát.
  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1202 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 25 June 2012 - 08:10 PM

Thêm phương pháp đệ quy cho bác NgaMy text thử. em viết 2 hàm luôn cho bác lựa chọn tùy theo nhu cầu

1/ Hàm tổng quát, áp dụng với vị trí kiểm tra tìm kiếm bất kì.
Tham số: i là vị trí cần kiểm tra (phần tử đầu tiên bắt đầu là 0), find: giá trị cần tìm kiếm, lst: danh sách cần tìm

(defun assoc-nth (i find lst / lst1 )
(if (equal (nth i (car lst)) find)
(car lst)
(if (setq lst1 (cdr lst)) (assoc-nth i find lst1))))
TEST: (assoc-nth 1 2 '((1 4 4) (1 1 1) (3 2 3) (1 3 2))) -> (3 2 3)

2/ Hàm chỉ dùng cho vị trí kiểm tra là phần tử thứ 2
(defun assoc-2 (find lst / lst1 )
(if (equal (cadar lst) find)
(car lst)
(if (setq lst1 (cdr lst)) (assoc-2 find lst1))))
TEST: (assoc-2 2 '((1 4 4) (1 1 1) (3 2 3) (1 3 2))) -> (3 2 3)

Tất nhiên là hàm 2 sẽ nhanh hơn hàm 1 vì các hàm cdr và car chạy nhanh hơn hàm nth nhưng không tổng quát.

Cám ơn bác, các hàm của bác Thai rất hay. Tuy nhiên nó chỉ test đc với số phần tử khoảng 15000 thôi, trên 20000 thì nó tràn nên chưa kết luận đc, mà dưới 15000 các hàm đều chập chòn giữa 0.0 - 0.015 - 0.031s.
  • 0

#1203 duy267

duy267

    biết vẽ point

  • Members
  • PipPip
  • 96 Bài viết
Điểm đánh giá: 7 (bình thường)

Đã gửi 25 June 2012 - 11:32 PM

Các bác cho hỏi có hàm nào(biến nào) lấy được Linetype scale trên bảng Properties hiện hành không. Xin cảm ơn.
  • 0

#1204 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 25 June 2012 - 11:41 PM

Lấy Linetype scale của 1 đối tượng:
(vlax-get-property (vlax-ename->vla-object (car (entsel))) 'Linetypescale)
  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1205 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 26 June 2012 - 04:28 AM

Sử dụng biến celtscale
-> (getvar "celtscale")
  • 1

#1206 duy267

duy267

    biết vẽ point

  • Members
  • PipPip
  • 96 Bài viết
Điểm đánh giá: 7 (bình thường)

Đã gửi 26 June 2012 - 01:45 PM

Sử dụng biến celtscale
-> (getvar "celtscale")

Xin cảm ơn bác Tuệ rất nhiều đã thức tới 4:28AM để trả lời câu hỏi của em. Đã đúng ý của em.

Lấy Linetype scale của 1 đối tượng:
(vlax-get-property (vlax-ename->vla-object (car (entsel))) 'Linetypescale)

Bác Hạ đã nhầm câu hỏi của em, em muốn lấy Lintype Scale trên bảng Properties chứ không phải của một đối tượng. Thanks bác.
  • 0

#1207 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 28 June 2012 - 03:02 PM

Hề hề hề,
Các bác cho hỏi:
Với đối tượng là ename thì có hàm (vlax-ename->vla-object ename) để chuyển nó thành đối tượng vla-object.
Vậy chứ nếu đối tượng là một tập chọn từ kết quả hàm ssget thì có cách nào để chuyển đối tượng này thành một đối tượng vla-object không hè???
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#1208 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 28 June 2012 - 03:09 PM

Chuyển về 1 collection vla bác ạ :

(vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object)))



Hàm có tác dụng với tập chọn hiện hành (đang highlight hoặc grip control)
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#1209 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 30 June 2012 - 06:32 PM

Có 1 tập chọn đối tượng ssget. trong đó các đối tượng đè lên nhau, làm thế nào để biết thứ tự draw order của chúng? hoặc chỉ cần chỉ ra đối tượng ở trên cùng cũng được.
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1210 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 30 June 2012 - 08:32 PM

Có 1 tập chọn đối tượng ssget. trong đó các đối tượng đè lên nhau, làm thế nào để biết thứ tự draw order của chúng? hoặc chỉ cần chỉ ra đối tượng ở trên cùng cũng được.

Gọi p là điểm thuộc các đối tượng đè lên nhau.
(setq ss (ssget "c" p p))
-> (ssname ss 0) là ename của đối tượng trên cùng
tiếp đến (ssname ss 1) là ename của đối tượng đè tiếp theo
........
  • 2

#1211 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 02 July 2012 - 04:38 PM

Có 1 tập chọn đối tượng ssget. trong đó các đối tượng đè lên nhau, làm thế nào để biết thứ tự draw order của chúng? hoặc chỉ cần chỉ ra đối tượng ở trên cùng cũng được.

Hề hề hề,
Các đối tượng trong CAD được quản lý thứ tự sinh ra bởi handent (mã dxf 5) do vậy bác thử so sánh cái mã này sẽ biết thằng nào là anh thằng nào là em. Mã dxf 5 là mã giá trị số trong hệ thập lục phân bác ạ. Phải mất công chuyển hệ một chút.
Chúc bác thành công.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#1212 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 02 July 2012 - 06:23 PM

thứ tự draw order mà bác bình. bác đang hiểu nhầm sang thứ tự đối tượng được tạo ra trong bản vẽ. thứ tự này được điều khiển bởi lệnh draworder. đối tượng "nằm trên" sẽ được chọn khi ta pick select tại 1 điểm có thể tìm thấy nhiều hơn 1 đối tượng.

"Nằm trên" bác cũng đừng hiểu là nó có tọa độ z lớn hơn. mà nó là thứ tự ưu tiên được hiển thị trên màn hình cad. ví dụ bác có 2 đường thẳng trùng nhau, 1 đỏ 1 xanh. nếu trên màn hình nó hiển thị màu xanh thì có nghĩa đường màu xanh "nằm trên" đường màu đỏ. muốn đổi chỗ việc ưu tiên hiển thị này, bác gõ lệnh dr.

Câu trả lời của bác Tue_NV là chính xác rồi bác ạ.
  • 2

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1213 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 02 July 2012 - 11:35 PM

Anh hoàn toàn có thể sắp xếp 1 tập chọn theo thứ tự draworder của chúng
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#1214 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 03 July 2012 - 01:42 AM

Cụ thể thế nào hả ketxu? Mình đang cần chính cái đó. phương pháp bác Tue_NV mách khiến mình hơi vất vả 1 chút vì phải đi tìm điểm chung của từng cặp đối tượng để chọn theo method (ssget "c" p p). kết quả cũng không đầy đủ trong trường hợp 2 đối tượng không giao nhau, sẽ không biết thực sự anh nào nằm trên, chị nào nằm dưới.
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1215 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 03 July 2012 - 07:23 AM

Cụ thể thế nào hả ketxu? Mình đang cần chính cái đó. phương pháp bác Tue_NV mách khiến mình hơi vất vả 1 chút vì phải đi tìm điểm chung của từng cặp đối tượng để chọn theo method (ssget "c" p p). kết quả cũng không đầy đủ trong trường hợp 2 đối tượng không giao nhau, sẽ không biết thực sự anh nào nằm trên, chị nào nằm dưới.

Mình thấy chỉ cần chọn theo method (setq ss (ssget)) cũng được
-> (ssname ss 0) là ename của đối tượng trên cùng
tiếp đến (ssname ss 1) là ename của đối tượng đè tiếp theo
........
  • 1

#1216 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 03 July 2012 - 08:18 AM

ồ đúng rồi bác Tue_NV ạ. Vậy mà em cứ ngỡ nó sắp xếp theo thứ tự đối tượng được sinh ra trong bản vẽ. Cảm ơn bác nhiều :D
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1217 hdt4151

hdt4151

    biết vẽ pline

  • Members
  • PipPip
  • 69 Bài viết
Điểm đánh giá: -1 (bình thường)

Đã gửi 03 July 2012 - 12:18 PM

Cho mình hỏi làm sao dùng lisp để thực hiện 1 lisp khác hoặc 1 lệnh tắt bằng command ?

Ví dụ:

(defun c:test()

(setq ss (car(entsel)))
(command "x" ss "" )

(princ))

----
Nếu thay "explode" thành "x" hoặc tên của 1 lisp khác đã được load thì chương trình bị lỗi.
  • 0

#1218 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 03 July 2012 - 12:28 PM

1). Không thể dùng hàm command để gọi lệnh tắt mà phải gọi bằng tên đầy đủ.
2). Không thể dùng hàm command để gọi lệnh lisp. Muốn gọi lệnh lisp ABC thì phải dùng (C:ABC).
  • 2

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1219 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 03 July 2012 - 05:13 PM

ồ đúng rồi bác Tue_NV ạ. Vậy mà em cứ ngỡ nó sắp xếp theo thứ tự đối tượng được sinh ra trong bản vẽ. Cảm ơn bác nhiều :D

Nếu các đối tượng của bác được lấy từ ssget ra thì cứ theo thứ tự đó thôi, vì ssget là cách chọn các đối tượng hình học. Còn nếu là 1 tập ename bất kỳ thì mới phải bàn thêm 1 chút code xử lý bác ạ :)
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#1220 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 08 July 2012 - 01:25 AM

Mình có tham khảo cái lisp cắt đối tượng (BreakObjects.lsp) của Charles Alan Butler. Lisp rất hay khổ cái nó chạy quá chậm nên dự định viết lại một ít để cải thiện tốc độ. Cũng vì cải thiện tốc độ nên mình phải tham khảo ý kiến các bạn.
Giả sử mình có một đối tượng (LINE, LWPOLYLINE, ARC, ELIP, SPLINE ...) và một danh sách các điểm giao (kg có thứ tự), làm thế nào để cắt chúng ra thật nhanh.
Minh giải thích thêm : Mình viết một giải thuật tìm những điểm giao có thể có trên 1 đối tượng, sau đó đem chúng ra cắt.
Một đối tượng tương ứng với một danh sách, giữa các đối tượng kg liên quan gì với nhau nữa, chỉ làm sao cắt từng thằng thật nhanh, chậm chậm thì mình làm cũng đc. Hình minh họa :
Hình đã gửi

Kg biết bạn nào có thể giải thích cách cắt đối tượng của lisp trên (chỉ lúc nó đem đối tượng ra cắt thôi), mình xem qua chẳng hiểu gí cả
Cám ơn các bạn.
  • 0