Đến nội dung


Hình ảnh
- - - - -

[Nhờ chỉnh sửa] Lỗi lisp


  • Please log in to reply
8 replies to this topic

#1 amateurday

amateurday

    biết lệnh break

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

Đã gửi 27 December 2011 - 05:27 PM

Các bác cho em hỏi đoạn code sau em copy từng dòng vào cad để chạy thì ok, nhưng khi copy toàn bộ paste cùng lúc thì lại báo lỗi:
error: bad function: (<Entity name: 7efab0c8> (65.7159 19.2102 0.0))

(setq blockmau (entsel "\nChon Block mau:"))
(setq nhomtenblockmau (assoc 2 (entget (car blockmau))))
(setq Blkname (cdr nhomtenblockmau))
(setq doituong (cdr (last (tblsearch "Block" Blkname))))
(setq doituongcon (entnext doituong))
(setq DXFdoituongcon (entget doituongcon))
Em hỏi thêm nữa là đoạn code sau tại sao chạy lại bị lỗi: error: bad argument type: lentityp nil sau khi kết thúc lệnh while nhỉ

(defun C:fff()
(setq blockmau (entsel "\nChon Block mau:"))
(setq nhomtenblockmau (assoc 2 (entget (car blockmau))))
(setq Blkname (cdr nhomtenblockmau))
(setq doituong (cdr (last (tblsearch "Block" Blkname))))
(setq doituongcon (entnext doituong))
(setq DXFdoituongcon (entget doituongcon))
(princ "\n")
(setq DXFdoituong (entget doituong))
(princ "\n&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;Bang ma DXF cua doi tuong nhu sau:")
(foreach tungphantu DXFdoituong
(princ "\n")
(princ tungphantu)
)
(princ "\n")
(princ "\n&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;Bang ma DXF cua doi tuong nhu sau:")
(foreach tungphantu DXFdoituongcon
(princ "\n")
(princ tungphantu)
)
(while (/= doituongcon nil)
(setq doituongcon (entnext doituongcon))
(setq DXFdoituongcon (entget doituongcon))
(princ "\n")
(princ "\n&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;Bang ma DXF cua doi tuong nhu sau:")
(foreach tungphantu DXFdoituongcon
(princ "\n")
(princ tungphantu)
)
)
(princ)
)

  • 0

#2 Chiron

Chiron

    biết dimradius

  • Members
  • PipPipPipPipPip
  • 310 Bài viết
Điểm đánh giá: 90 (tàm tạm)

Đã gửi 28 December 2011 - 08:36 AM

Các bác cho em hỏi đoạn code sau em copy từng dòng vào cad để chạy thì ok, nhưng khi copy toàn bộ paste cùng lúc thì lại báo lỗi:
error: bad function: (<Entity name: 7efab0c8> (65.7159 19.2102 0.0))

Theo Chiron, khi bạn copy từng dòng lệnh, bạn sẽ nhập từng yêu cầu của dòng lệnh đó rồi mới copy paste dòng tiếp theo. Còn khi bạn copy toàn bộ rồi paste thì dòng lệnh thứ 2 sẽ là tham số đầu vào của dòng lệnh thứ nhất... và tiếp tục. CAD không thể hiểu các tham số này, thế là báo lỗi. Để khắc phục, bạn nên hoàn tất các đoạn code trên thành 1 chương trình rồi hãy chạy thử, nhập tham số vào rồi phải có xử lý tham số đó như thế nào nữa. Khi đó CAD sẽ hiểu và chờ bạn nhập tham số rồi mới thực hiện dòng lệnh tiếp theo.
Hi vọng đúng ý bạn cần.
  • 1

#3 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 28 December 2011 - 08:55 AM

Các bác cho em hỏi đoạn code sau em copy từng dòng vào cad để chạy thì ok, nhưng khi copy toàn bộ paste cùng lúc thì lại báo lỗi:
error: bad function: (<Entity name: 7efab0c8> (65.7159 19.2102 0.0))
...
Em hỏi thêm nữa là đoạn code sau tại sao chạy lại bị lỗi: error: bad argument type: lentityp nil sau khi kết thúc lệnh while nhỉ
...

1. Lisp1: Bạn Chiron đã nói đúng. Bạn có thể khắc phục bằng cách lồng các dòng code vào nhau.
2. Lisp2: lỗi trên là: Hàm yêu cầu 1 đối số là Entity nhưng đã cung cấp một kiểu dữ liệu khác. Lý do nằm ở đoạn code dưới đây:
(while (/= doituongcon nil)
(setq doituongcon (entnext doituongcon))
(setq DXFdoituongcon (entget doituongcon))
Khi while thì doituongcon khác nil, nhưng tiếp theo sau đó thì doituongcon có thể nil, nên entget của nó sẽ lỗi, trong khi hàm entget y/c đối số là entity.
  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#4 amateurday

amateurday

    biết lệnh break

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

Đã gửi 28 December 2011 - 08:57 AM

Em hiểu rồi, nhờ các bác sửa giúp em đoạn code này nhé
  • 0

#5 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 28 December 2011 - 08:59 AM

đã trả lời ở trên
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#6 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 28 December 2011 - 09:08 AM

Em hiểu rồi, nhờ các bác sửa giúp em đoạn code này nhé

Bạn thay dòng :

(while (/= doituongcon nil)
(setq doituongcon (entnext doituongcon))
(setq DXFdoituongcon (entget doituongcon))
....
Thành dòng

(while (/= doituongcon nil)
(setq doituongcon (entnext doituongcon))
(if doituongcon (setq DXFdoituongcon (entget doituongcon)))
......
  • 1

#7 amateurday

amateurday

    biết lệnh break

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

Đã gửi 28 December 2011 - 09:10 AM

Thanks các bác
  • 0

#8 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 28 December 2011 - 09:13 AM

Hoặc đảo ngược thứ tự 2 dòng dưới đây trong while:
(setq doituongcon (entnext doituongcon))
(setq DXFdoituongcon (entget doituongcon))
  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#9 amateurday

amateurday

    biết lệnh break

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

Đã gửi 28 December 2011 - 10:30 AM

Thật độc đáo. Thanks bác
Code đã sửa:

(defun C:dtc()
(setq blockmau (entsel "\nChon Block mau:"))
(setq nhomtenblockmau (assoc 2 (entget (car blockmau))))
(setq Blkname (cdr nhomtenblockmau))
(setq doituong (cdr (last (tblsearch "Block" Blkname))))
(setq doituongcon (entnext doituong))
(setq DXFdoituongcon (entget doituongcon))
(princ "\n")
(setq DXFdoituong (entget doituong))
(princ "\n&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;Bang ma DXF cua doi tuong nhu sau:")
(foreach tungphantu DXFdoituong
(princ "\n")
(princ tungphantu)
)
(while (/= doituongcon nil)
(setq DXFdoituongcon (entget doituongcon))
(setq doituongcon (entnext doituongcon))
(princ "\n")
(princ "\n&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;&#8224;Bang ma DXF cua doi tuong nhu sau:")
(foreach tungphantu DXFdoituongcon
(princ "\n")
(princ tungphantu)
)
)
(princ)
)

  • 0