Chuyển đến nội dung
Diễn đàn CADViet
dtdat

[Sửa Lisp] Tính tổng chiều dài các LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE

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

Mình có sưu tập được một lisp tính tổng đoạn dài; không hiểu sao chỉ chọn được 01 đối tượng, sang đối tượng thứ 02 thì báo lỗi 

 

Hiên mình đang sử dụng Autocad 2018

 

 

TD11.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
11 phút trước, dtdat đã nói:

không có bác nào sửa lại giúp nhỉ?

Lisp trên có dùng được với các bản cad khác không, có dùng được với các máy khác không? Bạn thử chưa?

Bảo là lỗi thì có ai biết bạn bị cái gì không? Lỗi là lỗi gì, nó như thế nào.

Tóm lại : "Chỉ đưa thẻ căn cước thì đừng mong bắt được bệnh!"

  • 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

Xin lỗi mình bổ sung lại đây

 

Current length: 8621.1672
Select an object to measure or [DElta/Percent/Total/DYnamic] <Total>:
Specify total length or [Angle] <1.0000>: lengthen
Requires numeric distance, two points, or option keyword.
; error: Function cancelled

 

thêm dòng nhắc lệnh: Specify total length or [Angle] <1.0000>:

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

Xin lỗi mình bổ sung lại đây

Bạn có thể nhấn F2 rồi chụp nguyên cái màn hình cad của bạn khi chọn đối tượng thứ 2 lên để mọi người xem. Quay được video thì càng tốt.

Với các máy khác thì sao, với phiên bản cad khác có suất hiện lỗi này không? Tôi kiểm tra trên Cad 2012 không thấy lỗ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

Trong Lisp trên của bạn đó có dùng lệnh "LENGTHEN" để tính chiều dài.

Nhưng sau khi dùng lệnh đó xong thì nó yêu có một số yêu cầu khác nữa, mà không lặp qua đối tượng tiếp theo.

Bác @Danh Cong coi thử lệnh đó xem.

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

Trong Lisp trên của bạn đó có dùng lệnh "LENGTHEN" để tính chiều dài.

Nhưng sau khi dùng lệnh đó xong thì nó yêu có một số yêu cầu khác nữa, mà không lặp qua đối tượng tiếp theo.

Bác @Danh Cong coi thử lệnh đó xem.

(ssdel e_name ss)

Câu lệnh này nó xóa đối tượng SS_0 khỏi tập đối tượng E_name rồi bác @dinhvantrangạ.

Sau đó thì vòng lặp lại tiếp tục với đối tượng SS_0*. Tuy nhiên thì số 0 này không còn là số 0 như trước nữa, nó sẽ là đối tượng tiếp theo trong E_name.

( Nói chung là các bác lập trình trước có nhiều dòng code hay lắm ^^. Mình nhiều khi  chỉ đọc để hiểu cũng thấy toát mồ hô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

Tôi không có cad2018 nên không biết nó như nào.

Bạn thử sửa dòng này:

(command "lengthen" e_name "")

Thành dòng này:

(if (null command-s) (command "lengthen" e_name "") (command-s "lengthen" e_name ""))

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
53 phút trước, Doan Van Ha đã nói:

Tôi không có cad2018 nên không biết nó như nào.

Bạn thử sửa dòng này:

(command "lengthen" e_name "")

Thành dòng này:

(if (null command-s) (command "lengthen" e_name "") (command-s "lengthen" e_name ""))

Sửa như bác vẫn lỗ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
3 giờ trước, dinhvantrang đã nói:

Trong Lisp trên của bạn đó có dùng lệnh "LENGTHEN" để tính chiều dài.

Nhưng sau khi dùng lệnh đó xong thì nó yêu có một số yêu cầu khác nữa, mà không lặp qua đối tượng tiếp theo.

Bác @Danh Cong coi thử lệnh đó xem.

Tráng sĩ nói không sai! Cad đời trước chỉ cần "Nhất dương chỉ" (command "lengthen" e_name "") là có thể tiêu CMNR.

Nhưng truyền nhân các đời sau của nó, do khổ luyện nhiều hơn nên nội lực thâm hậu hơn, do đó phải dùng đến "Liên hoàn cước": (command "lengthen" e_name "" "" "")

KKK...!

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

Tráng sĩ nói không sai! Cad đời trước chỉ cần "Nhất dương chỉ" (command "lengthen" e_name "") là có thể tiêu CMNR.

Nhưng truyền nhân các đời sau của nó, do khổ luyện nhiều hơn nên nội lực thâm hậu hơn, do đó phải dùng đến "Liên hoàn cước": (command "lengthen" e_name "" "" "")

KKK...!

À, bác nhắc thế em mới nhớ. :))) Đúng là Cad đời sau ( Ví dụ như em từng xài cad 2015 ) có tình trạng này.

