Đến nội dung


Hình ảnh
- - - - -

Tính khối lượng Taluy


  • Please log in to reply
10 replies to this topic

#1 friendship293a

friendship293a

    biết lệnh erase

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

Đã gửi 03 April 2011 - 09:03 AM

Em nhờ các anh viết dùm cho em cái lisp có tính năng cụ thể thế này.
-Cho 2 số trên màn hình sau khi nhập lệnh thì chọn 2 số đó chương trình sẽ lấy giá trị trung bình của 2 số đó rùi lấy bình phương số trung bình đó rùi chia cho 2 sau đó nhân với khoảng cách được chọn trên màn hình rùi chọn vị trí điền kết quả.
+ Nếu đánh lệnh trên màn hình sẽ hiện. chọn 2text để lấy gt trung bình,Enter pick khoảng cách để nhân vào, Enter chọn vị trí điền kết quả.
+ Lý do là em tính khối lượng taluy theo công thức tam giác vuông cân. lấy bình phương giá trị trung bình( tương đương với bình phương một cạnh tam giác vuông chia 2 thì ra diện tích, nhân với chiều dài thì ra thể tích.
Cảm ơn mọi người đã quan tâm
  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 03 April 2011 - 10:39 AM

Em nhờ các anh viết dùm cho em cái lisp có tính năng cụ thể thế này.
-Cho 2 số trên màn hình sau khi nhập lệnh thì chọn 2 số đó chương trình sẽ lấy giá trị trung bình của 2 số đó rùi lấy bình phương số trung bình đó rùi chia cho 2 sau đó nhân với khoảng cách được chọn trên màn hình rùi chọn vị trí điền kết quả.
+ Nếu đánh lệnh trên màn hình sẽ hiện. chọn 2text để lấy gt trung bình,Enter pick khoảng cách để nhân vào, Enter chọn vị trí điền kết quả.
+ Lý do là em tính khối lượng taluy theo công thức tam giác vuông cân. lấy bình phương giá trị trung bình( tương đương với bình phương một cạnh tam giác vuông chia 2 thì ra diện tích, nhân với chiều dài thì ra thể tích.
Cảm ơn mọi người đã quan tâm

Dùng cái này xem sao:
(defun C:TTL()
(setq so1 (atof (cdr (assoc 1 (entget (car (entsel "\nChon so thu 1: ")))))))
(setq so2 (atof (cdr (assoc 1 (entget (car (entsel "\nChon so thu 2: ")))))))
(setq ln (entsel "\nChon line de lay chieu dai: "))
(setq ddau (cdr (assoc 10 (entget (car ln)))))
(setq dcuoi (cdr (assoc 11 (entget (car ln)))))
(setq kcach (distance ddau dcuoi))
(setq kq (* (/ (expt (+ so1 so2) 2) 8) kcach))
(setq dien (entget (car (entsel "\nChon text de dien ket qua: "))))
(setq dien (subst (cons 1 (rtos kq 2 2)) (assoc 1 dien) dien))
(entmod dien))
  • 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ờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

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


#3 friendship293a

friendship293a

    biết lệnh erase

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

Đã gửi 03 April 2011 - 11:29 AM

Bạn làm gần đúng ý mình. ý mình là độ dài là khoảng cách 2 điểm được píck chọn tự do trên màn hình chứ không phải là chọn đoạn thẳng như lisp của bạn( khoảng cách này cũng không phải là khoảng cách giữa số thứ nhất và số thứ 2 của bạn đâu mà là khoảng cách bất kỳ do người chọn píck trực tiếp 2 diem trên màn hình)
  • 0

#4 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 03 April 2011 - 11:49 AM

Bạn làm gần đúng ý mình. ý mình là độ dài là khoảng cách 2 điểm được píck chọn tự do trên màn hình chứ không phải là chọn đoạn thẳng như lisp của bạn( khoảng cách này cũng không phải là khoảng cách giữa số thứ nhất và số thứ 2 của bạn đâu mà là khoảng cách bất kỳ do người chọn píck trực tiếp 2 diem trên màn hình)

Thế thì thế này:
(defun C:TTL(/ so1 so2 p1 p2 kc kq dien)
(setq so1 (atof (cdr (assoc 1 (entget (car (entsel "\nChon so thu 1: ")))))))
(setq so2 (atof (cdr (assoc 1 (entget (car (entsel "\nChon so thu 2: ")))))))
(setq p1 (getpoint "\nChon diem thu 1: "))
(setq p2 (getpoint "\nChon diem thu 2: "))
(setq kc (distance p1 p2))
(setq kq (* (/ (expt (+ so1 so2) 2) 8) kc))
(setq dien (entget (car (entsel "\nChon text de dien ket qua: "))))
(setq dien (subst (cons 1 (rtos kq 2 2)) (assoc 1 dien) dien))
(entmod dien))
  • 2

* 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ờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

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


#5 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 03 April 2011 - 12:32 PM

@friendship : mình không nghĩ bài toán này quá khó với bạn ?? Bạn nói dùng các lisp để ghép vào lisp của bạn ?? Vậy bạn có nên đọc 1 chút về nó để chủ động hơn chăng :)
http://www.cadviet.c...ndpost&p=131297
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#6 friendship293a

friendship293a

    biết lệnh erase

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

Đã gửi 03 April 2011 - 05:44 PM

bạn Doan Van Ha oi sao lisp của bạn khi dùng cho 2 số âm kết quả ko hiển thị số âm nhỉ?
  • 0

#7 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 03 April 2011 - 06:27 PM

bạn Doan Van Ha oi sao lisp của bạn khi dùng cho 2 số âm kết quả ko hiển thị số âm nhỉ?

Do bạn đặt đề toán mà thôi. Trong công thức toán học tính thể tích thì không thể ra số âm. Còn nếu muốn có
thể tích âm (chẳng hạn đất phải đào đi) thì phải đặt điều kiện. Vậy bạn sửa dòng
(setq kq (* (/ (expt (+ so1 so2) 2) 8) kc))
thành 3 dòng sau:
(if (and (< so1 0) (< so2 0))
(setq kq (- 0 (* (/ (expt (+ so1 so2) 2) 8) kc)))
(setq kq (* (/ (expt (+ so1 so2) 2) 8) kc)))
Và bạn có muốn tính cho trường hợp 1 âm 1 dương thì ra cái gì nữa hay không?
  • 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ờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

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


#8 friendship293a

friendship293a

    biết lệnh erase

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

Đã gửi 03 April 2011 - 06:53 PM

Nó chạy rất tốt. nếu bạn mà làm nửa âm nửa dương mà ra cả khối lượng đào cả khối lượng đắp thì còn gì bằng hihi. cảm ơn bạn rất nhiều
  • 0

#9 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 03 April 2011 - 07:41 PM

Nó chạy rất tốt. nếu bạn mà làm nửa âm nửa dương mà ra cả khối lượng đào cả khối lượng đắp thì còn gì bằng hihi. cảm ơn bạn rất nhiều

Bạn post hình vẽ của tất cả trường hợp (cùng âm, cùng dương, 1 âm 1 dương) hoặc bạn nói rõ hơn ở chỗ 1 âm 1 dương, tôi sẽ
giúp cho. Nhưng, có công thức nào tính diện tích tam giác vuông cân như bạn nói mà kỳ vậy?
  • 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ờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

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


#10 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 04 April 2011 - 07:03 AM

Thế thì thế này:
(defun C:TTL(/ so1 so2 p1 p2 kc kq dien)
(setq so1 (atof (cdr (assoc 1 (entget (car (entsel "\nChon so thu 1: ")))))))
(setq so2 (atof (cdr (assoc 1 (entget (car (entsel "\nChon so thu 2: ")))))))
(setq p1 (getpoint "\nChon diem thu 1: "))
(setq p2 (getpoint "\nChon diem thu 2: "))
(setq kc (distance p1 p2))
(setq kq (* (/ (expt (+ so1 so2) 2) 8) kc))
(setq dien (entget (car (entsel "\nChon text de dien ket qua: "))))
(setq dien (subst (cons 1 (rtos kq 2 2)) (assoc 1 dien) dien))
(entmod dien))

Trong cách viết của mình thì mình thường hạn chế đặt biến, bạn ạ. Mình đặt trong những trường hợp cần thiết thôi.
Cứ như code trên của bạn. Sao bạn không sử dụng hàm getdist để tìm khoảng cách. Việc đặt biến p1 p2 có lẽ là không cần thiết (để rồi phải giải phóng chúng nữa)
3 dòng của bạn :
(setq p1 (getpoint "\nChon diem thu 1: "))
(setq p2 (getpoint "\nChon diem thu 2: "))
(setq kc (distance p1 p2))

Có thể thay bằng 1 dòng này :
(setq kc (getdist (getpoint "\nNhap diem thu nhat :") "\nVao khoang cach hoac Nhap diem thu hai :"))
  • 0

#11 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 04 April 2011 - 08:03 AM

Trong cách viết của mình thì mình thường hạn chế đặt biến, bạn ạ. Mình đặt trong những trường hợp cần thiết thôi.
Cứ như code trên của bạn. Sao bạn không sử dụng hàm getdist để tìm khoảng cách. Việc đặt biến p1 p2 có lẽ là không cần thiết (để rồi phải giải phóng chúng nữa)
3 dòng của bạn :
(setq p1 (getpoint "\nChon diem thu 1: "))
(setq p2 (getpoint "\nChon diem thu 2: "))
(setq kc (distance p1 p2))

Có thể thay bằng 1 dòng này :
(setq kc (getdist (getpoint "\nNhap diem thu nhat :") "\nVao khoang cach hoac Nhap diem thu hai :"))

Cám ơn Bác đã có những góp ý hay. Tôi rất thích dòng code Bác viết. Tôi sẽ hạn chế dùng biến theo Bác chỉ.
Nói thêm: tôi, danh tiếng (11), tàm tạm, Bác danh tiếng (2327), tuyệt vời, thì so sao cho nổi. Tôi còn học các Bác dài dài. Còn tôi, thấy việc nhẹ thì giúp, để đỡ công các bác, có thì giờ lo việc lớn hơn ^^. Hì, hì.
  • 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ờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

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