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

Xoay text thuộc tính trong block

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

Lệnh XO của lisp dưới đây sẽ xoay góc nghiêng của Attribute Block về 0.

 

(defun c:XO( / ssdt sodt index tt entdt)  
 (setq ssdt (ssget)
sodt (sslength ssdt)
index 0
 )
 (repeat sodt
   (setq entdt (ssname ssdt index)
  index (1+ index)
  entdt (entnext entdt)
  tt (entget entdt)
  tt (subst (cons 50 0.0) (assoc 50 tt) tt)
   )
   (entmod tt)
   (entupd entdt)
 )
 (princ)
)

 

Sử dụng đặc hiệu trong trường hợp block ký hiệu trục nằm nghiêng.

XoayAttr.gif

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ệnh XO của lisp dưới đây sẽ xoay góc nghiêng của Attribute Block về 0.

 

(defun c:XO( / ssdt sodt index tt entdt)  
 (setq ssdt (ssget)
sodt (sslength ssdt)
index 0
 )
 (repeat sodt
   (setq entdt (ssname ssdt index)
  index (1+ index)
  entdt (entnext entdt)
  tt (entget entdt)
  tt (subst (cons 50 0.0) (assoc 50 tt) tt)
   )
   (entmod tt)
   (entupd entdt)
 )
 (princ)
)

 

Sử dụng đặc hiệu trong trường hợp block ký hiệu trục nằm nghiêng.

XoayAttr.gif

 

 

 

Cái này chỉ dùng cho những Block có điểm chèn trùng với tâm Block (BLock có tính đối xứng)

Nếu gặp những Block không có tính đối xứng thì sao???

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 chỉ dùng cho những Block có điểm chèn trùng với tâm Block (BLock có tính đối xứng)

Nếu gặp những Block không có tính đối xứng thì sao???

 

Lệnh này dùng với mọi block có điểm chèn bất kỳ và hình bất kỳ!

 

Lệnh XO của lisp dưới đây sẽ xoay góc nghiêng của Attribute Block về 0.
Lệnh này dùng để xoay góc nghiêng của Attribute Block trong Block về 0, chứ không hề tác động hoặc lấy thông tin nào từ block mẹ. Ngay trong file ví dụ trên, điểm chèn cũng không nằm tại tâm vòng tròn mà nằm lệch vào đầu mút của nét line, ký hiệu trục trong ví dụ trên cũng không đối xứng tâm vì ngoài vòng tròn còn có kèm thêm một mẩu line ở đầu.

 

vndesperados hãy đọc mã lệnh chương trình đi (mã có lẽ là đủ ngắn và clear để đọc hiểu), hoặc nếu không đọc được thì cũng nên test qua chương trình đã, đừng suy đoá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
Lệnh này dùng với mọi block có điểm chèn bất kỳ và hình bất kỳ!

 

Lệnh này dùng để xoay góc nghiêng của Attribute Block trong Block về 0, chứ không hề tác động hoặc lấy thông tin nào từ block mẹ. Ngay trong file ví dụ trên, điểm chèn cũng không nằm tại tâm vòng tròn mà nằm lệch vào đầu mút của nét line, ký hiệu trục trong ví dụ trên cũng không đối xứng tâm vì ngoài vòng tròn còn có kèm thêm một mẩu line ở đầu.

 

vndesperados hãy đọc mã lệnh chương trình đi (mã có lẽ là đủ ngắn và clear để đọc hiểu), hoặc nếu không đọc được thì cũng nên test qua chương trình đã, đừng suy đoán.

 

 

http://www.cadviet.com/upfiles/Blk001_1.zip

 

Nhờ bác test trên block này đi.

Cái này mằm trong một phần chương trình ghi diện tích mà mình đã post lên diễn đàn đó

 

Mà đúng là lúc nãy chỉ đọc thôi, không test

Bây giờ mới test thật nè, mà cái block này là có sẵn chứ không cố tạo ra để chơi bác đâu.

 

Mô tả block cho bác luôn

