Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
linhoreka

SourceCode cDynamicSS thay thế AcadSelectionSet

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

linhoreka    47

Ai dùng lisp rồi chuyển sang VBA cũng thấy hàm ssget, ssadd của lisp gọn gàng nhanh hơn AcadSelectionSet nhiều

AcadSelectionSet phải khai báo tên v.v đôi lúc rất khó chịu

Mình trong quá trình lập trình phát triển được đối tượng cDynamicSS này để thay thế AcadSelectionSet, cùng một số tính năng mới hiệu quả hơn:

Ví dụ:

+ Select những đối tượng nằm trong 1 pline bằng cách chọn trực tiếp pline: cái này hiệu quả với mấy bạn vẽ những thửa đất với nhiều đối tượng ở bên trong muốn chọn nhanh các đối tượng đó để xử lý các thuật toán tiếp theo

(Xem ứng dụng trên topic Lọc các đối tượng theo màu rồi thống kê trên Excel)

 

+ Select những đối tượng cắt 1 pline bằng cách chọn trực tiếp pline ấy

 

...

(Các bạn chạy macro DemoDynamicSS để xem cách cDynamicSS hoạt động)

 

Ngoài ra còn có 1 MsgboxX tự chế thay thế Msgbox của VB tạo tiếng Beep hơi khó chịu

Share sourcecode cho mọi người cùng phát triển.

Cheer !

  • 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
linhoreka    47

@ketxu: ??? đề nghị ketxu edit lại bài post

 

Có cần hướng dẫn sử dụng không nhỉ. Tớ làm cái này quen rồi nên thấy dễ quá chắc chả cần hướng dẫn gì :). Có gì xem trực tiếp trong source code được rồi

 

Nhưng có lẽ cũng cần vài dòng về cơ sở thuật toán:

 

1. Cách lấy Item của cDynamicSS: Item(index) với index từ 0 trở đi. Buộc phải viết cú pháp ví dụ: ss.Item(5) chứ không thể là ss(5) vì trong VBA không có cách nào để set cái Item ấy về default. Nếu bạn chuyển sang VB6 tạo file dll thì mới khắc phục được nhược điểm này.

 

2. Cơ sơ dữ liệu của cDynamicSS là 1 collection chứ không phải là AcadSelectionSet. Nếu bạn muốn lấy đối tượng AcadSelectionSet, bạn gọi lệnh ss.SelectionSet. cDynamicSS sẽ chuyển toàn bộ đối tượng trong Collection của nó vào SelectionSet có tên "cDynamicSS"

>>> Không có giới hạn cho số lượng cDynamicSS như đối với AcadSelectionSet

 

3. Trong quá trình chạy, một số đối tượng bị xóa khỏi bản vẽ nhưng vẫn tồn tại trong cDynamicSS. Dùng lệnh Clean để purge đi, nếu không sẽ gặp lỗi khi gọi Item.

 

4. Vì VBA cho class chỉ có tính năng PublicNotCreatable nên nếu bạn gọi cDynamicSS từ một project khác reference đến cDynamicSS thì bạn làm như sau:

Dim ss as cDynamicSS 'New cDynamicSS không gọi được từ bên ngoài

Set ss = New_cDynamicSS([Optional AcadDoc]) 'New_cDynamicSS là một hàm public trong cDynamicSS

 

5. Cách chọn tập hợp bằng pline thực ra là nâng cấp cách chọn của AutoCAD. Cách chọn này đòi hỏi đối tượng chọn phải nhìn thấy được trên màn hình Mỗi chỗ này là hay gây lỗi thôi. Ngày xưa chuyên chống lụt cho mấy ông Civil làm san lấp mặt bằng chia ô ra ghi cao độ rồi không biết cộng lại thế nào :)

 

6. AddItems và RemoveItems linh hoạt paramarray theo sau có thể là cDynamicSS, AcadSelectionSet, Group, Entity hay Array(Entities) đều được

 

Trong một ứng dụng lập trình 1 việc quan trọng là chọn đối tượng, rồi lọc đối tượng, rồi chia đối tượng ra thành các nhóm v.v cDynamicSS được lập ra vì lý do đó.

 

PS: Cái tên cDynamicSS tự nhiên hồi ấy nghĩ ra giờ không thích nữa nhưng dùng nhiều quá rồi tạm để thế chấp nhận vậy, hì

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  

×