huunhantvxdts 195 Báo cáo bài đăng Đã đăng Tháng 11 16, 2011 Em sưu tầm và có chỉnh sửa lại theo những yêu cầu của mình nhưng khổ nổi nó chỉ chạy được lần đầu tiên còn các lần sau nó đều báo lổi nhờ các bác ai biết sửa lại cho em: (Defun c:TDT() (setvar "cmdecho" 0) (setvar "osmode" 0) (command "osnap" "none") (if (null am)(setq am "1")) (Setq temp1 T) (While temp1 (setq pt (strcat "\nHe so ("am") \<Chon diem>: ")) (Initget "h H") (setq str (getpoint pt)) (Cond ((= str "h") (setq am (getstring (strcat"\nNhap he so <"am"> :")))) ((= str "H") (setq am (getstring (strcat"\nNhap he so <"am"> :")))) (Progn (Setq pt str) (setq temp1 nil) ) ) ) (setq s 0) (progn ; (setq pt (getpoint "\n Chon diem: ")) (while pt (setq entold (cdr (assoc 5 (entget (entlast))))) (command "boundary" pt "") (setq entnew (cdr (assoc 5 (entget (entlast))))) (if (/= entold entnew) (progn (setq entnew (entget (entlast))) (if (assoc 62 entnew) (setq entnew (subst (cons 62 (+ 3 (cdr (assoc 62 entnew)))) (assoc 62 entnew) entnew)) (setq entnew (append entnew (list (cons 62 (+ 3 (cdr (assoc 62 (tblsearch "layer" (cdr (assoc 8 entnew)))))))))) ) (entmod entnew) (Command "area" "o" (entlast)) (setq s (+ s (getvar "area"))) (setq pt (getpoint "\n Chon diem: ")) (entdel (entlast)) ) (progn (princ "chon diem sai") (setq pt (getpoint "\n Chon diem: ")) ) ) ) ) (command "osnap" "intersection") (setq am (atof am)) (setq s (* s am)) (setq point (getpoint "\n Chon diem ghi dien tich: ")) (setq th (getvar "textsize")) (setq th (getstring (strcat "\nChieu cao chu <"(rtos th)"> :"))) ;(princ "\nDien tich nhung vung vua chon la: "s) (command "TEXT" point th 0 (rtos s 2 2)) (setvar "MODEMACRO" "**CHUC BAN LAM VIEC HIEU QUA** TAILIEUKYTHUAT.COM") (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
Doan Van Ha 3.202 Báo cáo bài đăng Đã đăng Tháng 11 16, 2011 Em sưu tầm và có chỉnh sửa lại theo những yêu cầu của mình nhưng khổ nổi nó chỉ chạy được lần đầu tiên còn các lần sau nó đều báo lổi nhờ các bác ai biết sửa lại cho em: Bạn kiểm tra lại thông số "am" của bạn, vì lúc đầu thì nó là string, sau đó nó là real nên bị lỗi. Thân thươ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
huunhantvxdts 195 Báo cáo bài đăng Đã đăng Tháng 11 16, 2011 Bạn kiểm tra lại thông số "am" của bạn, vì lúc đầu thì nó là string, sau đó nó là real nên bị lỗi. Thân thương! Vậy bây giờ em phải chuyển về string phải không em cám ơn nhiều 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 3.202 Báo cáo bài đăng Đã đăng Tháng 11 16, 2011 Vậy bây giờ em phải chuyển về string phải không em cám ơn nhiều Bạn đã biết sửa lisp thì có thể chọn lựa "am" là real hay string đều được, nhưng khi dùng vào hàm thì phải đúng kiểu. Còn việc chuyển đổi qua lại thì bạn biết mà 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
huunhantvxdts 195 Báo cáo bài đăng Đã đăng Tháng 11 16, 2011 Bạn đã biết sửa lisp thì có thể chọn lựa "am" là real hay string đều được, nhưng khi dùng vào hàm thì phải đúng kiểu. Còn việc chuyển đổi qua lại thì bạn biết mà Nói chung em cung không nắm rõ quy tắc cho lắm, chỉ sưu tầm rồi sửa lại theo ý của mì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
ketxu 2.984 Báo cáo bài đăng Đã đăng Tháng 11 16, 2011 Quy tắc là thế này, bạn chú ý những dòng sau theo thứ tự logic từ trên xuống dưới : 1. (if (null am)(setq am "1")) 2. (strcat "\nHe so ("am") \<Chon diem>: ")) 3. ((= str "h") (setq am (getstring (strcat"\nNhap he so <"am"> :")))) ((= str "H") (setq am (getstring (strcat"\nNhap he so <"am"> :")))) 4. (setq am (atof am)) - Dòng 1 có nghĩa là nếu chưa có biến am (am chưa có giá trị), chương trình sẽ đặt cho am giá trị bằng "1", nếu đã có thì giữ nguyên am để thực hiện hàm ngay sau nó ở dòng 2. 2 dấu "" trước và sau số 1 hiển thị đây là 1 string (chữ) - Dòng 2 : Hàm strcat là hàm nối chuỗi, chỉ thực hiện khi tất cả các đối số đều là chuỗi(string). - Dòng 3 có nghĩa là nếu người dùng ấn H, hoặc h, thì chương trình sẽ yêu cầu bạn nhập giá trị mới cho am. Giá trị am được lấy bởi hàm Getstring, nên cũng vẫn mang định dạng là String - Dòng 4 có nghĩa là cố lấy số thực từ 1 string am, và gán ngược lại biến am, sau đó mới thực hiện các phép toán số học với 1 số thực am. Sau bước này định dạng của am đã là 1 số Real Bây giờ xét quá trình làm việc của lisp trong lần đầu tiên : - Sau khi kiểm tra điều kiện ở dòng 1, tất nhiên, lúc này am chưa được gán giá trị nào, nên chương trình sẽ đặt am = "1" (string) - Dòng 2 : strcat với các đối số toàn là chuỗi => OK - Dòng 3 : cũng vậy - Dòng 4 : am ( giả sử ta k đặt lại am ở bước 3 nhé) được đặt lại bằng 1 (số thực) và thực hiện lisp => OK Lần thứ 2 chạy lisp : - Biến am đã được đặt là 1 ở dòng 4 của lần chạy đầu tiên - Khi thực hiện đến dòng thứ 2, hàm strcat không thể nối các chuỗi khi mà thằng am bản thân của nó không phải là chuỗi => Lỗi Cách đơn giản nhất để sửa là lại biến am thành string từ giá trị thực ở cuối chương trình để lần sau am vẫn là string cho đến trước khi tính toán số học. Có thể sử dụng hàm rtos : (setq am (rtos am)) 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
huunhantvxdts 195 Báo cáo bài đăng Đã đăng Tháng 11 17, 2011 Quy tắc là thế này, bạn chú ý những dòng sau theo thứ tự logic từ trên xuống dưới : - Dòng 1 có nghĩa là nếu chưa có biến am (am chưa có giá trị), chương trình sẽ đặt cho am giá trị bằng "1", nếu đã có thì giữ nguyên am để thực hiện hàm ngay sau nó ở dòng 2. 2 dấu "" trước và sau số 1 hiển thị đây là 1 string (chữ) - Dòng 2 : Hàm strcat là hàm nối chuỗi, chỉ thực hiện khi tất cả các đối số đều là chuỗi(string). - Dòng 3 có nghĩa là nếu người dùng ấn H, hoặc h, thì chương trình sẽ yêu cầu bạn nhập giá trị mới cho am. Giá trị am được lấy bởi hàm Getstring, nên cũng vẫn mang định dạng là String - Dòng 4 có nghĩa là cố lấy số thực từ 1 string am, và gán ngược lại biến am, sau đó mới thực hiện các phép toán số học với 1 số thực am. Sau bước này định dạng của am đã là 1 số Real Bây giờ xét quá trình làm việc của lisp trong lần đầu tiên : - Sau khi kiểm tra điều kiện ở dòng 1, tất nhiên, lúc này am chưa được gán giá trị nào, nên chương trình sẽ đặt am = "1" (string) - Dòng 2 : strcat với các đối số toàn là chuỗi => OK - Dòng 3 : cũng vậy - Dòng 4 : am ( giả sử ta k đặt lại am ở bước 3 nhé) được đặt lại bằng 1 (số thực) và thực hiện lisp => OK Lần thứ 2 chạy lisp : - Biến am đã được đặt là 1 ở dòng 4 của lần chạy đầu tiên - Khi thực hiện đến dòng thứ 2, hàm strcat không thể nối các chuỗi khi mà thằng am bản thân của nó không phải là chuỗi => Lỗi Cách đơn giản nhất để sửa là lại biến am thành string từ giá trị thực ở cuối chương trình để lần sau am vẫn là string cho đến trước khi tính toán số học. Có thể sử dụng hàm rtos : (setq am (rtos am)) Làm được rồi cảm ơn bạn đã giup đỡ 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