Đến nội dung


Hình ảnh
- - - - -

SourceCode cDynamicSS thay thế AcadSelectionSet


  • Please log in to reply
2 replies to this topic

#1 linhoreka

linhoreka

    biết lệnh erase

  • Members
  • PipPipPip
  • 106 Bài viết
Điểm đánh giá: 46 (tàm tạm)

Đã gửi 15 January 2011 - 01:59 PM

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 !
  • 1

#2 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 15 January 2011 - 05:17 PM

Hút máu, hút máu khẩn cấp anh em ơi :")
  • 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


#3 linhoreka

linhoreka

    biết lệnh erase

  • Members
  • PipPipPip
  • 106 Bài viết
Điểm đánh giá: 46 (tàm tạm)

Đã gửi 15 January 2011 - 06:44 PM

@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ì
  • 0