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.
Đăng nhập để thực hiện theo  
huunhantvxdts

[Nhờ chỉnh sửa] lisp tính tổng diện tích

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

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

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

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

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

 

 

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

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))

  • 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

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

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

Đăng nhập để thực hiện theo  

×