Chuyển đến nội dung
Diễn đàn CADViet
Nguyen Hoang Thuy Linh

Nhờ các bác viết lisp hoán đổi giá trị kích thước đường kính giúp em với!!!

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

Số là công việc của em suốt ngày là đo đường kính hình tròn rồi tra bảng gán cho nó một thông số. Tra bảng riết rồi chán quá mấy bác ơi. Bác nào giúp em viết một Lisp mà thay vì đo đường kính ra kích thước thì ra luôn thông số trong bảng dùm em với được không ạ! em có đính kèm file. cám ơn các bác nhiều ạ. chúc các bác sức khoẻ và vui vẻ!

Furanji.jpg

MAT BICH.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
34 phút trước, Nguyen Hoang Thuy Linh đã nói:

Số là công việc của em suốt ngày là đo đường kính hình tròn rồi tra bảng gán cho nó một thông số. Tra bảng riết rồi chán quá mấy bác ơi. Bác nào giúp em viết một Lisp mà thay vì đo đường kính ra kích thước thì ra luôn thông số trong bảng dùm em với được không ạ! em có đính kèm file. cám ơn các bác nhiều ạ. chúc các bác sức khoẻ và vui vẻ!

Furanji.jpg

MAT BICH.dwg

Đã là viết lisp thì quét 1 cái nó ra luôn chứ mắc gì phải đo từng cái nữa

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, sgcq đã nói:

ĐỀ BÀI NHÌN RẤT ĐƠN GIẢN

 

 

Câu hỏi của chủ topic nghiêm túc, rõ ràng và thực tế, sao lại relax được?

  • Vote tăng 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
2 giờ trước, Doan Van Ha đã nói:

Câu hỏi của chủ topic nghiêm túc, rõ ràng và thực tế, sao lại relax được?

Ý e là đề xuất theo hướng đó nếu do với số lượng nhiều. chứ file mẫu chỉ có 1 đối tượng nên không biết ý của chủ 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
1 giờ trước, huunhantvxdts đã nói:

Ý e là đề xuất theo hướng đó nếu do với số lượng nhiều. chứ file mẫu chỉ có 1 đối tượng nên không biết ý của chủ thớt

Ủa, tôi bàn về ý của @sgcq chứ đâu bàn về ý của bạn. Ý của bạn rất tốt 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
(defun c:ddk ( / ndc  dtdtt)
(command "DIMDIAMETER")
(while (< 0 (getvar "CMDACTIVE"))
(command pause)
) 
(setq ndc (cdr (assoc 1  (entget (entlast)))))
(cond 
((= ndc "") (setq ndc (cdr (assoc 42  (entget (entlast))))))
)
(cond  ((= ndc 75) (setq ndc "5K-10A")) )
(cond  ((= ndc 80) (setq ndc "5K-15A")) )
(cond  ((= ndc 85) (setq ndc "5K-20A")) )
(cond  ((= ndc 95) (setq ndc "5K-25A")) )
(cond  ((= ndc 115) (setq ndc "5K-32A")) )
(cond  ((= ndc 120) (setq ndc "5K-40A")) )

(setq dtdtt (subst (cons 1 ndc) (assoc 1 (entget (entlast))) (entget (entlast))))
(entmod dtdtt)

(princ)
)

Viết thử mà hông biết sao nó lại chạy chập chờn lúc được lúc không. Mới nhập từ 75 đến 120 thôi. Ỗn định thì bạn tự nhập tiếp.

  • Vote tăng 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
23 phút trước, duy782006 đã nói:

