Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
17 replies to this topic

#1 Danh Cong

Danh Cong

    biết lệnh linetype

  • Members
  • PipPipPipPip
  • 242 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 20 June 2016 - 11:46 AM

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

 

 


  • 0

             ***  Vô lo - Vô nghĩ - Vô sầu hận  ***

***  Chẳng thương - Chẳng giận - Chẳng đau lòng  ***


#2 Danh Cong

Danh Cong

    biết lệnh linetype

  • Members
  • PipPipPipPip
  • 242 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 20 June 2016 - 11:59 AM

http://www.cadviet.c...24641_lea_1.txt


  • 0

             ***  Vô lo - Vô nghĩ - Vô sầu hận  ***

***  Chẳng thương - Chẳng giận - Chẳng đau lòng  ***


#3 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 665 Bài viết
Điểm đánh giá: 312 (khá)

Đã gửi 20 June 2016 - 02:30 PM

 

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


  • 0

#4 txquychk51

txquychk51

    biết vẽ ellipse

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

Đã gửi 26 June 2016 - 01:59 PM

- 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.c...o_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 ạ!

  • 0

#5 txquychk51

txquychk51

    biết vẽ ellipse

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

Đã gửi 26 June 2016 - 02:03 PM

e ko biết tại sao trả lời của e chỉ hiện link mà ko hiện mấy chữ e viết, bác mở bản vẽ ra đọc giúp e với ạ


  • 0

#6 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 665 Bài viết
Điểm đánh giá: 312 (khá)

Đã gửi 26 June 2016 - 05:43 PM

 

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.c...o_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?


  • 0

#7 txquychk51

txquychk51

    biết vẽ ellipse

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

Đã gửi 27 June 2016 - 07:34 AM

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


  • 0

#8 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 665 Bài viết
Điểm đánh giá: 312 (khá)

Đã gửi 27 June 2016 - 09:39 AM

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


  • 0

#9 txquychk51

txquychk51

    biết vẽ ellipse

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

Đã gửi 27 June 2016 - 10:31 AM

A B C là điểm bất kỳ trên đoạn thẳng đó mà a. cứ leader giao với đoạn thẳng ở đâu thì lần lượt các điểm A B C nằm ở đó. 


  • 0

#10 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 665 Bài viết
Điểm đánh giá: 312 (khá)

Đã gửi 27 June 2016 - 10:39 AM

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.


  • 0

#11 Danh Cong

Danh Cong

    biết lệnh linetype

  • Members
  • PipPipPipPip
  • 242 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 27 June 2016 - 11:36 AM

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.c...24641_lea_1.lsp


  • 0

             ***  Vô lo - Vô nghĩ - Vô sầu hận  ***

***  Chẳng thương - Chẳng giận - Chẳng đau lòng  ***


#12 Danh Cong

Danh Cong

    biết lệnh linetype

  • Members
  • PipPipPipPip
  • 242 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 27 June 2016 - 11:51 AM

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.c...24641_lea_2.txt


  • 0

             ***  Vô lo - Vô nghĩ - Vô sầu hận  ***

***  Chẳng thương - Chẳng giận - Chẳng đau lòng  ***


#13 txquychk51

txquychk51

    biết vẽ ellipse

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

Đã gửi 27 June 2016 - 01:43 PM

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


  • 0

#14 Danh Cong

Danh Cong

    biết lệnh linetype

  • Members
  • PipPipPipPip
  • 242 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 27 June 2016 - 02:02 PM

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


  • 0

             ***  Vô lo - Vô nghĩ - Vô sầu hận  ***

***  Chẳng thương - Chẳng giận - Chẳng đau lòng  ***


#15 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 665 Bài viết
Điểm đánh giá: 312 (khá)

Đã gửi 27 June 2016 - 05:27 PM

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

  • 2

#16 Danh Cong

Danh Cong

    biết lệnh linetype

  • Members
  • PipPipPipPip
  • 242 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 27 June 2016 - 05:48 PM

 

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


  • 0

             ***  Vô lo - Vô nghĩ - Vô sầu hận  ***

***  Chẳng thương - Chẳng giận - Chẳng đau lòng  ***


#17 txquychk51

txquychk51

    biết vẽ ellipse

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

Đã gửi 28 June 2016 - 09:59 AM

 

Đ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


  • -1

#18 txquychk51

txquychk51

    biết vẽ ellipse

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

Đã gửi 30 June 2016 - 08:52 AM

 

Đ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é :)


  • 0