Đến nội dung


Hình ảnh
* * * - - 1 Bình chọn

LISP : Ánh xạ giá trị đối tượng (thay đổi giá trị nguồn -> Đích cập nhật theo)


  • Please log in to reply
76 replies to this topic

#61 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 08 June 2011 - 10:34 AM

Lisp này quả thật rất hay nhưng làm sao để xoá Link đó đi ạ ? Vì trong thực tế có nhiều bản vẽ người vẽ ko vẽ đúng tỷ lệ, do đó ta phải Scale đi để tính toán cho đúng rùi Scale lại. Làm sao để xoá link đó đi ạ ?

Vậy tốt nhất là bạn đừng dùng link Text nữa. Người ta làm link để phù hợp với việc thay đổi mà :)
  • 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


#62 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 24 February 2012 - 06:08 PM

1 obj_reactor có owner chứa danh sách objname của các đối tượng mà nó liên kết. Vậy có cách nào thêm hoặc bớt objname vào danh sách này không?
Hàm vlr-owner-remove: (vlr-owner-remove obj_reactor notifier-object) không làm được điều này hoặc có thể mình đã hiểu sai cách thức sử dụng nó. Cụ thể:
- Mình gắn cho đối tượng 1 rector theo dỗi sự kiện đối tượng bị xóa.
- Rector này gọi tới hàm callback thực hiện hàm: (setq obj_reactor (vlr-owner-remove obj_reactor notifier-object)) (ở đây hàm callback gắn objname của đối tượng bị xóa cho đối số notifier-object)
- Sau khi thực hiện xong việc xóa đối tượng, nghĩa là hàm callback trên đã được thực hiện, kiểm tra lại owner của obj_reactor vẫn thấy tồn tại objname của đối tượng đã xóa trên.

Bác Gia_Bach hay bác nào nắm vững về rector trợ giúp mình với.
Mục đích của mình là tạo hàm callback gắn với sự kiện đối tượng bị xóa. nếu đối tượng bị xóa chứa 1 rector nào đó thì hàm tự động loại bỏ rector của nó trước khi xóa, nhưng không loại bỏ liên kết của các đối tượng khác cùng nhóm liên kết với nó.
  • 0

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


#63 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 25 February 2012 - 03:21 PM

1 obj_reactor có owner chứa danh sách objname của các đối tượng mà nó liên kết. Vậy có cách nào thêm hoặc bớt objname vào danh sách này không?
Hàm vlr-owner-remove: (vlr-owner-remove obj_reactor notifier-object) không làm được điều này hoặc có thể mình đã hiểu sai cách thức sử dụng nó. Cụ thể:
- Mình gắn cho đối tượng 1 rector theo dỗi sự kiện đối tượng bị xóa.
- Rector này gọi tới hàm callback thực hiện hàm: (setq obj_reactor (vlr-owner-remove obj_reactor notifier-object)) (ở đây hàm callback gắn objname của đối tượng bị xóa cho đối số notifier-object)
- Sau khi thực hiện xong việc xóa đối tượng, nghĩa là hàm callback trên đã được thực hiện, kiểm tra lại owner của obj_reactor vẫn thấy tồn tại objname của đối tượng đã xóa trên.

Bác Gia_Bach hay bác nào nắm vững về rector trợ giúp mình với.
Mục đích của mình là tạo hàm callback gắn với sự kiện đối tượng bị xóa. nếu đối tượng bị xóa chứa 1 rector nào đó thì hàm tự động loại bỏ rector của nó trước khi xóa, nhưng không loại bỏ liên kết của các đối tượng khác cùng nhóm liên kết với nó.

Thaistreetz tham khảo lisp EraseAndDisconnect