(defun c:ddk ( / ndc  dtdtt)
(command "DIMDIAMETER")
(while (< 0 (getvar "CMDACTIVE"))
(command pause)
) 
(setq ndc (cdr (assoc 1  (entget (entlast)))))
(cond 
((= ndc "") (setq ndc (cdr (assoc 42  (entget (entlast))))))
)
(cond  ((= ndc 75) (setq ndc "5K-10A")) )
(cond  ((= ndc 80) (setq ndc "5K-15A")) )
(cond  ((= ndc 85) (setq ndc "5K-20A")) )
(cond  ((= ndc 95) (setq ndc "5K-25A")) )
(cond  ((= ndc 115) (setq ndc "5K-32A")) )
(cond  ((= ndc 120) (setq ndc "5K-40A")) )

(setq dtdtt (subst (cons 1 ndc) (assoc 1 (entget (entlast))) (entget (entlast))))
(entmod dtdtt)

(princ)
)

Viết thử mà hông biết sao nó lại chạy chập chờn lúc được lúc không. Mới nhập từ 75 đến 120 thôi. Ỗn định thì bạn tự nhập tiếp.

Lúc được lúc không là do dim có giá trị gần đúng. Thay = bằng equal là được.

Lisp bạn viết hơi rối.

 

  • Vote tăng 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

Thay = thành equal vẫn cứ chập chờn. Các đường tròn được vẽ đúng đường kính. cùng 1 đường tròn lúc được lúc không.

 

  • Vote tăng 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
33 phút trước, duy782006 đã nói:

Thay = thành equal vẫn cứ chập chờn. Các đường tròn được vẽ đúng đường kính. cùng 1 đường tròn lúc được lúc không.

 

Thử: (setq ndc (fix (cdr (assoc 42 (entget (entlast))))))

  • Vote tăng 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, duy782006 đã nói:

(fix 120.2) thì nó ra thành 120 sai rồi bạn.

- Dữ liệu bạn đầu toàn số nguyên mà! Thêm chút nữa: (or (eq (fix ndc) 120) (eq (itoa (rtos ndc 2 0)) 120))

- Còn muốn chấp nhận sai số trong 1 khoảng nào đó (vd: 0.999) thì theo như @ngokiet: (equal ndc 120 0.999).

 

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, NTHAHT đã nói:

- Dữ liệu bạn đầu toàn số nguyên mà! Thêm chút nữa: (or (eq (fix ndc) 120) (eq (itoa (rtos ndc 2 0)) 120))

- Còn muốn chấp nhận sai số trong 1 khoảng nào đó (vd: 0.999) thì theo như @ngokiet: (equal ndc 120 0.999).

 

Hic mình nhắc đổi thành equal thì phải thêm sài số vào.

 

Mình viết sơ lại

