Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
traitimbuiduong

Nhờ các cao thủ viết giúp Lisp vẽ tam giác bất kỳ khi biết chiều dài 3 cạnh

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

+ Bạn có thể áp dụng cái này, ko dùng lisp. Tiết kiệm được 90% thời gian so với quay compa :)))

Còn muốn tiết kiệm 99.99% thì .... à mà thôi, dùng cad cho quen tay đi.

 

 

image.png

  • Like 1
  • 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
2 giờ trước, traitimbuiduong đã nói:

Chào các anh em!

 

Mình đang có khoảng vài nghìn hình tam giác đã biết chiều dài 3 cạnh. Các anh em giúp mình viết lisp vẽ tam giác khi nhập chiều dài 3 cạnh với. Mình xin cảm ơn!

Chào Bạn.

Cái này không cần cao thủ đâu bạn, Hì Bạn làm kiểu gì mà có cả 1000 tam giác như vậy :)

Cad cũng có cách như Bạn trên có bày đó. Mình viết lisp này cũng được vậy.

Chắc bạn cũng biết load file LISP chứ. :)

 

(defun tg(/ xA d0 a b c)
  (setvar "osmode" 0)(Setvar "orthomode" 0)                 
  (setq a (getreal "\nCho canh a: ") b (getreal "\nCho canh b: ") c (getreal "\nCho canh c: ") d0 (getpoint "\nCho diem A: "))
  (setq xA (/ (- (+ (sqr a) (sqr c)) (sqr b)) 2.0 a) yA (sqrt (- (sqr c) (sqr xA))))
  (command "Pline" (list 0 0) (list a 0) (list xA yA) "c")
  (command "Move" (entlast) "" (list 0 0) d0)
)
(tg)  

 

IMG_6601.JPG

  • Like 2

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ạn phép có ý kiến xíu:

1-Không biết bạn làm công việc gì mà có vài ngàn tam giác phải vẽ? 

2- Cho dù có lisp chăng nữa mà mỗi tg phải nhập 3 số liệu, thêm vi trí đặt nữa thì biết đến bao giờ mới vẽ xong?

3- Không phải tg nào cũng có cạnh nằm ngang mà còn phải xoay nữa thì thời gian tốn thêm bao nhiêu?

Có vẻ công việc này khó khả thi lắm nhỉ!!

  • Like 2

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ảm ơn các bạn đã giúp mình nhé!

 

Đúng như Alisp nói, vẽ xong các tam giác mình còn phải xoay và ghép các tam giác vào với nhau.

 

Công việc của mình là đặt các tấm kính và tấm nhôm hình tam giác mặt trong và mặt ngoài của một công trình.

 

Có vẻ như vẽ compa sẽ lâu hơn cách của hai bác DanhCong và DuongTrungHuy, nhưng sẽ giải quyết được việc không phải xoay các tam giác khi ghép vào nhau nữa.

 

Công việc thật to tay... hix hix...

Untitled.jpg

  • Like 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
39 phút trước, traitimbuiduong đã nói:

Cảm ơn các bạn đã giúp mình nhé!

 

Đúng như Alisp nói, vẽ xong các tam giác mình còn phải xoay và ghép các tam giác vào với nhau.

 

Công việc của mình là đặt các tấm kính và tấm nhôm hình tam giác mặt trong và mặt ngoài của một công trình.

 

Có vẻ như vẽ compa sẽ lâu hơn cách của hai bác DanhCong và DuongTrungHuy, nhưng sẽ giải quyết được việc không phải xoay các tam giác khi ghép vào nhau nữa.

 

Công việc thật to tay... hix hix...

 

Kiểu này có được không nhỉ ? 

ezgif.com-video-to-gif (2).gif

  • Like 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
1 phút trước, traitimbuiduong đã nói:

 

Tam giác của mình hình dạng bất kỳ, ko phải tam giác cân bạn nhé

Tam giác nhập số bất kỳ mà.

Nếu oke thì mới tạo được.

Bác cần thêm thông tin gì thì Inbox mình 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

Cứ đặt hàng tầm 500k-1000 là ae trên này viết phút mốt. Thay vì vẽ hàng ngàn hình tam giác mất vài ngày thì chỉ việc ..1s... À mà thô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
19 giờ trước, alisp đã nói:

Mạn phép có ý kiến xíu:

3- Không phải tg nào cũng có cạnh nằm ngang mà còn phải xoay nữa thì thời gian tốn thêm bao nhiêu?

Chào Bạn!

Cái này mình dùng hệ tọa độ địa phương trùng cạnh đáy tam giác (vì vậy nó nằm ngang) để đưa phương trình 2 vòng tròn về dạng đơn giản nhằm có những biểu thức dễ dàng khi giải.

Sau đó như Bạn đã biết dùng lệnh "Align" (trong LSP) để đưa tam giác về nơi mình muốn (chứ không phải lệnh "Move" trong file đã gửi).

