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

[nhờ giúp đỡ] lisp tính các phép tính toán cơ bản với text

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

Nhờ mọi người chỉnh sửa giúp lisp tính toán này với ạ.

mình muốn sau khi tính toán với một phép tính nào đó lần đầu thì lần gõ lệnh tính tiếp theo nó sẽ cho lựa chọn là enter để tính phép tính đó hoặc là nhập + - * /  để tính phép tính khác

 

ví dụ : gõ lệnh "tinh" và gõ "+" để tính phép tính cộng

sau khi tính xong mình gõ lệnh "tinh" tiếp sẽ ra "Chon phep tinh <+ - * />: " nếu enter sẽ tính tiếp phép tính cộng còn nhập vào "*" sẽ tính phép tính nhân

Mong mọi người giúp đỡ. Cảm ơn!

 

(defun c:tinh()
  (vl-load-com)
  (initget 1 "+ - * /")
 
(setq ptinh (getkword "Chon phep tinh <+ - * />: "))
 
  (cond ((= ptinh "+")  ;;; cong
     (prompt "\nChon text de cong:")
     (setq ss (ssget '((0 . "TEXT")))
           kqua 0)
     (while (and ss (> (sslength ss) 0))
       (setq kqua (+ kqua (atof (cdr (assoc 1 (entget (setq ent (ssname ss 0))))))))
       (ssdel ent ss))
     (princ kqua))
    
    ((= ptinh "*")  ;;;nhan
     (prompt "\nChon text de nhan:")
     (setq ss (ssget '((0 . "TEXT")))
           kqua 1)
     (while (and ss (> (sslength ss) 0))
       (setq kqua (* kqua (atof (cdr (assoc 1 (entget (setq ent (ssname ss 0))))))))
       (ssdel ent ss))
     (princ kqua))
 
    ((= ptinh "-")  ;;;tru
     (setq sobitru (car (entsel "\nChon so bi tru:"))
           sotru (car (entsel "\nChon so tru:\n"))
           kqua (- (atof (cdr (assoc 1 (entget sobitru))))
             (atof (cdr (assoc 1 (entget sotru))))))    
     (princ kqua))
 
    ((= ptinh "/")  ;;;chia
     (setq sobichia (car (entsel "\nChon so bi chia:"))
           sochia (car (entsel "\nChon so chia:\n"))
           kqua (/ (atof (cdr (assoc 1 (entget sobichia))))
             (atof (cdr (assoc 1 (entget sochia))))))    
     (princ kqua))    
  )  
  (if (not ssle) (setq ssle 0))
  (setq obj (vlax-ename->vla-object (car (entsel "\nChon text de ghi ket qua:")))
        ssle1 (getint (strcat "\nSo so le <" (itoa ssle) ">: ")))
  (if ssle1 (setq ssle ssle1))
  (vla-put-TextString obj (rtos kqua 2 ssle))  
  (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

Nhờ mọi người chỉnh sửa giúp lisp tính toán này với ạ.

mình muốn sau khi tính toán với một phép tính nào đó lần đầu thì lần gõ lệnh tính tiếp theo nó sẽ cho lựa chọn là enter để tính phép tính đó hoặc là nhập + - * /  để tính phép tính khác

 

ví dụ : gõ lệnh "tinh" và gõ "+" để tính phép tính cộng

sau khi tính xong mình gõ lệnh "tinh" tiếp sẽ ra "Chon phep tinh <+ - * />: " nếu enter sẽ tính tiếp phép tính cộng còn nhập vào "*" sẽ tính phép tính nhân

Mong mọi người giúp đỡ. Cảm ơn!

Hề hề hề,

Bạn thử tự làm xem sao nhé.

Thêm dòng code:

(if (= ptinh nil)

vào phía trên dòng code:

(setq ptinh (getkword "Chon phep tinh <+ - * />: "))

Và Thêm một dấu ngoặc đóng ) vào dưới dòng code nói trên.

 

Chúc thành cô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

Hề hề hề,

Bạn thử tự làm xem sao nhé.

Thêm dòng code:

(if (= ptinh nil)

vào phía trên dòng code:

(setq ptinh (getkword "Chon phep tinh <+ - * />: "))

Và Thêm một dấu ngoặc đóng ) vào dưới dòng code nói trên.

 

Chúc thành công.

Cảm ơn anh phamthanhbinh đã trả lời giúp

theo như code a giúp thêm vào thì có nghĩa là nếu biến "ptinh" còn chưa có giá trị sẽ có lựa chọn còn nếu có  giá trị rồi sẽ ko còn lựa chọn được

 

nhưng e muốn là biến "ptinh" có giá trị rồi những vẫn cho lựa chọn, nếu enter sẽ bỏ qua và lấy lựa chọn trước đó

 

 giống như trong câu lệnh lựa chọn "So so le <2>:" nếu mình chọn là 2 thì lần sau chỉ cần enter là sẽ nhận là số cũ hoặc có thể nhập lại số khác

 

 

 (if (not ssle) (setq ssle 0))
  (setq obj (vlax-ename->vla-object (car (entsel "\nChon text de ghi ket qua:")))
        ssle1 (getint (strcat "\nSo so le <" (itoa ssle) ">: ")))
  (if ssle1 (setq ssle ssle1))
 
Cảm ơn và chúc anh sức khỏe!
  • 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

Có phải bạn muốn thế này:

(defun c:tinh (/ ss ent sobitru sotru sobichia sochia ssle1 kqua)
(vl-load-com)

(initget "+ - * /")
(setq ptinh1 (getkword "Chon phep tinh <+ - * />: "))

(if ptinh1
(setq ptinh ptinh1)
)

(cond ((= ptinh "+")
;;; cong
(prompt "\nChon text de cong:")
(setq ss (ssget '((0 . "TEXT")))
kqua 0
)
(while (and ss (> (sslength ss) 0))
(setq kqua
(+ kqua
(atof (cdr (assoc 1 (entget (setq ent (ssname ss 0))))))
)
)
(ssdel ent ss)
)
(princ kqua)
)

((= ptinh "*")
;;;nhan
(prompt "\nChon text de nhan:")
(setq ss (ssget '((0 . "TEXT")))
kqua 1
)
(while (and ss (> (sslength ss) 0))
(setq kqua
(* kqua
(atof (cdr (assoc 1 (entget (setq ent (ssname ss 0))))))
)
)
(ssdel ent ss)
)
(princ kqua)
)

((= ptinh "-")
;;;tru
(setq sobitru (car (entsel "\nChon so bi tru:"))
sotru (car (entsel "\nChon so tru:\n"))
kqua (- (atof (cdr (assoc 1 (entget sobitru))))
(atof (cdr (assoc 1 (entget sotru))))
)
)
(princ kqua)
)

((= ptinh "/")
;;;chia
(setq sobichia (car (entsel "\nChon so bi chia:"))
sochia (car (entsel "\nChon so chia:\n"))
kqua (/ (atof (cdr (assoc 1 (entget sobichia))))
(atof (cdr (assoc 1 (entget sochia))))
)
)
(princ kqua)
)
)
(if (not ssle)
(setq ssle 0)
)
(setq obj (vlax-ename->vla-object
(car (entsel "\nChon text de ghi ket qua:"))
)
ssle1 (getint (strcat "\nSo so le <" (itoa ssle) ">: "))
)
(if ssle1
(setq ssle ssle1)
)
(vla-put-TextString obj (rtos kqua 2 ssle))

(princ)
)

Không biết tác giả có ý đồ gì lại dùng tất cả biến toàn cục?!

  • 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

Có phải bạn muốn thế này:

(defun c:tinh (/ ss ent sobitru sotru sobichia sochia ssle1 kqua)

(vl-load-com)

 

(initget "+ - * /")

(setq ptinh1 (getkword "Chon phep tinh <+ - * />: "))

 

(if ptinh1

(setq ptinh ptinh1)

)

 

(cond ((= ptinh "+")

;;; cong

(prompt "\nChon text de cong:")

(setq ss (ssget '((0 . "TEXT")))

kqua 0

)

(while (and ss (> (sslength ss) 0))

(setq kqua

(+ kqua

(atof (cdr (assoc 1 (entget (setq ent (ssname ss 0))))))

)

)

(ssdel ent ss)

)

(princ kqua)

)

 

((= ptinh "*")

;;;nhan

(prompt "\nChon text de nhan:")

(setq ss (ssget '((0 . "TEXT")))

kqua 1

)

(while (and ss (> (sslength ss) 0))

(setq kqua

(* kqua

(atof (cdr (assoc 1 (entget (setq ent (ssname ss 0))))))

)

)

(ssdel ent ss)

)

(princ kqua)

)

 

((= ptinh "-")

;;;tru

(setq sobitru (car (entsel "\nChon so bi tru:"))

sotru (car (entsel "\nChon so tru:\n"))

kqua (- (atof (cdr (assoc 1 (entget sobitru))))

(atof (cdr (assoc 1 (entget sotru))))

)

)

(princ kqua)

)

 

((= ptinh "/")

;;;chia

(setq sobichia (car (entsel "\nChon so bi chia:"))

sochia (car (entsel "\nChon so chia:\n"))

kqua (/ (atof (cdr (assoc 1 (entget sobichia))))

(atof (cdr (assoc 1 (entget sochia))))

)

)

(princ kqua)

)

)

(if (not ssle)

(setq ssle 0)

)

(setq obj (vlax-ename->vla-object

(car (entsel "\nChon text de ghi ket qua:"))

)

ssle1 (getint (strcat "\nSo so le <" (itoa ssle) ">: "))

)

(if ssle1

(setq ssle ssle1)

)

(vla-put-TextString obj (rtos kqua 2 ssle))

 

(princ)

)

Không biết tác giả có ý đồ gì lại dùng tất cả biến toàn cục?!

cảm ơn Chiron cái lisp này đúng ý của mình rồi đấy.

lisp này mình down trên mạng về nên ko cũng không biết ý đồ của tác giả 

 

p/s: chắc phải học thêm về các định nghĩa biến, e cũng cố gắng sửa mà ko hiểu bản chất nên ko đượ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

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

×