Đến nội dung


Hình ảnh
- - - - -

{Cần giúp đỡ} Lisp nối text cao độ, giữ nguyên tọa độ điểm chèn cũ là circle


  • Please log in to reply
5 replies to this topic

#1 Dzzzung

Dzzzung

    biết zoom

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

Đã gửi 25 November 2014 - 04:31 PM

Chào các bác trên diễn đàn. Số là em có một bình đồ có chứa các cao độ san nền (file http://www.cadviet.c...nh_do_vi_du.dwg) Các cao độ này sẽ được tận dụng để tạo mô hình địa hình cho bước sau.

Tuy nhiên các cao độ này được xuất ra dạng attribute block. Sau khi burst các block này, kết quả thu được là 2 dtext rời rạc hai bên (bên trái là cao độ phần nguyên, bên phải là cao độ phần thập phân), đặc biệt điểm chèn (tọa độ chính xác của điểm cao độ) lại thể hiện bởi một circle.

Mục tiêu và ước nguyện cả buổi chiều của em là "nối được cao độ này lại (gồm cả dấu chấm chia phần thập phân) với điểm chèn text chính tại tim vòng tròn circle nói trên". Tiếc cái là sắp tối rồi mà em search không ra chủ đề nào phù hợp. Một số lisp các cao thủ viết ở đây: http://www.cadviet.c...i-text-tu-dong/ hay ở đây:http://www.cadviet.c...xt-can-giup-do/ đều không có tác dụng đúng với bài toán củ chuối của em kể trên. Do đề bài khác nhau hoặc do em nghiên cứu chưa đúng cách cũng nên.

Vì đó, em mạn phép lập topic này nhờ các cao thủ trên forum hoặc các mem đã từng gặp tình trạng tương tự và đã tìm ra cách giải quyết giúp đỡ em vài đường. Đề bài rõ hơn em đính kèm file Cad đây: http://www.cadviet.c..._text_vi_du.dwg.

 

Em cảm ơn và chúc các bác những ngày làm việc nhiều hiệu quả!

 

PS: Nếu chủ đề bị trùng lặp quá nhiều mong các MOD giúp em cái link trước khi cho cháu nó vô bãi nhé.


  • 0

#2 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 25 November 2014 - 10:55 PM

Của bạn là ở topic này

http://www.cadviet.c...point-gan-nhat/


  • 1



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#3 thehost31

thehost31

    biết vẽ line

  • Members
  • PipPip
  • 26 Bài viết
Điểm đánh giá: 17 (tàm tạm)

Đã gửi 26 November 2014 - 12:34 AM

Bạn dùng thử Lisp sau nhé. Không cần phá, để nguyên Att Block.

Lệnh: wt

 

 

 

(defun Read_bl-pt(bl / sslist eni enlist ih dh)
(setq sslist (entget bl))
(if (= (cdr (assoc 66 sslist)) 1)
(progn
(setq eni (entnext bl))
(setq enlist (entget eni))
(while (/= (cdr (assoc 0 enlist)) "SEQEND")
(if (AND (= (cdr (assoc 0 enlist)) "ATTRIB") (= (cdr (assoc 2 enlist)) "IH"))
(setq ht (cdr (assoc 40 enlist))
ih (cdr (assoc 1 enlist))
)
)
(if (AND (= (cdr (assoc 0 enlist)) "ATTRIB") (= (cdr (assoc 2 enlist)) "DH"))
(setq dh (cdr (assoc 1 enlist)))
)
(setq eni (entnext eni))
(setq enlist (entget eni))
)
)
)
(list ih dh)
)

(defun AddText(string point height / mspace text)
(vl-load-com)
(setq mspace (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
(setq text (vla-AddText mspace string (vlax-3d-point point) height))
)

(defun Join_List(li)
(if (and (car li) (cadr li))
(strcat (car li) "." (cadr li))
(strcat (car li) ".00")
)
)

(defun c:wt(/ ssx si ssi str_out)
(command ".undo" "be")
(setq ssx (ssget '((0 . "INSERT") (2 . "bl-pt"))))
(setq si 0)
(while (< si (sslength ssx))
(setq ssi (ssname ssx si))
(setq str_out (JOIN_LIST (READ_BL-PT ssi)))
(ADDTEXT str_out (cdr (assoc 10 (entget ssi))) ht)
(vla-delete (vlax-ename->vla-object ssi))
(setq si (1+ si))
)
(command ".undo" "e")
(princ)
(princ)
)


  • 1

#4 Dzzzung

Dzzzung

    biết zoom

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

Đã gửi 26 November 2014 - 12:29 PM

Cảm ơn hai bác đã xem và cho em một phương án.

Topic mà bác thanhduan2407 link cho em là một hướng giải quyết vấn đề tốt. Như em hiểu theo ý bác là em có thể phá att block, sau đó nối lại bằng một số lisp có trên forum (thêm được dấu chấm), sử dụng lisp nói trên để đẩy điểm chèn về tim circle gần nhất, cuối cùng xoá hết circle đi là ok. Cảm ơn bác rất nhiều.

Lisp của bác thehost31 giúp em thì quá tuyệt vời, nó giải quyết đúng đắn nhất bài toán mà em đang gặp phải theo hướng đơn giản dễ dàng nhất. Chỉ có điều sau khi thử với lệnh wt, phần thập phân (2 chữ số) bị chuyển hết về 00. Ví dụ 2.32 thành 2.00. Còn lại mọi thứ đều hoạt động tốt, điểm chèn của block rất chính xác. Bác thehost31 và các cao nhân trên forum có thể bớt tý thời gian kiểm tra lisp giúp em để bài toán đi tới đích cuối được không ạ?


  • 0

#5 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 26 November 2014 - 01:14 PM

Tìm chỗ

(cdr (assoc 2 enlist))

Sửa thành

(strcase (cdr (assoc 2 enlist)))

Cảm ơn tốt nhất là bấm vào mũi tên xanh dưới bài viết


  • 1

#6 Dzzzung

Dzzzung

    biết zoom

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

Đã gửi 26 November 2014 - 02:21 PM

Cảm ơn bác ndtnv rất nhiều. Em tìm không thấy nút thanks, ra là do chưa nhìn kỹ. Hic, lên Cadviet suốt vậy mà... Như vậy là bài toán của em đã được giải quyết nhanh gọn

http://www.cadviet.c..._do_binh_do.lsp

Chúc các bác những ngày làm việc hiệu quả.


  • 0