Đến nội dung


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

Viết lisp theo yêu cầu [phần 2]


  • Chủ đề bị khóa Chủ đề bị khóa
3783 replies to this topic

#61 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 11 September 2009 - 04:14 PM

Nhờ các cao thủ giúp mình một lisp như này.
đây là file bản vẽ minh hoạ
http://www.cadviet.c..._doi_cao_do.dwg

Chào bạn vqhnb,
Thủ mình thì thấp thôi, bạn chớ gọi là cao kẻo mà mình trốn hổng được.
Do cái yêu cầu của bạn chưa rõ ràng, bạn muốn một phát ăn ngay xơi hết tất cả các điểm hay muốn chơi bắn tỉa từng thằng theo kiểu nhát một???? Hì hì
Hơn nữa bạn muốn một lisp cho ra hai kết quả hay bạn muốn hai lisp chạy hai lần mỗi lần cho một kết quả như bản vẽ bạn đưa ra??? Hì hì.

Mình chưa hiểu rõ ý bạn, vả lại vốn lười nên mình chọn cái dễ ăn nhất là viết một lisp thôi, và lisp chỉ xơi một thằng để cho ra cái kết quả ở bản vẽ thứ ba của bạn. Nếu muốn xơi nhiều thằng bạn phải chạy lisp nhiều lần. Hì hì.
Bạn xài thử, nếu thấy đúng ý thì là quá tốt, còn nếu chửa đúng thì đừng có giận mà vứt nó đi. Bạn có thể dùng nó để sửa lại theo ý của bạn vì trong đó cơ bản đã có đủ những hàm bạn cần để xử lý cái yêu cầu của bạn. Chỉ cần sửa lại một chút hay bổ sung thêm một tẹo là sẽ đúng ý bạn thôi. Còn nếu như bạn chưa thể tự sửa thì hãy post lại nói rõ và chính xác cái yêu cầu bạn cần, mọi người sẽ sửa giúp nha.
Lisp đây bạn ạ.
http://www.cadviet.c...s/2/chgtext.lsp

Chúc bạn thành đạt trong công việc và cuộc sống.
  • 2
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#62 vqhnb

vqhnb

    biết pan

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

Đã gửi 11 September 2009 - 04:48 PM

Chào bạn vqhnb,
Thủ mình thì thấp thôi, bạn chớ gọi là cao kẻo mà mình trốn hổng được.
Do cái yêu cầu của bạn chưa rõ ràng, bạn muốn một phát ăn ngay xơi hết tất cả các điểm hay muốn chơi bắn tỉa từng thằng theo kiểu nhát một???? Hì hì
Hơn nữa bạn muốn một lisp cho ra hai kết quả hay bạn muốn hai lisp chạy hai lần mỗi lần cho một kết quả như bản vẽ bạn đưa ra??? Hì hì.

Mình chưa hiểu rõ ý bạn, vả lại vốn lười nên mình chọn cái dễ ăn nhất là viết một lisp thôi, và lisp chỉ xơi một thằng để cho ra cái kết quả ở bản vẽ thứ ba của bạn. Nếu muốn xơi nhiều thằng bạn phải chạy lisp nhiều lần. Hì hì.
Bạn xài thử, nếu thấy đúng ý thì là quá tốt, còn nếu chửa đúng thì đừng có giận mà vứt nó đi. Bạn có thể dùng nó để sửa lại theo ý của bạn vì trong đó cơ bản đã có đủ những hàm bạn cần để xử lý cái yêu cầu của bạn. Chỉ cần sửa lại một chút hay bổ sung thêm một tẹo là sẽ đúng ý bạn thôi. Còn nếu như bạn chưa thể tự sửa thì hãy post lại nói rõ và chính xác cái yêu cầu bạn cần, mọi người sẽ sửa giúp nha.
Lisp đây bạn ạ.
http://www.cadviet.c...s/2/chgtext.lsp

Chúc bạn thành đạt trong công việc và cuộc sống.

Cám ơn bạn 'phamthanhbinh'
mình muốn một phát ăn ngay xơi hết tất cả các điểm không chơi bắn tỉa. Thực ra mình chỉ biết tác dụng của chương trình lisp thôi chứ chưa một ngày học lisp. Ý mình là dùng một lisp để chuyển ra kết quả cuối cùng nhưng ở dòng Command: lisp có hỏi là có đổi cao độ hay không tức là +,-,*,/ vào một số x nào đấy vì có lúc công trình chỉ dùng cao độ giả định, nhưng có công trình lại đỏi hỏi cao độ quốc gia. thanks lời chúc của bạn
  • 1

#63 trang7889

trang7889

    biết pan

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

Đã gửi 11 September 2009 - 05:01 PM

Đây là phần tiếp theo của topic Viết lisp theo yêu cầu, mời các bạn tiếp tục thảo luận.

nhờ bạn hoanh viết dùm mình họa đồ trích đo này nhé minh đa rât cần.
text đánh theo thứ tự từ trái qua phải
bản vẽ gán theo tỷ lệ cho trước
Bản trích đo: http://www.cadviet.c...au_trich_do.dwg
File bản đồ: http://www.cadviet.c...dc_4f135ivd.dwg
  • 0

#64 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 11 September 2009 - 05:37 PM

Ý mình là dùng một lisp để chuyển ra kết quả cuối cùng nhưng ở dòng Command: lisp có hỏi là có đổi cao độ hay không tức là +,-,*,/ vào một số x nào đấy vì có lúc công trình chỉ dùng cao độ giả định, nhưng có công trình lại đỏi hỏi cao độ quốc gia. thanks lời chúc của bạn