Để sử dụng linh hoạt hơn có thể thêm vài dòng LISP và vấn đề này đơn giản.

 

Bài toán này làm gợi nhớ hồi học lớp 10 toán vẽ. "Dựng 1 tam giác khi biết 3 cạnh", trước đây mình chỉ nghĩ dùng copa, nhưng nay có Cad thì có thể có được tọa độ điểm chính xác (xA, yA) mà không cần dùng 2 circle cắt nhau nữa.

 

Vài lời buổi sáng, chúc vui vẻ, đầy năng lượng.

 

Thân chào!

  • Like 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

Tôi thấy cách làm trên có vẽ ngược quy trình.

Chiều dài cạnh tam giác tính được từ các node chứ trong thực tế khó có trường hợp cạnh => node

trừ khi các tam giác = nhau hoặc có thể tổ hợp các đa giác thành hình hoàn chỉnh như quả bóng

Theo cách của các chương trình kết cấu, từ bảng tọa độ node và bảng danh sách các tam giác với các đỉnh tương ứng

=> vẽ tự động hoàn toàn là dễ nhấ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
(defun acos (x) (if (<= -1 x 1) (atan (sqrt(- 1 (* x x))) x)))
(defun gg(a b c)
  (if (and (/= a 0) (/= b 0))
    (acos (/ (- (+ (* a a) (* b b)) (* c c)) (* 2 a b)))))
(defun cdtg(en / lp d ag a0 a1)
  (setq en (entget en))
  (if (and (eq (cdr (assoc 0 en)) "LWPOLYLINE")
	   (eq (cdr (assoc 90 en)) 4)
	   (eq (cdr (assoc 70 en)) 0)
	   (setq lp (mapcar 'cdr (vl-remove-if-not '(lambda(x) (eq (car x) 10)) en))
		 d  (mapcar 'distance lp (cdr lp))
		 ag (apply 'gg d)))
    (progn
      (setq a0 (if (> (sin (- (angle (cadr lp) (caddr lp)) (setq a1 (angle (cadr lp) (car lp))))) 0) (+ a1 ag) (- a1 ag))
	    lp (list (car lp) (cadr lp) (polar (cadr lp) a0 (cadr d)))
	    en (vl-remove-if '(lambda(x) (vl-position (car x) '(10 40 41 42 91))) en))
      (entmod (append
		(subst '(90 . 3) '(90 . 4) (subst '(70 . 1) '(70 . 0) en))
		(apply 'append
		       (mapcar '(lambda(x) (cons (cons 10 x) '((40 . 0) (41 . 0) (42 . 0) (91 . 0)))) lp)))))))
(defun c:pl2tg()
  (cdtg (car(entsel)))
  (princ))
(defun c:tg(/ en n)
  (setq en (entlast) n 4)
  (while (entnext en) (setq en (entnext en)))
  (command "pline" pause)
  (while (/= (getvar 'cmdactive) 0)
    (if (> (setq n (1- n)) 0) (command pause) (command "")))
  (if (/= en (entlast)) (cdtg (entlast)))
  (princ))

Buổi sáng code nhanh cho bạn.

- Lệnh pl2tg: Chuyển đỗi polyline có 3 cạnh (4 dỉnh ,  open) thành pl tam giác có chiều dài 3 cạnh bằng 3 cạnh pl.

- Lệnh tg. Vẽ tam giác bằng cách vẽ pl 3 cạnh trên.

* Lưu ý là cạnh đầu tiên pl sẽ không đổi, điểm thứ 3 sẽ định hướng tam giác.

 Nếu xác định được tam giác sẽ chuyển nếu ko thì thôi.

  • Like 1
  • 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
1 giờ trước, ndtnv đã nói:

Tôi thấy cách làm trên có vẽ ngược quy trình....

Chào bạn.

 

Có lẽ bạn này mới vẽ Cad nên chưa hiểu tường tận về Cad, thật ra kích thước từ các dim ghi chỉ là gần đúng, không thể lấy những giá trị đó để vẽ lại được. Vì vậy mới đề ra yêu cầu vẽ tam giác khi biết 3 cạnh.

 

  Đúng như bạn nói, ếu từ 1 bài toán kết cấu đã biết thì đôi khi các mắt giàn ( tạm gọi như vậy) là đã biết thì cũng không cần vẽ tam giác như vậy. ( Thầy bói sờ voi thôi chứ cũng không biết cụ thể cái bạn ấy cần)

 

Từ 1 vấn đề thực tế rồi đưa thành 1 bài toán đôi khi cũng rất khó khăn.

 

Chào nhé ndtnv

 

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 giờ} trướ}c, ngokiet đã nói:

(defun acos (x) (if (<= -1 x 1) (atan (sqrt(- 1 (* x x))) x)))
(defun gg(a b c)
  (if (and (/= a 0) (/= b 0))
    (acos (/ (- (+ (* a a) (* b b)) (* c c)) (* 2 a b)))))
