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  
Danh Cong

Nhờ Mọi Người Sửa Hộ Lisp Leader.

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

Danh Cong    108

Em mới tập viết lisp nên ko hiểu được lỗi sai của lisp này ở đâu. Mong mọi người giúp đỡ.

Ý muốn của em là: 

Trên bản vẽ có 1 đoạn thẳng. Chiều dài D1, điểm đầu là A, điểm cuối là B.

 

Em muốn vẽ n lần số lượng leader với đặc điểm là chung điểm cuối là B. Khoảng cách giữa các Leader là D2. 

Mong mọi người giúp em sửa lại ạ. 

 

(defun c:lea ()
(setq b1 (getpoint "\nChon diem dau cua leader"))
(setq b2 (getpoint b1 "\nChon diem cuoi cua leader"))
(setq d1 (distance b1 b2))
(setq e1 (getpoint "\nChon diem dau khoang cach chia"))
(setq e2 (getpoint "\nChon diem cuoi khoang cach chia"))
(setq d2 (distance e1 e2))
(setq nn (fix (/ d1 d2)))
(setq g (angle b1 b2))
 
(repeat nn
                    (command "leader" b1 b2 "" "" "n")
                     (setq b1 (polar b1 g d2))
)
(princ))
 

 

 

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
quocmanh04tt    385

 

Em mới tập viết lisp nên ko hiểu được lỗi sai của lisp này ở đâu. Mong mọi người giúp đỡ.

Ý muốn của em là: 

Trên bản vẽ có 1 đoạn thẳng. Chiều dài D1, điểm đầu là A, điểm cuối là B.

 

Em muốn vẽ n lần số lượng leader với đặc điểm là chung điểm cuối là B. Khoảng cách giữa các Leader là D2. 

Mong mọi người giúp em sửa lại ạ. 

 

(defun c:lea ()
(setq b1 (getpoint "\nChon diem dau cua leader"))
(setq b2 (getpoint b1 "\nChon diem cuoi cua leader"))
(setq d1 (distance b1 b2))
(setq e1 (getpoint "\nChon diem dau khoang cach chia"))
(setq e2 (getpoint "\nChon diem cuoi khoang cach chia"))
(setq d2 (distance e1 e2))
(setq nn (fix (/ d1 d2)))
(setq g (angle b1 b2))
 
(repeat nn
                    (command "leader" b1 b2 "" "" "n")
                     (setq b1 (polar b1 g d2))
)
(princ))

 

- Lisp vẫn chạy ra kết quả n leader ... Nhưng kết quả muốn như thế nào?

- Có lẽ nên đưa bản vẽ kết quả sau khi dùng lisp

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
txquychk51    2

- Lisp vẫn chạy ra kết quả n leader ... Nhưng kết quả muốn như thế nào?

- Có lẽ nên đưa bản vẽ kết quả sau khi dùng lisp

e cũng có mong muốn như chủ top. đây là bản vẽ của e, có các trường hợp luôn ạ

 

 

http://www.cadviet.com/upfiles/6/136661_nho_viet_lisp.dwg,

 

yêu cầu: các leader có cùng vị trí điểm cuối, khoảng cách điểm đầu do mình chọn 
ý tưởng: - dùng lệnh "le", vẽ 1 leader. sau đó sử dụng lệnh của lisp, chọn leader, 
   - nhấn chuột vào điểm đầu của leader (lúc này, leader phải hiện điểm truy bắt) tại vị trí A 
   - nhấn chuột vào điểm thứ 2 để chọn khoảng cách giữa các leader (trong ví dụ này là 200) tại vị trí B 
   - nhấn vào điểm kết thúc rải leader vị trí C, enter kết thúc lệnh, 
  và sẽ ra kết quả như hình bên.
góp ý:    - nên chọn khoảng cách bằng cách nhấn chuôt vào 2 điểm, vì nếu nhập khoảng cách sẽ gây ra
     sai số trong trường hợp rải nhiều khoảng cách lẻ,
  - hướng rải leader là hướng bất kỳ được tính từ điểm A đến điểm C theo hướng của hệ tọa độ trong cad,
  - nếu chiều dài AC không chia hết cho AB thì chỉ rải đến điểm trước điểm C thôi, không rải tại điểm C
Xin chân thành cảm ơ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
quocmanh04tt    385

 

e cũng có mong muốn như chủ top. đây là bản vẽ của e, có các trường hợp luôn ạ

 

 

