Chuyển đến nội dung
Diễn đàn CADViet
gia_bach

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

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

Chào master_worse

Rất tiếc là lệnh FIELD trong CAD chưa cho phép làm điều này.

 

Gửi bạn LISP link text đã cập nhật phần liên kết sau khi đóng bản vẽ .

chú ý : để liên kết đuợc thưc hiện, list phải đuợc Appload truớc khi sử dụng (đưa list vào mục Startup Suite)

(defun c:LinkT (/ ss objlst ); Link Text
 (if (setq ss (ssget  '((0 . "TEXT"))) )	
   (progn
     (vl-load-com)
     (setq objlst (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))))
     (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 . LinkText)
							     (:vlr-erased . eraseEnt)  ))))
     (princ (strcat "\n   Da thuc hien Link " (itoa(sslength ss)) " Text voi nhau !"
	     "\n   Goi lenh Edit Text (ddedit) de cap nhat gia tri."))
     (princ)
     )
   )
 )
(defun LinkText (notifier-object obj_reactor parameter-list / objlist str)
 (setq objlist (vlr-owners obj_reactor)
str (vla-get-TextString notifier-object))
 (foreach obj objlist
   (if (/= (vla-get-TextString obj)str)
     (vla-put-TextString obj str)
     )
   )
 )
(defun eraseEnt (notifier-object obj_reactor parameter-list)
 (alert "Ban da thuc hien lenh Erase tu doi tuong REACTOR.\nLinkText da bi huy bo : Cac Text khong con Link voi nhau !")
 (vlr-owner-remove  obj_reactor notifier-object)
 (vlr-remove obj_reactor)
 (princ)
 )

 

Lisp rất hay, nhưng cho mình hỏi tý, Gia_bach có thể chỉnh lại như lệnh "field" của cad được không? (cụ thể là: đối tượng nguồn thay đổi thì đối tượng đích thay đổi theo nhưng thêm "background color" làm mờ đối tượng đích bằng lớp màu trắng sữa phủ lên đối tượng để khỏi nhầm lẫn). Cảm ơn gia_ bach

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
Lisp rất hay, nhưng cho mình hỏi tý, Gia_bach có thể chỉnh lại như lệnh "field" của cad được không? (cụ thể là: đối tượng nguồn thay đổi thì đối tượng đích thay đổi theo nhưng thêm "background color" làm mờ đối tượng đích bằng lớp màu trắng sữa phủ lên đối tượng để khỏi nhầm lẫn). Cảm ơn gia_ bach

trong lisp nay: các đối tượng này được liên kết với nhau một đối tựơng đổi thì các đối tựơng khác cùng đổi theo (không có nguồn và đích)

 

 

Tiền bối gia_bach cho em hỏi có cách nào để không cho edit trực tiếp một đối tượng không(để dùng làm đối tượng đích)

hiện tại em chỉ xác định đối tựong đích rồi đặt dkiện để cac đối tượng khác không bị thay đổi khi tựong đích bị thay đổi thôi :bigsmile:

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ó thể chỉnh lại như lệnh "field" của cad được không? (cụ thể là: đối tượng nguồn thay đổi thì đối tượng đích thay đổi theo nhưng thêm "background color" làm mờ đối tượng đích bằng lớp màu trắng sữa phủ lên đối tượng để khỏi nhầm lẫn).

Do CAD không hổ trợ thuộc tính "background color" cho đối tượng TEXT -> chưa tìm đuợc cách thích hợp để làm mờ đối tượng đích.

 

 

.......

có cách nào để không cho edit trực tiếp một đối tượng không(để dùng làm đối tượng đích)

hiện tại em chỉ xác định đối tựong đích rồi đặt dkiện để cac đối tượng khác không bị thay đổi khi tựong đích bị thay đổi thôi :bigsmile:

Trong t/hợp này bạn có thể xét thêm 1 điều kiện thuộc tính nào đó để phân biệt nguồn và đích.

Vd: đưa đối tuợng nguồn vào layer có tên xác định, đối tuợng đích ở layer bình thuờng. viết hàm đáp ứng điều kiện tên Layer của đối tuợng trùng với layer cho truớc thì mới xử lý "LinkText"

