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

[Hỏi] Lisp chọn tập hợp đối tượng gần nhất được sinh ra bởi 1 lênh.

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

Rất nhiều lần mình có nhu cầu cần chọn được tập hợp đối tượng gần nhất được sinh ra bởi 1 lệnh nào đó (có thể là lệnh của cad hoặc lệnh của lisp) nên định viết 1 lisp chức năng như vây. nôm na thì nó cũng tương tự (ssget "L") nhưng ra cả đám chứ không chỉ 1 thằng ku cuối cùng.

Tuy nhiên hiện tại mình đang bí về cách thức giải quyết vấn đề đành phải lập topic xin các bác cao kiến để viết nó. Các bác cùng thảo luận nhé.

 

Edit: Đã xong. Các bạn có thể down lisp ở bài số #21 (trang 2)

  • 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

Rất nhiều lần mình có nhu cầu cần chọn được tập hợp đối tượng gần nhất được sinh ra bởi 1 lệnh nào đó (có thể là lệnh của cad hoặc lệnh của lisp) nên định viết 1 lisp chức năng như vây. nôm na thì nó cũng tương tự (ssget "L") nhưng ra cả đám chứ không chỉ 1 thằng ku cuối cùng.

Tuy nhiên hiện tại mình đang bí về cách thức giải quyết vấn đề đành phải lập topic xin các bác cao kiến để viết nó. Các bác cùng thảo luận nhé.

Có phải tương tự cái này không?

;----- LÊy tËp hîp chän sau lÖnh Copy.
(defun C:HA(/ sst sss p1 p2)
(princ "\nChon cac doi tuong...")
(setq sst (ssget) sss (ssadd) ent (entlast))        
(command "copy" sst "" (setq p1 (getpoint "\nDiem goc: ")) (getpoint p1 "\nDiem den: "))	;tuong tu: Offset, Mirror...
(while (setq ent (entnext ent))
 (setq sss (ssadd ent sss)))
(sssetfirst nil sss) 		;co the delete dong nay.
sss)

  • Vote tăng 2

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

Không. Bác Hà hiểu sai rồi.

Lisp trên lấy ra tập hợp đối tượng sau 1 lệnh cụ thể. (là lệnh HA)

Mình cần lisp lấy ra tập hợp đối tượng tạo ra bởi lệnh bất kỳ trước đó. nghĩa là...:

trong quá trình vẽ chúng ta thường xuyên phải select đối tượng. Cad đã cung cấp nhiều kiểu Select: P-Previuos; L-last; ...

Giờ mình muốn viết thêm 1 lệnh để select được tập hợp đối tượng cuối cùng được tạo ra.

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

Không. Bác Hà hiểu sai rồi.

Lisp trên lấy ra tập hợp đối tượng sau 1 lệnh cụ thể. (là lệnh HA)

Mình cần lisp lấy ra tập hợp đối tượng tạo ra bởi lệnh bất kỳ trước đó. nghĩa là...:

trong quá trình vẽ chúng ta thường xuyên phải select đối tượng. Cad đã cung cấp nhiều kiểu Select: P-Previuos; L-last; ...

Giờ mình muốn viết thêm 1 lệnh để select được tập hợp đối tượng cuối cùng được tạo ra.

CAD tạo ra từng đối tượng nên tập hợp cuối cùng chính là đối tượng cuối (ssget "L")

Nếu muốn lấy tất cả các đối tượng dc tạo mới sau 1 lệnh nào đó bạn nghiên cứu cái này thử: http://exchange.auto...6b7ccc-67d2.htm

Good luck!

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

Lấy kiểu đa năng nếu khó thì có khi nào làm vầy dể hơn chút nào không.

-Làm 1 lệnh đánh dấu.

-Làm 1 lệnh lấy các đối tượng mới sinh ra từ thời điểm đánh dấu.

  • 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

Lấy kiểu đa năng nếu khó thì có khi nào làm vầy dể hơn chút nào không.

-Làm 1 lệnh đánh dấu.