http://www.cadviet.com/upfiles/6/136661_nho_viet_lisp.dwg,

 

yêu cầu: các leader có cùng vị trí điểm cuối, khoảng cách điểm đầu do mình chọn 
ý tưởng: - dùng lệnh "le", vẽ 1 leader. sau đó sử dụng lệnh của lisp, chọn leader, 
   - nhấn chuột vào điểm đầu của leader (lúc này, leader phải hiện điểm truy bắt) tại vị trí A 
   - nhấn chuột vào điểm thứ 2 để chọn khoảng cách giữa các leader (trong ví dụ này là 200) tại vị trí B 
   - nhấn vào điểm kết thúc rải leader vị trí C, enter kết thúc lệnh, 
  và sẽ ra kết quả như hình bên.
góp ý:    - nên chọn khoảng cách bằng cách nhấn chuôt vào 2 điểm, vì nếu nhập khoảng cách sẽ gây ra
     sai số trong trường hợp rải nhiều khoảng cách lẻ,
  - hướng rải leader là hướng bất kỳ được tính từ điểm A đến điểm C theo hướng của hệ tọa độ trong cad,
  - nếu chiều dài AC không chia hết cho AB thì chỉ rải đến điểm trước điểm C thôi, không rải tại điểm C
Xin chân thành cảm ơn ạ!

 

- Xem lại dòng màu đỏ ở trên, theo hình vẽ thì hướng rải leader luôn theo hướng ngược với chiều mũi tên.

- Hướng của hệ tọa độ trong cad là thế nào?

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
txquychk51    2

- Xem lại dòng màu đỏ ở trên, theo hình vẽ thì hướng rải leader luôn theo hướng ngược với chiều mũi tên.

- Hướng của hệ tọa độ trong cad là thế nào?

"- Xem lại dòng màu đỏ ở trên, theo hình vẽ thì hướng rải leader luôn theo hướng ngược với chiều mũi tên." do lúc vẽ, e rải theo chiều từ A đến C.

ý của e là hướng tải leader là hướng pick từ điểm thứ nhất đến điểm thứ 2 (ở gạch đầu dòng thứ 2 và 3)

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
quocmanh04tt    385

Nói thế nào cho dễ hiểu nhỉ???

- Theo bản vẽ bạn gửi, hướng A đến C là nằm ngang, trái qua phải.

- 2 trường hợp đầu OK.

- 2 trường hợp sau, thì không phải theo A-C nữa mà nó xiên góc (Hướng này và A-C hoàn toàn khác nhau)...

*** Tóm lại:  4 trường hợp ở bản vẽ gần như không phụ thuộc vào A-C về hướng mà phụ thuộc vào chiều mũi tên của Le

*** Ví dụ thế này: Nếu bạn dùng lệnh COPY, sau khi chọn Leader xong điểm thứ nhất là A, thứ 2 là C thì .... 2 trường hợp sau sẽ không như ý... copy nhiều lần cùng hướng, với khoảng cách cộng dồn thì cũng tương tự rải..., hoặc Array theo path...

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
Danh Cong    108

Các bác nhiêt  tình quá. ^^

Em chọn điểm đầu ý bản vẽ của em có đôi lúc phải chỉnh sửa, đặt lại vị trí của Leader cho thoáng bản vẽ, nếu chon từng cái Leader để đặt thì mệt lắm. 

Có 1 số khoảng cách lại không đều nhau, nên ko thể dải leader theo lệnh Array được.

Em cũng sửa được cái lisp của em rồi.  Lỗi của nó là em chưa thêm dòng lệnh để tắt chế độ bắt điểm khi thực hiện lisp. 

Lúc trước chưa tắt, nên nó bắt lung tung vào các điểm khác anh ạ.

 

Thêm dòng :

(setq os (getvar "osmode"))
(setvar "osmode" 0)
....
(setvar "osmode" os)

Thế là lại chạy được ngon lành.

 

Nói chung là cám ơn các bác nhiều lắm ạ.http://www.cadviet.com/upfiles/6/124641_lea_1.lsp

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
Danh Cong    108

Lisp của em sửa lại đây ạ.

 

Do chiều dài dải lisp của em chỉ bố trí trên 1 đoạn nào đó nên phải viết thêm 1 vài dòng để xác định được phạm vi dải Leader ạ. http://www.cadviet.com/upfiles/6/124641_lea_2.txt

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
txquychk51    2