Đó là block dùng 6 cái ATT

Ba cái hiển thị:

Một cái ghi ký hiệu

Một cái ghi diện tích

Một cái ghi dân số

Ba cái ẩn

Một cái ghi giá trị handle của đối tượng mà Block gắn vào

Một cái ghi đơn vị DT

Một cái ghi đơn vị dân số

Cực kỳ trong sáng chứ không có gì khuất tất...

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
http://www.cadviet.com/upfiles/Blk001_1.zip

 

Nhờ bác test trên block này đi.

Cái này mằm trong một phần chương trình ghi diện tích mà mình đã post lên diễn đàn đó

 

Tại sao vndesperados không test luôn!

 

trước và sau khi xoay:

xoayattr.gif

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ại sao vndesperados không test luôn!

 

trước và sau khi xoay:

xoayattr.gif

 

(defun c:XO( / ssdt sodt index tt entdt)
(setq ssdt (ssget)
sodt (sslength ssdt)
index 0
)
(repeat sodt
(setq entdt (ssname ssdt index)
index (1+ index)
entdt (entnext entdt)
tt (entget entdt)
tt (subst (cons 50 0.0) (assoc 50 tt) tt)
)
(entmod tt)
(entupd entdt)
)
(princ)
)

 

Block này hiển thị đến 3 thông tin luôn. Đó mới chỉ là ký hiệu thôi. Còn thông tin về dân số và diện tích nằm trong 2 phần 1/4 hình tròn

Bác nhập đủ rồi test thử lại xem sao

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ôi muốn nói ở đây là lisp trên chạy rất tốt với mọi block.

 

Nó chỉ hiệu chỉnh 1 thuộc tính đầu tiên trong block. Muốn hiệu chỉnh tất cả các thuộc tính trong block (không phải ai cũng muốn), cần phải thêm một chút mã lệ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

Đùa bác tý thôi, nếu bác giận thì xin lỗi nhé

Có bài tóan này nè:

Trong một bản vẽ có nhiều block

Bây giờ muốn thay đổi lại điểm chèn (tâm) của block mà không làm thay đổi vị trí của block

Các block có thể có nhiều góc xoay và scale khác nhau.

Giả thích rõ ra nhé

Ví dụ có 1 block có điểm chèn nằm lệch. Sau khi đã chèn rất nhiều block đó vào bản vẽ thì người ta mới phát sinh nhu cầu thay đổi lại điểm chèn (tâm) của block mà không làm thay đổi vị trí của block đó.

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ệnh XO của lisp dưới đây sẽ xoay góc nghiêng của Attribute Block về 0.

 

(defun c:XO( / ssdt sodt index tt entdt)  
 (setq ssdt (ssget)
sodt (sslength ssdt)
index 0
 )
 (repeat sodt
   (setq entdt (ssname ssdt index)
  index (1+ index)
  entdt (entnext entdt)
  tt (entget entdt)
  tt (subst (cons 50 0.0) (assoc 50 tt) tt)
   )
   (entmod tt)
   (entupd entdt)
 )
 (princ)
)

 

Sử dụng đặc hiệu trong trường hợp block ký hiệu trục nằm nghiêng.

XoayAttr.gif

Nhờ bác Hoành hoặc bác nào biết sửa lại cho có thể nhập góc xoay vào được.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ờ bác Hoành hoặc bác nào biết sửa lại cho có thể nhập góc xoay vào được.Thanks.

Sửa lại theo yêu cầu của bạn 1 tí

