Đến nội dung


Hình ảnh
5 stars - based on 24598 reviews
* * * - - 5 Bình chọn

[yêu cầu &thảo luận] lisp vẽ mặt bằng kết cấu


  • Please log in to reply
117 replies to this topic

#41 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 20 May 2013 - 11:22 AM

@Ha : tôi không sử dụng Lisp này nhưng thông thường chiều rộng dầm theo 2 phương (ngang dọc) là khác nhau.

nên nhiều khả năng là sẽ có yêu cầu này ? Hà chuẩn bị trước nhé!

Nếu chỉ có 1 B ngang và 1 B dọc thì chắc sửa OK, còn như n B ngang và m B dọc thì nhờ Thiên Lôi thôi!


  • 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ờ. Và đừng làm điều ngược lại.

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


#42 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 20 May 2013 - 01:34 PM

Khó! Phức tạp! Nhất là tìm cho ra thuật toán để giải 1 bài toán tưởng chừng như đơn giản!

 

Lisp này vẽ lưới tường theo hệ các line trục đã có. Yêu cầu: các ô phải là hình chữ nhật.

 

(bạn phongtran86 chắc phải 10 like mới xứng  :lol:)

 

Ví dụ : Nhà chữ L chia thành 2 hình chữ nhật, chạy ra không đúng nữa rồi


  • 1

#43 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 20 May 2013 - 01:47 PM

Ví dụ : Nhà chữ L chia thành 2 hình chữ nhật, chạy ra không đúng nữa rồi

Giới hạn đã nói rồi!


  • 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ờ. Và đừng làm điều ngược lại.

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


#44 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 20 May 2013 - 01:51 PM

Giới hạn đã nói rồi!

 

Thấy bác ghi yêu cầu các ô là hình chữ nhật mà  :) . Chữ L chia thành 2 ô chữ nhật thoả mãn yêu cầu  :lol:


  • 0

#45 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 20 May 2013 - 02:13 PM

Thấy bác ghi yêu cầu các ô là hình chữ nhật mà  :) . Chữ L chia thành 2 ô chữ nhật thoả mãn yêu cầu  :lol:

Đề bài toán bao gồm vẽ cả ô ngoài nữa >> các ô phải là HCN bao gồm cả ô ngoài!


  • 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ờ. Và đừng làm điều ngược lại.

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


#46 phongtran86

phongtran86

    biết lệnh offset

  • Members
  • PipPipPip
  • 177 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 20 May 2013 - 07:06 PM

9like cho anh Hà. :D Còn 1 yêu cầu nhỏ nữa, cái này chắc ko khó là mấy cái dầm phụ có thể ko dung bề rông với dầm chính. Nên anh chỉnh chút giúp em là nhập bề rộng dầm chọn 1 số trục, enter, nhập bề rộng dầm khác- chọn trục tiếp enter là xong (nếu ở bước nhập bề rộng dầm khác mà ko có nhấn enter thi kết thúc lệnh luôn :D Cảm ơn sự nhiệt huyết của anh :)


  • 0

#47 phongtran86

phongtran86

    biết lệnh offset

  • Members
  • PipPipPip
  • 177 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 20 May 2013 - 07:43 PM

Líp overkill.lsp có tác dụng gí vậy anh ơi :D


  • 0

#48 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 21 May 2013 - 06:35 AM

Líp overkill.lsp có tác dụng gí vậy anh ơi :D

Lisp này chứa hàm xóa các đối tượng trùng nhau.


  • 0

* 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ờ. Và đừng làm điều ngược lại.

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


#49 phongtran86

phongtran86

    biết lệnh offset

  • Members
  • PipPipPip
  • 177 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 21 May 2013 - 07:50 AM

