Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
11 replies to this topic

#1 hugo75

hugo75

    biết vẽ polygon

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

Đã gửi 29 December 2013 - 10:09 AM

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.


  • -2

#2 hugo75

hugo75

    biết vẽ polygon

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

Đã gửi 30 December 2013 - 08:30 PM

Không bác nào giúp được mình sao?
  • -1

#3 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 30 December 2013 - 09:51 PM

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.


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


#4 hugo75

hugo75

    biết vẽ polygon

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

Đã gửi 31 December 2013 - 05:31 AM

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.


  • -1

#5 hochoaivandot

hochoaivandot

    biết dimradius

  • Members
  • PipPipPipPipPip
  • 310 Bài viết
Điểm đánh giá: 106 (tàm tạm)

Đã gửi 31 December 2013 - 08:11 AM

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


  • 2

Dương Bá Diệp

 

www.cadonline.duyxuyen.vn 

 

Thành viên nhóm CADMAGIC

 


#6 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 31 December 2013 - 12:42 PM

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.c...7168_tmp1_1.lsp


  • 1

#7 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 31 December 2013 - 03:25 PM

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.c...7168_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


  • 2

#8 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 31 December 2013 - 03:54 PM

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

 

http://www.cadviet.c...7168_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)
)

  • 1

#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 31 December 2013 - 04:06 PM

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


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

lyky

    biết vẽ polygon

  • Members
  • PipPip
  • 70 Bài viết
Điểm đánh giá: 126 (tàm tạm)

Đã gửi 31 December 2013 - 09:56 PM

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.
  • 1

22665_13x13progress.gif   22665_lyky.gif   22665_13x13progress.gif


#11 hugo75

hugo75

    biết vẽ polygon

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

Đã gửi 01 January 2014 - 06:56 AM

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.
  • 0

#12 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 01 January 2014 - 07:08 AM

@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)))))


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