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  
phamhung12

Nhờ viết lisp vẽ đoạn thẳng song song

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

phamhung12    1

Nhờ các bác Lisper viết dùm mình Lisp vẽ đoạn thẳng song song sss.lsp với dữ liệu nhập:

- Pick điểm chọn

- Chọn đường thẳng song song

- Chọn đường thẳng giới hạn

- Vẽ

File đính kèm:

http://www.cadviet.com/upfiles/3/132202_veduongsogsog.rar

Tahnks!

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

Xài thử cái này.

 

(defun c:sss()
  (setq ss (ssget '((0 . "POINT")))
dss (car (entsel "\nDuong song song:"))
ss10 (cdr (assoc 10 (entget dss)))
ss11 (cdr (assoc 11 (entget dss)))
dgh (car (entsel "\nDuong gioi han:"))
gh10 (cdr (assoc 10 (entget dgh)))
gh11 (cdr (assoc 11 (entget dgh)))
os (getvar 'osmode))
  (setvar 'osmode 0)
  (foreach pt (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
    (setq pt (cdr (assoc 10 (entget pt )))
 ints (inters pt (polar pt (angle ss10 ss11) 1) gh10 gh11 nil))
    (command "line" pt ints ""))
  (setvar 'osmode os)
)
  • 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
phamhung12    1

Thật tuyệt! Nhưng bạn Tot77 ơi! Bạn có thể cho chọn pick các điểm được không, vì thực tế có thể điểm là giao của 2 đường thẳng hay là tâm của Circle, donut...

Thanks!

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

Pick từng điểm thì dĩ nhiên được nhưng như vậy thì vất vả quá!!  :wub:

 

(defun c:sss(/ dss ss10 ss11 dgh gh10 gh11 os pt)
  (setq dss (car (entsel "\nDuong song song:"))
ss10 (cdr (assoc 10 (entget dss)))
ss11 (cdr (assoc 11 (entget dss)))
dgh (car (entsel "\nDuong gioi han:"))
gh10 (cdr (assoc 10 (entget dgh)))
gh11 (cdr (assoc 11 (entget dgh)))
os (getvar 'osmode))
  (setvar 'osmode 0)
  (while (and (setq pt (car (entsel "\nChon Diem:")))
     (= (cdr (assoc 0 (entget pt))) "POINT"))     
    (command "line" (setq pt (cdr (assoc 10 (entget pt))))
    (inters pt (polar pt (angle ss10 ss11) 1) gh10 gh11 nil) ""))
  (setvar 'osmode os) (princ)
)
(defun c:sss(/ dss ss10 ss11 dgh gh10 gh11 os pt)
  (setq dss (car (entsel "\nDuong song song:"))
ss10 (cdr (assoc 10 (entget dss)))
ss11 (cdr (assoc 11 (entget dss)))
dgh (car (entsel "\nDuong gioi han:"))
gh10 (cdr (assoc 10 (entget dgh)))
gh11 (cdr (assoc 11 (entget dgh)))
os (getvar 'osmode))
  (setvar 'osmode 0)
  (while (and (setq pt (car (entsel "\nChon Diem:")))
     (= (cdr (assoc 0 (entget pt))) "POINT"))     
    (command "line" (setq pt (cdr (assoc 10 (entget pt))))
    (inters pt (polar pt (angle ss10 ss11) 1) gh10 gh11 nil) ""))
  (setvar 'osmode os) (princ)
)
  • 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
phamhung12    1

Bạn Tot77 hiểu sai ý mình rồi... Không phải chọn điểm có sẵn mà là Click chọn bắt vào điểm tạo bởi giao của 2 đường thẳng hay là tâm của Circle, donut...Thanks!

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

Vậy mà trong bản vẽ bạn đưa rõ ràng là các điểm (point ) A,B,C. Thôi được, vậy thì cái này.

 

(defun c:sss(/ dss ss10 ss11 dgh gh10 gh11 os pt)
  (setq dss (car (entsel "\nDuong song song:"))
ss10 (cdr (assoc 10 (entget dss)))
ss11 (cdr (assoc 11 (entget dss)))
dgh (car (entsel "\nDuong gioi han:"))
gh10 (cdr (assoc 10 (entget dgh)))
gh11 (cdr (assoc 11 (entget dgh)))
  )
  (while (setq pt (getpoint "\nChon Diem:"))
    (command "line" "_non" pt "_non" (inters pt (polar pt (angle ss10 ss11) 1) gh10 gh11 nil) ""))
  (princ)
)
  • 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
phamhung12    1

Hehe :D ! Quá trời đúng ý mình luôn. Bài trong bản vẽ là cái lisp đầu tiên, còn bài cuối cùng là mình yêu cầu thêm cũng đã như ý! Thanks bạn Tot77 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
Tot77    501

Entmake chỉ tiện khi nào muốn line thuộc layer nào, linetype kiểu nào v. v..Trong trg hợp này cũng không cần thiết lắm, vả lại khi entmake cần undo thì nó undo cả lệnh trước đó luôn.

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
pphung183    425

Để tránh undo cả lệnh trước đó bạn có thể dùng (command "undo" "be") ....(command "undo" "e") mà, còn dùng

(entmake (list (cons 0 "LINE") (cons 10 pt) (cons 11 ints)))    thì không cần quan tâm đến osmode. :)

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

Nghe 2 bác đàm luận mình chẳng hiểu cóc nhái gì hết :( . Nhìn vào code là mình hoa cả mắt nên đối vớ mình lisp chay theo đúng yêu cầu là Ok :D

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  

×