ui chờ anh :) anh sửa chút là chọn đối tượng trụcc trước, nhập bề rồng dầm được chọn ---->chọn đối tượng trục khác(dầm phụ) bề rộng dầm(nếu ko nhập bước này mà nhập enter thị thực hiện trục trc)---> chọn đối tượng trục khác:D bề rộng( nếu enter thi thực hiện lệnh ngay). Công tác chọn đối tượng và bề rộng dầm anh cho vao vong lặp cho em. HÌ hì. cảm ơn anh nhiều nhiều.


  • 0

#50 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 21 May 2013 - 08:20 AM

ui chờ anh :) anh sửa chút là chọn đối tượng trụcc trước, nhập bề rồng dầm được chọn ---->chọn đối tượng trục khác(dầm phụ) bề rộng dầm(nếu ko nhập bước này mà nhập enter thị thực hiện trục trc)---> chọn đối tượng trục khác:D bề rộng( nếu enter thi thực hiện lệnh ngay). Công tác chọn đối tượng và bề rộng dầm anh cho vao vong lặp cho em. HÌ hì. cảm ơn anh nhiều nhiều.

 

Mình hỏi bạn chút: giả dụ bạn chọn trục rồi chọn bề rộng dầm rồi thì làm sao bạn biết bạn đã chọn trục chưa, bề rộng dầm nhập cho trục đó là bao nhiêu? Mặt bằng tương đối lớn rất dễ nhâm lẫn đó bạn. Hơn nữa, vẽ bề rộng dầm dựa vào lưới trục thì còn phải dựa vào hệ tường nữa. Chứ không phải là chùi sạch Mặt bằng kiến trúc đi chỉ để lưới trục mà vẽ dầm, bởi lẽ còn phải dựa vào tường để vẽ dầm nữa, rồi có khi còn phải tính tới độ lẹch trục dầm so với lưới trục là bao nhiêu? chứ không phải lúc nào trục cũng không lệch so với trục dầm như hình bạn post

 

Bản thân mình thấy làm được, mức độ hoàn thành có thể đạt 100%, làm cho đường xiên, Mặt bằng phức tạp. Có điều phải giải quyết mấy điều phân tích trên có lẽ mới nhanh được. Nếu không Lisp viết ra sẽ ngang ngữa với vẽ thủ công mà thậm chí vẽ thủ công còn nhanh hơn vì không phải ngồi dò nữa


  • 0

#51 phongtran86

phongtran86

    biết lệnh offset

  • Members
  • PipPipPip
  • 177 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 21 May 2013 - 08:58 AM

nhanh mà anh Tue_NV. Mình chỉ chuyển 1 số nét tường dầm phụ trên mặt bằng kiến trúc tắt later, copy sang. sẽ nhanh hơn thủ công phải copy offset rồi trim. :D Mong được sự giúp của bác để lisp tỏng quát :)


  • 0

#52 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 21 May 2013 - 08:58 AM

Mình hỏi bạn chút: giả dụ bạn chọn trục rồi chọn bề rộng dầm rồi thì làm sao bạn biết bạn đã chọn trục chưa, bề rộng dầm nhập cho trục đó là bao nhiêu? Mặt bằng tương đối lớn rất dễ nhâm lẫn đó bạn.

Cần thiết để tránh nhầm thì đánh dấu vào những thằng đã chọn?


  • 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ờ. Và đừng làm điều ngược lại.

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


#53 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 21 May 2013 - 09:06 AM

Cần thiết để tránh nhầm thì đánh dấu vào những thằng đã chọn?

 

Với MB nhỏ thì dễ , với MB tương đối lớn tí thì dễ bị nhầm. Bác có thể đánh dấu vào những lưới trục đã chọn, bác biết đã chọn rồi ok, nhưng liệu bác có nhớ đã nhập vào dầm đó là bề rộng là bao nhiêu không? Lấy gì để nhớ?

Chương trình thì chỉ làm có được một lần, chưa biết chắc đúng hay sai, lưới trục thì không phải lúc nào cũng trùng với trục dầm, modify thì phải dò và Stretch, có khi còn khổ hơn làm thủ công... :)


  • 0