(defun cdtg(en / lp d ag a0 a1)
  (setq en (entget en))
  (if (and (eq (cdr (assoc 0 en)) "LWPOLYLINE")
	   (eq (cdr (assoc 90 en)) 4)
	   (eq (cdr (assoc 70 en)) 0)
	   (setq lp (mapcar 'cdr (vl-remove-if-not '(lambda(x) (eq (car x) 10)) en))
		 d  (mapcar 'distance lp (cdr lp))
		 ag (apply 'gg d)))
    (progn
      (setq a0 (if (> (sin (- (angle (cadr lp) (caddr lp)) (setq a1 (angle (cadr lp) (car lp))))) 0) (+ a1 ag) (- a1 ag))
	    lp (list (car lp) (cadr lp) (polar (cadr lp) a0 (cadr d)))
	    en (vl-remove-if '(lambda(x) (vl-position (car x) '(10 40 41 42 91))) en))
      (entmod (append
		(subst '(90 . 3) '(90 . 4) (subst '(70 . 1) '(70 . 0) en))
		(apply 'append
		       (mapcar '(lambda(x) (cons (cons 10 x) '((40 . 0) (41 . 0) (42 . 0) (91 . 0)))) lp)))))))
(defun c:pl2tg()
  (cdtg (car(entsel)))
  (princ))
(defun c:tg(/ en n)
  (setq en (entlast) n 4)
  (while (entnext en) (setq en (entnext en)))
  (command "pline" pause)
  (while (/= (getvar 'cmdactive) 0)
    (if (> (setq n (1- n)) 0) (command pause) (command "")))
  (if (/= en (entlast)) (cdtg (entlast)))
  (princ))

Buổi sáng code nhanh cho bạn.

- Lệnh pl2tg: Chuyển đỗi polyline có 3 cạnh (4 dỉnh ,  open) thành pl tam giác có chiều dài 3 cạnh bằng 3 cạnh pl.

- Lệnh tg. Vẽ tam giác bằng cách vẽ pl 3 cạnh trên.

* Lưu ý là cạnh đầu tiên pl sẽ không đổi, điểm thứ 3 sẽ định hướng tam giác.

 Nếu xác định được tam giác sẽ chuyển nếu ko thì thôi.

 

Woaaa... cảm ơn bạn rất rất nhiều!!!

 

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ấy ý tưởng từ Bạn Doan Nguyen Van. Mình đưa lên cho phong phú diễn đàn.

 

- Lệnh tg1

- Ba cạnh tam giác a,b,c nên đưa vào cách nhau dấu ; dạng 3.14;2.45;5.47

 

Chúc Bạn thành công

 

Cad_Viet2.LSP

  • Like 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
1 giờ} trướ}c, DuongTrungHuy đã nói:

Lấy ý tưởng từ Bạn Doan Nguyen Van. Mình đưa lên cho phong phú diễn đàn.

 

- Lệnh tg1

- Ba cạnh tam giác a,b,c nên đưa vào cách nhau dấu ; dạng 3.14;2.45;5.47

 

Chúc Bạn thành công

Cad_Viet2.LSP

File này hình như bác thiếu hàm: SQR, SDIENTICH, VEDSPOLY, CDAUSO....

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
25 phút trước, Doan Nguyen Van đã nói:

File này hình như bác thiếu hàm: SQR, SDIENTICH, VEDSPOLY, CDAUSO....

Chào Bạn.

Mình viết từ 1 file lớn tách ra khi chạy chung thì không sao . Khi chạy riêng thì thiếu các hàm đó.

Hình như hàm sqr đã có rồi phải không Bạn nhỉ. Nó là hàm bình phương của Cad. Thiếu Bạn bổ sung giúp.

Mình đã bổ sung các hàm thiếu rồi. Cám ơn nhé.

 

(Defunc sqr (x) (setq bp (* x x)))

 

Thân chào, có gì góp ý 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
10 phút trước, DuongTrungHuy đã nói:

Chào Bạn.

Mình viết từ 1 file lớn tách ra khi chạy chung thì không sao . Khi chạy riêng thì thiếu các hàm đó.

Hình như hàm sqr đã có rồi phải không Bạn nhỉ. Nó là hàm bình phương của Cad. Thiếu Bạn bổ sung giúp.

Mình đã bổ sung các hàm thiếu rồi. Cám ơn nhé.

 

(Defunc sqr (x) (setq bp (* x x)))

 

Thân chào, có gì góp ý nhé!

Chạy oke rồi đó bác, cháu dùng cad2014 không biêt thiếu gì nên hàm SQR không chạy được, phải load hàm riêng

  • Like 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
20 phút trước, Doan Nguyen Van đã nói:

Chạy oke rồi đó bác, cháu dùng cad2014 không biêt thiếu gì nên hàm SQR không chạy được, phải load hàm riêng

Lisp không có hàm SQR (chỉ có SQRT), còn hàm của DuongTrungHuy viết bị thừa chữ "c".

  • Like 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

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
Đăng nhập để thực hiện theo  

×