Chuyển đến nội dung
Diễn đàn CADViet
ketxu

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

Đâ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

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

 

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
35 phút trước, Thái An 97 đã nói:

Em có tải lisp này về nhưng khi load thì bị lỗi ; error: syntax error.

Mọi người giúp em fix lỗi này với ạ

Em xin cảm ơn!!

TT-thong ke block.lsp

Sửa lại cho bạn load vào hết lỗi nhé:

(defun c:ttt (/ LM:al-effectivename LM:getdynprops blk blk_name ent i lst_blk pt row ss tblobj x y htxt)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun LM:al-effectivename  (ent / blk rep)
  (if (wcmatch (setq blk (cdr (assoc 2 (entget ent)))) "`**")
   (if (and (setq rep (cdadr (assoc -3 (entget (cdr (assoc 330 (entget (tblobjname "block" blk)))) '("AcDbBlockRepBTag")))))
            (setq rep (handent (cdr (assoc 1005 rep)))))
    (setq blk (cdr (assoc 2 (entget rep))))))
  blk
 )
;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun LM:getdynprops  (blk)
  (mapcar '(lambda (x) (cons (vla-get-propertyname x) (vlax-get x 'value)))
          (vlax-invoke blk 'getdynamicblockproperties))
)
(vl-load-com)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 (or (> (setq htxt (getvar 'TEXTSIZE)) 0) (setq htxt (setvar 'TEXTSIZE 250)))
(if (setq ss (ssget (list (cons 0 "INSERT"))))
(progn 
    (setq i -1)
    (while (setq ent (ssname ss (setq i (1+ i))))
          (setq blk (vlax-ename->vla-object ent))
          (setq blk_name
(if (= "*" (substr (cdr (assoc 2 (entget ent))) 1 1))
(strcat (LM:al-effectivename ent) ": " (cdar (LM:getdynprops blk)))
(LM:al-effectivename ent)
))
          (if (not (assoc blk_name lst_blk))
           (setq lst_blk (cons (cons blk_name 1) lst_blk))
           (setq lst_blk (subst (cons blk_name (1+ (cdr (assoc blk_name lst_blk)))) (assoc blk_name lst_blk) lst_blk)))
	)
         (setq lst_blk (vl-sort lst_blk '(lambda (x y) (< (car x) (car y)))))
         (setq pt     (getpoint "\nSpecify insertion point: ")
               TblObj (vla-addtable (vla-get-modelspace (vla-get-ActiveDocument (vlax-get-Acad-Object)))
                                    (vlax-3d-point pt) (+ (length lst_blk) 2) 4 (* 1.5 htxt) (* 6 htxt)))
         (vla-SetColumnWidth TblObj 0 (* 4 htxt))
         (vla-SetColumnWidth TblObj 1 (* 12 htxt))
         (vla-put-vertcellmargin TblObj (* 0.2 htxt))
         (mapcar '(lambda (x y) (vla-setTextHeight TblObj x y))
                 (list acTitleRow acHeaderRow acDataRow)
                 (list htxt htxt (* 0.75 htxt)))
         (mapcar '(lambda (x) (vla-setAlignment TblObj x 8)) (list acTitleRow acHeaderRow acDataRow))
         (vla-MergeCells TblObj 0 0 0 2)
         (vla-setText TblObj 0 0 "Bang thong ke khoi luong")
         (vla-setText TblObj 1 0 "STT")
         (vla-setText TblObj 1 1 "Ten")
         (vla-setText TblObj 1 2 "Don vi")
         (vla-setText TblObj 1 3 "So luong")
         (setq row 2
               i   1)
         (foreach pt  lst_blk
          (vla-setText TblObj row 0 (itoa i))
          (vla-setText TblObj row 1 (car pt))
          (vla-setText TblObj row 2 "cai")
          (vla-setText TblObj row 3 (itoa (cdr pt)))
          (setq row (1+ row)
                i   (1+ i))))
  (vlax-release-object TblObj))
 (princ))

 

  • Like 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
33 phút trước, huunhantvxdts đã nói:

Sửa lại cho bạn load vào hết lỗi nhé:


(defun c:ttt (/ LM:al-effectivename LM:getdynprops blk blk_name ent i lst_blk pt row ss tblobj x y htxt)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun LM:al-effectivename  (ent / blk rep)
  (if (wcmatch (setq blk (cdr (assoc 2 (entget ent)))) "`**")
   (if (and (setq rep (cdadr (assoc -3 (entget (cdr (assoc 330 (entget (tblobjname "block" blk)))) '("AcDbBlockRepBTag")))))
            (setq rep (handent (cdr (assoc 1005 rep)))))
    (setq blk (cdr (assoc 2 (entget rep))))))
  blk
 )
;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun LM:getdynprops  (blk)
  (mapcar '(lambda (x) (cons (vla-get-propertyname x) (vlax-get x 'value)))
          (vlax-invoke blk 'getdynamicblockproperties))
)
(vl-load-com)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 (or (> (setq htxt (getvar 'TEXTSIZE)) 0) (setq htxt (setvar 'TEXTSIZE 250)))
(if (setq ss (ssget (list (cons 0 "INSERT"))))
(progn 
    (setq i -1)
    (while (setq ent (ssname ss (setq i (1+ i))))
          (setq blk (vlax-ename->vla-object ent))
          (setq blk_name
(if (= "*" (substr (cdr (assoc 2 (entget ent))) 1 1))
(strcat (LM:al-effectivename ent) ": " (cdar (LM:getdynprops blk)))
(LM:al-effectivename ent)
))
          (if (not (assoc blk_name lst_blk))
           (setq lst_blk (cons (cons blk_name 1) lst_blk))
           (setq lst_blk (subst (cons blk_name (1+ (cdr (assoc blk_name lst_blk)))) (assoc blk_name lst_blk) lst_blk)))
	)
         (setq lst_blk (vl-sort lst_blk '(lambda (x y) (< (car x) (car y)))))
         (setq pt     (getpoint "\nSpecify insertion point: ")
               TblObj (vla-addtable (vla-get-modelspace (vla-get-ActiveDocument (vlax-get-Acad-Object)))
                                    (vlax-3d-point pt) (+ (length lst_blk) 2) 4 (* 1.5 htxt) (* 6 htxt)))
         (vla-SetColumnWidth TblObj 0 (* 4 htxt))
         (vla-SetColumnWidth TblObj 1 (* 12 htxt))
         (vla-put-vertcellmargin TblObj (* 0.2 htxt))
         (mapcar '(lambda (x y) (vla-setTextHeight TblObj x y))
                 (list acTitleRow acHeaderRow acDataRow)
                 (list htxt htxt (* 0.75 htxt)))
         (mapcar '(lambda (x) (vla-setAlignment TblObj x 8)) (list acTitleRow acHeaderRow acDataRow))
         (vla-MergeCells TblObj 0 0 0 2)
         (vla-setText TblObj 0 0 "Bang thong ke khoi luong")
         (vla-setText TblObj 1 0 "STT")
         (vla-setText TblObj 1 1 "Ten")
         (vla-setText TblObj 1 2 "Don vi")
         (vla-setText TblObj 1 3 "So luong")
         (setq row 2
               i   1)
         (foreach pt  lst_blk
          (vla-setText TblObj row 0 (itoa i))
          (vla-setText TblObj row 1 (car pt))
          (vla-setText TblObj row 2 "cai")
          (vla-setText TblObj row 3 (itoa (cdr pt)))
          (setq row (1+ row)
                i   (1+ i))))
  (vlax-release-object TblObj))
 (princ))

 

Mình load đc rồi, cảm ơn bạ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

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

×