(defun c:ddk ( / ndc  ent)
  (setq ent (entlast))
  (command "DIMDIAMETER")
  (while (< 0 (getvar "CMDACTIVE")) (command pause))
  (if (/= ent (setq ent (entlast)))
    (if (setq ndc (assoc (fix (+ 0.5 (cdr(assoc 42 (entget ent)))))
			 '((75 . "5K-10A")
			   (80 . "5K-15A")
			   (85 . "5K-20A")
			   (95 . "5K-25A")
			   (115 . "5K-32A")
			   (120 . "5K-40A")
			   (130 . "5K-50A")
			   (155 . "5K-65A")
			   (180 . "5K-80A")
			   (190 . "5K-900A")
			   (200 . "5K-100A")
			   (235 . "5K-125A")
			   (265 . "5K-150A")
			   (300 . "5K-175A")
			   (320 . "5K-200A")
			   (345 . "5K-225A")
			   (385 . "5K-250A")
			   (430 . "5K-300A")
			   (480 . "5K-350A"))))
      (entmod (list (cons -1 ent) (cons 1 (cdr ndc))))))
  (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
13 giờ trước, duy782006 đã nói:

(defun c:ddk ( / ndc  dtdtt)
(command "DIMDIAMETER")
(while (< 0 (getvar "CMDACTIVE"))
(command pause)
) 
(setq ndc (cdr (assoc 1  (entget (entlast)))))
(cond 
((= ndc "") (setq ndc (cdr (assoc 42  (entget (entlast))))))
)
(cond  ((= ndc 75) (setq ndc "5K-10A")) )
(cond  ((= ndc 80) (setq ndc "5K-15A")) )
(cond  ((= ndc 85) (setq ndc "5K-20A")) )
(cond  ((= ndc 95) (setq ndc "5K-25A")) )
(cond  ((= ndc 115) (setq ndc "5K-32A")) )
(cond  ((= ndc 120) (setq ndc "5K-40A")) )

(setq dtdtt (subst (cons 1 ndc) (assoc 1 (entget (entlast))) (entget (entlast))))
(entmod dtdtt)

(princ)
)

Viết thử mà hông biết sao nó lại chạy chập chờn lúc được lúc không. Mới nhập từ 75 đến 120 thôi. Ỗn định thì bạn tự nhập tiếp.

Cám ơn bác nhé! của bác em thử đúng là chập chờn thật, một hai lần đầu ra bình thường, mình đo qua lần thứ 3 thì không ra nữa, hii

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

Hic mình nhắc đổi thành equal thì phải thêm sài số vào.

 

Mình viết sơ lại


(defun c:ddk ( / ndc  ent)
  (setq ent (entlast))
  (command "DIMDIAMETER")
  (while (< 0 (getvar "CMDACTIVE")) (command pause))
  (if (/= ent (setq ent (entlast)))
    (if (setq ndc (assoc (fix (+ 0.5 (cdr(assoc 42 (entget ent)))))
			 '((75 . "5K-10A")
			   (80 . "5K-15A")
			   (85 . "5K-20A")
			   (95 . "5K-25A")
			   (115 . "5K-32A")
			   (120 . "5K-40A")
			   (130 . "5K-50A")
			   (155 . "5K-65A")
			   (180 . "5K-80A")
			   (190 . "5K-900A")
			   (200 . "5K-100A")
			   (235 . "5K-125A")
			   (265 . "5K-150A")
			   (300 . "5K-175A")
			   (320 . "5K-200A")
			   (345 . "5K-225A")
			   (385 . "5K-250A")
			   (430 . "5K-300A")
			   (480 . "5K-350A"))))
      (entmod (list (cons -1 ent) (cons 1 (cdr ndc))))))
  (princ))

 

Bác ngokiet đúng ý em quá rồi, em thử good lắm a, bác fix +0.5 đúng là cái em mắc phải mà em không nghỉ tới, vì file của em Import từ cái file đuôi .igs nên thỉnh thoảng nó củng ra số gần đúng. nếu fix + - 0.5 thì ok hơn, bác chỉ e sửa thêm -0.5 nửa 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

Mình sửa lại của @ngokiet:

+ Số 0.999 bạn có thể thay đổi cho phù hợp, ý nghĩa:

Ví dụ đối với đường kính D120 thì giá trị nằm trong khoảng: 191.001 đến 120.999 được chấp nhận.

