Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
hoangkimoanh

[Cần giúp đỡ] gộp giúp em lisp lệnh bật, tắt Layer với

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

hoangkimoanh

Gửi vào Hôm qua, 01:20 AM

em hay dùng tắt, bật layer khi vẽ. em cần giúp gộp đoạn code dưới đây thành 1 lệnh tắt hay bật Layer đều bằng 1 lệnh.

VD: bấm số 1 lúc đầu là tắt Layer, sau muốn hiện Layer lên lại thì lại bấm số 1 là nó hiện lại nhưng Layer đã tắt. cảm ơn các anh rất nhiều.

CODE:

(defun c:1() (prompt "\nGO SO 1: DE TAT TUNG LAYER TUY CHON")(c:LAYOFF))

(defun c:11() (prompt "\nGO SO 2: DE MO TAT CA CAC LAYER DA TAT")(c:LAYON))

 

Thaistreetz

Gửi vào Hôm qua, 08:28 AM

Làm được nhưng lời khuyên là đừng làm thế.

Giả sử tại 1 thời điểm nào đó bản vẽ đang có 1 số layer bị tắt. giờ bạn muốn tắt thêm 1 số layer nữa thì làm thế nào? Lại bật tất cả lên rồi mới tắt à?

 

 

hoangkimoanh

Gửi vào Hôm nay, 04:06 AM

em muốn biết cái hàm gộp lệnh nó như thế nào để có thể thực hiện cho 1 số lệnh khác nữa anh ạ. vấn đề không phải là em lười, mà các lệnh tắt cần thiết hay dùng em đặt hết trên dãy số tứ 1->9 rồi.

trường hợp khi muốn tắt thêm 1 số layer nữa thì em có thể đặt tên khác VD: 11 là tắt Layer; 111 là mở Layer, còn lệnh gộp là 1. nếu muốn tắt thêm thì gõ 11, còn bình thường thì chỉ cần dùng bằng 1 lệnh là số 1 để chuyển qua lại thôi.

trân thành cảm ơn các anh

(EM MỜI VÀO DIỄN ĐÀN THAM GIA NÊN CHƯA BIẾT CÁCH POST BÀI, BỞI VẬY BÀI TRƯỚC CỦA EM ĐÃ BỊ VÀO THÙNG RÁC. EM GỬI LẠI NHƯ THẾ NÀY KHÔNG BIẾT CÓ SAI SÓT GÌ KHÔNG, MONG CÁC CÁCH THÔNG CẢ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

Lisp gộp 2 lệnh LAYOFF và LAYON thành 1 lệnh.

(defun c:1()
(cond
 ((or (not n) (= n 1))
  (c:LAYOFF)
  (setq n 2))
 ((= n 2)
  (c:LAYON)
  (setq n 1))))

  • Vote tăng 4

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

Nhờ các bác viết giúp em list vẽ trọng tâm của hình 2D bất kỳ. Nghĩa là khi mình có 1 hình bất kỳ, nhấp vào 1 điểm giữa hình thì sẽ vẽ ra được trong tâm của hình đó dưới dạng +. Cảm ơn các bác pro 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

Chơi kiểu gì mà tung tin lên các topic khác với cùng 1 nội dung, mà nội dung này không ăn nhập gì với chủ đề của topic vậy?

Nếu chủ đề chưa có thì mở topic mới nhé! Riêng Lisp tìm trọng tâm thì trên forum có nhiều rồi, bạn search sẽ thấy.

Hoặc xem link dưới đây.

http://xaydungit.vn/product/lisp-tinh-trong-tam-chung-cua-cac-hinh-phang-1014.htm

  • 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

Code lật ngược thế trận này đẹp quá:

(setq *n (not *n))

Đẹp nhưng tăng 1 biến toàn cục. => không nên

 

để viết được lệnh này như bạn chủ topic yêu cầu mà không fải sử dụng 1 biến toàn cục thì cần kiểm tra màu của các layer. layer bị off nếu màu của nó = màu thực nhân với -1.

từ nguyên tắc này có thể viết được 3 lệnh layon; layoff và layiso mà không cần express

  • 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

cảm ơn các anh quan tâm rất nhiều!

đoạn code của anh Ha và anh ketxu đều làm đúng ý của em nhưng có 1 chút nữa em cần sự giúp đỡ: em thực hiện lisp của anh ketxu khi nhấn lệnh số 1 rồi Enter nó hiện ra "All layers have been turned on.T" em nhấn tiếp Enter lần nữa mới được và sau đó thì dùng bình thường, còn mở 1 file mới thì khi thực hiện lệnh lần đầu tiên thì lại bị như trên vậy là làm sao để không phải nhấn Enter 2 lần khi muốn thực hiện lệnh đó lần đầu tiê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

Chơi kiểu gì mà tung tin lên các topic khác với cùng 1 nội dung, mà nội dung này không ăn nhập gì với chủ đề của topic vậy?

Nếu chủ đề chưa có thì mở topic mới nhé! Riêng Lisp tìm trọng tâm thì trên forum có nhiều rồi, bạn search sẽ thấy.

Hoặc xem link dưới đây.

http://xaydungit.vn/...-phang-1014.htm

Sory vì đã hỏi trong topic này! Lâu lắp rồi mới xài lại forum nên hơi ..."vịt", tìm hoài mà không mở được topic mới nên ghé vào đây ké tạm! Cảm ơn Mr Ha nhiều nhoa!!! :)

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

