Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
28 replies to this topic

#21 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 March 2012 - 11:01 PM

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.
  • 2

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


#22 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 25 March 2012 - 11:39 PM

Mình check thử thì thấy như sau:
Hình đã gửi
  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#23 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 26 March 2012 - 12:04 AM

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ó.
  • 0

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


#24 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 26 March 2012 - 12:18 AM

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


#25 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 26 March 2012 - 12:27 AM

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. :(
  • 0

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


#26 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 26 March 2012 - 07:02 AM

Các đối tượng tạo mới bởi 1 module VBA k được, e đoán có khả năng với arx hoặc Net cũng .....
A Thái muốn ứng dụng lisp này vào việc j thế a ^^
  • 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


#27 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 26 March 2012 - 08:41 AM

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ó.

Code của mình sử dụng các event sau trong code:
  • CommandWillStart ~ :vlr-commandWillStart
  • CommandEnded ~ :vlr-commandEnded
  • LispWillStart ~ :vlr-lispWillStart
  • LispEnded ~ :vlr-lispEnded
  • ObjectAppended ~ :vlr-objectAppended
  • ObjectReappended ~ :vlr-objectReAppended // for undo command
  • ObjectUnappended ~ :vlr-objectUnAppended // for redo command
  • ObjectErased ~ :vlr-objectErased
Ngoài ra mình dùng 2 list để lưu các ent trước và sau khi lisp/command end, để quyết định xem nên lấy list nào là list sẽ trả về nếu user gọi lệnh get selection.
Let me know if you need my Code for reference
Good luck!
p/s: đã test với mấy cái dim thì thấy nó OK hết.

http://www.youtube.com/watch?v=3ga6QpkjSzw
  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#28 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 26 March 2012 - 12:14 PM

Mình đã nghĩ rằng không thể làm được nó. nhưng khi bạn đưa lên Clip đầu tiên thì mình đã thấy có cơ sở để thực hiện được. Nhìn qua các even bạn sử dụng thì đúng là cùng 1 thuật toán để giải, có thể khác nhau chút xíu.

@ketxu: bạn cứ vẽ nhiều thì sẽ thấy lệnh SX mình viết trên là cần thiết. Nếu chưa bao giờ dùng cách này để select đối tượng thì sẽ nghĩ rằng không cần nó bởi chúng ta quen với việc select theo cách khác rồi. Nhưng nếu dùng quen thì thấy...sướng! đỡ được tương đối nhiều thời gian cho việc select đối tượng. Bản thân các lệnh hỗ trợ chọn đối tượng nhanh của cad cũng không có lựa chọn để select loại đối tượng này nên việc viết nó là cần thiết chứ.
Vấn đề dim thì có thể sửa khá đơn giản. nhưng dùng cho các lệnh của ngôn ngữ khác thì chắc là chịu rùi. thôi đành vậy
  • 0

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


#29 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 26 March 2012 - 12:52 PM

các lệnh của ngôn ngữ khác thì chắc là chịu rùi. thôi đành vậy

ngôn ngữ nào cũng sẽ Append Ent vào database cả. catch cái đó là OK
Good luck!
  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341