(defun c:XO( / ssdt sodt index tt entdt ang)  
 (setq ssdt (ssget '((0 . "INSERT") (66 . 1)))
sodt (sslength ssdt)
index 0
  )
 (or *ang* (setq *ang* 0.0))
 (setq ang (getangle (strcat "\n Nhap goc < " 
			(rtos (/ (* 180 *ang*) pi) 2 2) " > :")))
 (if ang (setq *ang* ang) (setq ang *ang*))
 (repeat sodt
   (setq entdt (ssname ssdt index)
  index (1+ index))
   (while (/= (cdr(assoc 0 (entget entdt))) "SEQEND")
   	(setq
    entdt (entnext entdt)
  tt (entget entdt)
  tt (subst (cons 50 ang) (assoc 50 tt) tt)
   	)
  	 (entmod tt)
   	(entupd entdt)
   )
 )
 (princ)
)

  • 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áo lỗi ; error: bad SSGET list value.Mong bác xem lại giúp.

Đã sửa lại code. Bạn download lại Lisp ở bài viết trên của Tue_NV

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ác bác cho em hỏi nhờ chút ạ

những Block có tên trùng nhau nhưng có góc quay khác nhau thì có cách nào xuất được tọa độ và những góc quay đó không ạ

Em cảm ơ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

Lệnh XO của lisp dưới đây sẽ xoay góc nghiêng của Attribute Block về 0.

 

 

(defun c:XO( / ssdt sodt index tt entdt)
(setq ssdt (ssget)
sodt (sslength ssdt)
index 0
)
(repeat sodt
(setq entdt (ssname ssdt index)
index (1+ index)
entdt (entnext entdt)
tt (entget entdt)
tt (subst (cons 50 0.0) (assoc 50 tt) tt)
)
(entmod tt)
(entupd entdt)
)
(princ)
)

Sử dụng đặc hiệu trong trường hợp block ký hiệu trục nằm nghiêng.

XoayAttr.gif

Sau khi sử dụng lệnh xo thì text trong att block bị lệch vị trí mọi người có biết tại sao không giúp mình 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

Sau khi sử dụng lệnh xo thì text trong att block bị lệch vị trí mọi người có biết tại sao không giúp mình với

Thử lệnh :  torient trong express xem sao. ^_^

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ệnh :  torient trong express xem sao. ^_^

Mình cũng có dùng lệnh này rồi, nhưng không biết tại sao có lúc được lúc không ah! 

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

Mình cũng có dùng lệnh này rồi, nhưng không biết tại sao có lúc được lúc không ah! 

Vì Justification của att không phải Middle center và không trùng với tâm đườ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

Vì Justification của att không phải Middle center và không trùng với tâm đường tròn.

Vay co cach nao lam cho no trung voi tam duong tron khong vay ban? Boi vi att block nay do nguoi khac tao truoc do roi.

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

Vay co cach nao lam cho no trung voi tam duong tron khong vay ban? Boi vi att block nay do nguoi khac tao truoc do roi.

1.Blockeditor 1 block bất kỳ. Thay justifi của att thành MC, Move vào tâm đường tròn. Save and close.

2.Insert block đó tại vị trí bất kỳ (xong sẽ xóa) với value attt bất kỳ.

3.Command: ATTSYNC -> select block vừa insert và Yes. Xong xóa block vừa insert đó. Done.

4.Dùng torient trong express để xoay att tù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

1.Blockeditor 1 block bất kỳ. Thay justifi của att thành MC, Move vào tâm đường tròn. Save and close.

2.Insert block đó tại vị trí bất kỳ (xong sẽ xóa) với value attt bất kỳ.

3.Command: ATTSYNC -> select block vừa insert và Yes. Xong xóa block vừa insert đó. Done.

4.Dùng torient trong express để xoay att tùy ý.

 

^_^

- Trong 4 ý của bạn có ý 4 là ok nhưng lệnh này có khi cũng không dùng được. (có những bv vẽ ta không dùng được lệnh này)

- Ý 1 thì chỉ sử dụng được 1 att block được chọn thôi. 

---> Nói chung cũng không ổn lắm ! 

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

- Trong 4 ý của bạn có ý 4 là ok nhưng lệnh này có khi cũng không dùng được. (có những bv vẽ ta không dùng được lệnh này)

- Ý 1 thì chỉ sử dụng được 1 att block được chọn thôi. 

---> Nói chung cũng không ổn lắm ! 

Ok, nếu thử lisp thì nghịch tí nào. Thêm cả 2 cách Autolisp và Visual lisp.

 

Autolisp này: ^_^ Ah tất nhiên dùng lisp trong trường hợp này là các block trục không nằm trong block tổng nữa nhé.  :D

(defun c:test (/ blk ss n name ins lst value)
  (if (setq blk (car (entsel "\nChon block: ")))
    (progn
      (setq
	ss (ssget "_X" (list '(0 . "INSERT") (assoc 2 (entget blk))))
      )
      (command "_justifytext" ss "" "MC")
      (setq name (cdr (assoc 2 (entget (ssname ss 0)))))
      (setq lst (get-block-entities name))
      (foreach ob lst
	(if (eq (cdr (assoc 0 (entget ob))) "CIRCLE")
	  (setq center (trans (cdr (assoc 10 (entget ob))) 1 0))
	  )
	);foreach
      (foreach ob lst
	(if (eq (cdr (assoc 0 (entget ob))) "ATTDEF")
	  (progn
	    (setq value (cdr (assoc 1 (entget ob))))
	    (entmod (subst (cons 11 center) (assoc 11 (entget ob)) (entget ob)))
	    )
	  )
	);foreach
      (entupd (ssname ss 0))
      (setq n 0)
      (repeat (sslength ss)
	(setq ins (cdr (assoc 10 (entget (ssname ss n)))))
	(setq value (cdr (assoc 1 (entget (entnext (ssname ss n))))))
	(command "_-insert" name "_none" ins 1 1 0 value
		 "_erase" (ssname ss n) "")
	(setq n (1+ n))
	)
      )
    )
  )
(defun get-block-entities ( blk / ent lst )
    (if (setq ent (tblobjname "block" blk))
      (while (setq ent (entnext ent))
	(setq lst (cons ent lst))
        ) ;; end WHILE
    ) ;; end IF
    (reverse lst) ;; Return the list
) ;; end DEFUN
;;;END CODE AUTOLISP HERE


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

- Trong 4 ý của bạn có ý 4 là ok nhưng lệnh này có khi cũng không dùng được. (có những bv vẽ ta không dùng được lệnh này)

- Ý 1 thì chỉ sử dụng được 1 att block được chọn thôi. 

---> Nói chung cũng không ổn lắm ! 

Thử cả VL xem nào ^_^ Còn cái này thì chơi tất. :D

(defun c:MAC (/ acdoc mspace blk center temp)
  (setq acdoc (vla-get-activedocument (vlax-get-acad-object)))
  (setq mspace (vla-get-modelspace acdoc))
  (if (setq blk (car (entsel "\nChon block: ")))
    (progn
      (vlax-for	blks (vla-get-blocks acdoc)
	(if (wcmatch (vla-get-Name blks) (cdr (assoc 2 (entget blk))))
	  (progn
	    (vlax-for obj blks
	      (if (= (vla-get-ObjectName obj) "AcDbCircle")
		(setq center (vlax-get obj 'Center))
	      )
	    )
	    (vlax-for obj blks
	      (if
		(= (vla-get-ObjectName obj) "AcDbAttributeDefinition")
		 (progn
		   (vla-put-Rotation obj 0.0)
		   (vla-put-Alignment obj acAlignmentMiddleCenter)
		   (vla-put-TextAlignmentPoint
		     obj
		     (vlax-3d-point center)
		   )
		 )			;progn
	      )				;if
	    )				;vlax-for obj
	  )				;progn then
	)				;if
      )					;vlax-for blks
      (setq temp (vla-insertblock
		   mspace
		   (vlax-3d-point '(0. 0. 0.))
		   (cdr (assoc 2 (entget blk)))
		   1
		   1
		   1
		   0
		 )
      )
      (vla-sendcommand
	acdoc
	(strcat	"ATTSYNC\n"
		"Name\n"
		""
		(cdr (assoc 2 (entget blk)))
		"\n"
		""
	)
      )
      (vla-delete temp)
    )					;progn
  )					;if
(command "regen")
  (princ)
)					;defun

;;;END CODE VISUAL LISP HERE

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

 

Ok, nếu thử lisp thì nghịch tí nào. Thêm cả 2 cách Autolisp và Visual lisp.

 

Autolisp này: ^_^

(defun c:test (/ blk ss n name ins lst value)
  (if (setq blk (car (entsel "\nChon block: ")))
    (progn
      (setq
	ss (ssget "_X" (list '(0 . "INSERT") (assoc 2 (entget blk))))
      )
      (command "_justifytext" ss "" "MC")
      (setq name (cdr (assoc 2 (entget (ssname ss 0)))))
      (setq lst (get-block-entities name))
      (foreach ob lst
	(if (eq (cdr (assoc 0 (entget ob))) "CIRCLE")
	  (setq center (trans (cdr (assoc 10 (entget ob))) 1 0))
	  )
	);foreach
      (foreach ob lst
	(if (eq (cdr (assoc 0 (entget ob))) "ATTDEF")
	  (progn
	    (setq value (cdr (assoc 1 (entget ob))))
	    (entmod (subst (cons 11 center) (assoc 11 (entget ob)) (entget ob)))
	    )
	  )
	);foreach
      (entupd (ssname ss 0))
      (setq n 0)
      (repeat (sslength ss)
	(setq ins (cdr (assoc 10 (entget (ssname ss n)))))
	(setq value (cdr (assoc 1 (entget (entnext (ssname ss n))))))
	(command "_-insert" name "_none" ins 1 1 0 value
		 "_erase" (ssname ss n) "")
	(setq n (1+ n))
	)
      )
    )
  )
(defun get-block-entities ( blk / ent lst )
    (if (setq ent (tblobjname "block" blk))
      (while (setq ent (entnext ent))
	(setq lst (cons ent lst))
        ) ;; end WHILE
    ) ;; end IF
    (reverse lst) ;; Return the list
) ;; end DEFUN
;;;END CODE AUTOLISP HERE


 

 

Thử cả VL xem nào ^_^ Ah tất nhiên dùng lisp trong trường hợp này là các block trục không nằm trong block tổng nữa nhé. :D

(defun c:MAC (/ acdoc mspace blk center temp)
  (setq acdoc (vla-get-activedocument (vlax-get-acad-object)))
  (setq mspace (vla-get-modelspace acdoc))
  (if (setq blk (car (entsel "\nChon block: ")))
    (progn
      (vlax-for	blks (vla-get-blocks acdoc)
	(if (wcmatch (vla-get-Name blks) (cdr (assoc 2 (entget blk))))
	  (progn
	    (vlax-for obj blks
	      (if (= (vla-get-ObjectName obj) "AcDbCircle")
		(setq center (vlax-get obj 'Center))
	      )
	    )
	    (vlax-for obj blks
	      (if
		(= (vla-get-ObjectName obj) "AcDbAttributeDefinition")
		 (progn
		   (vla-put-Rotation obj 0.0)
		   (vla-put-Alignment obj acAlignmentMiddleCenter)
		   (vla-put-TextAlignmentPoint
		     obj
		     (vlax-3d-point center)
		   )
		 )			;progn
	      )				;if
	    )				;vlax-for obj
	  )				;progn then
	)				;if
      )					;vlax-for blks
      (setq temp (vla-insertblock
		   mspace
		   (vlax-3d-point '(0. 0. 0.))
		   (cdr (assoc 2 (entget blk)))
		   1
		   1
		   1
		   0
		 )
      )
      (vla-sendcommand
	acdoc
	(strcat	"ATTSYNC\n"
		"Name\n"
		""
		(cdr (assoc 2 (entget blk)))
		"\n"
		""
	)
      )
      (vla-delete temp)
    )					;progn
  )					;if
  (princ)
)					;defun

;;;END CODE VISUAL LISP HERE

Cả 2 lsp đều bị lỗi hết rồi bạn ơ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

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

×