Đẹp nhưng tăng 1 biến toàn cục. => không nên

để viết được lệnh này như bạn chủ topic yêu cầu mà không fải sử dụng 1 biến toàn cục thì cần kiểm tra màu của các layer. layer bị off nếu màu của nó = màu thực nhân với -1.

từ nguyên tắc này có thể viết được 3 lệnh layon; layoff và layiso mà không cần express

Tôi chỉ nói code đẹp hơn của tôi thôi (mặc dầu cả 2 đều đẻ ra 1 biến toàn cục, là nhược điểm).

Cách của bác tuy code hơi dài, hoặc tất cả cách nào không đẻ biến toàn cục đều văn minh cả. OK!

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 cho hỏi, mình có cái này trước đây dùng CAD2008 thì ok, giờ dùng CAD2009 thì nó cứ dừng ở dòng lệnh đánh tên kg cho chọn đối tượng cần tắt.

Còn nếu dùng lệnh _LA của CAD thì khi enter ở dòng lệnh đánh tên thì nó lại nhảy tới dòng lệnh chọn đối tượng....(cái này mình cần tìm).

 

(defun C:LLF () (COMMAND "_LAYER" "OFF" ))

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 gộp 2 lệnh LAYOFF và LAYON thành 1 lệnh.

(defun c:1()
(cond
 ((or (not n) (= n 1))
  (c:LAYOFF)
  (setq n 2))
 ((= n 2)
  (c:LAYON)
  (setq n 1))))

 

Từ lisp nhờ chỉnh sửa trên, em cũng xin ké tý, nhu cầu của em mong muốn nhờ các bác cũng na ná như trên, cụ thể như sau:

1. Em đã có sẵn lisp với các lệnh thực thi tương ứng là: n1, n2, n3, n4, n5

2. Nhờ các bác viết 1 lisp (ví dụ lệnh: a1)

3. Sau khi load các lisp với các lệnh n1, n2, n3, n4, n5, a1 xong

4. Gọi lệnh a1 thì lisp sẽ tự động thực hiện lệnh n1

5. Thực hiện xong lệnh n1 sẽ hiện bảng thông báo "Done to n1, space to continue, esc to stop"

6. Nếu nhấn nút space thì lisp sẽ tự động thực hiện tiếp lệnh n2, nhấn nút esc thì lisp sẽ tự động kết thức lệnh

7. Thực hiện xong lệnh n2 sẽ hiện bảng thông báo "Done to n1, space to continue, esc to stop"

8. Nếu nhấn nút space thì lisp sẽ tự động thực hiện tiếp lệnh n2, nhấn nút esc thì lisp sẽ tự động kết thức lệnh

9. Tiếp tục như thế đến hết lệnh n5 (nếu thực hiện đến n5 thì lisp tự động kết thúc lệnh và hiện lên bảng thông báo "good luck")

10. Nhấn space để hoàn thành.

 

Xin cảm ơn các bác trướ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

 

Từ lisp nhờ chỉnh sửa trên, em cũng xin ké tý, nhu cầu của em mong muốn nhờ các bác cũng na ná như trên, cụ thể như sau:

1. Em đã có sẵn lisp với các lệnh thực thi tương ứng là: n1, n2, n3, n4, n5

