Chuyển đến nội dung
Diễn đàn CADViet
Doan Van Ha

Các lỗi "oái oăm" trong LISP!!!

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

Có 1 vài hàm không thể thực hiện (Restricted) khi 1 hộp thoại (Dialog) đang được mở.

Thật bất ngờ. Em cũng đã dùng giải pháp này nhưng lại k hiểu lý do. Hỏi trên các diễn đàn khác cũng thấy im lặng. Bác gia_bach quả là siêu ^^

Thật lạ là ngay cả biến snapang làm thay đổi editor tức thì thì lại k rejected

  • 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

Thật bất ngờ. Em cũng đã dùng giải pháp này nhưng lại k hiểu lý do. Hỏi trên các diễn đàn khác cũng thấy im lặng. Bác gia_bach quả là siêu ^^

Thật lạ là ngay cả biến snapang làm thay đổi editor tức thì thì lại k rejected

Ketxu quá lời.

Chẳng qua là Ketxu post bài vào cuối tuần nên đa số đều Online ở trạng thái "Read Only + No CAD".

Và tôi có phần may mắn khi "lật đúng trang sách" có nội dung cần tìm.

  • 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

Hãy cẩn thận khi chọn đối tượng dùng tùy chọn "fence"!!!

Hình dưới đây gồm 4 Line, giao nhau tại 4 điểm. Điều oái oăm là khi chọn đối tượng với tùy chọn "f" qua các cặp điểm giao nhau thì chúng cho những kết quả rất chi trời ơi! Biết để đề phòng nhé, chứ không thì có ngày dính chẩu!

File test:

http://www.cadviet.com/upfiles/3/67029_loi_oai_oam_cua_cad.dwg

Image:

67029_oai_oam_cad.png

  • 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

Hai đối tượng không giao nhau vẫn có... giao điểm!!!

Thêm một lỗi "oái oăm" nữa mà người code lisp có thể mắc phải, đó là: 2 đối tượng không giao nhau trực tiếp (không xét giao biểu kiến - tức giao nhau nếu kéo dài chúng ra) vẫn tồn tại giao điểm, dù là xác định bằng Cad hay bằng Lisp.

Các bạn test bằng ví dụ trong file gởi kèm, sẽ thấy tồn tại giao điểm, dù chúng hở.

- Test bằng osnap của cad.

- Test bằng các hàm lisp tìm giao điểm.

Nhưng, giao điểm sẽ "biến mất" nếu chúng ta zoom đủ lớn.

http://www.cadviet.com/upfiles/3/67029_trim_loi_oai_oam.dwg

  • 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

Nhưng "gap" bao nhiêu thì nó không "lờ" đi mới là vấn đề?

Hình như nó liên quan tới hàm (acet-geom-pixel-unit) nhưng chưa biết chính xác, đành post lên để cảnh báo thôi. Hy vọng có ai đó phát hiện ra thì tiếp tục vậy.

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

Hai đối tượng không giao nhau vẫn có... giao điểm!!!

Thêm một lỗi "oái oăm" nữa mà người code lisp có thể mắc phải, đó là: 2 đối tượng không giao nhau trực tiếp (không xét giao biểu kiến - tức giao nhau nếu kéo dài chúng ra) vẫn tồn tại giao điểm, dù là xác định bằng Cad hay bằng Lisp.

Các bạn test bằng ví dụ trong file gởi kèm, sẽ thấy tồn tại giao điểm, dù chúng hở.

- Test bằng osnap của cad.

- Test bằng các hàm lisp tìm giao điểm.

Nhưng, giao điểm sẽ "biến mất" nếu chúng ta zoom đủ lớn.

http://www.cadviet.com/upfiles/3/67029_trim_loi_oai_oam.dwg

 

Ta có thể dùng hàm Lisp tìm giao điểm và các hàm Lisp để kiểm tra 2 đối tượng không giao nhau trực tiếp

"Gap" kiểm tra  vượt quá ngưỡng 1.E-9 thì lúc đó không thể tìm chúng có giao nhau hay hở mà thôi. Trong khoảng lệch 1E-9 này quá nhỏ Lisp mới chịu vì Units của CAD chỉ sai số tới giới hạn 1E-9

Hai đối tượng không giao nhau  trong bản vẽ bác post hoàn toàn có thể dùng các hàm lisp để kiểm tra đượ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

Ta có thể dùng hàm Lisp tìm giao điểm và các hàm Lisp để kiểm tra 2 đối tượng không giao nhau trực tiếp

"Gap" kiểm tra  vượt quá ngưỡng 1.E-9 thì lúc đó không thể tìm chúng có giao nhau hay hở mà thôi. Trong khoảng lệch 1E-9 này quá nhỏ Lisp mới chịu vì Units của CAD chỉ sai số tới giới hạn 1E-9