Nên em không xài "Lengthen" nữa mà chuyển vô (vla-get-Length (vlax-ename->vla-object e_name))

Câu trước hiểu nhầm ý bác DinhvanTrang điều này :) Sr bác.

Chủ thớt thay thử dòng lệnh theo bác QuocManh coi thế nào. !

  • 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
13 phút trước, Danh Cong đã nói:

À, bác nhắc thế em mới nhớ. :))) Đúng là Cad đời sau ( Ví dụ như em từng xài cad 2015 ) có tình trạng này.

Nên em không xài "Lengthen" nữa mà chuyển vô (vla-get-Length (vlax-ename->vla-object e_name))

Câu trước hiểu nhầm ý bác DinhvanTrang điều này :) Sr bác.

Chủ thớt thay thử dòng lệnh theo bác QuocManh coi thế nào. !

Có 1 điều: vla-get-Length không thể dùng chung cho các đối tượng trong list của lisp ở trên. (VD: CIRCLE, ARC...)

 

Viết lại 1 cái gọn hơn, và dùng chung được nhiều đời cad:

 

(defun c:tt  (/ ss)
 (vl-load-com)
 (if (setq ss (ssget '((0 . "ARC,CIRCLE,ELLIPSE,LINE,POLYLINE,LWPOLYLINE,SPLINE"))))
  ((lambda (tot / ent)
    (while (setq ent (ssname ss 0))
     (setq tot (+ tot (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent))))
     (setq ent (ssdel ent ss)))
    (alert (strcat "Total length: " (rtos (* tot 1e-3) 2 3) "m")))
   0))
 (princ))

  • Like 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

Lâu nay tôi vẫn dùng hàm trên của quocmanh04tt để tính Len.

Hôm nay nhàn cư vi bất thiện test thử thì kết quả nhảy như đứa say rượu. Lúc thì ra kết quả này lúc thì ra kết quả khác.

Mọi người test giùm tôi xem lỗi Cad hay lỗi lisp với.

Entsel trong hàm dưới quý vị chọn khoảng 10 lần, mỗi lầm bấm vào 1 đối tượng xem kết quả có nhảy bậy không nhé

(1 line = 1 ; 1 line = 10 ; 1 cir có r=1 ; 1  cir có r = 10)

Hàm:

(vlax-curve-getDistAtParam ent (vlax-curve-getEndParam (setq ent (car (entsel)))))

File Cad cho kết quả lung tung:

 

a1.dwg

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

không phải do Cad đâu bác @Doan Van Ha

Em test trên file cad của bác gửi và trên file cad mới, nó cũng nhảy loạn lên, lúc thì ra đúng lúc thì ra sai, không biết đâu mà lầ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
6 phút trước, Doan Van Ha đã nói:

Vậy là Ẹ lắm rồi! Sao mà chán thế cơ chứ, Lisp ơi!

Chú đoán mò nhé! Dùng như của bác ở trên thì thằng ent không được giải phóng. Bác thử dùng cái này xem có bị vậy không??? Chú thử không sao!

(defun c:tt  (/ ent)
 (while (setq ent (car (entsel)))
  (princ (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent)))))

P/s:

Nếu dùng cái này: (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam (setq ent (car (entsel)))))

Dùng lần đầu sẽ bị lỗi: Error: unable to get ObjectID: nil

Dùng lần thứ hai sẽ có kết quả => Cad sẽ lấy cái ent lần đầu để tính. và cứ thế... Nếu bác dùng (setq ent nil) rồi tiếp tục dùng cái ở trên sẽ bị lỗi.

 

  • 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

Mấy bác test nguyên xi trên lisp bác QuocManh hay là thế nào vậy? Sao em test thì kết quả nó lũ lượt giống nhau, không thấy khác gì?