#54 phongtran86

phongtran86

    biết lệnh offset

  • Members
  • PipPipPip
  • 177 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 21 May 2013 - 09:22 AM

tr­­ường hợp thông thường các dầm chính thường là 220 nên trục dầm trùng với trục định vị. Các dầm phụ vẽ trục định vị cho dầm này bên mb kiến trúc.


  • 0

#55 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 21 May 2013 - 09:26 AM

Với MB nhỏ thì dễ , với MB tương đối lớn tí thì dễ bị nhầm. Bác có thể đánh dấu vào những lưới trục đã chọn, bác biết đã chọn rồi ok, nhưng liệu bác có nhớ đã nhập vào dầm đó là bề rộng là bao nhiêu không? Lấy gì để nhớ?

Chương trình thì chỉ làm có được một lần, chưa biết chắc đúng hay sai, lưới trục thì không phải lúc nào cũng trùng với trục dầm, modify thì phải dò và Stretch, có khi còn khổ hơn làm thủ công... :)

2). OK

1). Cũng như các trục (đánh dấu), thì kể cả bề rộng từng dầm tương ứng với chúng cũng có cách để "nhớ" và thấy trực quan trên màn hình luôn. Nhưng mệt!


  • 0

* 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ờ. Và đừng làm điều ngược lại.

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


#56 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 21 May 2013 - 09:48 AM

tr­­ường hợp thông thường các dầm chính thường là 220 nên trục dầm trùng với trục định vị. Các dầm phụ vẽ trục định vị cho dầm này bên mb kiến trúc.

 

Đó là trường hợp nhỏ lẻ, gặp đặc biệt phải dò lại thôi bạn.........

Mình chưa viết Lisp này bởi lẽ chưa tìm được Phương án tối ưu nhất, chưa thấy sự hiệu quả của nó, bạn ạ. 

Nếu cứ vẽ ra rồi thì không modify gì được hết, phải mất công dò lại, thì thà rằng làm tay vừa kiểm tra vừa soát lại còn khỏe hơn

Mà công trình thì không phải lúc nào làm một lần là xong đâu bạn, phải thay đổi khá nhiều đó.

Không lẽ mỗi lúc thay đổi lại bạn phải chạy lại chương trình? Có kiểm soát hết được đâu bạn? 


  • 0

#57 phongtran86

phongtran86

    biết lệnh offset

  • Members
  • PipPipPip
  • 177 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 21 May 2013 - 11:59 AM

trường hợp đặc biệt mới vậy. còn trường hợp không đặc biệt chiếm phần lớn chứ sao lại nhỏ lẻ :D Anh cứ viết đi rồi phát triển và hoàn thiện dần. :)


  • 0

#58 phongtran86

phongtran86

    biết lệnh offset

  • Members
  • PipPipPip
  • 177 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 22 May 2013 - 10:40 AM

http://mp3.zing.vn/b...h/ZW6UZ69O.html Chờ người nơi ấy. :D


  • 0

#59 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 22 May 2013 - 11:00 AM

http://mp3.zing.vn/b...h/ZW6UZ69O.html Chờ người nơi ấy. :D

Nợ tình chưa trả đủ thì chờ với chả mong làm gì! :lol:


  • 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ờ. Và đừng làm điều ngược lại.

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


#60 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 22 May 2013 - 04:06 PM

Kết thúc lisp này ở đây, vì quá khó, quá mất công, và còn dành thời gian kiếm cơm nữa!

File cad để test:

http://www.cadviet.c...67029_test2.dwg

File hình để rửa mắt:

67029_untitled_10.png

File lisp trần ai:

 