(defun c:ddk  (/ ent lst ndc)
  (setq ent (entlast)
        lst '((75 . "5K-10A")
              (80 . "5K-15A")
              (85 . "5K-20A")
              (95 . "5K-25A")
              (115 . "5K-32A")
              (120 . "5K-40A")
              (130 . "5K-50A")
              (155 . "5K-65A")
              (180 . "5K-80A")
              (190 . "5K-900A")
              (200 . "5K-100A")
              (235 . "5K-125A")
              (265 . "5K-150A")
              (300 . "5K-175A")
              (320 . "5K-200A")
              (345 . "5K-225A")
              (385 . "5K-250A")
              (430 . "5K-300A")
              (480 . "5K-350A")))
  (command "DIMDIAMETER")
  (while (< 0 (getvar "CMDACTIVE")) (command pause))
  (if (/= ent (setq ent (entlast)))
    (if (setq ndc (car
                    (vl-remove-if-not '(lambda (x) (equal (car x) (cdr (assoc 42 (entget ent))) 0.999))
                                      lst)))
      (entmod (list (cons -1 ent) (cons 1 (cdr ndc))))))
  (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, NTHAHT đã nói:

Mình sửa lại của @ngokiet:

+ Số 0.999 bạn có thể thay đổi cho phù hợp, ý nghĩa:

Ví dụ đối với đường kính D120 thì giá trị nằm trong khoảng: 191.001 đến 120.999 được chấp nhận.


(defun c:ddk  (/ ent lst ndc)
  (setq ent (entlast)
        lst '((75 . "5K-10A")
              (80 . "5K-15A")
              (85 . "5K-20A")
              (95 . "5K-25A")
              (115 . "5K-32A")
              (120 . "5K-40A")
              (130 . "5K-50A")
              (155 . "5K-65A")
              (180 . "5K-80A")
              (190 . "5K-900A")
              (200 . "5K-100A")
              (235 . "5K-125A")
              (265 . "5K-150A")
              (300 . "5K-175A")
              (320 . "5K-200A")
              (345 . "5K-225A")
              (385 . "5K-250A")
              (430 . "5K-300A")
              (480 . "5K-350A")))
  (command "DIMDIAMETER")
  (while (< 0 (getvar "CMDACTIVE")) (command pause))
  (if (/= ent (setq ent (entlast)))
    (if (setq ndc (car
                    (vl-remove-if-not '(lambda (x) (equal (car x) (cdr (assoc 42 (entget ent))) 0.999))
                                      lst)))
      (entmod (list (cons -1 ent) (cons 1 (cdr ndc))))))
  (princ))

 

Cám ơn bác nhiều nhé! bác có thể gán cho em nó dùm em một layer tên KVN_text /cyan/continous/nét 0.25 giúp em với nhé! àh, sau khi kết thúc lệnh thì nó trở về layer 0 mặ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
6 giờ trước, Nguyen Hoang Thuy Linh đã nói:

Bác ngokiet đúng ý em quá rồi, em thử good lắm a, bác fix +0.5 đúng là cái em mắc phải mà em không nghỉ tới, vì file của em Import từ cái file đuôi .igs nên thỉnh thoảng nó củng ra số gần đúng. nếu fix + - 0.5 thì ok hơn, bác chỉ e sửa thêm -0.5 nửa nhé!!!

Mình viết fix +0.5 là làm tròn số. ví dụ như 74.5 -> 75.49 thì nó thành 75. Chứ fix ko thì 74.999 nó chỉ ra 74 thôi.

Nếu sai số nhiều hơn thì dùng cái này

(defun c:ddk ( / ndc  ent)
  (setq ent (entlast))
  (command "DIMDIAMETER")
  (while (< 0 (getvar "CMDACTIVE")) (command pause))
  (if (/= ent (setq ent (entlast)))
    (Progn
      (setq ndc (cdr(assoc 42 (entget ent))))
      (if (vl-some '(lambda(x)
		      (if (equal ndc (car x) 0.999) (setq ndc (cdr x))))
		   '((75  . "5K-10A")  (80 . "5K-15A")   (85 . "5K-20A")
		     (95  . "5K-25A")  (115 . "5K-32A")  (120 . "5K-40A")
		     (130 . "5K-50A")  (155 . "5K-65A")  (180 . "5K-80A")
		     (190 . "5K-900A") (200 . "5K-100A") (235 . "5K-125A")
		     (265 . "5K-150A") (300 . "5K-175A") (320 . "5K-200A")
		     (345 . "5K-225A") (385 . "5K-250A") (430 . "5K-300A")
		     (480 . "5K-350A")))
	(entmod (list (cons -1 ent) (cons 1 ndc))))))
  (princ))

@NTHAHT Dùng vl-remove thì nó so sánh toàn bộ. Mình dùng vl-some thì khi có kết quả thì nó ngừng.

 

Còn bác muốn tự động vào layer thì cứ tạo layer rồi sử dụng dimlayer là được. Không cần chèn vào lisp cho rối. 

  • Vote tăng 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

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

×