(defun LinkText (notifier-object obj_reactor parameter-list / objlist str)
 (if (= (vla-get-Layer notifier-object) "Layer_nguon"); vd : ten layer = "Layer_nguon"
   (progn
     (setq objlist (vlr-owners obj_reactor)
    str (vla-get-TextString notifier-object))
     (foreach obj objlist
(if (/= (vla-get-TextString obj)str)
  (vla-put-TextString obj str)
  )
)
     )
   )
 )

  • Vote tăng 3

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

(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)
)

 

tiền bối gia_bach từ các hướng dẫn của tiền bối, em viết cái lisp này

tiền bối cho em hỏi thêm chút nha

- PARAMETER-LIST sử dụng làm gì?

- mình có thể thêm đối số cho các hàm callback không?

-------------------------

26/10/2009

có cách nào xác định một đối tượng là reactor (an object from the list of owners of an object reactor)

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
......................... cho em hỏi thêm chút nha

- PARAMETER-LIST sử dụng làm gì?

- mình có thể thêm đối số cho các hàm callback không?

-------------------------

26/10/2009

có cách nào xác định một đối tượng là reactor (an object from the list of owners of an object reactor)

- PARAMETER-LIST sử dụng làm gì?

tạm dịch từ Help của CAD : PARAMETER-LIST : danh sách các phần tử dữ liệu có liên quan đến sự kiện cụ thể. Các thành phần của danh sách này đuợc cho trong bảng “Object Events Callback Data”

thực sự thì tui cũng không hiểu rõ tham số này! pótay :tongue2:

- mình có thể thêm đối số cho các hàm callback không?

hàm callback chỉ chấp nhận 3 tham số : owner , reactor_objectPARAMETER-LIST như bạn đã biết.

 

Để xác định một đối tượng là reactor bạn dùng hàm vlr-owners

trong ví dụ của bạn, gọi (vlr-owners OBJ-REACTOR) sẽ trả về các đối tuợng VLA, trong t/hợp này là IAcadText .

  • 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
Để xác định một đối tượng là reactor bạn dùng hàm vlr-owners

trong ví dụ của bạn, gọi (vlr-owners OBJ-REACTOR) sẽ trả về các đối tuợng VLA, trong t/hợp này là IAcadText .

 

Cho em hỏi thêm chút nữa là: hàm (vlr-owners OBJ-REACTOR) trả về các đối tuợng VLA, nếu ngược lại thì sử dụng hàm gì? (hàm??? VLA-OBJ) trả về OBJ-REACTOR

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
Cho em hỏi thêm chút nữa là: hàm (vlr-owners OBJ-REACTOR) trả về các đối tuợng VLA, nếu ngược lại thì sử dụng hàm gì? (hàm??? VLA-OBJ) trả về OBJ-REACTOR

Bạn đọc trong Help đó : các hàm bắt đầu bằng vlr-***

 

vlr-type : Returns a symbol representing the reactor type

vlr-types : Returns a list of all reactor types

 

Chú ý các hàm vlr-***-reactor

  • 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

LSP ánh xạ rất hay khi dùng tính diện tích và ADD vào Block thuộc tính để sau đó xuất ra file số liệu. Nhưng nó không dùng được thuộc tính diện tích của "HATCH".

Hy vọng các bác bổ sung thêm phần nầy vào lsp và cho luôn biến tỉ lệ khi tính diện tích. Thanks.

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

Nhưng nó không dùng được thuộc tính diện tích của "HATCH".

Hy vọng các bác bổ sung thêm phần nầy vào lsp và cho luôn biến tỉ lệ khi tính diện tích. Thanks.

Bổ sung tính diện tích của "HATCH" và tỉ lệ khi tính diện tích.