Sao trong bản vẽ không đặt A, B, C ở điểm giao, mà đặt ở đầu mút của các line kia? Trong bản vẽ không nói về điểm giao.

nếu đặt nhiều chữ ở điểm giao, rồi giải thích, e sợ rối. nên e đặt như vậy chỉ là tượng trưng.

còn lisp của bác chủ topic kia, chỉ tạo được leader 1 đoạn thẳng, ko tạo được leader nhiều đoạn thẳng như e muố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
Danh Cong    108

nếu đặt nhiều chữ ở điểm giao, rồi giải thích, e sợ rối. nên e đặt như vậy chỉ là tượng trưng.

còn lisp của bác chủ topic kia, chỉ tạo được leader 1 đoạn thẳng, ko tạo được leader nhiều đoạn thẳng như e muốn

Ừ nhỉ, mình chưa tạo được leader nhiều đoạn thẳng. Để vài ngày mình tìm hiểu rồi trả lời bạn nhé. Mình cũng mới tìm hiểu về lập trình lisp thôi. CHưa thành thạo cho lắm ^^

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
quocmanh04tt    385

Điểm C chỉ là để lấy khoảng cách và góc hợp giữa đoạn thẳng nối A-C với khúc đầu của leader. Hướng rải luôn theo hướng mũi tên leader, nếu góc ở trên < 90 thì rải giật lùi và ngược lại.

 

