Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
2 replies to this topic

#1 saycaphe

saycaphe

    biết vẽ circle

  • Members
  • PipPip
  • 32 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 06 September 2011 - 03:08 PM

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"))
)

  • 0

#2 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 06 September 2011 - 03:55 PM

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...
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#3 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5683 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 06 September 2011 - 09:10 PM

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")
)

  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC