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.
ketxu

Các lỗi thường gặp trong lập trình Lisp

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

ketxu    2.653

2 hàm ssadd và ssdel không làm thay đổi tên tập chọn, chỉ thay đổi số đối tượng trong tập chọn, nên chỉ cần gán tên tập chọn ban đầu là đủ, nhưng gán lại cũng không thiệt chi ^^

  • 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
Doan Van Ha    2.680

2 hàm ssadd và ssdel không làm thay đổi tên tập chọn, chỉ thay đổi số đối tượng trong tập chọn, nên chỉ cần gán tên tập chọn ban đầu là đủ, nhưng gán lại cũng không thiệt chi ^^

 

Thực ra tôi nghĩ bác PTB có sơ suất ở 1 điều gì đó. Nói thiệt: tôi biết không bao giờ có chuyện này. Nhưng diễn đàn thì phải vậy, thậm chí hôm nay tôi phải srr tới 2 lần.

Thân thươ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
Thaistreetz    515

bác bình kiểm tra lại biến e. nếu e là nil sẽ gặp lỗi này. đặt lại (setq ss (ssadd e ss)) là thừa, nhưng nếu có đặt cũng không sao, không gây ra lỗi như bác nêu đâu ạ.

  • 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
phamthanhbinh    3.123

bác bình kiểm tra lại biến e. nếu e là nil sẽ gặp lỗi này. đặt lại (setq ss (ssadd e ss)) là thừa, nhưng nếu có đặt cũng không sao, không gây ra lỗi như bác nêu đâu ạ.

Hề hề hề,

Mình bị lỗi thiệt và cách khăc phục của mình cũng chỉ có vậy là lisp nó chạy bon như ô tô vậy. Cũng vì thế mà mình mất công mày mò vì cứ nghĩ là viết (setq ss (ssadd e ss)) là được. Đến khi đọc lại hep và ngộ ra rồi chỉnh là (ssadde ss) thì nó chạy tối mắt luôn.

Ngoài ra mình chả biết nó lỗi chỗ nào nữa và mình không hề điều chỉnh gì khác nữa cả. Có nhẽ trong trường hợp này, thừa là có tội vậy.

Mình cũng chả rõ lắm là mình hiểu có đúng không nên mới post lên đây để mọi người phân tích chứ mình có dám nói đùa đâu.

Hề hề hề ,

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
gia_bach    1.442

Hề hề hề,

Mình bị lỗi thiệt và cách khăc phục của mình cũng chỉ có vậy là lisp nó chạy bon như ô tô vậy. Cũng vì thế mà mình mất công mày mò vì cứ nghĩ là viết (setq ss (ssadd e ss)) là được. Đến khi đọc lại hep và ngộ ra rồi chỉnh là (ssadde ss) thì nó chạy tối mắt luôn.

Ngoài ra mình chả biết nó lỗi chỗ nào nữa và mình không hề điều chỉnh gì khác nữa cả. Có nhẽ trong trường hợp này, thừa là có tội vậy.

Mình cũng chả rõ lắm là mình hiểu có đúng không nên mới post lên đây để mọi người phân tích chứ mình có dám nói đùa đâu.

Hề hề hề ,

Bác thử đoạn Lisp này xem sao :

(defun c:sstest(/ ss ss1)
 (setq ss (ssadd) ss1 (ssadd))
 (while (setq e (car (entsel "\nChon doi tuong :")))
(setq ss (ssadd e ss))
(princ (strcat "\nSo luong ss = " (itoa(sslength ss))))
(ssadd e ss1)
(princ (strcat "\nSo luong ss1 = " (itoa(sslength ss1))))
)
 (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
phamthanhbinh    3.123

Bác thử đoạn Lisp này xem sao :

(defun c:sstest(/ ss ss1)
 (setq ss (ssadd) ss1 (ssadd))
 (while (setq e (car (entsel "\nChon doi tuong :")))
(setq ss (ssadd e ss))
(princ (strcat "\nSo luong ss = " (itoa(sslength ss))))
(ssadd e ss1)
(princ (strcat "\nSo luong ss1 = " (itoa(sslength ss1))))
)
 (princ)  )

Hề hề hề,

Quả thực là test cái của bác thì chả thấy sai ở đâu cả. Vậy có nhẽ do tác động của các yếu tố khác chăng.??? nhờ các bác test giùm đoạn code mình viết này coi nó vì sao lại bị lỗi như vậy???


(defun c:trbv (/ ssk ssk1 ss e1 p1 p2)
(vl-load-com)
(setq ssk (acet-ss-to-list (ssget (list (cons 0 "lwpolyline") (cons 8 "line_spe")))))
(foreach en ssk
    (command "undo" "be")
    (setq ss (ssget "cp" (acet-geom-vertex-list en)))
    (setq e1 (entlast))
    (command "copy" ss "" (setq p1 (car (acet-geom-vertex-list en))) (setq p2 (getpoint p1)))
    (command "zoom" "e")
    (setq e (entnext e1))
    (while e 
         (flatent e)
         (setq ssk1 (ssadd))
[color=#ff0000]          (ssadd e ssk1)[/color]
         (setq e (entnext e))
    )
    (setq ssk1 (acet-ss-to-list ssk1))
    (foreach e ssk1
          (if (and (= (cdr (assoc 0 (entget e))) "LWPOLYLINE") (= (cdr (assoc 8 (entget en))) "line_spe")) 
              (etrim e p1)
         )
    )
    (command "copy" en "" p1 p2)
    (etrim (entlast) p1)
    (command "erase" (entlast) "")
    (command "zoom" "p")
    (command "undo" "e")

)
)
;;;;;;;;;;;;;;;;;;;;
(defun flatent (ename / elist etype  tmpucs  olderr  oldcmd  zeroz   ss1     ss1len    vrt     crz)

(setq tmpucs "$FLATTEN-TEMP$")        ;temporary UCS

 ;;Error handler
 (setq olderr *error*)

 ;;Setup
 (setq oldcmd (getvar "CMDECHO"))
 (setvar "CMDECHO" 0)
;;;;;;;;;;;; (command "._UNDO" "_Group")
 (command "._UCS" "_Delete" tmpucs "._UCS" "_Save" tmpucs "._UCS" "_World") ;;;;;;;set World UCS

 ;;Get input
 (setq ;;;;;;;;;;;;;;;;;; ename (ssname ss1 i)   ;entity name
                elist (entget ename)   ;entity data list
                etype (cdr (assoc 0 elist)) ;entity type

          )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defun *error* (msg)
   (if (or (= msg "Function cancelled") (= msg "quit / exit abort"))
     ;;if user cancelled or program aborted, exit quietly
     (princ)
     ;;otherwise report error message
     (princ (strcat "\nError: " msg))
   )
   (setq *error* olderr)
   (if (tblsearch "UCS" tmpucs)
     (command "._UCS" "_Restore" tmpucs "._UCS" "_Delete" tmpucs)
   )
  ;;;;;;;;; (command "._UNDO" "_End")
   (setvar "CMDECHO" oldcmd)
   (princ)
 )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;Function to change Z coordinate to 0

 (defun zeroz (key zelist / oplist nplist)
   (setq oplist (assoc key zelist)
         nplist (reverse (append '(0.0) (cdr (reverse oplist))))
         zelist (subst nplist oplist zelist)
   )
   (entmod zelist)
 )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;     
          ;;*Keep track of entities not flattened

          ;;Change group 10 Z coordinate to 0 for listed entity types.
          (if (member etype
                      '("3DFACE"    "ARC"       "ATTDEF"    "CIRCLE"
                        "DIMENSION" "ELLIPSE"   "HATCH"     "INSERT"
                        "LINE"      "MTEXT"     "POINT"     "POLYLINE"
                        "SOLID"     "TEXT"
                       )
                 )
                (setq elist  (zeroz 10 elist) ;change entities in list above

                 )
            )

          ;;Change group 11 Z coordinate to 0 for listed entity types.
            (if (member etype
                      '("3DFACE" "ATTDEF" "DIMENSION" "LINE" "TEXT" "SOLID")
                 )
                 (setq elist (zeroz 11 elist))
             )

          ;;Change groups 12 and 13 Z coordinate to 0 for SOLIDs and 3DFACEs.
          (if (member etype '("3DFACE" "SOLID"))
              (progn
               (setq elist (zeroz 12 elist))
               (setq elist (zeroz 13 elist))
              )
           )

          ;;Change groups 13, 14, 15, and 16
          ;;Z coordinate to 0 for DIMENSIONs.
          (if (member etype '("DIMENSION"))
            (progn
              (setq elist (zeroz 13 elist))
              (setq elist (zeroz 14 elist))
              (setq elist (zeroz 15 elist))
              (setq elist (zeroz 16 elist))
            )
          )

          ;;Change each polyline vertex Z coordinate to 0.
          ;;Code provided by Vladimir Livshiz, 09-Oct-1998
          (if (= etype "POLYLINE")
            (progn
              (setq vrt ename)
              (while (not (equal (cdr (assoc 0 (entget vrt))) "SEQEND"))
                (setq elist (entget (entnext vrt)))
                (setq crz (cadddr (assoc 10 elist)))
                (if (/= crz 0)
                  (progn
                    (zeroz 10 elist)
                    (entupd ename)
                  )
                )
                (setq vrt (cdr (assoc -1 elist)))
              ) ;;;;;;;;; end of while
            )
          )

          ;;Special handling for LWPOLYLINEs
          (if (member etype '("LWPOLYLINE"))
            (progn
              (setq elist  (subst (cons 38 0.0) (assoc 38 elist) elist)

              )
              (entmod elist)
            )
          )
 (command "._UCS" "_Restore" tmpucs "._UCS" "_Delete" tmpucs)
;;;;;;;;;;; (command "._UNDO" "_End")
 (setvar "CMDECHO" oldcmd)
 (setq *error* olderr)
 ename          
 ) 

Mình chỉ thay (setq ssk1 (ssadd e ssk1)) bằng (ssadd e ssk1) thì nó chạy ngon lành mà để như cũ thì nó báo lỗi lentityp nil.

Kỳ quái thiệt.

Rất mong các bác làm sáng tỏ vấ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
Doan Van Ha    2.680

Hề hề hề,

Quả thực là test cái của bác thì chả thấy sai ở đâu cả. Vậy có nhẽ do tác động của các yếu tố khác chăng.??? nhờ các bác test giùm đoạn code mình viết này coi nó vì sao lại bị lỗi như vậy???

Mình chỉ thay (setq ssk1 (ssadd e ssk1)) bằng (ssadd e ssk1) thì nó chạy ngon lành mà để như cũ thì nó báo lỗi lentityp nil.

Kỳ quái thiệt.

Rất mong các bác làm sáng tỏ vấn đề.

 

Bác giấu cái thằng ETRIM đâu rồi?

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
Doan Van Ha    2.680

Thêm 1 điều lý thú nữa đây:

Command: (setq a 5279.0)
5279.0
Command: (rtos a 2 13)
"5278.999999999999"

Command: (setq a 5280.0)
5280.0
Command: (rtos a 2 13)
"5280.000000000001"

Command: (setq a 5281.0)
5281.0
Command: (rtos a 2 13)
"5281.000000000000"

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

 

Bác giấu cái thằng ETRIM đâu rồi?

Cái Etrim là mình load sẵn nó trong start suit rồi vì bị nhiều lần nó chơi kiểu điếc với thằng etrim này. Bởi vậy nên bây giờ lại hay quên chép nó vào code các bác ạ.

Tuy nhiên chắc chắn không phải lỗi của thằng này đâu bác ạ.

hề hề hề, nó là lỗi lentityp nil. mà bác không phải lỗi Unknown command Etrim.

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

bác gửi cả bản vẽ mà bác dùng để test lisp này + hàm etrim nữa để em kiểm tra coi nào :D

Nó đây ạ:

http://www.4shared.com/file/Lv4AJTZj/BDKM22-30.html

Còn về thằng etrim thì bác chĩ cần load thằng Extrim.lsp trong express tools vào Start suit là nó thường trực mà, đâu cần gửi khi mà bác đã có sẵn rùi bác nhể. Thằng này là hàm con trong thằng extrim bá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
phamthanhbinh    3.123

Thêm 1 điều lý thú nữa đây:

 

Hề hề hề,

Bác làm chi mà cần tới một lũ tí nhau vậy hở bác. Mình chỉ xài đến 4 con là đã phờ râu rồi bác ạ.

Cái ni chắc tại nhiều con nhỏ quá nên thằng lisp nó nhìn lộn con nọ vào con kia ấy mà bác.

Hề hề hề,...

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
kid_a2pbc    1

Các bác cho em hỏi. Lisp có chương trình nào để chạy kiểm tra lỗi được ko ạ. Kiểu như pascal trước đây em học, trong chương trình thì có kiểm tra chạy từng dòng nó báo lỗi để mình dễ phát hiện ra ấy ạ. Em cám ơ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
Doan Van Ha    2.680

Đây là các bước kiểm tra lỗi Lisp tôi sưu tầm được:

TÌM DÒNG CODE BỊ LỖI

1). Mở Vlide => mở File => Tools => Load Text in Editor

2). Vào Debug => Tick vào Break On Error (nếu chưa)

3). Về lại Cad => Chạy lisp

4). Về Vlide => Debug => Last Break Source => đoạn Code lỗi sẽ được Highlight

5). Cuối cùng: Debug => Reset to Top Level để thoát

  • 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
Doan Van Ha    2.680

Cho tôi hỏi tí: bạn muốn kiểm tra lỗi của file lisp do code lisp sai hay kiểm tra lỗi khi chạy chương trình lisp (code lisp đã đúng)?

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
saigonnew    2
báo lỗi: bad defun syntax là sao vậy bạn, sai chỗ nào vậy

 

 

  (defun c: qa ()

    

   (COMMAND "-SCALELISTEDIT""R""Y""E")

       

   )

  • Vote giảm 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
Danh Cong    121

 

báo lỗi: bad defun syntax là sao vậy bạn, sai chỗ nào vậy
  (defun c: qa () 
   (COMMAND "-SCALELISTEDIT""R""Y""E")   
   )

 

Góp ý với bạn đôi chút: 

 

+ Nên viết tách cú pháp cho rõ ràng, để thuận tiện cho việc sau này có sảy ra lỗi thì bạn có thể dễ dàng kiểm tra: 

 Ví dụ: "-SCALELISTEDIT""R""Y""E"   thành "-SCALELISTEDIT"  "R"  "Y"  "E"

+ Lỗi Bad defun syntax thì bác #DoanVanHa nói rồi. Chi tiết hơn thì nó nằm ngay trong dòng:   defun c: qa () của bạn ^^ Bạn tự dò lỗi để nhớ cho lâu nhé. : )

 

+ Thêm điều nữa: Những người thành thạo về lisp chắc cũng hơn bạn ít cũng chục tuổi. Nên bạn muốn người khác giúp thì nên xưng hô kính trọng họ , có thưa có gửi đàng hoàng .

Vì làm gì có ai có trách nhiệm trả lời câu hỏi của bạn! ,< Tôi còn trẻ, nên bạn gọi sao cũng đượ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ạ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


×