(defun c:tt  (/ ang apt dis ele ent i lea len lsc lsm lsp pt pt1 pt2)
 (vl-load-com)
 (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
 (if (and (setq ele (ssget "_+.:E:S" '((0 . "LEADER"))))
          (setq ent (ssname ele 0)
                lsp (vl-remove-if-not '(lambda (x) (member (car x) '(10))) (entget ent))
                lsc (vlax-get-property (vlax-ename->vla-object ent) 'ScaleFactor))
          (setq pt1 (cdr (car lsp)))
          (setq dis (getdist "\nKhoang cach giua cac Leader: " pt1))
          (setq pt2 (getpoint "\nDiem ket thuc: " pt1)))
  (progn (setq lsm (vl-remove-if '(lambda (x) (member (car x) '(-1 5 10 330 340))) (entget ent))
               ang (angle pt1 (cdr (cadr lsp)))
               len (distance pt1 pt2)
               i   0)
         (setq apt (angle pt1 pt2))
         (if (or (< (- apt ang) (* 0.5 pi)) (> (- apt ang) (* 1.5 pi)))
          (setq ang ang)
          (setq ang (+ ang pi)))
         (repeat (fix (/ len dis))
          (setq pt (polar pt1 ang (* dis (setq i (1+ i)))))
          (setq lea (entmakex (append lsm (subst (cons 10 pt) (assoc 10 lsp) lsp))))
          (vlax-put-property (vlax-ename->vla-object lea) 'ScaleFactor lsc))))
 (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
 (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
Danh Cong    108

 

Điểm C chỉ là để lấy khoảng cách và góc hợp giữa đoạn thẳng nối A-C với khúc đầu của leader. Hướng rải luôn theo hướng mũi tên leader, nếu góc ở trên < 90 thì rải giật lùi và ngược lại.

(defun c:tt  (/ ang apt dis ele ent i lea len lsc lsm lsp pt pt1 pt2)
 (vl-load-com)
 (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
 (if (and (setq ele (ssget "_+.:E:S" '((0 . "LEADER"))))
          (setq ent (ssname ele 0)
                lsp (vl-remove-if-not '(lambda (x) (member (car x) '(10))) (entget ent))
                lsc (vlax-get-property (vlax-ename->vla-object ent) 'ScaleFactor))
          (setq pt1 (cdr (car lsp)))
          (setq dis (getdist "\nKhoang cach giua cac Leader: " pt1))
          (setq pt2 (getpoint "\nDiem ket thuc: " pt1)))
  (progn (setq lsm (vl-remove-if '(lambda (x) (member (car x) '(-1 5 10 330 340))) (entget ent))
               ang (angle pt1 (cdr (cadr lsp)))
               len (distance pt1 pt2)
               i   0)
         (setq apt (angle pt1 pt2))
         (if (or (< (- apt ang) (* 0.5 pi)) (> (- apt ang) (* 1.5 pi)))
          (setq ang ang)
          (setq ang (+ ang pi)))
         (repeat (fix (/ len dis))
          (setq pt (polar pt1 ang (* dis (setq i (1+ i)))))
          (setq lea (entmakex (append lsm (subst (cons 10 pt) (assoc 10 lsp) lsp))))
          (vlax-put-property (vlax-ename->vla-object lea) 'ScaleFactor lsc))))
 (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
 (princ))

 

Em thử nghiệm và đạt kết quả cao :))) Nhưng đoc lisp của bác mà em chưa hiểu gì hết. 

Chắc tại trình độ mình còn kém quá, còn phải học dài dà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
txquychk51    2

 

Điểm C chỉ là để lấy khoảng cách và góc hợp giữa đoạn thẳng nối A-C với khúc đầu của leader. Hướng rải luôn theo hướng mũi tên leader, nếu góc ở trên < 90 thì rải giật lùi và ngược lại.

(defun c:tt  (/ ang apt dis ele ent i lea len lsc lsm lsp pt pt1 pt2)
 (vl-load-com)
 (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
 (if (and (setq ele (ssget "_+.:E:S" '((0 . "LEADER"))))
          (setq ent (ssname ele 0)
                lsp (vl-remove-if-not '(lambda (x) (member (car x) '(10))) (entget ent))
                lsc (vlax-get-property (vlax-ename->vla-object ent) 'ScaleFactor))
          (setq pt1 (cdr (car lsp)))
          (setq dis (getdist "\nKhoang cach giua cac Leader: " pt1))
          (setq pt2 (getpoint "\nDiem ket thuc: " pt1)))
  (progn (setq lsm (vl-remove-if '(lambda (x) (member (car x) '(-1 5 10 330 340))) (entget ent))
               ang (angle pt1 (cdr (cadr lsp)))
               len (distance pt1 pt2)
               i   0)
         (setq apt (angle pt1 pt2))
         (if (or (< (- apt ang) (* 0.5 pi)) (> (- apt ang) (* 1.5 pi)))
          (setq ang ang)
          (setq ang (+ ang pi)))
         (repeat (fix (/ len dis))
          (setq pt (polar pt1 ang (* dis (setq i (1+ i)))))
          (setq lea (entmakex (append lsm (subst (cons 10 pt) (assoc 10 lsp) lsp))))
          (vlax-put-property (vlax-ename->vla-object lea) 'ScaleFactor lsc))))
 (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
 (princ))

rất cảm ơn bác đã nhiệt tình giúp đỡ. hiện tại máy e đang bị lỗi nên chưa thử được. khi nào thử được e phản hồi lại ạ. cảm ơn

  • Vote giảm 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
txquychk51    2

 

Điểm C chỉ là để lấy khoảng cách và góc hợp giữa đoạn thẳng nối A-C với khúc đầu của leader. Hướng rải luôn theo hướng mũi tên leader, nếu góc ở trên < 90 thì rải giật lùi và ngược lại.

(defun c:tt  (/ ang apt dis ele ent i lea len lsc lsm lsp pt pt1 pt2)
 (vl-load-com)
 (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
 (if (and (setq ele (ssget "_+.:E:S" '((0 . "LEADER"))))
          (setq ent (ssname ele 0)
                lsp (vl-remove-if-not '(lambda (x) (member (car x) '(10))) (entget ent))
                lsc (vlax-get-property (vlax-ename->vla-object ent) 'ScaleFactor))
          (setq pt1 (cdr (car lsp)))
          (setq dis (getdist "\nKhoang cach giua cac Leader: " pt1))
          (setq pt2 (getpoint "\nDiem ket thuc: " pt1)))
  (progn (setq lsm (vl-remove-if '(lambda (x) (member (car x) '(-1 5 10 330 340))) (entget ent))
               ang (angle pt1 (cdr (cadr lsp)))
               len (distance pt1 pt2)
               i   0)
         (setq apt (angle pt1 pt2))
         (if (or (< (- apt ang) (* 0.5 pi)) (> (- apt ang) (* 1.5 pi)))
          (setq ang ang)
          (setq ang (+ ang pi)))
         (repeat (fix (/ len dis))
          (setq pt (polar pt1 ang (* dis (setq i (1+ i)))))
          (setq lea (entmakex (append lsm (subst (cons 10 pt) (assoc 10 lsp) lsp))))
          (vlax-put-property (vlax-ename->vla-object lea) 'ScaleFactor lsc))))
 (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
 (princ))

e đã thử và thành công. e cảm ơn bác 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

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  

×