Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
victor85

[Yêu cầu] Nhờ viết lisp copy nhóm đối tượng lên points

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

Thiệt tình là như cái hàm đã nói thì bần tui cũng đi mót thôi. Sau đó lấy búa gõ ra từng miếng rồi ngâm... rượu. Có cái ngâm nó ngọt, có cái ngâm nó đắng lè.

Nhưng chắc chắn 100% kết quả của hàm trên là đúng. Biết đâu thằng acet nó cũng viết kiểu đó bác ạ.

Có thể trả lời chắc chắn cho bác Hà biết là Acet nó không viết hàm trên như thế. Có thể nó không dùng lisp để viết mà dùng ngôn ngữ khác cho tốc độ nhanh hơn. Mình đã tốn tương đối nhiều công sức để viết 1 hàm chuyển đổi selection set về list. Cách viết như trên chỉ là 1 trong số các cách mà mình từng viết. Khi viết mình ưu tiên tốc độ vì hầu hết chương trình của mình đều thường xuyên fải xử lý con số hàng nghìn đối tượng. (hình như bác cũng chuyên ngành cầu đường nên chắc sẽ hiểu vì sao lại nhiều như vậy)

 

Kết luận: Cách trên là cách triển khai code ngắn gọn nhất, nhưng nó cũng là cách viết tệ nhất vì nó cực chậm. Chậm hơn acet có khi đến cả 1000 lần. Nguyên nhân gây chậm chính là ở hàm ssnamex. Các cách viết khác sử dụng hàm ssname cho tốc độ gần bằng acet. Tuy nhiên mình chưa viết được 1 hàm nào nhanh bằng hoặc hơn acet-ss-to-list cả. Đây là lựa chọn cuối cùng của mình để thay thế cho acet:

(defun ss->list (ss / i lst) (if ss (repeat (setq i (sslength ss)) (setq lst (cons (ssname ss (setq i (1- i))) lst)))))

Đúng ra fải reverse kết quả mới đúng thứ tự. tuy nhiên do ít khi có nhu cầu nên mình cũng bỏ hàm này luôn. khi nào cần list kết quả đúng thứ tự thì viết thế này (reverse (ss->list ss))

  • Vote tăng 3

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

Theo e thì dùng while nhanh hơn bác ạ. Mà bác chạy từ sslength chạy ngược về thì cons sẽ thành list chuẩn, sao lại rev mần chi ^^

ACET thì ta biết rồi, dính vào thằng ARX ^^

  • 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ó thể trả lời chắc chắn cho bác Hà biết là Acet nó không viết hàm trên như thế. Có thể nó không dùng lisp để viết mà dùng ngôn ngữ khác cho tốc độ nhanh hơn. Mình đã tốn tương đối nhiều công sức để viết 1 hàm chuyển đổi selection set về list. Cách viết như trên chỉ là 1 trong số các cách mà mình từng viết. Khi viết mình ưu tiên tốc độ vì hầu hết chương trình của mình đều thường xuyên fải xử lý con số hàng nghìn đối tượng. (hình như bác cũng chuyên ngành cầu đường nên chắc sẽ hiểu vì sao lại nhiều như vậy)

Kết luận: Cách trên là cách triển khai code ngắn gọn nhất, nhưng nó cũng là cách viết tệ nhất vì nó cực chậm. Chậm hơn acet có khi đến cả 1000 lần. Nguyên nhân gây chậm chính là ở hàm ssnamex. Các cách viết khác sử dụng hàm ssname cho tốc độ gần bằng acet. Tuy nhiên mình chưa viết được 1 hàm nào nhanh bằng hoặc hơn acet-ss-to-list cả. Đây là lựa chọn cuối cùng của mình để thay thế cho acet:

(defun ss->list (ss / i lst) (if ss (repeat (setq i (sslength ss)) (setq lst (cons (ssname ss (setq i (1- i))) lst)))))

Đúng ra fải reverse kết quả mới đúng thứ tự. tuy nhiên do ít khi có nhu cầu nên mình cũng bỏ hàm này luôn. khi nào cần list kết quả đúng thứ tự thì viết thế này (reverse (ss->list ss))

1). Tôi biết về bản chất các hàm acet rất mơ hồ. Một số hàm nằm trong thư mục Exprees thì còn lấy búa đập nó ra được. Còn đa số nằm trong arx thì bó tay nên chỉ nói là "có thể". Vậy là "có thể" của tôi đã trở thành "không thể". OK.

2). Tôi mê "tốc độ" bởi vì nhiều chương trình dài hơi của tôi đã khốn đốn vì tốc độ, nên tôi ủng hộ.

