Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
hugo75

[Yêu cầu]Lisp vẽ đoạn thẳng giữa 2 đoạn thẳng?

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

hugo75    4

Nhờ các bác viết giùm lisp sau:

Có sẵn 2 đoạn thẳng,và một layer tên là DUONG BAO.Khi đánh lệnh lisp thì sẽ kêu chọn hai đoạn thẳng sau đó sẽ tự vẽ 1 đoạn thẳng ở giữa và song song với 2 đoạn thẳng vừa chọn và có tên là DUONG BAO.

Chân thành cảm ơn các bác trước.

  • Vote giảm 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
Doan Van Ha    2.678

Môn hình học không bắt buộc 2 đoạn thẳng bất kỳ phải song song nhau. Do đó, nếu ai đó vẽ được đoạn thẳng, nằm ở giữa, và song song với 2 đoạn thẳng kia thì người đó sẽ phát minh ra môn hình học mới: mọi cặp đoạn thẳng bất kỳ đều song song.

  • 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
hugo75    4

Môn hình học không bắt buộc 2 đoạn thẳng bất kỳ phải song song nhau. Do đó, nếu ai đó vẽ được đoạn thẳng, nằm ở giữa, và song song với 2 đoạn thẳng kia thì người đó sẽ phát minh ra môn hình học mới: mọi cặp đoạn thẳng bất kỳ đều song song.

Xin lỗi bác,e đã sai.Do bài toán e là đã có 2 đoạn thẳng trước,thay vì dim khoảng cách giữa 2 đoạn thẳng rồ offset vào giữa thì tốn thời gian vì trong bản vẽ có rất nhiều đoạn thẳng có khoảng cách khác nhau nên e mới nhờ viết đoạn lisp này.Mong các bác giúp e với.Thanks.

  • Vote tăng 1
  • Vote giảm 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
hochoaivandot    108

Xin lỗi bác,e đã sai.Do bài toán e là đã có 2 đoạn thẳng trước,thay vì dim khoảng cách giữa 2 đoạn thẳng rồ offset vào giữa thì tốn thời gian vì trong bản vẽ có rất nhiều đoạn thẳng có khoảng cách khác nhau nên e mới nhờ viết đoạn lisp này.Mong các bác giúp e với.Thanks.

Nếu ngôn từ là điểm yếu của bạn thì dùng hình ảnh để diễn đạt đi. Diễn đàn CADviet thì tốt nhất là dùng file CAD.

Muốn vẽ đường thẳng song song cùng lúc với 2 đường thẳng đã cho thì 2 đường thẳng đã cho phải song song hoặc trùng nhau.

Yêu cầu của bạn dễ như ăn ớt. Nhưng cách bạn diễn đạt không gây hứng thú cho người viết lisp, hơn nữa không có file để kiểm tra.

2 đoạn thẳng của bạn không biết là 2 LINE hay 2 POLYLINE hay 1 LINE và 1 PLine...

Bạn đã có 70 bài post trên cadviet.com chắc biết cách upload file đính kém, chèn ảnh vào bài post. Sử dụng các chức năng trên sẽ làm bài viết của bạn dễ hiểu và thu hút hơn...

 

Ngoài ra, bạn có thể dùng cách này trực tiếp trên cad, chưa dùng đến sự hổ trợ của lisp.

 + Offset

 + T

 + Chọn 1 đường có sẵn của bạn

 + M2P

 + Pick 2 mút của 2 line

Chúc năm mới vui vẻ.

  • Vote tăng 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
ndtnv    397

Thử file lsp này, nó chỉ cho chọn 2 line thôi, chọn ít hơn hay nhiều line hơn sẽ bắt chọn lại.

http://www.cadviet.com/upfiles/3/127168_tmp1_1.lsp

Thuật toán trên không đúng trong trường hợp tổng quát là 2 line bất kỳ. Nếu 2 line // mà có phương // trục x hoặc y và ngược chiều nhau (VD explode 1 HCN) kết quả cũng sai.

Với 2 line AB và CD cần so sánh tổng AC+BD và AD+BC để quyết định

  • Vote tăng 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
Tot77    501

Sửa lại một chút : <= thay vì < trong hàm sortline

 

http://www.cadviet.com/upfiles/3/127168_tmp1_2.lsp

 

không quan tâm 2 line co song song hay không, chỉ cần vẽ đường giữa là đủ.

