Đến nội dung


Hình ảnh

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


  • Please log in to reply
11 replies to this topic

#1 phamhung12

phamhung12

    biết vẽ ellipse

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

Đã gửi 21 July 2014 - 01:17 PM

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.c...duongsogsog.rar

Tahnks!


  • 0

#2 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 21 July 2014 - 02:52 PM

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

  • 2

#3 phamhung12

phamhung12

    biết vẽ ellipse

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

Đã gửi 21 July 2014 - 03:14 PM

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!


  • 0

#4 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 21 July 2014 - 03:29 PM

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

  • 1

#5 phamhung12

phamhung12

    biết vẽ ellipse

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

Đã gửi 21 July 2014 - 03:43 PM

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!


  • 0

#6 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 21 July 2014 - 04:01 PM

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

  • 2

#7 phamhung12

phamhung12

    biết vẽ ellipse

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

Đã gửi 21 July 2014 - 04:15 PM

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!!! :)


  • 0

#8 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 21 July 2014 - 05:48 PM

Sao Tot77 không dùng entmake thay cho Command nhỉ? :)


  • 2

#9 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 21 July 2014 - 06:07 PM

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

#10 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 21 July 2014 - 06:26 PM

Để 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. :)


  • 2

#11 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 21 July 2014 - 06:37 PM

Có khi ng ta chỉ muốn undo từng line một không phải undo cả 1 loạt vừa vẽ.
  • 0

#12 phamhung12

phamhung12

    biết vẽ ellipse

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

Đã gửi 21 July 2014 - 08:09 PM

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


  • 0