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

Nhờ soát giúp CT autolisp về cơ khí

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

Tôi viết hộ cậu em ct mô phỏng đường chạy dụng cụ của file .NC xuất từ MasterCam cho bộ điều khiển CNC Fanuc. Tôi học lập Autolisp đã từ năm 1996 và sau đó không dùng nữa. Do thời gian quá lâu không lập trình và đầu óc mu mẫn đi rồi soát mãi vẫn chưa tìm ra lỗi. Nhờ các cao thu soát hộ, mô tả sơ bộ như sau:

Ct "drawn_main"- drawnc.lsp là mô phỏng file *.NC (2 file dinh kem "pad.nc" "sy8402.nc")

http://www.cadviet.com/upfiles/New_Folder.rar

cụ thể là chỉ vẽ cung tròn và đường thẳng lấy dữ liệu từ file .NC thôi.

một số hàm lấy từ "cutxy.lsp"

Khi chạy CT khi được khi không hoặc chi chạy được 1 lần chạy tiếp lần 2 thì lỗi, mở bản vẽ mới load lại thì lại chạy được 1 lần.

 

thêm nữa các biến hệ thống (system variable) tôi quên hết rồi, thực hiện phép toán ví dụ: (/ 3 4) kết quả = 0, đọc help và set thử biến mãi không được.

Tôi mất 2 tuần để viết CT này mà tôi lại không có nhiều thời gian (2h/ ngày) mong các bạn giúp

Xin cam on

Roberto Nguyen

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

Sau khi xem file lisp của bạn, tôi thấy 2 nguyên nhân gây lỗi và không ổn định trong chương trình bạn như sau:

 

1. Sử dụng hàm findfile trong trường hợp tổng quát:

Trong modul Rapid move point của bạn sử dụng dòng mã gán lsp-path (vl-filename-directory (findfile "cutxy.lsp")) để tìm thư mục chứa file cutxy.lsp. Hàm findfile thực tế chỉ tìm trong các thư mục Support File Search Path của Tool > Option > File mà thôi. Còn khi nằm ở thư mục khác thì hàm này sẽ không tìm thấy và trả về nil. Vì vậy thay bằng dòng lệnh đó, bạn hãy gán lsp-path thành tên thư mục luôn ví dụ lsp-path "C:\\temp\\New Folder".

 

2. Không tắt osnap khi sử dụng hàm command:

Lỗi này khiến modul Convert NC > DWG của bạn chỉ chạy đúng khi file chưa có đối tượng nào (lần chạy đầu tiên). Sang lần chạy thứ 2, đối tượng đã có nên chương trình sẽ 'vẽ' sai do tọa độ các đối tượng bị dính vào nhau.

Để khắc phục điều này, bạn thêm dòng mã: (setq oldos (getvar "osmode"))(setvar "osmode" 0) vào đầu chương trình và thêm dòng mã (setvar "osmode" oldos) vào cuối chương trình. Hoặc trước khi chạy chương trình bạn tắt osnap đi (bằng phím F3).

 

Sau khi thực hiện như trên, tôi thấy các modul của chương trình chạy ổn định, không báo lỗi nhưng không biết có chạy đúng không.

 

 

Về phép chia, bạn hãy sử dụng: (/ 3.0 4) hoặc (/ (float 3) 4) để lấy giá trị thực của phép chia.

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ám ơn bạn Nguyen Hoanh, tôi cũng nghĩ là lỗi do biến hệ thống nào đó nhưng không biết là biến nào, tôi ra soát ct nửa ngày mà không tìm ra lỗi, bây giờ thi ok rồi.

 

xin hỏi thêm.

Nếu khi đặt đường dẫn cố định, khi người sử dụng thay đổi thư mục thì sẽ gây lỗi có cách nào khắc phục không? ví dụ đổi "C:\\temp\\New Folder" thành "D:\\temp\\New Folder", Bởi vì các modul tiếp phải đọc file dữ liệu rất nhiều. Hay phải viết 1 function kiểm tra và bắt người dùng chỉ ra đường dẫn?

 

Trước đây tôi học lập trình R12 for dos thì thực hiện (/ 3 4) để lấy giá trị thực chỉ cần setvar xxxxxx , lâu quá rồi không nhớ nổi, các phiên bản về sau thi không biết thế nào vi tôi không sử dụng từ năm 1997 đến bây giờ.

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
xin hỏi thêm.

Nếu khi đặt đường dẫn cố định, khi người sử dụng thay đổi thư mục thì sẽ gây lỗi có cách nào khắc phục không? ví dụ đổi "C:\\temp\\New Folder" thành "D:\\temp\\New Folder", Bởi vì các modul tiếp phải đọc file dữ liệu rất nhiều. Hay phải viết 1 function kiểm tra và bắt người dùng chỉ ra đường dẫn?

Tôi thường xử lý cách này như sau:

 

1. Lưu đường dẫn file vào một biến của config (bằng hàm getcfg và setcfg) trong acad. Đây là cách lưu dữ liệu đơn giản và không liên quan đến các đường dẫn.

 

2. Lúc khởi động lệnh, gán đường dẫn file bằng biến config đã lưu. Kiểm tra đường dẫn vừa gán có tồn tại không? nếu không tồn tại thì bắt người sử dụng chỉ định lại đường dẫn và save nó vào config.

 

Nói thì hơi lằng nhằng, nhưng lệnh thì rất đơn giản như sau:

(setq lsp-path (getcfg "AppData/roberto/tenfile"))
(while (or (not lsp-path) (not (vl-file-directory-p lsp-path)))
 (setq lsp-path (getstring t "\nVao duong dan toi file: "))
 (if (vl-file-directory-p lsp-path) (setcfg "AppData/roberto/tenfile" lsp-path))
)

  • 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


×