(defun c:LinkA (/ ss_ent ent ss e cmd sole tile Suff Pref);Link Area
 (if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1) ;;;AutoCAD 2006 16.2
   (progn
     (vl-load-com)
     (command "_.undo" "_begin")
     (setq cmd (getvar "cmdecho"))
     (setvar "cmdecho" 0)
     (princ "\nChon doi tuong lay Dien tich : ")
     (if (setq ss_ent (ssget "_:S:E" '((0 . "*POLYLINE,ARC,SPLINE,ELLIPSE,CIRCLE,HATCH"))) )
(progn
  (setq ent (vlax-ename->vla-object (ssname ss_ent 0)))
  (princ "\nChon Text can Link gia tri Dien tich : ")
  (setq ss (ssget (list (cons 0 "*TEXT")) ))
  (setq sole (getvar "Luprec"));so le
  (or *tile* (setq *tile* 1));ti le
  (initget 6)
  (setq tile (getreal (strcat "\nNhap ti le <" (rtos *tile*) ">: ")))
  (if tile (setq *tile* tile)(setq tile *tile*))
  (setq Pref "S=")
  (setq Suff " mm2")
  (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
    (vla-put-TextString
      (vlax-ename->vla-object e)
      (strcat "%<\\AcObjProp Object(%<\\_ObjId "
	      (vl-princ-to-string (vla-get-ObjectId ent) )
	      ">%).Area \\f \"%lu2%ps[" Pref "," Suff "]%pr" (itoa sole) "%ct8[" (vl-princ-to-string tile) "]\">%"
	      )
      )
    )
  )
(alert "\nDoi tuong da chon khong co Dien tich !")
)
     (setvar "cmdecho" cmd)
     (command "_.undo" "_end")(princ)
     )
   (alert "\nChi chay tren Autocad 2006-2010")
   )
 )

  • 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
Chào các bạn

Nhân đọc bài Ánh xạ giá trị đối tượng text, nguồn đổi giá trị, đích bị sửa của bác Hoành,

xin gửi các bạn LISP : Ánh xạ giá trị đối tượng gồm

1 . LinkT : Ánh xạ giá trị Text

2 . LinkA : Ánh xạ giá trị Diện tích

chú ý : khi sửa giá trị ở đối tượng nguồn, đối tượng đích (text) chỉ update sau khi sử dụng lệnh REGEN, SAVE, PLOT, ...

(defun c:LinkT (/ ss_ent ent ss e cmd);Link Text
 (if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1) ;;;AutoCAD 2006 16.2
   (progn
     (vl-load-com)
     (command "_.undo" "_begin")
     (setq cmd (getvar "cmdecho"))
     (setvar "cmdecho" 0)
     (and (princ "\nChon Text goc : ")
   (setq ss_ent (ssget "_:S:E" '((0 . "TEXT"))) )
   (setq ent (vlax-ename->vla-object (ssname ss_ent 0)))
   (princ "\nChon Text can Link gia tri tu Text goc : ")
   (setq ss (ssget (list (cons 0 "TEXT")) ))
   (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
     (vla-put-TextString
       (vlax-ename->vla-object e)
       (strcat"%<\\AcObjProp Object(%<\\_ObjId "(vl-princ-to-string (vla-get-ObjectId ent)) ">%).TextString >%")
       )
     )
   )
     (setvar "cmdecho" cmd)
     (command "_.undo" "_end")(princ)
     )
   (alert "\nChi chay tren Autocad 2006-2010")
   )
 )

(defun c:LinkA (/ ss_ent ent ss e cmd sole tile Suff Pref);Link Area
 (if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1) ;;;AutoCAD 2006 16.2
   (progn
     (vl-load-com)
     (command "_.undo" "_begin")
     (setq cmd (getvar "cmdecho"))
     (setvar "cmdecho" 0)
     (and (princ "\nChon doi tuong lay Dien tich : ")
   (setq ss_ent (ssget "_:S:E" '((0 . "*POLYLINE,ARC,SPLINE,ELLIPSE,CIRCLE"))) )
   (setq ent (vlax-ename->vla-object (ssname ss_ent 0)))
   (princ "\nChon Text can Link gia tri Dien tich : ")
   (setq ss (ssget (list (cons 0 "TEXT")) ))
   (setq sole (getvar "Luprec"));so le
   (setq tile 1);ti le
   (setq Pref "S=")
   (setq Suff " mm2")
   (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
     (vla-put-TextString
       (vlax-ename->vla-object e)
       (strcat "%<\\AcObjProp Object(%<\\_ObjId "
	       (vl-princ-to-string (vla-get-ObjectId ent) )
	       ">%).Area \\f \"%lu2%ps[" Pref "," Suff "]%pr" (itoa sole) "%ct8[" (vl-princ-to-string tile) "]\">%"
	       )
       )
     )
   )
     (setvar "cmdecho" cmd)
     (command "_.undo" "_end")(princ)
     )
   (alert "\nChi chay tren Autocad 2006-2010")
   )
 )

Anh ơi cái này áp dụng cho cad 2007 được không vậy? Em áp dụng sảy ra trường hợp như sau: chọn đối tượng nguồn, sau đó chọn các

đối tượng muốn link rồi. Sau đó thì các text được chọn bị ẩn hết. Thay đổi giá trị nguồn, sau đó regen lại nhưng vẫn không thấy các đối tượng

text bị ẩn hiện lên và thay đổi.

Mong anh giải thích dùm. Cảm ơn anh.

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
Chào các bạn

Nhân đọc bài Ánh xạ giá trị đối tượng text, nguồn đổi giá trị, đích bị sửa của bác Hoành,

xin gửi các bạn LISP : Ánh xạ giá trị đối tượng gồm

1 . LinkT : Ánh xạ giá trị Text

2 . LinkA : Ánh xạ giá trị Diện tích

chú ý : khi sửa giá trị ở đối tượng nguồn, đối tượng đích (text) chỉ update sau khi sử dụng lệnh REGEN, SAVE, PLOT, ...

(defun c:LinkT (/ ss_ent ent ss e cmd);Link Text
 (if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1) ;;;AutoCAD 2006 16.2
   (progn
     (vl-load-com)
     (command "_.undo" "_begin")
     (setq cmd (getvar "cmdecho"))
     (setvar "cmdecho" 0)
     (and (princ "\nChon Text goc : ")
   (setq ss_ent (ssget "_:S:E" '((0 . "TEXT"))) )
   (setq ent (vlax-ename->vla-object (ssname ss_ent 0)))
   (princ "\nChon Text can Link gia tri tu Text goc : ")
   (setq ss (ssget (list (cons 0 "TEXT")) ))
   (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
     (vla-put-TextString
       (vlax-ename->vla-object e)
       (strcat"%<\\AcObjProp Object(%<\\_ObjId "(vl-princ-to-string (vla-get-ObjectId ent)) ">%).TextString >%")
       )
     )
   )
     (setvar "cmdecho" cmd)
     (command "_.undo" "_end")(princ)
     )
   (alert "\nChi chay tren Autocad 2006-2010")
   )
 )

(defun c:LinkA (/ ss_ent ent ss e cmd sole tile Suff Pref);Link Area
 (if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1) ;;;AutoCAD 2006 16.2
   (progn
     (vl-load-com)
     (command "_.undo" "_begin")
     (setq cmd (getvar "cmdecho"))
     (setvar "cmdecho" 0)
     (and (princ "\nChon doi tuong lay Dien tich : ")
   (setq ss_ent (ssget "_:S:E" '((0 . "*POLYLINE,ARC,SPLINE,ELLIPSE,CIRCLE"))) )
   (setq ent (vlax-ename->vla-object (ssname ss_ent 0)))
   (princ "\nChon Text can Link gia tri Dien tich : ")
   (setq ss (ssget (list (cons 0 "TEXT")) ))
   (setq sole (getvar "Luprec"));so le
   (setq tile 1);ti le
   (setq Pref "S=")
   (setq Suff " mm2")
   (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
     (vla-put-TextString
       (vlax-ename->vla-object e)
       (strcat "%<\\AcObjProp Object(%<\\_ObjId "
	       (vl-princ-to-string (vla-get-ObjectId ent) )
	       ">%).Area \\f \"%lu2%ps[" Pref "," Suff "]%pr" (itoa sole) "%ct8[" (vl-princ-to-string tile) "]\">%"
	       )
       )
     )
   )
     (setvar "cmdecho" cmd)
     (command "_.undo" "_end")(princ)
     )
   (alert "\nChi chay tren Autocad 2006-2010")
   )
 )

Sao không bác nào ghé qua trả lời giúp em cái nhỉ? em thực hiện mãi ko được mà cái này em thấy rất hay. Ứng dụng được nhiều trong công việc. Mong các bác giải thích dùm tại sao lại sảy ra hiện tượng trê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

Bổn hiệu em chỉ làm giờ hành chánh thôi các bác ạ.

Ngoài giờ phải tranh thủ "tăng ca" bác á.

 

Đừng dowload bằng cách click vào Download lisp file.

(chức năng này của diễn đàn đang bị lỗi)

Bạn copy toàn bộ text trong mục CODEBOX và luu thành file *.lsp.

 

Tham khảo : http://www.cadviet.com/forum/index.php?sho...ost&p=81489

[/quote

Cảm ơn anh. Tối qua em tìm ra rồi.

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ổ sung tính diện tích của "HATCH" và tỉ lệ khi tính diện tích.

(defun c:LinkA (/ ss_ent ent ss e cmd sole tile Suff Pref);Link Area
 (if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1) ;;;AutoCAD 2006 16.2
   (progn
     (vl-load-com)
     (command "_.undo" "_begin")
     (setq cmd (getvar "cmdecho"))
     (setvar "cmdecho" 0)
     (princ "\nChon doi tuong lay Dien tich : ")
     (if (setq ss_ent (ssget "_:S:E" '((0 . "*POLYLINE,ARC,SPLINE,ELLIPSE,CIRCLE,HATCH"))) )
(progn
  (setq ent (vlax-ename->vla-object (ssname ss_ent 0)))
  (princ "\nChon Text can Link gia tri Dien tich : ")
  (setq ss (ssget (list (cons 0 "*TEXT")) ))
  (setq sole (getvar "Luprec"));so le
  (or *tile* (setq *tile* 1));ti le
  (initget 6)
  (setq tile (getreal (strcat "\nNhap ti le <" (rtos *tile*) ">: ")))
  (if tile (setq *tile* tile)(setq tile *tile*))
  (setq Pref "S=")
  (setq Suff " mm2")
  (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
    (vla-put-TextString
      (vlax-ename->vla-object e)
      (strcat "%<\\AcObjProp Object(%<\\_ObjId "
	      (vl-princ-to-string (vla-get-ObjectId ent) )
	      ">%).Area \\f \"%lu2%ps[" Pref "," Suff "]%pr" (itoa sole) "%ct8[" (vl-princ-to-string tile) "]\">%"
	      )
      )
    )
  )
(alert "\nDoi tuong da chon khong co Dien tich !")
)
     (setvar "cmdecho" cmd)
     (command "_.undo" "_end")(princ)
     )
   (alert "\nChi chay tren Autocad 2006-2010")
   )
 )

Bác ơi em chạy trên Cad 2005 và 2007 nó ko nhận, nhờ các bác sửa giúp em với.

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

Nhân tiện đây nhờ Bác chỉnh sữa dùm em 1 chút về lips LinkT như sau:

- Khi chọn đối tượng nguồn thì mình có thể chọn được nhiều đối tượng nguồn cho 1 đối tượng đích.

- Khi copy 1 đối tượng nguồn thì đối tượng mới được copy vẫn được hiểu là 1 phần đối tượng nguồi của đối tượng đích mà mình vừa copy.

Cá mơn Bác nhiề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

Nhân tiện đây nhờ mọi người chỉnh sửa dùm em 1 chút về lips LinkT như sau:

- Khi chọn đối tượng nguồn thì mình có thể chọn được nhiều đối tượng nguồn cho 1 đối tượng đích.

- Khi copy 1 đối tượng nguồn thì đối tượng mới được copy vẫn được hiểu là 1 phần đối tượng nguồi của đối tượng đích mà mình vừa copy.

Cá mơn Bác nhiều!

Đây là file cad mẫu: http://www.cadviet.c...mau_cadviet.dwg

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

Nhân tiện đây nhờ mọi người chỉnh sửa dùm em 1 chút về lips LinkT như sau:

- Khi chọn đối tượng nguồn thì mình có thể chọn được nhiều đối tượng nguồn cho 1 đối tượng đích.

- Khi copy 1 đối tượng nguồn thì đối tượng mới được copy vẫn được hiểu là 1 phần đối tượng nguồi của đối tượng đích mà mình vừa copy.

Cá mơn Bác nhiều!

Đây là file cad mẫu: http://www.cadviet.c...mau_cadviet.dwg

Ơ, sao lại nhân tiện nhỉ ?!

 

Lisp cộng các TEXT đã chọn rồi ghi vào Text đích :

(T/hợp copy ... -> chạy lại lisp này :) )

(defun c:CongT (/ fieldexp obj sole ss);Cong Text
 ;;  By : Gia_Bach, www.CadViet.com      ;;
 (vl-load-com)
 (if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1) ;;;AutoCAD 2006 16.2
   (if (and
  (princ "\nChon cac Text can tinh tong : ")
  (setq ss (ssget '((0 . "TEXT"))))
  (setq obj (car (entsel "\nChon Text ghi tong : "))))
     (progn
(or *sole* (setq *sole* 0))
(initget 4)
(setq sole (getint (strcat "\n So chu so thap phan <" (itoa *sole*) "> :")))
(if (not sole) (setq sole *sole*) (setq *sole* sole))
(setq fieldExp "%<\\AcExpr (0")
(foreach e (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
  (setq fieldExp (strcat fieldExp
			 "+%<\\AcObjProp Object(%<\\_ObjId "
			 (itoa (vla-get-objectid e))
			 ">%).TextString>%")) )
(vla-put-TextString (vlax-ename->vla-object obj) (strcat fieldExp ") \\f \"%lu2%pr" (itoa sole) "\">%"))
(princ)))
   (alert "\nChi chay tu Autocad 2006")  )  )

  • 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

Nhân tiện vụ ánh xạ, các bác chỉ dùm em một chút.

Em có 2 hình chữ nhật và muốn tính diện tích.

- Khi em chọn hình 1 thì diện tích được lưu dữ trong máy, chọn hình thứ 2 xong ấn enter hoặc chuột phải để kết thúc. Và chọn vị trí ghi diện tích. (Đây là chiều thuận không xảy ra lỗi).

- Khi em chọn xong hình 1, em chọn hình 2 nhưng ấn nhầm hình 1 máy tự động lọc dữ liệu và thông báo vùng này đã tính và không ghi dữ liệu. Tiếp đó sau khi em chọn xong hình 2 chưa ấn enter em tiếp tục chọn hình 1 hoặc hình 2 thì lại báo lỗi hình này đã được tính.

Em đang mắc vụ lọc dữ liệu vùng pick rồi và vùng chưa pick. Rất mong các bác giúp đỡ.

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

Nhân tiện vụ ánh xạ, các bác chỉ dùm em một chút.

Em có 2 hình chữ nhật và muốn tính diện tích.

- Khi em chọn hình 1 thì diện tích được lưu dữ trong máy, chọn hình thứ 2 xong ấn enter hoặc chuột phải để kết thúc. Và chọn vị trí ghi diện tích. (Đây là chiều thuận không xảy ra lỗi).

- Khi em chọn xong hình 1, em chọn hình 2 nhưng ấn nhầm hình 1 máy tự động lọc dữ liệu và thông báo vùng này đã tính và không ghi dữ liệu. Tiếp đó sau khi em chọn xong hình 2 chưa ấn enter em tiếp tục chọn hình 1 hoặc hình 2 thì lại báo lỗi hình này đã được tính.

Em đang mắc vụ lọc dữ liệu vùng pick rồi và vùng chưa pick. Rất mong các bác giúp đỡ.

Cái này mình nghĩ bạn có thể dựa theo Handle hoặc ename của hình đó mà ?Mỗi lần pick thì đưa nó vào 1 list, pick tiếp thì đưa tiếp vào list, kiểm tra member hoặc vl-positon của đối tượng mới, có rồi thì thông báo và hủy đi :)

Tuy nhiên, việc pick chọn đối tượng như bạn nói đầu bài với lại pick vào khoảng trống như bạn nói cuối bài lại khác nhau hoàn toà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

Bác Gia-Bach ơi cho em hỏi chút, yêu cầu số 1 thì giống ý em rồi, còn yêu cầu thứ 2 thì có thể thực hiện được không vậy bác?

- Có thể copy thêm nhiều đối tượng nguồn từ những đối tượng nguồn đã có đối tượng đích nhưng những đối tượng nguồn vừa được copy thì nó vẫn hiểu là chung đối tượng đích với đối tượng nguồn được copy.

Đây là file cad: http://www.cadviet.com/upfiles/3/mau.dwg

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ác Gia-Bach ơi cho em hỏi chút, yêu cầu số 1 thì giống ý em rồi, còn yêu cầu thứ 2 thì có thể thực hiện được không vậy bác?

- Có thể copy thêm nhiều đối tượng nguồn từ những đối tượng nguồn đã có đối tượng đích nhưng những đối tượng nguồn vừa được copy thì nó vẫn hiểu là chung đối tượng đích với đối tượng nguồn được copy.

Đây là file cad: http://www.cadviet.com/upfiles/3/mau.dwg

Chào xuandao0708.

 

Về mặt lập trình, tôi cho rằng LISP có thể thực hiện đuợc yêu cầu của bạn :excl: (Sử dụng REACTOR)

Đây là 1 ý tuởng hay. :rolleyes:

Tuy nhiên việc triển khai yêu cầu này có thể tốn khá nhiều thời gian.

Xin mời các Lisper có thời gian và lòng đam mê tham gia "ngâm kíu" giùm bạn xuandao0708.

 

Trong khi chờ đợi "ai đó" viết lisp này, mỗi khi copy bạn chịu khó chạy lại lisp CongT ở trên.

  • 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ề mặt sử dụng, em thấy chẳng lâu hơn là bao với 1 thao tác lặp lại lệnh CongT

  • 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

Hi mình thấy list congT rất hay xong nếu có thêm phần 2 là update nếu copy text thì hay hơn nữa, vì khi tính toán có thể vì một lúc đãng trí sẽ không lặp lại lisp congT nên kq sẽ không update được.

Ah khi xuất kết quả có thể thêm 3 lựa chọn giống như lisp Tcal đã up lên diễn đàn thì hay.

Thanks.

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ái này mình nghĩ bạn có thể dựa theo Handle hoặc ename của hình đó mà ?Mỗi lần pick thì đưa nó vào 1 list, pick tiếp thì đưa tiếp vào list, kiểm tra member hoặc vl-positon của đối tượng mới, có rồi thì thông báo và hủy đi :)

Tuy nhiên, việc pick chọn đối tượng như bạn nói đầu bài với lại pick vào khoảng trống như bạn nói cuối bài lại khác nhau hoàn toàn :)

ý mình nó như thía nè.

Pick vào 1 vùng (kín) nó sẽ tạo ra 1 vùng khác nhờ lệnh boundary. Pick lại cái vùng đó thì báo đã pick rồi, và sau khi pick 1 vài vùng khác pick lại nó thì vẫn báo pick rồi. Đơn giản chỉ như vậy thui bạn à.

Lisp udt bị lỗi như vậy đó.

http://www.cadviet.com/forum/index.php?showtopic=2490&st=40

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

Thì lúc đầu bạn nói là chọn Object mà. Đến cuối mới nói pick vùng. Nếu pick vùng, chắc bạn phải lưu lại toàn bộ list vertex point của Boundary tạo ra rồi. Khi tính diện tích mà thấy S trùng nhau thì kiểm tra lại list point đó xem có trùng không. Hoặc bạn tìm trọng tâm Boundary để ghi vào list, nếu trùng tâm thì coi như trùng vùng. Việc 2 vùng khác nhau mà trùng điểm này cũng khó xảy ra, nên có thể tạm chấp nhận đượ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

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

×