-Làm 1 lệnh lấy các đối tượng mới sinh ra từ thời điểm đánh dấu.

Ý tưởng này có lẻ khả thi 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ưởng này có lẻ khả thi nhỉ!

Em có trông cái như thế lâu rồi nhưng ứ làm được = chờ :D. Nhớ xưa bác Hoành với cả bác nào đấy có bàn mớ về vụ này và củng có viết rồi nhưng em ko nạp vào đầu được nên giờ cũng ko nhớ là vấn đề đã giải quyết tới đâu.

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 có trông cái như thế lâu rồi nhưng ứ làm được = chờ :D. Nhớ xưa bác Hoành với cả bác nào đấy có bàn mớ về vụ này và củng có viết rồi nhưng em ko nạp vào đầu được nên giờ cũng ko nhớ là vấn đề đã giải quyết tới đâu.

Ý tưởng trên hoàn toàn có thể làm được.

1. Xây dựng 1 hàm đánh dấu : Là 1 hàm lấy Ename cuối cùng ->

Lưu trữ Ename này vào 1 "chổ đâu đó". Nếu "chỗ đâu đó" đã tồn tại ename thì thay ename cũ bằng ename cuối cùng đó

 

2. Xây dựng hàm lấy đối tượng mới sinh từ thời điểm đánh dấu :

Bằng cách lấy ename ở "chổ đâu đó" và xây dựng hàm lấy đối tượng mới sinh.

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

Về nguyên tắc cơ bản thì trình tự làm như Bác Duy đã nêu.

Hqua em cũng viết thử dựa trên nguyên tắc này. sử dụng reactor theo dõi 2 sự kiện: lispWillStart và CommadWillStart của Vlr-editor-reactor. Tuy nhiên chỉ hoàn thành được 80% yêu cầu vì còn 1 vài điểm chưa giải quyết được. Tối về em post để các bác xem rồi ý kiến gỡ rối giúp em.

@Detailing Mình chưa thử nghiên cứu các sự kiện của vlr-acdb-reactor. Để mình thư xem có lôi ra được gì từ nó khô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

Về nguyên tắc cơ bản thì trình tự làm như Bác Duy đã nêu.

Hqua em cũng viết thử dựa trên nguyên tắc này. sử dụng reactor theo dõi 2 sự kiện: lispWillStart và CommadWillStart của Vlr-editor-reactor. Tuy nhiên chỉ hoàn thành được 80% yêu cầu vì còn 1 vài điểm chưa giải quyết được. Tối về em post để các bác xem rồi ý kiến gỡ rối giúp em.

@Detailing Mình chưa thử nghiên cứu các sự kiện của vlr-acdb-reactor. Để mình thư xem có lôi ra được gì từ nó không.

2 reactor lispWillStart và CommadWillStart theo dõi việc start command của CAD và lisp vậy .Net và ARX thì sao?

vlr-acdb-reactor là reactor theo dõi sự thay đổi của database của bản vẽ (tương tự biến DBmod) -> khi có đối tượng nào tạo ra thì lưu vào list, khi nào xem list xong thì xóa các item của nó đi, bắt đầu lưu lại list mới.

Good luck!

  • 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 reactor lispWillStart và CommadWillStart theo dõi việc start command của CAD và lisp vậy .Net và ARX thì sao?

vlr-acdb-reactor là reactor theo dõi sự thay đổi của database của bản vẽ (tương tự biến DBmod) -> khi có đối tượng nào tạo ra thì lưu vào list, khi nào xem list xong thì xóa các item của nó đi, bắt đầu lưu lại list mới.

Good luck!

Các trường hợp bạn nêu chính là những vấn đề thuộc về số 20% còn lại mà mình chưa giải quyết được nên đành chuyển hướng khác là ... lập topic này :D

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

Rất nhiều lần mình có nhu cầu cần chọn được tập hợp đối tượng gần nhất được sinh ra bởi 1 lệnh nào đó (có thể là lệnh của cad hoặc lệnh của lisp) nên định viết 1 lisp chức năng như vây. nôm na thì nó cũng tương tự (ssget "L") nhưng ra cả đám chứ không chỉ 1 thằng ku cuối cùng.

