Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
4 replies to this topic

#1 info

info

    biết zoom

  • Members
  • Pip
  • 12 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 28 February 2013 - 09:36 AM

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

 


  • 0

#2 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 28 February 2013 - 01:32 PM

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.


  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#3 info

info

    biết zoom

  • Members
  • Pip
  • 12 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 01 March 2013 - 02:33 PM

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!

  • 1

#4 Chiron

Chiron

    biết dimradius

  • Members
  • PipPipPipPipPip
  • 310 Bài viết
Điểm đánh giá: 90 (tàm tạm)

Đã gửi 01 March 2013 - 04:20 PM

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?!


  • 1

#5 info

info

    biết zoom

  • Members
  • Pip
  • 12 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 02 March 2013 - 11:25 AM

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


  • 0