Chuyển đến nội dung
Diễn đàn CADViet
Nguyễn Minh Chương

Lisp tính tổng độ dài

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

Chào mọi người, mình không hiểu lắm về lisp cad nên nhờ mọi người giúp đỡ.

Mình có lisp tính tổng độ dài, hiện tại nó chỉ tính được đường Polyline và xuất kết quả ra 1 text đã có sẵn trên mặt bằng. Giờ mình muốn sửa lại lisp một tí là muốn nó tính được cả đường line và tự xuất ra text.

Mong mọi người giúp đỡ ạ. (file mình có đính kèm)

 

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

Lisp này là tổng diện tích chứ tổng độ dài đâu ?

 

Hỏi 1 đằng quăng lisp 1 nẻo nhỉ ^_^ chắc để cho vui diễn đà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
21 giờ trước, Bee đã nói:

Lisp này là tổng diện tích chứ tổng độ dài đâu ?

 

Hỏi 1 đằng quăng lisp 1 nẻo nhỉ ^_^ chắc để cho vui diễn đàn.

Bác @Bee có nhầm không vậy??? lisp bạn đưa lên là tính chiều dài 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
Vào lúc 20/10/2018 tại 09:40, Nguyễn Minh Chương đã nói:

Chào mọi người, mình không hiểu lắm về lisp cad nên nhờ mọi người giúp đỡ.

Mình có lisp tính tổng độ dài, hiện tại nó chỉ tính được đường Polyline và xuất kết quả ra 1 text đã có sẵn trên mặt bằng. Giờ mình muốn sửa lại lisp một tí là muốn nó tính được cả đường line và tự xuất ra text.

Mong mọi người giúp đỡ ạ. (file mình có đính kèm)

 

cc.lsp

bạn chỉnh sửa đoạn sau:

(setq doituong (ssget '((0 . "*POLYLINE"))))

thành:

(setq doituong (ssget '((0 . "*POLYLINE,LINE"))))

để tính được cả polyline và line

 

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

Chủ nhân của Lisp này đã đánh lừa Bee và đánh lừa tất cả mọi người bởi dòng code: L=(xyz)mm.

Thực ra Lisp tính S

Nhưng ghi là L

Lại phát minh thêm 1 thứ nguyên mới đo diện tích là mm.

Hahaha!

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
22 giờ trước, Bee đã nói:

Lisp này là tổng diện tích chứ tổng độ dài đâu ?

 

Hỏi 1 đằng quăng lisp 1 nẻo nhỉ ^_^ chắc để cho vui diễn đàn.

59 phút trước, Doan Van Ha đã nói:

Chủ nhân của Lisp này đã đánh lừa Bee và đánh lừa tất cả mọi người bởi dòng code: L=(xyz)mm.

Thực ra Lisp tính S

Nhưng ghi là L

Lại phát minh thêm 1 thứ nguyên mới đo diện tích là mm.

Hahaha!

Ủa, các huynh đài có nhìn nhầm (lộn) không??? Trong lisp, tại hạ thấy có cái này mà: (getvar "Perimeter").

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
34 phút trước, quocmanh04tt đã nói:

Ủa, các huynh đài có nhìn nhầm (lộn) không??? Trong lisp, tại hạ thấy có cái này mà: (getvar "Perimeter").

KKK công nhận là tại hạ cưỡi ngựa xem hoa. Thấy area lại thêm biến tdt nhằm đánh lạc hướng người xem ^_^. Vui thật !

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
Vào lúc 20/10/2018 tại 09:40, Nguyễn Minh Chương đã nói:

Chào mọi người, mình không hiểu lắm về lisp cad nên nhờ mọi người giúp đỡ.

Mình có lisp tính tổng độ dài, hiện tại nó chỉ tính được đường Polyline và xuất kết quả ra 1 text đã có sẵn trên mặt bằng. Giờ mình muốn sửa lại lisp một tí là muốn nó tính được cả đường line và tự xuất ra text.

Mong mọi người giúp đỡ ạ. (file mình có đính kèm)

 

cc.lsp

Chỉnh lại lisp khác cho bạn dùng ^_^

(defun c:cc  (/ ss tl n ent itm obj l txt)
  (setq ss (ssget)
        tl 0
        n  (1- (sslength ss)))
  (while (>= n 0)
    (setq ent (entget (setq itm (ssname ss n)))
          obj (cdr (assoc 0 ent))
          l   (cond
                ((= obj "LINE")
                 (distance (cdr (assoc 10 ent)) (cdr (assoc 11 ent))))
                ((= obj "ARC")
                 (* (cdr (assoc 40 ent))
                    (if (minusp (setq l (- (cdr (assoc 51 ent))
                                           (cdr (assoc 50 ent)))))
                      (+ pi pi l)
                      l)))
                ((or (= obj "CIRCLE")
                     (= obj "SPLINE")
                     (= obj "POLYLINE")
                     (= obj "LWPOLYLINE")
                     (= obj "ELLIPSE"))
                 (command "_.area" "_o" itm)
                 (getvar "perimeter"))
                (t 0))
          tl  (+ tl l)
          n   (1- n)))
  
  (setq txt (car (entsel "Ch\U+1EC9 vào text c\U+1EA7n ghi: ")))
  
  (if (= (cdr (assoc 0 (entget txt))) "TEXT")
    (progn
      (setq txt (entmod (subst (cons 1 (strcat "L= " (rtos tl 2 0) " mm")) (assoc 1 (entget txt)) (entget txt))))

      (if (assoc 62 txt)
        (entmod (subst (cons 62 4) (assoc 62 txt) txt))
        (entmod (append txt (list (cons 62 4))))
        )
      )

    )
  (princ)
  )

 

  • Like 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
25 phút trước, Bee đã nói:

Chỉnh lại lisp khác cho bạn dùng ^_^

 

Vào lúc 20/10/2018 tại 09:40, Nguyễn Minh Chương đã nói:

Mình có lisp tính tổng độ dài, hiện tại nó chỉ tính được đường Polyline và xuất kết quả ra 1 text đã có sẵn trên mặt bằng. Giờ mình muốn sửa lại lisp một tí là muốn nó tính được cả đường line và tự xuất ra text.

Lần này Mr. Bee cưỡi trâu đuổi thằng hái trộm hoa. KKK.

@huunhantvxdts với Line đâu có "Command" "area" ...  được??? (à được nhưng không có kết quả). hehehe...

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
46 phút trước, quocmanh04tt đã nói:

 

Lần này Mr. Bee cưỡi trâu đuổi thằng hái trộm hoa. KKK.

@huunhantvxdts với Line đâu có "Command" "area" ...  được??? (à được nhưng không có kết quả). hehehe...

Hê hê, tại hạ làm luôn mấy thằng khác, không lại thêm từng thằng thì lại sửa tiếp. ^_^

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

Cảm ơn bạn "Bee" rất nhiều, mình ko biết làm sao để đính kèm bình luận trên, hjhjhj

Bạn "Bee" cho mình hỏi tí, là làm sao để lệnh lisp đó nó xuất kết quả ra thành text luôn không cần phải ghi đè kết quả đó lên 1 text có sẵn.

Cảm ơn bạn rất 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
11 giờ trước, Nguyễn Minh Chương đã nói:

Cảm ơn bạn "Bee" rất nhiều, mình ko biết làm sao để đính kèm bình luận trên, hjhjhj

Bạn "Bee" cho mình hỏi tí, là làm sao để lệnh lisp đó nó xuất kết quả ra thành text luôn không cần phải ghi đè kết quả đó lên 1 text có sẵn.

Cảm ơn bạn rất nhiều.

Xuất thành text ở vị trí nào ? to hay nhỏ theo cỡ nào ? Phải xác định được các cái đó thì xuất text đơn giản thô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
2 giờ trước, Bee đã nói:
14 giờ trước, Nguyễn Minh Chương đã nói:

Cảm ơn bạn "Bee" rất nhiều, mình ko biết làm sao để đính kèm bình luận trên, hjhjhj

Bạn "Bee" cho mình hỏi tí, là làm sao để lệnh lisp đó nó xuất kết quả ra thành text luôn không cần phải ghi đè kết quả đó lên 1 text có sẵn.

Cảm ơn bạn rất nhiều.

Xuất thành text ở vị trí nào ? to hay nhỏ theo cỡ nào ? Phải xác định được các cái đó thì xuất text đơn giản thôi ^_^

Xuất ra vị trí tùy ý khi mình dùng chuột chọn vị trí đó, VD: khi mình chọn xong các đường để đo, space rồi nhập chuột trái 1 vị trí bất kỳ thì text tổng độ dài nó xuất hiện ở vị trí đó.

Còn to nhỏ thì không thành vấn đề, chỉ cần nhìn thấy là được rồi.

Cảm ơn bạ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
8 giờ trước, Nguyễn Minh Chương đã nói:

Xuất ra vị trí tùy ý khi mình dùng chuột chọn vị trí đó, VD: khi mình chọn xong các đường để đo, space rồi nhập chuột trái 1 vị trí bất kỳ thì text tổng độ dài nó xuất hiện ở vị trí đó.

Còn to nhỏ thì không thành vấn đề, chỉ cần nhìn thấy là được rồi.

Cảm ơn bạn.

Ok đã chỉnh nhé. ^_^

(defun c:cc  (/ ss tl n ent itm obj l txt)
  (setq ss (ssget)
        tl 0
        n  (1- (sslength ss)))
  (while (>= n 0)
    (setq ent (entget (setq itm (ssname ss n)))
          obj (cdr (assoc 0 ent))
          l   (cond
                ((= obj "LINE")
                 (distance (cdr (assoc 10 ent)) (cdr (assoc 11 ent))))
                ((= obj "ARC")
                 (* (cdr (assoc 40 ent))
                    (if (minusp (setq l (- (cdr (assoc 51 ent))
                                           (cdr (assoc 50 ent)))))
                      (+ pi pi l)
                      l)))
                ((or (= obj "CIRCLE")
                     (= obj "SPLINE")
                     (= obj "POLYLINE")
                     (= obj "LWPOLYLINE")
                     (= obj "ELLIPSE"))
                 (command "_.area" "_o" itm)
                 (getvar "perimeter"))
                (t 0))
          tl  (+ tl l)
          n   (1- n)))

  (entmake
    (list
      (cons 0 "TEXT")
      (cons 100 "AcDbText")
      (cons 10 (trans (getpoint "\nCh\U+1ECDn v\U+1ECB trí \U+0111\U+1EB7t text: ") 1 0))
      (cons 40 (getvar 'TEXTSIZE))
      (cons 1 (strcat "L= " (rtos tl 2 0) " mm"))
      (cons 50 0.0)
      (cons 62 4)      
      )
    )
  (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
1 giờ} trướ}c, Bee đã nói:
9 giờ trước, Nguyễn Minh Chương đã nói:

Xuất ra vị trí tùy ý khi mình dùng chuột chọn vị trí đó, VD: khi mình chọn xong các đường để đo, space rồi nhập chuột trái 1 vị trí bất kỳ thì text tổng độ dài nó xuất hiện ở vị trí đó.

Còn to nhỏ thì không thành vấn đề, chỉ cần nhìn thấy là được rồi.

Cảm ơn bạn.

Ok đã chỉnh nhé. ^_^


(defun c:cc  (/ ss tl n ent itm obj l txt)
  (setq ss (ssget)
        tl 0
        n  (1- (sslength ss)))
  (while (>= n 0)
    (setq ent (entget (setq itm (ssname ss n)))
          obj (cdr (assoc 0 ent))
          l   (cond
                ((= obj "LINE")
                 (distance (cdr (assoc 10 ent)) (cdr (assoc 11 ent))))
                ((= obj "ARC")
                 (* (cdr (assoc 40 ent))
                    (if (minusp (setq l (- (cdr (assoc 51 ent))
                                           (cdr (assoc 50 ent)))))
                      (+ pi pi l)
                      l)))
                ((or (= obj "CIRCLE")
                     (= obj "SPLINE")
                     (= obj "POLYLINE")
                     (= obj "LWPOLYLINE")
                     (= obj "ELLIPSE"))
                 (command "_.area" "_o" itm)
                 (getvar "perimeter"))
                (t 0))
          tl  (+ tl l)
          n   (1- n)))

  (entmake
    (list
      (cons 0 "TEXT")
      (cons 100 "AcDbText")
      (cons 10 (trans (getpoint "\nCh\U+1ECDn v\U+1ECB trí \U+0111\U+1EB7t text: ") 1 0))
      (cons 40 (getvar 'TEXTSIZE))
      (cons 1 (strcat "L= " (rtos tl 2 0) " mm"))
      (cons 50 0.0)
      (cons 62 4)      
      )
    )
  (princ)
  )

 

Woa Woa, cảm ơn bạn rất nhiều, bạn giỏi quá. Mà ngại quá, bạn chỉ mình cách chỉnh chữ lớn lên được ko, nó xuất ra cỡ chứ 1.5 à, mình phải zoom lên mấy vòng với thấy được.

Cảm ơn bạ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
31 phút trước, Nguyễn Minh Chương đã nói:

Woa Woa, cảm ơn bạn rất nhiều, bạn giỏi quá. Mà ngại quá, bạn chỉ mình cách chỉnh chữ lớn lên được ko, nó xuất ra cỡ chứ 1.5 à, mình phải zoom lên mấy vòng với thấy được.

Cảm ơn bạn

 

Bạn xem trong lisp có dòng này "(cons 40 (getvar 'TEXTSIZE)) "

Trước khi dùng lisp có thể oánh lệnh "TEXTSIZE" để điều chỉnh hoặc thay chữ (getvar 'TEXTSIZE) bằng chiều cao chữ bạn 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
18 phút trước, CadExTools đã nói:

 

Bạn xem trong lisp có dòng này "(cons 40 (getvar 'TEXTSIZE)) "

Trước khi dùng lisp có thể oánh lệnh "TEXTSIZE" để điều chỉnh hoặc thay chữ (getvar 'TEXTSIZE) bằng chiều cao chữ bạn muốn

Cảm ơn sự giúp đỡ của bạn rất 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

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

×