Tuy nhiên hiện tại mình đang bí về cách thức giải quyết vấn đề đành phải lập topic xin các bác cao kiến để viết nó. Các bác cùng thảo luận nhé.

'Thaistreetz' tham khảo đoạn code của CAB trong BreakAll :

 

CAB - get last entity in datatbase

(defun GetLastEnt ( / ename result )

(if (setq result (entlast))

(while (setq ename (entnext result))

(setq result ename) ) )

result)

;;===================================

;; CAB - return a list of new enames

(defun GetNewEntities (ename / new)

(cond

((null ename) (alert "Ename nil"))

((eq 'ENAME (type ename))

(while (setq ename (entnext ename))

(if (entget ename) (setq new (cons ename new))) ) )

((alert "Ename wrong type.")) )

new

)

;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;; S T A R T S U B R O U T I N E H E R E

;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

(setq LastEntInDatabase (GetLastEnt))

 

Viết lệnh ở đây .

;;==============================================================

(GetNewEntities LastEntInDatabase) ; return list of enames of new objects

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. Xây dựng hàm lấy đối tượng mới sinh từ thời điểm đánh dấu :

Bằng cách lấy ename ở "chổ đâu đó" và xây dựng hàm lấy đối tượng mới sinh.

Cái này thì tương đối đơn giản, chúng ta đã có nhiều lisp từng sử dụng thuật toán này. đây là kết quả em làm được

(defun C:SX (/ last-en lst)

(if (vl-member-if '(lambda (x) (= (vlr-data x) "Acdb Reactor: Select The new Objects")) (cdar (vlr-reactors :vlr-acdb-reactor)))

(if *Last-Objects*

(progn (setq last-en *Last-Objects*) (while (setq last-en (entnext last-en)) (setq lst (cons last-en lst))) (sssetfirst nil (list->ss lst)))

(prompt (TCVN3-Unicode "** Khong co doi tuong moi nao duoc chon (progn

(setq *Last-Objects* nil)

(prompt (TCVN3-Unicode " << bat che do theo doi doi tuong entlast>>"))

(vlr-acdb-reactor "Acdb Reactor: Select The new Objects" '((:vlr-objectAppended . Callback-objectAppended)))))

(princ))

Phần bôi đậm là ý tưởng xây dựng cho ý 1 sau đây

Ý tưởng trên hoàn toàn có thể làm được.

1. Xây dựng 1 hàm đánh dấu : Là 1 hàm lấy Ename cuối cùng -> Lưu trữ Ename này vào 1 "chổ đâu đó". Nếu "chỗ đâu đó" đã tồn tại ename thì thay ename cũ bằng ename cuối cùng đó.

Việc đánh dấu này khi đặt vấn đề thì nghĩ là đơn giản. nhưng thực ra nó không hề dễ 1 chút nào.

Tốt nhất là dùng 1 reactor để làm việc này nếu muốn tự động hóa hoàn toàn, mục đích là để có thể "select the new objecs" bất cứ lúc nào chúng ta muốn trong khi vẽ. Đã có 2 ý tưởng:

 

1 Của mình: Dùng 1 reactor để theo dõi các sự kiện: sự kiện bắt đầu dùng 1 lệnh autocad :VLR-CommandWillStart và sự kiện bắt đầu 1 lệnh lisp :VLR-LispWillStart. khi sảy ra 1 trong 2 sự kiện này thì gọi hàm callback và gán đối tượng cuối cùng cho 1 biến. Hàm callback cho 2 sự kiện này được đại khái như sau:

(defun callback (reactor pramlist) (setq *Object-last* (entlast)) .....);end

Các vấn đề mình chưa giải quyết được khi sử dụng cách trên:

- không biết nó có tác dụng với các lệnh được viết bằng các ngôn ngữ khác hay không hay chỉ có tác dụng với lệnh cad và lệnh lisp, khả năng 99% là không (như Detailing đã nêu)

- Nếu chỉ dùng với lệnh của cad thôi thì coi như xong. ý tưởng đã được thực hiện. nhưng đa số chúng ta ai cũng dùng lisp. Nếu 1 lệnh lisp có bao gồm 1 hoặc nhiều lệnh của cad thì toi rồi.

Cụ thể: Khi lệnh lisp được gọi thì sự kiên VLR-LispWillStart. sảy ra. hàm callback được gọi, biến *object-last* được gán giá trị. tuy nhiên nếu trong quá trình chạy lisp, 1 lệnh của cad được gọi thông quahàm (command "tenlenh") thì sự kiện :VLR-CommandWillStart lại sảy ra và hàm callback lại tiếp tục được gọi *object-last* được gán giá trị mới. cứ như vậy bao nhiêu lần thực hiện hàm command thì sẽ có bấy lần hàm callback được gọi, kết quả là biến *object-last* chỉ là đồ bỏ đi.

- Nếu trường hợp lệnh cad và lệnh lisp không được hoàn thành. người dùng thoát giữa chừng thì *object-last* cũng không dùng được nữa

Túm lại là cách này không dùng được

 

2. Ý tưởng của bác Detailing: theo dõi sự kiện dữ liệu bản vẽ (database) bị thay đổi bằng vlr-acdb-reactor. Cụ thể là sự kiện dữ liệu bản vẽ được ghi thêm đối tượng :vlr-objectAppended mà mình sử dụng ở trên. hàm callback được gọi khi dữ liệu bản vẽ xuất hiện đối tượng mới. nó cũng được viết đại khái giống hàm callback bên trên.

- Cách này càng không được. mình lấy ví dụ thế này cho dễ hiểu: Giả sử mình sử dụng lệnh copy để copy 2 đối tượng. như vậy có 2 lần sự kiện :vlr-objectAppended kết quả là 2 lần hàm callback được gọi và *object-last* sẽ được gán là đối tượng cuối cùng được tạo ra sau lệnh copy, huề cả làng rồi. (entnext *object-last*) = nil

 

Vậy nên mời các bác tiếp tục đóng góp ý kiến :(

@ bác gia_bach: bác hiểu sai ý em giống như bác DVH bên trên. thành thât xin lỗi các bác vì diễn đạt chưa rõ nghĩ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

Bạn xem clip này và load file đính kèm xem có đúng ý ko. Nguyên lý thì đã nói ở trên rồi.

 

http://www.youtube.com/watch?v=aCR6oCnHecA

 

>>Download Here<<

 

Lưu ý:

  • chỉ load file trackingDatabaseChanged.dll (lệnh NETLOAD)
  • cái check box xóa/ko xóa các đối tượng sau khi get selection.

  • Vote tăng 2

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

Nếu như chỉ cần kết quả như bạn đã làm thì vấn đề lại khá đơn giản, mình làm được bằng lisp, nhưng nó không phải là cái mà mình muốn. Có lẽ mình cần phải nói rõ hơn về ý định viết lệnh này của mình để các bác không bị lạc hướng đi nữa nhé:

 

- trong quá trình vẽ mình có nhu cầu chọn được tập hợp đối tượng cuối cùng được sinh ra bởi 1 lệnh trước đó.

- tập hợp đối tượng cuối cùng được sinh ra phải được hiểu là tập hợp được sinh ra bởi 1 lệnh duy nhất (cái của bạn là của rất nhiều lệnh tính từ thời điểm tập hợp đối tượng chọn của bạn ở trạng thái rỗng. thực tế, chúng ta không có nhu đó trong khi vẽ).

- 1 lệnh trước đó: Phải được hiểu là lệnh cuối cùng có phát sinh đối tượng mới chứ không nhất thiết phải là lệnh cuối cùng.

 

ví dụ đơn giản để minh họa:

1. bạn bạn dùng lệnh line để vẽ 1 line: bản vẽ có 1 line

2. bạn dùng lệnh copy để copy line đó thành 2 line: bản vẽ có 3 line (2 đối tượng đươc tạo mới)

3. bạn lại dùng lệnh copy 1 lần nữa để copy 2 line mới đó thành 4 line mới: bản vẽ có 7 line (4 đối tượng được tạo mới)

4. tiếp theo bạn dùng rất nhiều lênh khác, nhưng không có phát sinh đối tượng mới.

5. lúc này bạn có nhu cầu sử dụng 4 đối tượng line ở bước 3. chỉ việc gõ lệnh lệnh trên là chọn được: Tập hợp cuối cùng là 4 đối tượng được tạo bởi lệnh copy ở bước 3.

Yêu cầu bắt buộc của lệnh mình muốn viết: bất kể lúc nào người dùng cần, chỉ cần gõ lệnh là chọn được tập hợp đối tượng mới tạo mà không cần phải thủ công xác định điểm mố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

Nếu như chỉ cần kết quả như bạn đã làm thì vấn đề lại khá đơn giản, mình làm được bằng lisp, nhưng nó không phải là cái mà mình muốn. Có lẽ mình cần phải nói rõ hơn về ý định viết lệnh này của mình để các bác không bị lạc hướng đi nữa nhé:

 

- trong quá trình vẽ mình có nhu cầu chọn được tập hợp đối tượng cuối cùng được sinh ra bởi 1 lệnh trước đó.

- tập hợp đối tượng cuối cùng được sinh ra phải được hiểu là tập hợp được sinh ra bởi 1 lệnh duy nhất (cái của bạn là của rất nhiều lệnh tính từ thời điểm tập hợp đối tượng chọn của bạn ở trạng thái rỗng. thực tế, chúng ta không có nhu đó trong khi vẽ).

- 1 lệnh trước đó: Phải được hiểu là lệnh cuối cùng có phát sinh đối tượng mới chứ không nhất thiết phải là lệnh cuối cùng.

 

ví dụ đơn giản để minh họa:

1. bạn bạn dùng lệnh line để vẽ 1 line: bản vẽ có 1 line

2. bạn dùng lệnh copy để copy line đó thành 2 line: bản vẽ có 3 line (2 đối tượng đươc tạo mới)

3. bạn lại dùng lệnh copy 1 lần nữa để copy 2 line mới đó thành 4 line mới: bản vẽ có 7 line (4 đối tượng được tạo mới)

4. tiếp theo bạn dùng rất nhiều lênh khác, nhưng không có phát sinh đối tượng mới.

5. lúc này bạn có nhu cầu sử dụng 4 đối tượng line ở bước 3. chỉ việc gõ lệnh lệnh trên là chọn được: Tập hợp cuối cùng là 4 đối tượng được tạo bởi lệnh copy ở bước 3.

Yêu cầu bắt buộc của lệnh mình muốn viết: bất kể lúc nào người dùng cần, chỉ cần gõ lệnh là chọn được tập hợp đối tượng mới tạo mà không cần phải thủ công xác định điểm mốc.

Bạn thử file này xem

Load bằng lệnh NETLOAD

lệnh để lấy tập chọn là "ZZ"

 

>>DownLoad Here<<

  • 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ảm ơn Detailing đã nhiệt tình với topic của mình. Tuy nhiên lần này cũng vẫn chưa đạt yêu cầu. không biết có sự khác biệt nào giữa máy của bạn và máy của mình (Cad 2010) hay không? tuy nhiên trên máy của mình tập hợp đối tượng được chọn sau khi gõ lệnh zz vẫn cứ là tập hợp đối tượng được tạo của rất nhiều lênh trước đó.

Cụ thể khi mình test với ví dụ 5 bước như bài số #15 thì tại bước 5 gõ lệnh zz chương trình chọn luôn đủ 7 đối tượng. không fải chỉ 4 đối tượng cuối cù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

Bạn xem lại xem có post nhầm file không. mình down về dùng với 5 bước như trên nó vẫn chọn đủ đám 7 đối tượng bình thường,

Các lệnh mình đã dùng:

- Line (command) : bước 1

- Copy (command trong lisp) : bước 2 và 3 (defun C:C (/ SS) (if (setq SS (ssget))(vl-cmdf "Copy" SS "" "M")(vl-cmdf "Copy" "P" "" "M"))(princ))

- Move (command) :bước 4

Hoặc có thể thuật toán hay ngôn ngữ của bạn dùng không ổn định với các đời cad. mình dùng cad 2010 .net3

  • 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ạn xem lại xem có post nhầm file không. mình down về dùng với 5 bước như trên nó vẫn chọn đủ đám 7 đối tượng bình thường,

Các lệnh mình đã dùng:

- Line (command) : bước 1

- Copy (command trong lisp) : bước 2 và 3 (defun C:C (/ SS) (if (setq SS (ssget))(vl-cmdf "Copy" SS "" "M")(vl-cmdf "Copy" "P" "" "M"))(princ))

- Move (command) :bước 4

Hoặc có thể thuật toán hay ngôn ngữ của bạn dùng không ổn định với các đời cad. mình dùng cad 2010 .net3

Câu hỏi hay, hay ở chổ cái lisp của bạn có cách hoạt động khác với bình thường: start lisp - invoke command (trong lisp) - end lisp - end command (ngoài lisp).

Trường hợp này mình ko ngờ tới. Tuy nhiên mình đã update ở post trên rồi (post #18). Bạn check thử nha.

Enjoy!

  • 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

hà hà. chương trình của Detailing đạt 99% rồi. 1% còn lại hỏng khi có bước 4. cái này lúc trước bạn đã làm được nên mình đoán là có thể sửa được.

 

Vừa hay mình cũng viết xong bằng lisp. Lệnh này thực hiện công việc tưởng chừng đơn giản nhưng không ngờ viết lại phức tạp vậy. đây là lisp khiến mình vất vả nhất để nghĩ ra thuật toán kể từ khi viết lisp đến giờ. Mình phải kết hợp cả 2 ý tưởng của mình và của Detailing mới ra được kết quả này.

;;; Copyright 2012 Thaistreetz from Cadviet.com
(vl-load-com)
(defun C:SX (/ list->ss last-en lst)
(defun list->ss (lst / ss) (setq ss (ssadd)) (foreach s lst (ssadd s ss)))
(if *New-object*
(progn (setq last-en *New-object* lst (list *New-object*)) (while (setq last-en (entnext last-en)) (setq lst (cons last-en lst))) (sssetfirst nil (list->ss lst)))
(prompt "** Khong co doi tuong moi nao duoc tao **"))
(if *Reactor-CmdStart*
(or (vlr-added-p *Reactor-CmdStart*) (vlr-add *Reactor-CmdStart*)
(setq *Reactor-CmdStart* (vlr-editor-reactor "Editor Reactor: Command Start" '((:vlr-Lispwillstart . Callback-CmdStart)(:vlr-commandwillstart . Callback-CmdStart)))))
(setq *Reactor-CmdStart* (vlr-editor-reactor "Editor Reactor: Command Start" '((:vlr-Lispwillstart . Callback-CmdStart)(:vlr-commandwillstart . Callback-CmdStart)))))
(princ))
; Callback defun
(foreach x (cdar (vlr-reactors :vlr-editor-reactor)) (if (= (vlr-data x) "Editor Reactor: Command Start") (vlr-remove x)))
(setq *Reactor-CmdStart* (vlr-editor-reactor "Editor Reactor: Command Start" '((:vlr-Lispwillstart . Callback-CmdStart)(:vlr-commandwillstart . Callback-CmdStart))))
(defun Callback-CmdStart (reactor lst)
(vlr-remove reactor)
(if *Reactor-Append*
(or (vlr-added-p *Reactor-Append*) (vlr-add *Reactor-Append*)
(setq *Reactor-Append* (vlr-acdb-reactor "Acdb Reactor: Select The new Objects" '((:vlr-objectAppended . Callback-objectadd)))))
(setq *Reactor-Append* (vlr-acdb-reactor "Acdb Reactor: Select The new Objects" '((:vlr-objectAppended . Callback-objectadd)))))
(if (eq (vlr-current-reaction-name) :vlr-commandwillstart) (setq *Cmdstart* T) (setq *Cmdstart* nil))) ;end
(defun Callback-objectadd (reactor object)
(vlr-remove reactor)
(setq *New-object* (cadr object))
(if *Cmdstart*
(if *Reactor-CmdEnd*
(or (vlr-added-p *Reactor-CmdEnd*) (vlr-add *Reactor-CmdEnd*)
(setq *Reactor-CmdEnd* (vlr-editor-reactor "Editor Reactor: Command End" '((:vlr-commandEnded . Callback-CmdEnd) (:vlr-commandCancelled . Callback-CmdEnd) (:vlr-commandFailed . Callback-CmdEnd)))))
(setq *Reactor-CmdEnd* (vlr-editor-reactor "Editor Reactor: Command End" '((:vlr-commandEnded . Callback-CmdEnd) (:vlr-commandCancelled . Callback-CmdEnd) (:vlr-commandFailed . Callback-CmdEnd)))))
(if *Reactor-CmdStart*
(or (vlr-added-p *Reactor-CmdStart*) (vlr-add *Reactor-CmdStart*)
(setq *Reactor-CmdStart* (vlr-editor-reactor "Editor Reactor: Command Start" '((:vlr-Lispwillstart . Callback-CmdStart)(:vlr-commandwillstart . Callback-CmdStart)))))
(setq *Reactor-CmdStart* (vlr-editor-reactor "Editor Reactor: Command Start" '((:vlr-Lispwillstart . Callback-CmdStart)(:vlr-commandwillstart . Callback-CmdStart))))))) ;end
(defun Callback-CmdEnd (reactor lst)
(vlr-remove reactor)
(if *Reactor-CmdStart*
(or (vlr-added-p *Reactor-CmdStart*) (vlr-add *Reactor-CmdStart*)
(setq *Reactor-CmdStart* (vlr-editor-reactor "Editor Reactor: Command Start" '((:vlr-Lispwillstart . Callback-CmdStart)(:vlr-commandwillstart . Callback-CmdStart)))))
(setq *Reactor-CmdStart* (vlr-editor-reactor "Editor Reactor: Command Start" '((:vlr-Lispwillstart . Callback-CmdStart)(:vlr-commandwillstart . Callback-CmdStart)))))) ;end

Lisp này sẽ chọn được các đối tượng mới tạo của lệnh cuối cùng bất cứ lúc nào người dùng muốn. không phải lo việc đánh dấu thủ công trước khi có nhu cầu chọn.

Các bác dùng thử xem nó có vướng phải vấn đề nào mà mình chưa ngờ tới hay không. Mình không có điều kiện để kiểm tra với các đối tượng tạo bằng lệnh của các ngôn ngữ lập trình khác nên chưa biết nó có chạy được không. còn với lệnh của cad hoặc lệnh lisp thì thấy có vẻ ổn rồi. Cảm ơn Detailing rất nhiều về đóng góp ý tưởng của bạn.

  • Vote tăng 2

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. Mình post ẩu khi copy không đúng biến. đã sửa

Đọc qua đoạn này của bạn ở bài trước: start lisp - invoke command (trong lisp) - end lisp - end command (ngoài lisp). thì có vẻ như bạn cũng có hướng đi giống như mình để giải quyết vấn đề nan giải này nhỉ. nhức hết cả đầu với nó.

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

E dim thử 1 phát bằng lisp dim nhanh bình thường k thấy chọn lại được ^^

Thử explode 1 Block toàn dim này cũng k thấy chọn lại đượ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

Vừa kiểm tra lại phản hồi của Ketxu. Như vậy có lẽ là với các đối tượng phức thì gặp vấn đề. để mai mình kiểm tra lại vậy. :(

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  

×