3). Tôi cực chán cái hàm reserve, bởi nó làm chậm rất đáng kể. Do đó, không thể không quan tâm tới nó.

4). Cuối cùng: tôi rất mê các hàm Acet, Cal. Nhưng hình như chúng là loại "tầm gởi" của cad nên tôi hơi thiếu thiện chí với chúng. Lý do đó khiến tôi viết lisp thì rất hạn chế dùng, trừ trường hợp làm biếng hoặc không thể viết tốt hơn. À, thêm thằng command nữa.

Tóm lại: từ topic này mà mà mở mang được vài kiến thức.

Nhưng còn 1 vấn đề: tại sao chủ topic dùng "NON" bị lỗi (xem các phản hồi ở trên)? Ai biết xin chỉ giùm.

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

Bác đã bỏ lisp đó đi nên k bắt lỗi được ^^ Lỗi báo nhập vào giá trị nil chứ k phải lỗi của thằng non ạ. Ngoài ra cũng có thể lưu ý cả yếu tố về đời CAD (bạn victor chắc dùng 12 với lệnh copy có array)

  • 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

Bác đã bỏ lisp đó đi nên k bắt lỗi được ^^ Lỗi báo nhập vào giá trị nil chứ k phải lỗi của thằng non ạ. Ngoài ra cũng có thể lưu ý cả yếu tố về đời CAD (bạn victor chắc dùng 12 với lệnh copy có array)

Lisp cũ chỉ khác là không set osmode. Thay vào đó, trong lệnh copy thì trước điểm nguồn và điểm đích đều có "non" thôi.

Tiếc là không có 12 để test.

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

Theo e thì dùng while nhanh hơn bác ạ. Mà bác chạy từ sslength chạy ngược về thì cons sẽ thành list chuẩn, sao lại rev mần chi ^^

ACET thì ta biết rồi, dính vào thằng ARX ^^

Đúng rồi, Ketxu rất tinh ý. Mình nhớ nhầm, ban đầu mình sử dụng 1+ thấy rườm rà hơn nên đổi về 1-

Về mấy vòng lặp, mình chưa từng kiểm tra sự chênh lệch tốc độ giữa while, foreach và repeat. Mình suy nghĩ chủ quan rằng với những fép lặp có thể xác định trước số lần lặp thì repeat là nhanh nhất bởi while có thêm yêu cầu kiểm tra điều kiện lặp. có lẽ fải test lại mớ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

Theo e thì dùng while nhanh hơn bác ạ. Mà bác chạy từ sslength chạy ngược về thì cons sẽ thành list chuẩn, sao lại rev mần chi ^^

ACET thì ta biết rồi, dính vào thằng ARX ^^

Liệu với hàm đó thì dùng foreach có chậm hơn while không, vì while thì có thể giảm số phần tử sau mỗi vòng lặp nhưng lại phải thêm hàm làm giảm, trong khi foreach thì không giảm số lần lặp nhưng chả cần thêm gì. Tôi đang nghi ngờ giữa chú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

Lisp cũ chỉ khác là không set osmode. Thay vào đó, trong lệnh copy thì trước điểm nguồn và điểm đích đều có "non" thôi.

Tiếc là không có 12 để test.

Tue_NV chạy lisp có dòng : (command "copy" ss "" "non" pg "non" (cdr (assoc 10 (entget n))) )) ở CAD2012

chạy tốt -> không có vấn đề gì cả

  • 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

Mình thấy được voi mà đòi Hai Bà Trưng thì cũng xấu lắm.

Tuy nhiên trong quá trình sử dụng cad nó cứ phát sinh ra. Mong các bác mở rộng viết dùm mình copy nhóm đối tượng cũng với điểm gốc chèn lên các block ( Thay đầu vào là các point là các điểm chèn của các block)

Mình thấy trong bản vẽ các block xuất hiện với tần xuất rất nhiều lần. Vì vậy việc cần copy nhóm đối tượng theo block cũng khá hay gặp (Không kể đến trường hợp refedit block để thêm các đối tượng vì một số lý do quản lý nên ta không muốn nhóm đối tương kia nằm trong block - VD: nhóm đối tượng là text). Các bác xuống tay viết dùm em với 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

Trong lisp của ai đó thì thay "POINT" bằng "INSERT", code lấy điểm chèn vẫn là 10 nên không có gì thay đổ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

he he, đã làm được rùi. Cảm ơn ket xu 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

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

Đăng nhập để thực hiện theo  

×