Hai đối tượng không giao nhau  trong bản vẽ bác post hoàn toàn có thể dùng các hàm lisp để kiểm tra được

1). 1E-9 là bác Tue_NV đoán mò rồi!  :lol: Phạt 1 like thôi. Vẫn bản vẽ đó, tôi cắt bớt 2 đầu mút để nó cách nhau 0.00000013 (6 chữ số 0 sau dấu chấm) >> nó vẫn giờ... ao... giao. Khoảng cách có lớn bao nhiêu thì vẫn ép chúng giao nhau được.

2). Bác thử đề xuất giải thuật để kiểm tra 2 đối tượng có giao nhau thực chất hay không, trong trường hợp tổng quát? Tôi không nghĩ ra.

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

1). 1E-9 là bác Tue_NV đoán mò rồi!  :lol: Phạt 1 like thôi. Vẫn bản vẽ đó, tôi cắt bớt 2 đầu mút để nó cách nhau 0.00000013 (6 chữ số 0 sau dấu chấm) >> nó vẫn giờ... ao... giao. Khoảng cách có lớn bao nhiêu thì vẫn ép chúng giao nhau được.

2). Bác thử đề xuất giải thuật để kiểm tra 2 đối tượng có giao nhau thực chất hay không, trong trường hợp tổng quát? Tôi không nghĩ ra.

 

Bác không nghĩ ra mà đòi phạt Tue_NV à?  :lol:

Code đây bác. Bác dùng code để kiểm tra bản vẽ của bác thử xem

 