Line_min = 1.000 Line_max =10.000     Circle_min=6.283    Circle_max=62.832 (Ứng với (* tot 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

Đúng là ent phải lôi cổ nó ra trước, sau đó mới đập nó được!

Lỗi này tương tự vài lỗi mà trước đây bần tăng đã gặp: có 1 số hàm/lệnh bị "nuốt chửng" khi chạy chương trình!

Nghĩa là hàm đó chưa kịp thực thi và show kết quả thì nó nhảy qua hàm kế tiếp, nhiều khi phải dùng một rổ (princ) rất vô duyên để bắt nó theo ý mì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
11 phút trước, quocmanh04tt đã nói:

Chú đoán mò nhé! Dùng như của bác ở trên thì thằng ent không được giải phóng. Bác thử dùng cái này xem có bị vậy không??? Chú thử không sao!

(defun c:tt  (/ ent)
 (while (setq ent (car (entsel)))
  (princ (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent)))))

P/s:

Nếu dùng cái này: (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam (setq ent (car (entsel)))))

Dùng lần đầu sẽ bị lỗi: Error: unable to get ObjectID: nil

Dùng lần thứ hai sẽ có kết quả => Cad sẽ lấy cái ent lần đầu để tính. và cứ thế... Nếu bác dùng (setq ent nil) rồi tiếp tục dùng cái ở trên sẽ bị lỗi.

 

 

He he đúng là như vậy. Kết quả okie nhé bác @Doan Van Ha

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

Có 1 điều: vla-get-Length không thể dùng chung cho các đối tượng trong list của lisp ở trên. (VD: CIRCLE, ARC...)

 

Viết lại 1 cái gọn hơn, và dùng chung được nhiều đời cad:

 

(defun c:tt  (/ ss)
 (vl-load-com)
 (if (setq ss (ssget '((0 . "ARC,CIRCLE,ELLIPSE,LINE,POLYLINE,LWPOLYLINE,SPLINE"))))
  ((lambda (tot / ent)
    (while (setq ent (ssname ss 0))
     (setq tot (+ tot (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent))))
     (setq ent (ssdel ent ss)))
    (alert (strcat "Total length: " (rtos (* tot 1e-3) 2 3) "m")))
   0))
 (princ))

Cái này của bác này chuẩn này...đúng  không lỗi luôn.

Thank bác!

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, Doan Van Ha đã nói:

Lâu nay tôi vẫn dùng hàm trên của quocmanh04tt để tính Len.

Hôm nay nhàn cư vi bất thiện test thử thì kết quả nhảy như đứa say rượu. Lúc thì ra kết quả này lúc thì ra kết quả khác.

Mọi người test giùm tôi xem lỗi Cad hay lỗi lisp với.

Entsel trong hàm dưới quý vị chọn khoảng 10 lần, mỗi lầm bấm vào 1 đối tượng xem kết quả có nhảy bậy không nhé

(1 line = 1 ; 1 line = 10 ; 1 cir có r=1 ; 1  cir có r = 10)

Hàm:

(vlax-curve-getDistAtParam ent (vlax-curve-getEndParam (setq ent (car (entsel)))))

File Cad cho kết quả lung tung:

 

a1.dwg

Cháu ngạc nhiên vì bác Hạ dính lỗi này đó ^^ . Dạo này bị ông Hà Giang áp lực quá rồi :D

  • 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
Vào lúc 24/7/2018 tại 13:21, quocmanh04tt đã nói:

Tráng sĩ nói không sai! Cad đời trước chỉ cần "Nhất dương chỉ" (command "lengthen" e_name "") là có thể tiêu CMNR.

Nhưng truyền nhân các đời sau của nó, do khổ luyện nhiều hơn nên nội lực thâm hậu hơn, do đó phải dùng đến "Liên hoàn cước": (command "lengthen" e_name "" "" "")

KKK...!

Vì lý do có 1 số hàm buộc phải dùng (command...) mà không thể thay thế bằng hàm lisp khác nên điều này rất nguy hiểm.

Mọi người có cad đời cao thử giùm xem liệu thay (command...) bằng (vl-cmdf...) thì có bị lỗi dư 1 dấu "" như dùng (command...) ở trên không?

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

×