(vl-load-com)
(defun c:EraseAndDisconnect ( / allReactorsLst obj removeLst)
(if (setq obj (vlax-ename->vla-object (car (entsel))))
(progn
(mapcar
'(lambda (a / ownLst)
(setq ownLst (vlr-owners a))
(cond
((and (member obj ownLst) (= (length ownLst) 1))
(vlr-remove a) )
((member obj ownLst)
(vlr-owner-remove a obj) ) ) )
(apply 'append (mapcar 'cdr (vlr-reactors :vlr-object-reactor))) )
(setq allReactors (apply 'append (mapcar 'cdr (vlr-reactors))))
(mapcar 'vlr-remove allReactors) ; temporarily disable all reactors
(vla-delete obj)
(mapcar 'vlr-add allReactors) ))
(princ))
(defun c:LinkR (/ ss objlst obj_reactor); Link Radius
(if (setq ss (ssget '((0 . "CIRCLE"))) )
(setq objlst (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
obj_reactor (vlr-object-reactor objlst nil '((:vlr-modified . callback)))) ) )
(defun callback (notifier-object obj_reactor parameter-list / objlist newrad)
(setq objlist (vlr-owners obj_reactor))
(setq newrad (vla-get-radius notifier-object))
(foreach obj objlist
(if (/= (vla-get-radius obj)newrad)
(vla-put-radius obj newrad) ) ) )

  • 1

#64 enix

enix

    biết vẽ ellipse

  • Members
  • PipPip
  • 56 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 13 April 2012 - 10:06 AM

Em dùng lisp link text của bác GiaBach thì nó ko chạy, file đích chỉ hiện thị #### chứ ko chạy theo file nguồn bác ơi.
Còn cái lisp đã chỉnh sửa sao cho khi tắt bản vẽ mở lại vẫn giữ link thì lại ko phản ứng gì cả.
Ah em xài AutoCAD 2013.
  • 0

#65 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 13 April 2012 - 10:46 AM

Lisp ánh xạ text thì liên quan gì đến file ở đây ? Có phải bạn đang dùng CAD 64bit ?
  • 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


#66 dung_can

dung_can

    biết pan

  • Members
  • Pip
  • 9 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 16 June 2012 - 03:09 PM

(defun C:L2T (/ OBJLINE SS OBJLST OBJ;|OBJ-REACTOR|;)
(vl-load-com)
(setq OBJLINE (vlax-ename->vla-object (car (entsel "\nChon duong thang nguon: "))))
(while (/= (vla-get-objectname OBJLINE) "AcDbLine")
(setq OBJLINE (vlax-ename->vla-object (car (entsel "\nChon duong thang nguon: "))))
)
(princ "\nChon cac text dich: ")
(setq SS (ssget '((0 . "TEXT"))))
(setq OBJLST (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex SS)))))
(foreach OBJ OBJLST
(vla-put-textstring OBJ (rtos (* (vla-get-length OBJLINE) (getvar "DIMLFAC"))))
)
(setq OBJLST (append OBJLST (list OBJLINE)))
(if (and OBJ-REACTOR (vlr-added-p OBJ-REACTOR))
(vlr-remove OBJ-REACTOR)
)
(setq OBJ-REACTOR
(vlr-pers
(vlr-object-reactor OBJLST
NIL
'((:vlr-modified . UPDATETEXT)
(:vlr-erased . ERASEENT)
)
)
)
)
(princ (strcat "\nDa link duong thang voi " (itoa (sslength SS)) " text"))
(princ)
)
(defun UPDATETEXT (NOTIFIER-OBJECT OBJ-REACTOR PARAMETER-LIST / OBJLST OBJ)
(setq *ERROR* REACTOR-ERR)
(if (= (vla-get-objectname NOTIFIER-OBJECT) "AcDbLine")
(progn
(princ (strcat "\nTy le 1/" (rtos (getvar "DIMLFAC"))))
(setq OBJLST (vlr-owners OBJ-REACTOR))
(foreach OBJ OBJLST
(if (= (vla-get-objectname OBJ) "AcDbText")
(vla-put-textstring OBJ (rtos (* (vla-get-length NOTIFIER-OBJECT) (getvar "DIMLFAC"))))
)
)
)
)
(setq *ERROR* NIL)
)
(defun ERASEENT (NOTIFIER-OBJECT OBJ-REACTOR PARAMETER-LIST / OBJLST)
(alert "Ban da thuc hien lenh Erase tu doi tuong REACTOR.\nCac doi tuong khong con link voi nhau!")
(vlr-owner-remove OBJ-REACTOR NOTIFIER-OBJECT)
(vlr-remove OBJ-REACTOR)
(princ)
)
(defun REACTOR-ERR (MSG)
(cond ((= MSG "Automation Error. Object was open for undo") (princ "\nObject was open for undo"))
((= MSG "Automation Error. Object was erased") (princ "\nObject was erased"))
((= MSG "quit / exit abort") (princ "\t\texit"))
(t (progn (princ MSG) (princ)))
)
(setq *ERROR* NIL)
(princ)
)

Chào các bác,
Bác Master Worse viết đoạn lisp tự động cập nhật chiều dài LINE khi LINE thay đổi rất hay. Khi em thống kê kích thước các chi tiết vào 1 bảng, lúc cập nhật được 1 LINE rồi chuyển sang LINE tiếp theo thì LINE trước không thực hiện được nữa. Em lại muốn sự cập nhật ấy giữ lại ở tất cả các LINE trong file ấy.
Mong các bác giúp đỡ.
  • 0

#67 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 16 June 2012 - 05:35 PM

Bác ấy viết trên Reactor và chỉ gán cho 1 đối tượng. Bài toán của bạn sẽ cực kỳ dễ nếu dùng Field
  • 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


#68 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 16 June 2012 - 07:42 PM

code này có chạy được đâu nhỉ. nó lỗi ngay từ khi chọn đối tượng mà.

(setq OBJLINE (vlax-ename->vla-object (car (entsel "\nChon duong thang nguon: "))))
(while (/= (vla-get-objectname OBJLINE) "AcDbLine")
(setq OBJLINE (vlax-ename->vla-object (car (entsel "\nChon duong thang nguon: ")))))

(vlax-ename->vla-object nil) => ; error: bad argument type: lentityp nil

Cũng thật khó hiểu cho đoạn code này của Master Worse để select đối tượng :mellow:

Code này có rất nhiều lỗi xử lý reactor, về khía cạnh người dùng thì bạn chỉ nhìn thấy kết quả. nhưng phía sau nó là rất nhiều lỗi sảy ra có thể gây ảnh hưởng đến cad của bạn, và sẽ đặc biệt nghiêm trọng nếu bạn có sử dụng các chương trình khác có sử dụng reactor. vì thế khuyên bạn ko lên dùng code này.
  • 1

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


#69 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 16 June 2012 - 08:00 PM

code này có chạy được đâu nhỉ. nó lỗi ngay từ khi chọn đối tượng mà.

(setq OBJLINE (vlax-ename->vla-object (car (entsel "\nChon duong thang nguon: "))))
(while (/= (vla-get-objectname OBJLINE) "AcDbLine")
(setq OBJLINE (vlax-ename->vla-object (car (entsel "\nChon duong thang nguon: ")))))
(vlax-ename->vla-object nil) => ; error: bad argument type: lentityp nil
Cũng thật khó hiểu cho đoạn code này của Master Worse để select đối tượng :mellow:

Đúng là như thế! Đoạn code đó nếu xui xẻo lần đầu chọn không trúng đối tượng thì lỗi.
Nếu muốn chọn chừng nào được 1 Line thì thôi, chắc phải viết kiểu như vầy:
(while (or (not (setq ent (car (entsel "\nChon 1 Line: ")))) (/= "LINE" (cdr (assoc 0 (entget ent))))))
  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#70 Chiron

Chiron

    biết dimradius

  • Members
  • PipPipPipPipPip
  • 310 Bài viết
Điểm đánh giá: 90 (tàm tạm)

Đã gửi 28 June 2012 - 02:43 PM

Lisp ánh xạ text thì liên quan gì đến file ở đây ? Có phải bạn đang dùng CAD 64bit ?

Hình như CAD64bit không dùng được linkA của bác gia_bach? Mình đã thử trên 2 bản, CAD 32bit thì bình thường. Ketxu có thể giải thích vì sao không và cách khắc phục?
  • 0

#71 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 28 June 2012 - 02:52 PM

Field muốn lấy được thuộc tính của đối tượng để link (ở đây là Contents = nội dung) thì trước tiên nó phải lấy được mã hiệu của đối tượng đó, hay còn gọi là ObjectId.
Cad 64bit thì hàm lấy ObjectId có khác 1 chút so với CAd32 bit => Chỉ cần sửa 1 tí tẹo lisp bác gia_bach là ổn với các đời CAD. Mình đang ở chỗ k có CAD để viết, bạn hãy chờ bác nào đó viết hộ bạn nhé
  • 2

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


#72 xuandao0708

xuandao0708

    biết lệnh scale

  • Members
  • PipPipPip
  • 140 Bài viết
Điểm đánh giá: 8 (bình thường)

Đã gửi 15 October 2012 - 09:56 AM

Nhờ mọi người nghiên cứu thêm dùm em phần ánh xạ hiệu, phần ánh xạ tổng thì rất được rồi, nhưng hiện nay do em phải làm nhiều phần hiệu trừ nên khi trừ nhiều diện tích thì rất dể bị nhầm này nhờ mọi người quan tâm dùm. Thank!
Đây là file cad mẫu:
http://www.cadviet.c...hieu_anh_xa.dwg
  • 0

#73 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 15 October 2012 - 10:47 AM

Nhờ mọi người nghiên cứu thêm dùm em phần ánh xạ hiệu, phần ánh xạ tổng thì rất được rồi, nhưng hiện nay do em phải làm nhiều phần hiệu trừ nên khi trừ nhiều diện tích thì rất dể bị nhầm này nhờ mọi người quan tâm dùm. Thank!
Đây là file cad mẫu:
http://www.cadviet.c...hieu_anh_xa.dwg

Xuan dao đọc các bài viết ở đây nhé!
Link: http://www.cadviet.c...showtopic=40442
  • 1

#74 xuandao0708

xuandao0708

    biết lệnh scale

  • Members
  • PipPipPip
  • 140 Bài viết
Điểm đánh giá: 8 (bình thường)

Đã gửi 15 October 2012 - 03:49 PM

Thank Tue_VN nhiều! Tại hồi sáng tìm mà không thấy bài này.
  • 0

#75 thonggtcc

thonggtcc

    biết zoom

  • Members
  • Pip
  • 18 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 31 October 2012 - 01:33 PM

Nhân đọc bài ánh xạ giá trị nguồn, giá trị đích thay đổi theo. Mình có bài toán thế này mong mọi người giúp đở:
Mình tạo 1 block thuộc tính. Khi đặt Block đó tại 1 vị trí cố định (nguồn). Nhập thủ công giá trị tọa độ hoặc khoảng cách mới thì Block tự động dịch chuyển (hoặc copy) sang tọa độ mới vừa đưa vào. (Xem file đính kèm).
Thanks.
  • 0

#76 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 31 October 2012 - 05:27 PM

Không có file đính kèm bạn ạ. Bài toán xuôi thì có vẻ hơi khó nhưng mình nghĩ sao bạn không đặt vấn đề ngược lại nhỉ? dễ giải quyết hơn nhiều: Viết 1 lisp để chèn 1 block vào bản vẽ với giá trị tọa độ nhập vào (có thể là từ hộp thoại hoặc đơn giản hơn là nhập ngay tại dòng lệnh)
  • 1

#77 thonggtcc

thonggtcc

    biết zoom

  • Members
  • Pip
  • 18 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 01 November 2012 - 09:31 AM

"Không có file đính kèm bạn ạ. Bài toán xuôi thì có vẻ hơi khó nhưng mình nghĩ sao bạn không đặt vấn đề ngược lại nhỉ? dễ giải quyết hơn nhiều: Viết 1 lisp để chèn 1 block vào bản vẽ với giá trị tọa độ nhập vào (có thể là từ hộp thoại hoặc đơn giản hơn là nhập ngay tại dòng lệnh) "

Vì công việc mình chỉ có đến thế thôi nên mình chưa nghĩ đến. Nếu được bạn có thể phát triển bài toán theo cả 2 hướng giúp mình. Thanks
Đây là file đính kèm:http://www.cadviet.c...toado_block.dwg
  • 0