(defun ktgd(e1 e2);kiemtragiaodiem
  (if (setq gd (vlax-invoke (vlax-ename->vla-object e1) 'IntersectWith (vlax-ename->vla-object e2) 0))
    (if (apply 'and
           (mapcar '(lambda(x y) (= (rtos x 2 99) (rtos y 2 99)))
              (vlax-curve-getClosestPointTo e1 gd nil)
              (vlax-curve-getClosestPointTo e2 gd nil)
           ))
        (alert "\n Ton tai giao diem")
        (alert "\n Khong Ton tai giao diem")
     )
            (alert "\n Khong Ton tai giao diem")
  )
)
(defun ktgd(e1 e2);kiemtragiaodiem
  (if (setq gd (vlax-invoke (vlax-ename->vla-object e1) 'IntersectWith (vlax-ename->vla-object e2) 0))
    (if (apply 'and
           (mapcar '(lambda(x y) (= (rtos x 2 99) (rtos y 2 99)))
              (vlax-curve-getClosestPointTo e1 gd nil)
              (vlax-curve-getClosestPointTo e2 gd nil)
           ))
        (alert "\n Ton tai giao diem")
        (alert "\n Khong Ton tai giao diem")
     )
(alert "\n Khong Ton tai giao diem")
  )
)
(defun ktgd(e1 e2);kiemtragiaodiem
  (if (setq gd (vlax-invoke (vlax-ename->vla-object e1) 'IntersectWith (vlax-ename->vla-object e2) 0))
    (if (apply 'and
           (mapcar '(lambda(x y) (= (rtos x 2 99) (rtos y 2 99)))
              (vlax-curve-getClosestPointTo e1 gd nil)
              (vlax-curve-getClosestPointTo e2 gd nil)
           ))
        (alert "\n Ton tai giao diem")
        (alert "\n Khong Ton tai giao diem")
     )
(alert "\n Khong Ton tai giao diem")
  )
)
(defun ktgd(e1 e2);kiemtragiaodiem
  (if (setq gd (vlax-invoke (vlax-ename->vla-object e1) 'IntersectWith (vlax-ename->vla-object e2) 0))
    (if (apply 'and
           (mapcar '(lambda(x y) (= (rtos x 2 99) (rtos y 2 99)))
   (vlax-curve-getClosestPointTo e1 gd nil)
   (vlax-curve-getClosestPointTo e2 gd nil)
           ))
        (alert "\n Ton tai giao diem")
        (alert "\n Khong Ton tai giao diem")
     )
  )
)
(defun ktgd(e1 e2);kiemtragiaodiem
  (if (setq gd (vlax-invoke (vlax-ename->vla-object e1) 'IntersectWith (vlax-ename->vla-object e2) 0))
    (if (apply 'and
           (mapcar '(lambda(x y) (= (rtos x 2 99) (rtos y 2 99)))
   (vlax-curve-getClosestPointTo e1 gd nil)
   (vlax-curve-getClosestPointTo e2 gd nil)
           ))
        (alert "\n Ton tai giao diem")
        (alert "\n Khong Ton tai giao diem")
     )
  )
)

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

:lol:

Tôi nói ở trên có 2 ý:

1). 1E-9: bác có chấp nhận là mờ o huyền không? Nếu đúng như tôi thì like. Nếu chứng minh được tôi nói ẩu thì tôi like ngược.

2). Đang bàn đến chuyện "cực nhỏ", bác lại thay cái "cực nhỏ" này (1E-9) bằng cái "cực nhỏ" khác (1E-99). Ngộ nhỡ 1E99 thì OK nhưng 1E100 thì NO, và biết lấy 1Exyztuv nào cho vừa?

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

:lol:

Tôi nói ở trên có 2 ý:

1). 1E-9: bác có chấp nhận là mờ o huyền không? Nếu đúng như tôi thì like. Nếu chứng minh được tôi nói ẩu thì tôi like ngược.

2). Đang bàn đến chuyện "cực nhỏ", bác lại thay cái "cực nhỏ" này (1E-9) bằng cái "cực nhỏ" khác (1E-99). Ngộ nhỡ 1E99 thì OK nhưng 1E100 thì NO, và biết lấy 1Exyztuv nào cho vừa?

 

1) Đúng cái chi mà đúng bác. Bác nói không thể dùng hàm Lisp để xác định hai đối tượng giao nhau biểu kiến vẫn có giao điểm? Tue_NV đã chứng minh điều ngược lại bằng code xác định rằng đã xác định hai đối tượng  giao nhau biểu kiến (trong file bác upload) không có giao điểm bằng code rồi đó

 

2) Có thể Tue_NV đã nhầm số 1E-9. Chính xác là 1E-14. Hàm (rtos so 2 99) cũng = (rtos so 2 14) 

Như Tue_NV cũng đã nói vì bài toán này tương đối. Điều này đã nói ở bài viết trê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

1). Có sự nhầm lẫn từ điều 1 sang điều 2 ?

2). Có sự nhầm lẫn từ điều 2 sang điều 1 ?

3). Lại có chuyện 1E-14 và 1E-99 nữa ư? Tôi chưa hề biết 14 và 99 có gì đặc biệt trong lisp. Nếu điều này là có sự đặc biệt đáng ghi nhận thì xin được học hỏi và srr mọi người đã mất công đọc ý kiến này.

"Như Tue_NV cũng đã nói vì bài toán này tương đối. Điều này đã nói ở bài viết trên"

Bác đã nói ở đâu? Mà sao đã nói lại còn chứng minh?

Thôi. Cá nhân tôi xin dừng tranh luận vấn đề này ở đây - như đã từng xin dừng nhiều cuộc tranh luận trên CadViet.

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

Mình có đoạn lisp như sau:

(setq    path (strcat (vl-string-right-trim "acad.dcl" (findfile "acad.dcl")) "test.txt"))
(setq openfile (open path "w"))

 

- Máy ở công ty ( cad 2007 và cad 2010) thì chạy bình thường,, cách đây 3 ngày sau khi windown7 update thì khi chay đến dòng (open path "w") thì chạy cad 2010 báo lổi "; error: bad argument type: stringp nil", còn cad 2007 thì vẫn chạy

 

- Máy ở nhà cách đây 1 tháng sau khi thay ổ đĩa SSD và cài đặt mới thì  cad2007 và cad2010 chạy bình thường, sau khi W7 update thì cad 2007 và 2010 chạy đều báo lổi như trên. Mình tiến hành restore w7 về thời điểm trước đó nhưng vẫn không khắc phục được lổi trên

 

Do máy nhà mới mà bị lổi nên mình cài lại tất cả và tắt update của W7 nên dùng cho đến bây giờ không bi lổi. Còn máy công ty thì nhiều chương trình nên ngại cài lại mới

 

Có ai đã bị như thế này chưa? và có cách khắc phục nào khác hay khô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

Lỗi do máy không tìm được file acad.dcl, có thể do windows thay đổi registry.

Bạn có thể đổi như sau:

(setq path (strcat (vl-string-right-trim "acad.dcl"

                 (strcat (substr (setq sup (vla-get-SupportPath (vla-get-Files (vla-get-Preferences (vlax-get-acad-object))))) 1

                 (vl-string-search ";" sup)) "\\acad.dcl")) "test.txt"))

 

(setq path (strcat (vl-string-right-trim "acad.dcl"
(strcat (substr (setq sup (vla-get-SupportPath (vla-get-Files
(vla-get-Preferences (vlax-get-acad-object))))) 1 (vl-string-search ";" sup)) "\\acad.dcl")) "test.txt"))

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

Thanks Tot77

 

mình dùng (setq path (getfiled "Select file" (getvar "DWGPREFIX") "txt" 1)) (lưu file ở ổ D, E, ...) rồi mở cũng bị lổi như trên

 

Hầu như các file tạo mới bằng lisp đều bị như vậy. Không biết vlisp có tạo mới file rồi ghi lại các giá trị để các lisp khác đọc hay không? nếu có cho mình xin code mẫu để test

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

Vậy có thể là do chính sách bảo mật của win7 không cho ghi file. Bạn thử đăng nhập win với quyền admin xem thử còn bị lỗi không.

Còn bạn nói vlisp ghi lại gia trị hay không là do bạn có khử biến hay không thô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

- Hai máy của mình dùng W7 và đều có quyền admin, nếu mình ghi file lên các ổ D, E,.... không phải ổ hệ thống thì vẫn bị lổi open

- Ý mình muốn nói ở đây là dùng vlisp để tạo file txt, cập nhật nội dung lên file rồi đóng lại giống như dùng các lệnh thuần lisp để tạo (nhưng ở đây thuần lisp thì bị lổi open :(  )

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

Vấn đề ở đây không phải là do autolisp hay vlisp, nếu chưa tìm ra nguyên nhân lỗi thì dù alisp hay vlisp cũng vậy thô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

Nếu biết chính xác nguyên nhân lổi để tiến hành khắc phục thì quá tốt. Do chưa biết nguyên nhân nên mình đề xuất viết code theo vlisp, nếu được thì cũng mở ra hướng tìm lổi đồng thời cũng là giải pháp tạm thờ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

Chia sẻ nỗi buồn này với bạn Tien2005!

Có lẽ lỗi này do Win. Mới đây tôi cũng bị 1 lỗi tương tự, mà nhiều khả năng cũng do Win. Chép lên để ai biết thì chia sẻ hoặc để né tránh:

Khi chạy 1 chương trình lisp của tôi, tôi thường ghi file *.cfg chứa các thông số mà mình đã đặt để mặc định cho lần sau. Hơn 1 năm nay nó ghi rất ngoan ngoản, bỗng cách đây 1 tháng thì nó không thèm ghi nữa, và báo ở command như thế này:

 

Command:

CVVC stop writing to: C:\Users\VANHA\AppData\Roaming\Autodesk\AutoCAD 2007\R17.0\enu\Support\Cang_day_TAICT.cfg

 

Tôi không hiểu 4 từ viết tắt CVVC là gì?

Đồng thời, tôi chuyển qua ghi vào thư mục làm việc luôn cho lành.

Command:
CVVC stop writing to:
C:\Users\VANHA\AppData\Roaming\Autodesk\AutoCAD 
2007\R17.0\enu\Support\Cang_day_TAICT.cfg

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

Hic, "một người nữa giống như tôi ..." :(

Mình tiếp tục thử với file đã có sẵn , mở lên và ghi các list  thì không báo lổi, đến dòng lệnh (close openfile) thì lổi

 

Vừa mới uninstall acad và cài lại mới thì bình thường :blink:  vậy mà trước đây trên máy ở nhà lại không được :angry2:

póhand

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 lỗi oái oăm nữa mà chưa biết bản chất và cách khắc phục. Post lên để mọi người biết để đề phòng và tìm hướng khắc phục nếu được.

Có 1 Spline màu trắng và 4 Lines (2 đỏ 2 xanh) vẽ trong 2D bằng đường Continuous. Rõ ràng 4 Lines này đều có điểm giao với Spline, nhưng thực tế chỉ có 2 Lines màu xanh là tìm được giao điểm (cả osnap intersection lẫn dùng hàm lisp) còn 2 Lines đỏ thì không tìm được (cả osnap intersection lẫn dùng hàm lisp). Tại sao vậy?

File Cad để test:http://www.cadviet.com/upfiles/5/67029_loi_oai_oam.dwg

67029_loi_oai_oam.png

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

Khả năng vẫn liên quan đến Spline. Bác flat Z nó đi là xong. Và lỗi này chắc thuộc về CAD thì đúng hơ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ốt lắm Ket ơi!

Rõ ràng vẽ 2D mà phải flat mới về 2D.

Tuy nhiên, khi flat thì nó mất đi một số thuộc tính mà user đã gán cho đối tượng, ví dụ mất Xdata..., mọi người chú ý nhé!

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 dùng thủ thuật move đi rồi move về đó ^^ 

 

http://www.cadviet.com/forum/topic/54646-yeu-cau-chuyen-cao-do-z-cua-cac-loai-doi-tuong-ve-z-0/?do=findComment&comment=169525

 

Đúng là không có tác dụng với bản vẽ trên theo bài rl của bác DVH bên dưới ^^

  • 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

×