;Doan Van Ha - CADViet.com - Ngay 22/05/2013
;Chuc nang: ve luoi dam/tuong theo he truc // XOY, be rong tuy chon, luoi break bat ky nhung o ngoai cung phai la HCN.
(defun C:HA(/ ss lsti lst lstg1 giao lstg kcm ptx pty ent)
 (vl-load-com) (command "undo" "be")
 (setq cmd (getvar "cmdecho") osm (getvar "osmode") hpb (getvar "hpbound")) (setvar "cmdecho" 0) (setvar "osmode" 0) (setvar "hpbound" 1)
 (while
  (and
   (princ "\nChon cac Line duong truc...")
   (setq ss (ssget '((0 . "LINE"))))
   (setq lsti (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
   (or kc (setq kc 110))
   (setq kc (cond ((getdist (strcat "\nBe rong tuong/dam <" (rtos kc 2 2) ">:"))) (kc))))
  (setq lst (append (mapcar '(lambda(ent) (list ent kc)) lsti) lst)))
 (foreach n1 lst
  (setq lstg1 nil)
  (foreach n2 lst
   (if (setq giao (car (HA:Giao (vlax-ename->vla-object (car n1)) (vlax-ename->vla-object (car n2)) acExtendNone)))
    (setq lstg1 (cons giao lstg1))))
  (if lstg1 (setq lstg (append lstg1 lstg))))
 (setq lstg (LM:UniqueFuzz (vl-sort lstg '(lambda(p q) (if (equal (car p) (car q) 1E-8) (< (cadr p) (cadr q)) (< (car p) (car q))))) 1E-8))
 (HA:hcn (car lstg) (last lstg) 0)
 (HA:OffsetInOut (entlast) lst "N")
 (setq kcm (* 0.9 (HA:DisMinMax lstg "min")))
 (setq ss (ssadd) ptx (polar (car lstg) 0 kcm))
 (while (< (car ptx) (car (last lstg)))
  (setq pty (polar ptx (/ pi 2) kcm))
  (while (< (cadr pty) (cadr (last lstg)))
   (setq ent (entlast))
   (command "boundary" pty "")
   (if (setq ent (entnext ent)) (setq ss (ssadd ent ss)))
   (setq pty (polar pty (/ pi 2) kcm)))
  (setq ptx (polar ptx 0 kcm)))
 (load "overkillsup.lsp") (acet-overkill2 (list ss 1E-8 nil "N" "N" "N"))
 (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "w" (car lstg) (last lstg) '((0 . "LWPOLYLINE"))))))
  (HA:OffsetInOut ent lst "T"))
 (acet-overkill2 (list (ssget "w" (car lstg) (last lstg) '((0 . "LWPOLYLINE"))) 1E-8 nil "N" "N" "N"))
 (setvar "cmdecho" cmd) (setvar "hpbound" hpb) (command "undo" "e") (princ) lst)
;----- Check xem 2 lines ent1 vµ ent2 n»m trªn cïng ®­êng th¼ng kh«ng?
(defun HA:2LineCollinear-p(ent1 ent2)
 (setq p1 (vlax-curve-getStartPoint ent1) p2 (vlax-curve-getEndPoint ent1)
       q1 (vlax-curve-getStartPoint ent2) q2 (vlax-curve-getEndPoint ent2))
 (and
  ((lambda(a b c) (or (equal (+ a b) c 1e-8) (equal (+ b c) a 1e-8) (equal (+ c a) b 1e-8))) (distance p1 p2) (distance p2 q1) (distance q1 p1))
  ((lambda(a b c) (or (equal (+ a b) c 1e-8) (equal (+ b c) a 1e-8) (equal (+ c a) b 1e-8))) (distance p1 p2) (distance p2 q2) (distance q2 p1))))
;----- Check xem ®iÓm p co n»m trong/ngoµi obj kin hay kh«ng?
(defun HA:PointInOut (p obj flag / flag1 obj1 obj2 lon nho)
 (setq obj1 (car (vlax-invoke obj 'Offset 1E-3))
       obj2 (car (vlax-invoke obj 'Offset -1E-3)))
 (if (> (vla-get-area obj1)(vla-get-area obj2))
  (setq lon obj1 nho obj2)
  (setq lon obj2 nho obj1))
 (if (> (distance p (vlax-curve-getClosestPointTo lon p))(distance p (vlax-curve-getClosestPointTo nho p)))
  (if (= flag "T")
   (setq flag1 T)))
 (mapcar 'vla-delete (list lon nho))
 flag1)
;----- Offset ent vµo bªn trong polygon, víi dis mçi c¹nh kh¸c nhau.
(defun HA:OffsetInOut(ent lstx flag / obj0 obj obj1 obj2 i mid objc objl lst lst1 lst2 lst3 lst4)
 (setq obj0 (vlax-ename->vla-object ent))
 (setq lst (mapcar 'cdr (vl-remove-if-not '(lambda(x) (= (car x) 10)) (entget ent))))
 (setq entlst (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "cp" lst '((0 . "LINE")))))))
 (setq lst1 (append lst lst))
 (setq i 0)
 (repeat (length lst)
  (setq obj (vlax-ename->vla-object (setq ent1 (entmakex (list (cons 0 "LINE") (cons 10 (nth i lst1)) (cons 11 (nth (1+ i) lst1)))))))
  (foreach ent2 entlst
   (if (HA:2LineCollinear-p ent1 ent2) (setq entL ent2)))
  (foreach ent lstx
   (if (equal entL (car ent)) (setq kcx (cadr ent))))
  (setq obj1 (car (vlax-invoke obj 'Offset (/ kcx 2))) obj2 (car (vlax-invoke obj 'Offset (/ kcx -2))))
  (setq mid (mapcar '(lambda(x y) (/ (+ x y) 2)) (vlax-curve-getStartPoint obj1) (vlax-curve-getEndPoint obj1)))
  (if (HA:PointInOut mid obj0 flag)
   (setq objc obj1 objl obj2)
   (setq objc obj2 objl obj1))
  (setq lst2 (cons objc lst2))
  (mapcar 'vla-delete (list objl obj))
  (setq i (1+ i)))
 (setq lst3 (append lst2 lst2))
 (setq i 0)
 (repeat (length lst2)
  (if (setq giao (HA:Giao (nth i lst3) (nth (1+ i) lst3) acExtendBoth))
   (setq lst4 (cons (car giao) lst4)))
  (setq i (1+ i)))
 (LWPoly lst4 1)
 (mapcar 'vla-delete (cons obj0 lst2)))
(defun LWPoly(lst cls)
 (entmakex (append (list 
    (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 (length lst)) (cons 70 cls)) (mapcar (function (lambda (p) (cons 10 p))) lst))))
(defun HA:Giao(obj1 obj2 mode / l r)
 (setq l (vlax-invoke obj1 'intersectwith obj2 mode))
 (repeat (/ (length l) 3)
  (setq r (cons (list (car l) (cadr l) (caddr l)) r) l (cdddr l)))
 r)
(defun HA:hcn(p1 p3 kc / p1x p3x)
 (setq p1x (list (+ (min (car p1) (car p3)) kc) (+ (min (cadr p1) (cadr p3)) kc))
       p3x (list (- (max (car p1) (car p3)) kc) (- (max (cadr p1) (cadr p3)) kc)))
 (command "rectang" p1x p3x))
(defun LM:UniqueFuzz(l fz)
 (if l 
  (cons (car l) (LM:UniqueFuzz (vl-remove-if '(lambda(x) (equal x (car l) fz)) (cdr l)) fz))))
(defun HA:DisMinMax(lst func / ghan)
 (if (= (strcase func) "MIN") (setq func min ghan 1E15) (setq func max ghan -1E15))
 (apply 'func (apply 'append (mapcar '(lambda(p) (mapcar '(lambda(q) (if (equal p q 1E-8) ghan (distance p q))) lst)) lst))))

  • 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ờ. Và đừng làm điều ngược lại.

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