2. Nhờ các bác viết 1 lisp (ví dụ lệnh: a1)

3. Sau khi load các lisp với các lệnh n1, n2, n3, n4, n5, a1 xong

4. Gọi lệnh a1 thì lisp sẽ tự động thực hiện lệnh n1

5. Thực hiện xong lệnh n1 sẽ hiện bảng thông báo "Done to n1, space to continue, esc to stop"

6. Nếu nhấn nút space thì lisp sẽ tự động thực hiện tiếp lệnh n2, nhấn nút esc thì lisp sẽ tự động kết thức lệnh

7. Thực hiện xong lệnh n2 sẽ hiện bảng thông báo "Done to n1, space to continue, esc to stop"

8. Nếu nhấn nút space thì lisp sẽ tự động thực hiện tiếp lệnh n2, nhấn nút esc thì lisp sẽ tự động kết thức lệnh

9. Tiếp tục như thế đến hết lệnh n5 (nếu thực hiện đến n5 thì lisp tự động kết thúc lệnh và hiện lên bảng thông báo "good luck")

10. Nhấn space để hoàn thành.

 

Xin cảm ơn các bác trước!

Bạn thử code này :

(defun c:a1(/ str)
(c:n1)
(if (= "" (getstring "\nDone to n1, space to continue, esc to stop"))
 (progn (c:n2)
(if (= "" (getstring "\nDone to n2, space to continue, esc to stop"))
   (progn (c:n3)
  		(if (= "" (getstring "\nDone to n3, space to continue, esc to stop"))
       (progn (c:n4)
         		(if (= "" (getstring "\nDone to n4, space to continue, esc to stop"))
           (progn (c:n5)(alert "Good luck"))
  		)
       )
   	)
   )
)
)
)
)

 

Viết gọn gàng lại như sau :

(defun c:a1(/ lst_tenlenh defun_tenlenh i)
(setq lst_tenlenh '("n1" "n2" "n3" "n4" "n5")); danh sach ten lenh o day
(setq defun_tenlenh (mapcar '(lambda(x) (strcat "(c:" x ")")) lst_tenlenh) i 0)
(eval (read (nth 0 defun_tenlenh)))
(while (and (< i (1- (length lst_tenlenh)))
   	(getstring (strcat "Done to " (nth i lst_tenlenh) ", Press any key to continue, esc to stopp"))    
  	)
  (eval (read (nth (setq i (1+ i)) defun_tenlenh)))
  (if (= i (1- (length lst_tenlenh) )) (alert "Good luck"))
)
)

Chỉnh sửa theo Tue_NV
  • 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

Khi ấn Esc thì bạn khỏi bảo nó cũng thoát lệnh rồi ^^

(defun c:test ()
(mapcar '(lambda(x)(eval (read (strcat "(c:" x ")")))
	(getstring (strcat "\nDone to " x ", space to continue, esc to stop"))
 ) '("n1" "n2" "n3"))
(alert "Done! Good luck!")
(princ)
)

  • 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

Khi ấn Esc thì bạn khỏi bảo nó cũng thoát lệnh rồi ^^

(defun c:test ()
(mapcar '(lambda(x)(eval (read (strcat "(c:" x ")")))
(getstring (strcat "\nDone to " x ", space to continue, esc to stop"))
 ) '("n1" "n2" "n3"))
(alert "Done! Good luck!")
(princ)
)

Khi thực hiện xong lệnh n3 thì chưa "Good luck" được. "Chúc may mắn" phải thông qua "press any key".

Chưa đạt yêu cầu vì : (nếu thực hiện đến n3 thì lisp tự động kết thúc lệnh hiện lên bảng thông báo "good luck"). Phải thêm code nữa Ket mới đạt được yêu cầu

 

Cái của Tue_NV tuy dài hơn ketxu 1 tí nhưng "Good luck" ngay khi kết thúc lệnh cuối cùng, chẳng phải thông qua "press any key" nào 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

Kiểu này mình cũng sắp mất ăn mất ngủ vì mê lisp mất thôi, xong đợt này quyết tâm.... học lisp. nhiều ý định về lisp quá mà chưa thực hiện được, nhờ vả nhiều quá rồi, chắc cũng chỉ nhờ khoảng 1000 lần nữa thoai, hê hê, cảm ơn lisp muôn năm, cảm ơn các bro nhiều 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

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  

×