Mình đã nhiều lần gặp trường hợp như bạn trong công việc. đây là lisp mình tìm được trên diễn đàn này. mình đã sửa lại 1 chút để bạn có thể sử dụng được cả 4 phép tính. Nó có tác dụng cộng, hoặc trừ, hoặc nhân, hoặc chia tất cả các text số mà bạn chọn với một số mà bạn nhập vào.
lệnh là: cong; tru; nhan; chia.

(defun c:cong()
(setq i 0 s1 0)
(setq n (getreal "\nnhap so muon cong them: "))
(prompt "\nchon cac so can sua ...")
(setq txt (ssget '((0 . "TEXT"))))
(repeat (sslength txt)
(setq txt_name (ssname txt i))
(setq txt_ent (entget txt_name))
(setq cont (cdr(assoc 1 txt_ent)))
(setq cont (atof cont))
(setq s (+ cont n))
(setq txt_ent (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
(entmod txt_ent)
(setq i (+ i 1))
);repeat
);defun
;------------------------------------------------------
(defun c:tru()
(setq i 0 s1 0)
(setq n (getreal "\nnhap so tru: "))
(prompt "\nchon cac so can sua ...")
(setq txt (ssget '((0 . "TEXT"))))
(repeat (sslength txt)
(setq txt_name (ssname txt i))
(setq txt_ent (entget txt_name))
(setq cont (cdr(assoc 1 txt_ent)))
(setq cont (atof cont))
(setq s (- cont n))
(setq txt_ent (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
(entmod txt_ent)
(setq i (+ i 1))
);repeat
);defun
;------------------------------------------------------
(defun c:nhan()
(setq i 0 s1 0)
(setq n (getreal "\nnhap so muon nhan: "))
(prompt "\nchon cac so can sua ...")
(setq txt (ssget '((0 . "TEXT"))))
(repeat (sslength txt)
(setq txt_name (ssname txt i))
(setq txt_ent (entget txt_name))
(setq cont (cdr(assoc 1 txt_ent)))
(setq cont (atof cont))
(setq s (* cont n))
(setq txt_ent (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
(entmod txt_ent)
(setq i (+ i 1))
);repeat
);defun
;------------------------------------------------------
(defun c:chia()
(setq i 0 s1 0)
(setq n (getreal "\nnhap mau so: "))
(prompt "\nchon cac so can sua ...")
(setq txt (ssget '((0 . "TEXT"))))
(repeat (sslength txt)
(setq txt_name (ssname txt i))
(setq txt_ent (entget txt_name))
(setq cont (cdr(assoc 1 txt_ent)))
(setq cont (atof cont))
(setq s (/ cont n))
(setq txt_ent (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
(entmod txt_ent)
(setq i (+ i 1))
);repeat
);defun
;------------------------------------------------------

Chú ý là kết quả tính toán sẽ lấy số chữ số sau dấu phẩy theo Precision trong định dạng Units bản vẽ của bạn. Với text cao độ thường lấy 2 chữ số sau dấu phẩy. bạn nên thiết lập lại Precision trước khi chạy thực hiện lệnh.
  • 2

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


#65 vqhnb

vqhnb

    biết pan

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

Đã gửi 11 September 2009 - 05:59 PM

Mình đã nhiều lần gặp trường hợp như bạn trong công việc. đây là lisp mình tìm được trên diễn đàn này. mình đã sửa lại 1 chút để bạn có thể sử dụng được cả 4 phép tính. Nó có tác dụng cộng, hoặc trừ, hoặc nhân, hoặc chia tất cả các text số mà bạn chọn với một số mà bạn nhập vào.
lệnh là: cong; tru; nhan; chia.


(defun c:cong()
(setq i 0 s1 0)
(setq n (getreal "\nnhap so muon cong them: "))
(prompt "\nchon cac so can sua ...")
(setq txt (ssget '((0 . "TEXT"))))
(repeat (sslength txt)
(setq txt_name (ssname txt i))
(setq txt_ent (entget txt_name))
(setq cont (cdr(assoc 1 txt_ent)))
(setq cont (atof cont))
(setq s (+ cont n))
(setq txt_ent (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
(entmod txt_ent)
(setq i (+ i 1))
);repeat
);defun
;------------------------------------------------------
(defun c:tru()
(setq i 0 s1 0)
(setq n (getreal "\nnhap so tru: "))
(prompt "\nchon cac so can sua ...")
(setq txt (ssget '((0 . "TEXT"))))
(repeat (sslength txt)
(setq txt_name (ssname txt i))
(setq txt_ent (entget txt_name))
(setq cont (cdr(assoc 1 txt_ent)))
(setq cont (atof cont))
(setq s (- cont n))
(setq txt_ent (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
(entmod txt_ent)
(setq i (+ i 1))
);repeat
);defun
;------------------------------------------------------
(defun c:nhan()
(setq i 0 s1 0)
(setq n (getreal "\nnhap so muon nhan: "))
(prompt "\nchon cac so can sua ...")
(setq txt (ssget '((0 . "TEXT"))))
(repeat (sslength txt)
(setq txt_name (ssname txt i))
(setq txt_ent (entget txt_name))
(setq cont (cdr(assoc 1 txt_ent)))
(setq cont (atof cont))
(setq s (* cont n))
(setq txt_ent (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
(entmod txt_ent)
(setq i (+ i 1))
);repeat
);defun
;------------------------------------------------------
(defun c:chia()
(setq i 0 s1 0)
(setq n (getreal "\nnhap mau so: "))
(prompt "\nchon cac so can sua ...")
(setq txt (ssget '((0 . "TEXT"))))
(repeat (sslength txt)
(setq txt_name (ssname txt i))
(setq txt_ent (entget txt_name))
(setq cont (cdr(assoc 1 txt_ent)))
(setq cont (atof cont))
(setq s (/ cont n))
(setq txt_ent (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
(entmod txt_ent)
(setq i (+ i 1))
);repeat
);defun
;------------------------------------------------------

Chú ý là kết quả tính toán sẽ lấy số chữ số sau dấu phẩy theo Precision trong định dạng Units bản vẽ của bạn. Với text cao độ thường lấy 2 chữ số sau dấu phẩy. bạn nên thiết lập lại Precision trước khi chạy thực hiện lệnh.

Bác Thaistreetz là ks giao thông ạ. lisp đúng ý tớ cảm ơn bác, mong được học hỏi bác nhiều hơn nữa, cám ơn bác nhé, cám ơn sự nhiệt tình của các thành viên trong diễn đàn. Thanhs
  • 0

#66 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 11 September 2009 - 06:55 PM

Nhờ các cao thủ giúp mình một lisp như này.
đây là file bản vẽ minh hoạ
http://www.cadviet.c..._doi_cao_do.dwg

Chào Thaistreet.
Lisp của bạn chỉ thực hiện phép tính cộng, nhân chia rời rạc, chưa thể hiện được yêu cầu của bạn vqnhb đề ra là như trong file minh hoạ là thực hiện phép tính trên Text theo quy tắc : Nhân chia trước, cộng trừ sau.
Mình thấy bạn cũng biết về Lisp -> bạn hãy suy nghĩ và xây dựng 1 code thực hiện phép tính trên Text theo quy tắc : Nhân chia trước, cộng trừ sau nhé.
Chúc bạn xây dựng Code thành công.
  • 1

#67 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 11 September 2009 - 08:00 PM

Chào Thaistreet.
Lisp của bạn chỉ thực hiện phép tính cộng, nhân chia rời rạc, chưa thể hiện được yêu cầu của bạn vqnhb đề ra là như trong file minh hoạ là thực hiện phép tính trên Text theo quy tắc : Nhân chia trước, cộng trừ sau.
Mình thấy bạn cũng biết về Lisp -> bạn hãy suy nghĩ và xây dựng 1 code thực hiện phép tính trên Text theo quy tắc : Nhân chia trước, cộng trừ sau nhé.
Chúc bạn xây dựng Code thành công.

Chào anh Tuệ.
Vì em cũng gặp trường hợp của bạn vqnhb khá nhiều lần nên em hiểu chính xác điều bạn vqnhb muốn là gì qua bản vẽ của bạn ấy (có lẽ khác với cách mà mọi người sẽ hiểu). Và lisp trên đã thỏa mãn được nhu cầu sử dụng của vqnhb.
Còn về ý tưởng của anh em chưa rõ ý anh lắm. Nếu ta thực hiện phép tính trên theo quy tắc: Nhân chia trước, cộng trừ sau. Vậy thì số liệu chúng ta nhập vào là gì? có phải một biểu thức toán học đơn giản với 4 phép tính không ạ?
  • 0

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


#68 vqhnb

vqhnb

    biết pan

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

Đã gửi 11 September 2009 - 08:23 PM

Chào hai bạn Tuệ và Thaistreetz lisp mà bạn Thaistreetz viết đúng như yêu cầu của tớ đấy hình như bạn Thaistreetz là dân giao thông nên rất hiểu sử lý vụ cốt cách, ý bạn Tuệ là cộng trừ nhân chia cùng một lúc thì đúng là phải dùng biểu thức toán học chắc phải phức tạp lắm.
  • 0

#69 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 11 September 2009 - 09:44 PM

Chào anh Tuệ.
Vì em cũng gặp trường hợp của bạn vqnhb khá nhiều lần nên em hiểu chính xác điều bạn vqnhb muốn là gì qua bản vẽ của bạn ấy (có lẽ khác với cách mà mọi người sẽ hiểu). Và lisp trên đã thỏa mãn được nhu cầu sử dụng của vqnhb.
Còn về ý tưởng của anh em chưa rõ ý anh lắm. Nếu ta thực hiện phép tính trên theo quy tắc: Nhân chia trước, cộng trừ sau. Vậy thì số liệu chúng ta nhập vào là gì? có phải một biểu thức toán học đơn giản với 4 phép tính không ạ?

Dữ liệu đầu vào (Input)

nhap so muon nhan hoac chia <1> : (1)

nhap so muon cong hoac tru <0> : (2)

chon cac so can sua : (3)

Xử lý (Processor)

-> Xuất kết quả (Output)


Lisp này sẽ tương đương với 4 Lisp trên của bạn (có thể cộng; hoặc trừ; hoặc nhân; hoặc chia cùng trong 1 Lisp nhưng có tính năng ưu việt hơn là khả năng tính theo quy tắc : Nhân chia trước, cộng trừ sau

Nếu chỉ cộng hoặc trừ text với 1 số thôi thì : (tương đương với Lisp cong.lsp và tru.lsp của bạn)
Hàng 1 : nhập số 1 (Khi nhân hay chia một số với số 1 thì kết quả là chính nó)
Hàng 2 : Nhập số cần cộng (ví dụ số 10 thì nhập 10) , muốn trừ thì nhập trừ (- 10)

Nếu chỉ nhân hoặc chia text với 1 số thôi thì : (tương đương với Lisp nhan.lsp và chia.lsp của bạn)
Hàng 1 : Nhập số cần nhân hoặc chia
Hàng 2 : nhập số 0 (Khi cộng hay trừ một số với số 0 thì kết quả là chính nó)

Nếu để nhân chia trước, cộng trừ sau đối với Text : tính năng mới : nhân chia trước, cộng trừ sau)
Hàng 1 : Nhập số cần nhân hoặc chia
Hàng 2 : Nhập số cần cộng hoặc trừ

Bước nhập vào (Input); và xuất ra (output). Bạn đã làm thành công. Chỉ còn bước Xử lý (Processor) : Tue_NV để cho bạn suy nghĩ. Yên tâm đi, có gặp gì khó khăn thì Tue_NV sẽ hỗ trợ cho bạn.
Chúc bạn xây dựng Code thành công.
  • 4

#70 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 11 September 2009 - 09:47 PM

Chào hai bạn Tuệ và Thaistreetz lisp mà bạn Thaistreetz viết đúng như yêu cầu của tớ đấy hình như bạn Thaistreetz là dân giao thông nên rất hiểu sử lý vụ cốt cách, ý bạn Tuệ là cộng trừ nhân chia cùng một lúc thì đúng là phải dùng biểu thức toán học chắc phải phức tạp lắm.

Uh, mình là dân giao thông.
giải quyết một biểu thức toán học cũng không fải là vấn đề phức tạp lắm. bản thân cad đã cung cấp cho ta công cụ để giải quyết các biểu thức toán học là lệnh CAL. có thể nhúng lệnh này vào lisp khá đơn giản. Tuy nhiên mình nghĩ điều đó không cần thiết.
Vấn đề có lẽ là do anh Tuệ và mọi người không hiểu đc ý của bạn từ bản vẽ bạn up lên. (như bản vẽ của bạn thì ai cũng có thể hiểu phần thứ 3 mới là kết quả cuối cùng bạn muốn). Bạn chú ý cho lần sau nhé. Người viết lisp không phải là bạn nên có thể không hiểu đc điều bạn muốn, vì thế khi yêu cầu phải rõ ràng, cụ thể, một nghĩa thì mọi người mới có thể giúp bạn được. cũng để tránh gây cảm giác bực mình cho người giúp bạn khi công sức bỏ ra đành vứt đi và fải viết lại lisp.

EDIT: Ah, em hiểu ý của anh Tuệ rồi, để em thử xem thế nào :s_big:
  • 1

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


#71 kamezoko

kamezoko

    biết vẽ line

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

Đã gửi 11 September 2009 - 10:12 PM

Chào Kamezoko,
Trước hết Thiep đề nghị định dạng lại bản vẽ của bạn như sau:
Các điểm đo là đối tượng POINT được đặt trong lớp "DIEM"
Các ký hiệu điểm đo là đối tượng TEXT được đặt trong lớp "TENDIEM"
Các cao độ điểm đo là đối tượng TEXT được đặt trong lớp "CAODO"
Các ký hiệu điểm đo phải là một ký tự chữ kèm với 1 số tự nhiên tăng dần. ví dụ: đường chuyền đa giác 1: I.1, I.2, I.3... I.100, đường chuyền đa giác 2: H-1, H-2, H-3 ... H-100, không được là II.1, II.2, II.3 ...Nếu bạn lỡ ký hiệu như vậy thì dùng chức năng find and replace của CAD để chỉnh sửa lại.
Lisp sẽ tự động dò các điểm có ký hiệu cùng 1 kiểu đường chuyền sẽ nối với nhau thành một 3dpolyline
Thiep dùng lisp JD của bác Hoanh chỉnh sửa lại cho phù hợp với bạn hơn.
Các bạn trắc địa dùng và cho ý kiến nhé:

;;;===============================================
;;; Lisp tao duong chuyen 3DPOLYLINE
;;; Update: 09/09/2009
;;; Free from CADVIET.COM
(defun 3DPoly (Lp *ModelSpace* / PntArr)
(setq PntArr (vlax-make-safearray
vlax-vbDouble
(cons 0 (1- (length Lp)))
)
)
(vlax-safearray-fill PntArr Lp)
(vla-Add3Dpoly *ModelSpace* PntArr)
)
;;;---------------------
(defun SAVE_MODE ()
(command "UCS" "W" "")
(setq OLD_OSMODE (getvar "OSMODE")
OLD_CECOLOR (getvar "CECOLOR")
OLD_AUTOSNAP (getvar "AUTOSNAP")
OLD_ORTHOMODE (getvar "ORTHOMODE")
)
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(setvar "plinegen" 1)

)
(defun RESTORE ()
(setvar "osmode" OLD_OSMODE)
(setvar "AUTOSNAP" OLD_AUTOSNAP)
(setvar "ORTHOMODE" OLD_ORTHOMODE)
(setvar "CECOLOR" OLD_CECOLOR)
(setvar "cmdecho" 1)
)
;;;------------------------------------
(defun timgan (p lst / dmin ppluu)
(foreach pp lst
(setq d (distance p (car pp)))
(if (or (not dmin) (> dmin d))
(setq dmin d
ppluu pp
)
)
)
(cdr ppluu)
)

(defun filter (lstent otype olayer / kq)
(foreach pp lstent
(setq tt (entget pp))
(if (and
(member (cons 0 otype) tt)
(member (cons 8 olayer) tt)
)
(setq kq (append kq (list pp)))
)
)
kq
)
(defun ss2ent(ss / sodt index lstent)
(setq
sodt (if ss (sslength ss) 0)
index 0
)
(repeat sodt
(setq ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
)
)
(reverse lstent)
)
;;;===============================================
(vl-load-com)
(defun c:jd (/ ss lstent lstcode lstpoint lstponew lstassoc
lstass pc code p lstPLY p0
lstponew co n
)
(setq ActDoc (vla-get-ActiveDocument (vlax-get-acad-object))
*Model* (vla-get-ModelSpace ActDoc)
*layer* (vla-get-Layers ActDoc)
)
(vla-StartUndoMark ActDoc)
(if (not (setq enlay (tblobjname "layer" "DUONGCHUYEN")))
(setq lay (vla-add *layer* "DUONGCHUYEN"))
(progn
(setq lay (vlax-ename->vla-object enlay))
(setq lay (vla-add *layer* "DUONGCHUYEN"))
)
)
(vla-put-color lay acRed)
(vla-put-Linetype lay "continuous")
(setvar "clayer" "DUONGCHUYEN")
(SAVE_MODE)
(setq
ss (ssget
'((-4 . " (-4 . " (0 . "POINT")
(8 . "DIEM")
(-4 . "AND>")
(-4 . " (0 . "TEXT")
(8 . "TENDIEM")
(-4 . "AND>")
(-4 . "OR>")
)
)
lstent (ss2ent ss)
lstcode (mapcar '(lambda (e)
(cons (cdr (assoc 10 (entget e)))
(cdr (assoc 1 (entget e)))
)
)
(filter lstent "TEXT" "TENDIEM")
)
lstpoint (mapcar '(lambda (e) (cdr (assoc 10 (entget e))))
(filter lstent "POINT" "DIEM")
)
lstpoint (mapcar '(lambda (p)
(cons (timgan p lstcode) p)
)
lstpoint
)
)
(setq lstpoint
(vl-sort
lstpoint
'(lambda (e1 e2)
(< (car e1)
(car e2)
)
)
)
)
(foreach pn lstpoint
(setq lstponew
(cons (cons (read (substr (car pn) 1 1)) (list (cdr pn)))
lstponew
)
)
(setq lstassoc (cons (substr (car pn) 1 1) lstassoc))
)
(setq lstponew (reverse lstponew))
(while lstassoc
(setq lstass (cons (car lstassoc) lstass)) ;flag
(setq lstassoc (vl-remove (car lstassoc) lstassoc))
)
(setq n 1)
(foreach flag lstass
(setq lstPLY nil)
(while (setq co (assoc (read flag) lstponew))
(setq lstPLY (append (cadr co) lstPLY))
(setq lstponew (vl-remove co lstponew))
)
(vla-put-color (3DPoly lstPLY *Model*) n)
(setq n (1+ n))
)
(RESTORE)
(princ)
)

Còn đây là bản vẽ Thiep đã test:
http://www.cadviet.c...es/2/vd_3_1.dwg

cám ơn bạn nhiều, nhưng mình muốn nối điểm tự do,ko muốn nối tư động,nếu có thế thực hiện trên 1 lớp thì tốt hơn..mong bạn giúp đở... :s_big:
  • 0

#72 vqhnb

vqhnb

    biết pan

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

Đã gửi 11 September 2009 - 10:24 PM

Uh, mình là dân giao thông.
giải quyết một biểu thức toán học cũng không fải là vấn đề phức tạp lắm. bản thân cad đã cung cấp cho ta công cụ để giải quyết các biểu thức toán học là lệnh CAL. có thể nhúng lệnh này vào lisp khá đơn giản. Tuy nhiên mình nghĩ điều đó không cần thiết.
Vấn đề có lẽ là do anh Tuệ và mọi người không hiểu đc ý của bạn từ bản vẽ bạn up lên. (như bản vẽ của bạn thì ai cũng có thể hiểu phần thứ 3 mới là kết quả cuối cùng bạn muốn). Bạn chú ý cho lần sau nhé. Người viết lisp không phải là bạn nên có thể không hiểu đc điều bạn muốn, vì thế khi yêu cầu phải rõ ràng, cụ thể, một nghĩa thì mọi người mới có thể giúp bạn được. cũng để tránh gây cảm giác bực mình cho người giúp bạn khi công sức bỏ ra đành vứt đi và fải viết lại lisp.

EDIT: Ah, em hiểu ý của anh Tuệ rồi, để em thử xem thế nào :s_big:

Chân thành cảm ơn các bác đã giúp đỡ. Đúng là khi mình yêu cầu một lisp nào đó mình cũng cố gắng viết làm sao cho ngắn ngọn dễ hiểu, nhưng trình độ mình có hạn có thể không hiểu hết vấn đề phát sinh khi yêu cầu, công sức các pác bỏ ra quả là rất đáng trân trọng. Một lần nữa mình xin chân thành cám ơn.
  • 0

#73 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 12 September 2009 - 12:07 AM

Đây là lisp em đã viết lại theo gợi ý của anh Tuệ
Lisp sẽ đưa ra yêu cầu
- nhập số muốn nhân. (nếu không có thì enter bỏ qua)
- nhập số muốn chia. (nếu không có thì enter bỏ qua. em tách số muốn nhân và số muốn chia thành 2 số độc lập để đỡ fải nhẩm giá trị nghịch đảo của một số nào đó khi thực muốn hiện phép chia)
- nhập số muốn cộng (nếu không có thì enter bỏ qua. nếu muốn thực hiện phép trừ thay cho phép cộng thì chỉ cần nhập giá trị âm)
- chọn các text số cần thay đổi giá trị. --> OK
(defun c:tinh()
(setq i 0 nhan 1 chia 1 cong 0)
(setq nhan1 (getreal "\nnhap so muon nhan: ")
chia1 (getreal "\nnhap so muon chia: ")
cong1 (getreal "\nnhap so muon cong them: "))
(if nhan1 (setq nhan nhan1))
(if chia1 (setq chia chia1))
(if cong1 (setq cong cong1))
(prompt "\nchon cac so can sua ...")
(setq txt (ssget '((0 . "TEXT"))))
(repeat (sslength txt)
(setq txt_name (ssname txt i))
(setq txt_ent (entget txt_name))
(setq cont1 (cdr(assoc 1 txt_ent)))
(setq cont (atof cont1))
(if (and (/= cont1 "0") (/= cont1 "0.0") (/= cont1 "0.00") (/= cont1 "0.000") (/= cont1 "0.0000") (/= cont1 "0.0000") (/= cont1 "00.0") (/= cont1 "00.00") (/= cont1 "00.000") (/= cont1 "00.0000") (/= cont1 "00.0000") (= cont 0)) ()
(progn
(setq s (+ (/ (* cont nhan) chia) cong))
(setq txt_ent (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
(entmod txt_ent)))
(setq i (+ i 1))
);repeat
);defun
Quả thật sau khi hoàn thiện lisp này mới thấy ý tưởng của anh Tuệ rất hay, rất thông minh. cảm ơn anh đã góp ý để em hoàn thiện code này. :s_big:

Đoạn code này em có bổ xung thêm phần lọc đối tượng text là số và chuỗi ký tự. cách làm hơi củ chuối tý nhưng em nghĩ nó hoạt động tương đối hiệu quả rồi. hiện tại em cũng chưa nghĩ ra cách nào tốt hơn giúp lọc đối tượng text thành số và chuỗi ký tự riêng biệt.
cách làm này có nhược điểm:
- bị giới hạn nhận diện các số có giá trị bằng 0 (ngoài các số có giá trị là 0 đã đưa vào lisp như trên thì các số 0 dạng khác nó sẽ hiểu thành chuỗi ký tự. VD số 0.0 thì nó nhận diện được, còn số 000.00000 nó hiểu là chuỗi ký tự "000.00000" và ko thực hiện phép tính cho số này)
- còn bị nhầm lẫn một chỗi ký tự thành một số nếu các kỹ tự đầu chuỗi là số. VD chỗi 23ABCD thì nó sẽ hiểu thành 23.
tuy nhiên những trường hợp trên là rất ít gặp và có thể khắc phục trong qúa trình sử dụng. Hi vọng anh Tuệ mọi người có cách khác hay hơn.
  • 4

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


#74 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 12 September 2009 - 01:48 AM

Bác Thaistreetz là dân giao thông chắc bác biết lệnh tạo nhà trong nova bác có thể giúp em viết một lisp tạo nhà giống như thế được không.

Chào bạn Tuynh
Quả thật là mình không biết lệnh "tạo nhà" trong nova là lệnh nào. Phải chăng bạn muốn nói đến các loại địa vật vẽ trên trắc ngang? nếu không fải thì bạn cho mình tên lệnh và tên bản nova bạn đang dùng để mình kiểm tra nhé. nếu giúp được mình sẵn lòng.
  • 0

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


#75 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 12 September 2009 - 08:06 AM

Đây là lisp em đã viết lại theo gợi ý của anh Tuệ
Lisp sẽ đưa ra yêu cầu
- nhập số muốn nhân. (nếu không có thì enter bỏ qua)
- nhập số muốn chia. (nếu không có thì enter bỏ qua. em tách số muốn nhân và số muốn chia thành 2 số độc lập để đỡ fải nhẩm giá trị nghịch đảo của một số nào đó khi thực muốn hiện phép chia)
- nhập số muốn cộng (nếu không có thì enter bỏ qua. nếu muốn thực hiện phép trừ thay cho phép cộng thì chỉ cần nhập giá trị âm)
- chọn các text số cần thay đổi giá trị. --> OK

cách làm này có nhược điểm:
- bị giới hạn nhận diện các số có giá trị bằng 0 (ngoài các số có giá trị là 0 đã đưa vào lisp như trên thì các số 0 dạng khác nó sẽ hiểu thành chuỗi ký tự. VD số 0.0 thì nó nhận diện được, còn số 000.00000 nó hiểu là chuỗi ký tự "000.00000" và ko thực hiện phép tính cho số này)
- còn bị nhầm lẫn một chỗi ký tự thành một số nếu các kỹ tự đầu chuỗi là số. VD chỗi 23ABCD thì nó sẽ hiểu thành 23.
tuy nhiên những trường hợp trên là rất ít gặp và có thể khắc phục trong qúa trình sử dụng. Hi vọng anh Tuệ mọi người có cách khác hay hơn.

- nhập số muốn cộng (nếu không có thì enter bỏ qua. nếu muốn thực hiện phép trừ thay cho phép cộng thì chỉ cần nhập giá trị âm) : cái này mình đồng ý với bạn.

- nhập số muốn nhân. (nếu không có thì enter bỏ qua)
- nhập số muốn chia. (nếu không có thì enter bỏ qua. em tách số muốn nhân và số muốn chia thành 2 số độc lập để đỡ fải nhẩm giá trị nghịch đảo của một số nào đó khi thực muốn hiện phép chia)

Cái này Tue_NV không đồng ý với bạn

Chỉ cần (setq nhan1 (getreal "\nnhap so muon nhan: "))
-> nnhap so muon nhan: 100 -> Return -> 100.0
Còn nếu : -> nnhap so muon nhan: 1/100 -> Return -> 0.01
Tức là nếu nhân với 100 thì nhập 100; nếu chia cho 100 thì nhập 1/100 -> OKay

Vậy nên dòng này trong Code của bạn : chia1 (getreal "\nnhap so muon chia: ") -> bỏ

Vô hình dung 1 mũi tên bắn 2 nhạn -> bạn đã khắc phục được dãy số 0.00000000 hoặc 000.00 vô nghĩa đó là nhược điểm trong Code của bạn. Bạn thử xem -> sẽ rút ra vấn đề của bài toán

Hãy hoàn thành Code trên theo ý tưởng của Tue_NV và mình cũng đã hoàn thành xong code này. Nó rất tuyệt
Bạn chú ý tới số 1 và số 0 màu đỏ ở dưới nhé. Thêm chúng vào chuỗi để người dùng dễ hiểu nhé.
Chỉ cần 3 dòng Input thôi nhé

Dữ liệu đầu vào (Input)

nhap so muon nhan hoac chia <1> : (1)

nhap so muon cong hoac tru <0> : (2)

chon cac so can sua : (3)

Xử lý (Processor)

-> Xuất kết quả (Output)

Lisp này sẽ tương đương với 4 Lisp trên của bạn (có thể cộng; hoặc trừ; hoặc nhân; hoặc chia cùng trong 1 Lisp nhưng có tính năng ưu việt hơn là khả năng tính theo quy tắc : Nhân chia trước, cộng trừ sau
Nếu chỉ cộng hoặc trừ text với 1 số thôi thì : (tương đương với Lisp cong.lsp và tru.lsp của bạn)
Hàng 1 : nhập số 1 (Khi nhân hay chia một số với số 1 thì kết quả là chính nó)
Hàng 2 : Nhập số cần cộng (ví dụ số 10 thì nhập 10) , muốn trừ thì nhập trừ (- 10)

Nếu chỉ nhân hoặc chia text với 1 số thôi thì : (tương đương với Lisp nhan.lsp và chia.lsp của bạn)
Hàng 1 : Nhập số cần nhân hoặc chia (Ví dụ : Nếu nhân với 100 thì nhập 100; nếu chia cho 100 thì nhập 1/100)
Hàng 2 : nhập số 0 (Khi cộng hay trừ một số với số 0 thì kết quả là chính nó)

Nếu để nhân chia trước, cộng trừ sau đối với Text : tính năng mới : nhân chia trước, cộng trừ sau)
Hàng 1 : Nhập số cần nhân hoặc chia (Ví dụ : Nếu nhân với 100 thì nhập 100; nếu chia cho 100 thì nhập 1/100)
Hàng 2 : Nhập số cần cộng hoặc trừ


  • 3

#76 dovanlinh

dovanlinh

    biết vẽ arc

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

Đã gửi 12 September 2009 - 08:32 AM

Không biết điểm gốc của đối tượng dtext theo ý bạn là điểm nào trong 2 điểm sau:
- điểm bắt đầu của đối tượng Dtext, nó nằm ở góc dưới bên trái mỗi đối tượng dtext. Điểm này có mã DXF là 10
- điểm Justify của đối tượng Dtext, nó nằm ở một trong các vị trí: Left, center, right, top left, top center ... của text. Điểm này có mã DXF là 11.

Mình lấy ví dụ cho trường hợp 1 nhé. trường hợp 2 cũng tương tự.
@vqhnb: Lisp bạn cần mình nhớ ở diễn đàn đã có. bạn PHẢI TÌM KIẾM TRƯỚC khi post yêu cầu nhé (dùng hộp thoại tìm kiếm). nếu vì một lý do nào đó lisp đã có trên diễn đàn chưa phù hợp với nhu cầu của bạn thì hãy post yêu cầu đê mọi người sửa giúp bạn.

chuẩn rổi! cám ơn nhé!
  • 0
49XD1

#77 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 12 September 2009 - 10:58 AM

cám ơn bạn nhiều, nhưng mình muốn nối điểm tự do,ko muốn nối tư động,nếu có thế thực hiện trên 1 lớp thì tốt hơn..mong bạn giúp đở... :s_big:

Chào kamezoko, nếu muốn nối điểm tự do thì nối bằng tay thôi. Trong bản vẽ của bạn, các điểm 1, 2, 3 nối theo quy luật số tự nhiên tăng đều liên tục. Đến điểm 3 nối 5 nối 7 nối 9 nối 11 nối 13, dừng, thì không theo quy luật trên nữa mà tăng cách quảng 1. Các điểm: A1 nối A2 nối A3 nối A4 thì dừng, không nối tiếp? Còn nối điểm theo lớp, thì cũng có quy luật nối, nếu không lisp sẽ không hiểu hoặc nối tùm lum.
Đến đây Thiep bó tay.com!
Thiep nghĩ lisp JD.lsp mà Thiep chỉnh sửa cũng rất có ích cho những nhà địa chất công trình đó, trên 1 mặt cắt địa chất công trình có nhiiều hố khoan đã phân tầng theo quy luật: Hố khoan HK1 được phân tầng bởi các điểm A1, B1 ... Z1. Hố khoan HK2 được phân tầng bởi các điểm A2, B2 ... Z2. Hố khoan HKn (n là số tự nhiên) được phân tầng bởi các điểm An, Bn ... Zn. Dùng lisp JD sẽ khoanh nối được các ranh giới các tầng địa chất.
  • 1

#78 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 12 September 2009 - 11:18 AM

Cám ơn bạn 'phamthanhbinh'
mình muốn một phát ăn ngay xơi hết tất cả các điểm không chơi bắn tỉa. Thực ra mình chỉ biết tác dụng của chương trình lisp thôi chứ chưa một ngày học lisp. Ý mình là dùng một lisp để chuyển ra kết quả cuối cùng nhưng ở dòng Command: lisp có hỏi là có đổi cao độ hay không tức là +,-,*,/ vào một số x nào đấy vì có lúc công trình chỉ dùng cao độ giả định, nhưng có công trình lại đỏi hỏi cao độ quốc gia. thanks lời chúc của bạn

Chào bạn vqhnb,
Xin lỗi bạn vì mình khong phải dân giao thông hay trắc địa như bạn nên chưa hiểu được ý bạn ngay. Mình cũng đã đọc các bài pót của bác TueNV bác Thaistreet về cách giải quyết các vấn đề của bạn. Không biết bạn có còn cần nữa không, nhưng theo cái cách hiểu củ chuối của mình thì mình cũng viết thử một cái lisp hy vọng sẽ giúp được bạn.
Cách giải quyết của mình thật ra không được hay và trọn vẹn như các bác ấy đã nêu nhưng có lẽ theo mình thì nó trực diện hơn và có vẻ dễ hiểu hơn cho những người mới học lisp.
Trước hết về phần chọn đối tượng mình sử dụng hàm ssget để bạn có thể dễ dàng lựa chọn đúng đối tượng cần chuyển đối. Bởi vì trên bản vẽ của bạn hẳn còn nhiều loại text khác nhau chứ không phải chỉ có các text số như vậy.
Sau khi bạn lựa chọn xong các đối tượng cần chuyển, có thể dùng cửa sổ để lựa chọn hay pick từng con trên bản vẽ cũng được. Nhấn enter lisp sẽ chuyển các đối tượng này về kiểu số chứa hai chữ số thập phân.
Sau khi chuyển các text này về đúng giá trị chứa hai chữ số thấp phân, lisp sẽ hỏi ban có muông thay đổi cao độ hay không, nếu bạn trả lời y (yes) thì lisp sẽ hỏi bạn phép tính mà bạn cần sử dụng, (cộng hay trừ hay nhân hay chia) bạn sẽ nhâp tên phép tính này vào theo đúng các ký tự đã gợi ý trong ngoặc và enter. Khi đó lisp sẽ hỏi bạn giá trị mà bạn cần nhập vào phép tính đó. Khi bạn đã nhập xong giá trị và enter thì lisp sẽ tự tính toán và trả ra kết quả bạn mong muốn đối với tất cả các đối tượng mà bạn đã thực hiện phép lựa chọn ở bên trên.
Bạn hãy dùng thử và cho mình biết ý kiến của bạn nhé.
Lisp đây bạn ạ:
http://www.cadviet.c...2/chgtext_1.lsp
Lệnh chạy lisp vẫn là chgtxt như cái lisp trước của mình.
Sau khi bạn chạy thử, bạn có thể mở hai cái lisp mà mình gửi bạn ra để so sánh và tìm thấy những gì mình đã bổ sung thêm vào cái lisp cũ và bạn sẽ thấy nó không quá phức tạp đâu, chỉ đơn giản là sử dụng thêm các hàm điều kiện if, while và các hàm getxxx để nhập số liệu thôi bạn ạ.
Chúc bạn thành công trong công việc và cuộc sống.

Đây là lisp mình đã chỉnh sửa lại theo gợi ý của bác TueNV và cái lisp mẫu của bác Thaistreet. Nó đơn giản và ngắn hơn cái lisp trên nhiều. Rất hay nhưng bạn cần hiểu rõ cách dùng như bác Thaistreet đã chỉ ở bài trước.
Trong lisp này gộp các phép tính lại nên việc nhập số liệu cho các phép tính cần chú y kẻo nhầm sẽ cho kết quả sai.
Bạn xài thử xem nhé.
http://www.cadviet.c.../2/chgtext1.lsp
  • 3
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#79 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 12 September 2009 - 11:26 AM

Chào kamezoko, nếu muốn nối điểm tự do thì nối bằng tay thôi. Trong bản vẽ của bạn, các điểm 1, 2, 3 nối theo quy luật số tự nhiên tăng đều liên tục. Đến điểm 3 nối 5 nối 7 nối 9 nối 11 nối 13, dừng, thì không theo quy luật trên nữa mà tăng cách quảng 1. Các điểm: A1 nối A2 nối A3 nối A4 thì dừng, không nối tiếp? Còn nối điểm theo lớp, thì cũng có quy luật nối, nếu không lisp sẽ không hiểu hoặc nối tùm lum.
Đến đây Thiep bó tay.com!

Chào kamezoko và thiep
Lisp sau Tue_NV đã viết theo ý kamezoko nhưng chưa hoàn thành.
và mình post lên để giúp cho kamezoko.
Lisp trên nối điiẻm chèn Text lại với nhau theo ý của kamezoko.
Vì Lisp trên chưa hoàn hảo nên muốn thoát bạn bấm Esc 2 lần để thoát lệnh nhé.
Bạn xài tạm vậy :
(defun c:ntdt(/ lis a ss i ent chu p x)
(setvar "cmdecho" 0)
(prompt "Chon Text :")
(setq ss (ssget '((0 . "TEXT"))) i 0 lis nil res " " lisch "")
(while (< i (sslength ss))
(setq ent (entget(ssname ss i)))
(setq chu (cdr(assoc 1 ent)))
(setq p (cdr(assoc 10 ent)))
(setq lis (append lis (list (cons chu p))))
(setq lisch (strcat lisch chu res))
(setq i (1+ i))
)

(command "line")
(foreach x lis
(initget 1 (eval lisch))
(command
(if (setq a (assoc (getkword "\n Nhap chu : ") lis))
(progn
(cdr a)
)
)
)
)

(princ)
)
Nếu thiep và mọi người rảnh thì xin sửa dùm Code này lại với vì hiện giờ Tue_NV rất bận. Thanks
  • 1

#80 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 12 September 2009 - 12:38 PM

Chào kamezoko và thiep
Lisp sau Tue_NV đã viết theo ý kamezoko nhưng chưa hoàn thành.
và mình post lên để giúp cho kamezoko.
Lisp trên nối điiẻm chèn Text lại với nhau theo ý của kamezoko.
Vì Lisp trên chưa hoàn hảo nên muốn thoát bạn bấm Esc 2 lần để thoát lệnh nhé.
Bạn xài tạm vậy :

(defun c:ntdt(/ lis a ss i ent chu p x)
....
(princ)
)
Nếu thiep và mọi người rảnh thì xin sửa dùm Code này lại với vì hiện giờ Tue_NV rất bận. Thanks

Chào Tue_NV, lisp trên yêu cầu người dùng đưa vào tên điểm bằng bàn phím để nối line. Thay vì vậy, người dùng ra lệnh LINE xong pick bằng chuột từng điểm một trên màn hình. Hai cách này giống nhau, thậm chí cách pick bằng chuột sẽ nhanh hơn.
Mặt khác, tọa độ điểm và tọa độ TEXT (tên điểm) đôi khi khác nhau đó bạn.
  • 3