(defun c:test(/ n ss l1 l2 cl)
  (defun sortLine(x) (vl-sort (list (acet-dxf 10 (entget x)) (acet-dxf 11 (entget x)))
     '(lambda(x y) (and (<= (car x) (car y)) (<= (cadr x) (cadr y))))))
  (defun midp(d1 d2)  (polar d1 (angle d1 d2) (* 0.5 (distance d1 d2))))
  
  ;;;  
  (setq n 0)
  (while (/= 2 n)
    (princ "\nChon 2 Line:")
    (setq ss (ssget '((0 . "LINE"))))
    (if ss (setq n (sslength ss))))
  (setq cl (getvar "CLAYER"))
  (setq l1 (sortLine (car (acet-ss-to-list ss)))
l2 (sortLine (last (acet-ss-to-list ss))))
  (setvar "CLAYER" "DUONG BAO")
  (command "line" (midp (car l1) (car l2)) (midp (last l1) (last l2)) "")
  (setvar "CLAYER" cl)
)
  • 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
lyky    126

Thuật toán trên không đúng trong trường hợp tổng quát là 2 line bất kỳ. Nếu 2 line // mà có phương // trục x hoặc y và ngược chiều nhau (VD explode 1 HCN) kết quả cũng sai.

Với 2 line AB và CD cần so sánh tổng AC+BD và AD+BC để quyết định

không quan tâm 2 line co song song hay không, chỉ cần vẽ đường giữa là đủ.

Thêm osmode kẻo nguy hiểm.

 

Bạn Tot77 đã không hiểu ý bác NDT rồi.

 

1/- Nếu bạn vẽ một HCN (// hệ trục Oxy) rồi nổ ra, chọn 2 đoạn đối diện (là 2 đoạn song song ngược chiều) để test thì kết quả cho ra đường chéo (chứ không phải đường trung bình?!!)

 

22665_lyky_3.jpg

 

2/- Nếu bạn vẽ một HCN rồi quay đi một góc nào đó, sau đó nổ ra, test sẽ cho ra kết qủa là một đoạn thẳng có chiều dài bằng 0, vì điểm đầu điểm cuối trùng nhau?! (Tương đương một điểm).

 

3/- Không cần đâu 2 đường thẳng song song, chỉ cần 2 đường thẳng trái chiều là LISP của bạn đã trả ra kết quả sai rồi?!

 

4/- Có một điều rất kì quặc trong code của bạn Tot77:

(defun c:test(/ n ss l1 l2 cl)
....
(setq n 0)
(while (/= 2 n)
....
Đặt: n = 0 thì đương nhiên là: 0 ≠ 2 chứ mắc mớ gì phải kiểm tra rồi mới chạy vòng lặp?!

 

5/- Trước dòng (command "line" (midp (car l1) (car l2)) (midp (last l1) (last l2)) ""), bạn nên đặt OSMODE bằng 0 để tắt chế độ bắt điểm - đối với những đường line gần nhau - nếu không làm vậy sẽ xuất ra kết quả sai (đặc biệt là đối với bài toán mà chúng tôi đề nghị sau đây, ở mục [7]).

 

6/- Bạn nên thêm vào code: Kiểm tra xem bản vẽ đã có sẵn layer "DUONG BAO" chưa, nếu đã có, đặt hiện hành nó trước khi vẽ line, nếu không, tạo layer "DUONG BAO" trước rồi mới đặt hiện hành, vẽ line xong, phục hồi về layer cũ... Nếu không làm như vậy, trong bản vẽ chưa có sẵn layer "DUONG BAO" lisp sẽ báo lỗi.

 

7/- Vì sao chúng ta không mở rộng bài toán này cho trường hợp vẽ n đoạn thẳng "rải xoè quạt" bên trong 2 đoạn thẳng ban đầu chọn làm biên? Bài toán này sẽ ứng dụng trong vẽ kết cấu mặt sàn dạng hình thang, cốt thép rải xòe quạt.

  • 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
hugo75    4

Cảm ơn các bác quan tâm giúp đỡ.mấy ngày nay không ngồi máy tính nên không gửi file và thử được lisp được.cảm ơn các bác đã thử và đóng góp lisp của bác Tot77.

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
Doan Van Ha    2.678

@lyly+Tot77:

1) + 2) + 3): Hàm sort không đúng ý đồ vì dùng AND.

4) Có thể bỏ dòng (setq n 0) nếu n là biến cục bộ.

5) và 6):

Có thể không cần osmode và cũng không cần kiểm tra hay tạo layer, bằng cách dùng entmake(x) thay cho command.

(entmake (list (cons 0 "LINE") (cons 8 "DUONG BAO") (cons 10 (midp (car l1) (car l2))) (cons 11 (midp (last l1) (last l2)))))

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  

×