Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
saycaphe

[Hỏi]Nhờ các bác sửa giúp em file lisp

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

saycaphe    1

Em viết file lisp này , muốn thực hiện bước kiểm tra tồn tại của 1 trong 3 layer : Contour-buiten,Contour-binnen và FRAG-8. Nếu tồn tại 1 trong 3 layer trong bản ve thì mới thực hiện các bước tiếp theo, nếu ko tồn tại layer nào thì đóng bản vẽ, mà gặp lỗi hihi. Nhờ các bác sửa giúp em với.

(defun c:cc()
(if (or (tblsearch "layer" "Contour-buiten") (tblsearch "layer" "Contour-binnen") (tblsearch "layer" "FRAG-8"))
(
  (if (tblsearch "layer" "Contour-buiten")
(sssetfirst nil (ssget "x" '((8 . "Contour-buiten"))))
  (command "chprop" "p" "" "layer" "0" ""))
 (if (tblsearch "layer" "Contour-binnen")
   	(sssetfirst nil (ssget "x" '((8 . "Contour-binnen"))))
  (command "chprop" "p" "" "layer" "0" ""))
 (if (tblsearch "layer" "FRAG-8")
   	(sssetfirst nil (ssget "x" '((8 . "FRAG-8"))))
  (command "chprop" "p" "" "layer" "0" ""))
 (command "-layer" "lock" "0" "")
 (command "erase" "all" "")
 (command "-layer" "unlock" "0" "")
(command "_.saveas" "DXF" ""
	(strcat
   	(getvar 'dwgprefix)
   	(substr (getvar 'dwgname) 1 (- (strlen (getvar 'dwgname)) 4))
   	".dxf"
	) "y")
 (command "._close" "_n")
)
  (command "._close" "_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
phamthanhbinh    3.123

Em viết file lisp này , muốn thực hiện bước kiểm tra tồn tại của 1 trong 3 layer : Contour-buiten,Contour-binnen và FRAG-8. Nếu tồn tại 1 trong 3 layer trong bản ve thì mới thực hiện các bước tiếp theo, nếu ko tồn tại layer nào thì đóng bản vẽ, mà gặp lỗi hihi. Nhờ các bác sửa giúp em với.

(defun c:cc()
(if (or (tblsearch "layer" "Contour-buiten") (tblsearch "layer" "Contour-binnen") (tblsearch "layer" "FRAG-8"))
(
  (if (tblsearch "layer" "Contour-buiten")
(sssetfirst nil (ssget "x" '((8 . "Contour-buiten"))))
   (command "chprop" "p" "" "layer" "0" ""))
 (if (tblsearch "layer" "Contour-binnen")
   	(sssetfirst nil (ssget "x" '((8 . "Contour-binnen"))))
  (command "chprop" "p" "" "layer" "0" ""))
 (if (tblsearch "layer" "FRAG-8")
   	(sssetfirst nil (ssget "x" '((8 . "FRAG-8"))))
  (command "chprop" "p" "" "layer" "0" ""))
 (command "-layer" "lock" "0" "")
 (command "erase" "all" "")
 (command "-layer" "unlock" "0" "")
(command "_.saveas" "DXF" ""
(strcat
   	(getvar 'dwgprefix)
   	(substr (getvar 'dwgname) 1 (- (strlen (getvar 'dwgname)) 4))
   	".dxf"
) "y")
 (command "._close" "_n")
)
  (command "._close" "_n"))
 )

Hề hề hề,

Đọc cái lisp của bạn mình thấy có một vài điểm xin góp ý như sau:

1/- Hàm if:

- Nếu bạn muốn thực hiện nhiều hành động khi thỏa hay không thỏa điều kiện kiểm thì phải cho tất cả các hàm hành động này vào trong một hàm gọi là hàm (PROGN ........)

2/- Cái hàm

(if (tblsearch "layer" "Contour-buiten")

(sssetfirst nil (ssget "x" '((8 . "Contour-buiten"))))

(command "chprop" "p" "" "layer" "0" "")

)

sẽ được hiểu là:

Nếu tìm được layer Contour-buiten bạn sẽ chọn tất cả các đối tượng trên lớp này và highlight chúng lên

Nếu không tìm thấy layer này bạn sẽ chuyển tất cả các đối tượng được chọn trước đó về lớp 0.

Như vậy ở đây có 2 vấn đề:

a/- Nếu ý bạn đúng như vầy thì bạn lấy đâu ra các đối tượng đã chọn trước đó mà bạn dùng "p"

b/- Nếu ý bạn là cả hai hành động trên đều được làm khi tồn tại lớp Contour-buiten thì bạn sẽ có "p" là các đối tượng có trên layer này và như thế bạn phải cho cả hai hành động này vào trong hàm (progn ....) như đã nói bên trên

 

3/- Tương tự với các hàm if sau đó.

 

Vài ý kiến như vậy, hy vọng bạn sẽ khắc phục được cái lisp này theo ý của bạn.

Chúc bạn thành cô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
ketxu    2.653

Với trường hợp sử dụng nhiều IF, bạn nên chuyển hướng sang hàm rẽ nhánh COND. Ngoài ra, thao tác lặp đi lặp lại nên tìm cách đặt nó ra sau cùng.

Ngoài ra, khi viết lisp, bạn có thể nên nghĩ đến việc sử dụng trong tương lai.Ví dụ bạn có thể viết như sau :

(defun c:cc()
(setq lstLayer '("Contour-buiten" "Contour-binnen" "FRAG-8" "1234")) ;List cac Layer xu ly, co the them hoac bot trong tuong lai
(foreach layer lstLayer ;Duyet qua tung layer trong list ben tren
(cond ((tblsearch "layer" layer) ;Neu tim thay Layer
  (if (setq ss (ssget "x" (list (cons 8 layer)))) ;Kiem tra xem co doi tuong nao thuoc Layer do (neu khong, phan ss "p" cua ban co the khong phai nhu y
(progn  ;Neu co thi chon het va chuyen ve layer 0
	(sssetfirst nil ss)
	(command "chprop" "p" "" "layer" "0" "")
) ;Ket thuc Progn
  ) ;Ket thuc If
  ) ;Ket thuc cond 1
) ; Ket thuc toan bo cond
)
;Lam cac viec khac vi du nhu
 (command "-layer" "lock" "0" "")
 (command "erase" "all" "")
 (command "-layer" "unlock" "0" "")
(command "_.saveas" "DXF" ""
(strcat
	(getvar 'dwgprefix)
	(substr (getvar 'dwgname) 1 (- (strlen (getvar 'dwgname)) 4))
	".dxf"
) "y")
 (command "._close" "_n")
)

  • 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

Đăng nhập để thực hiện theo  

×