Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
Lungviettri

Nhờ viết Lisp tính toán cộng và nhân số trong text

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

Xin chào anh em,

Công việc của Em có tính toán khối lượng bản vẽ, nhờ anh em viết giúp Lisp cộng và nhân khối lượng.

Ví dụ: có 4 text sau, L=3m,  L=5m, L = 9m, 7EA

Giờ em muốn gõ lệnh gg chọn các đối tượng cần tính tổng là  L=3m,  L=5m, L = 9m; sau đó ấn lệnh (dấu cách) chọn đối tượng cần nhân 7EA với tổng trước đó và xuất kết quả ra màn hình

(3+5+9)*7=119

Em xin chân thành cám ơn!

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
(defun c:CalcMath ( / txtSelection sum idx txtObj txtValue num txtToMultiply numToMultiply result)
  ;; Buoc 1: Yeu cau nguoi dung chon cac doi tuong Text
  (setq txtSelection (ssget '((0 . "TEXT,MTEXT"))))

  ;; Buoc 2: Loc gia tri so trong cac Text da chon va cong chung lai
  (setq sum 0)
  (setq idx 0)
  (if txtSelection
    (repeat (sslength txtSelection)
      (setq txtObj (vlax-ename->vla-object (ssname txtSelection idx)))
      (setq txtValue (vla-get-textstring txtObj))
      ;; Loc cac ky tu so tu chuoi Text
      (setq num (vl-remove-if-not '(lambda (x) (or (and (>= x 48) (<= x 57)) (= x 46))) (vl-string->list txtValue)))
      (setq num (vl-list->string num))
      ;; Neu num hop le (khong rong), thi cong vao tong
      (if (not (eq num ""))
        (setq sum (+ sum (atof num)))
      )
      (setq idx (1+ idx)) ;; Tang chi so vong lap
    )
  )

  ;; Buoc 3: Yeu cau nguoi dung chon doi tuong Text can nhan
  (setq txtToMultiply (car (entsel "\nChon doi tuong Text can nhan: ")))

  ;; Buoc 4: Loc gia tri so tu Text da chon va nhan voi tong
  (if txtToMultiply
    (progn
      (setq txtObj (vlax-ename->vla-object txtToMultiply))
      (setq txtValue (vla-get-textstring txtObj))
      (setq numToMultiply (vl-remove-if-not '(lambda (x) (or (and (>= x 48) (<= x 57)) (= x 46))) (vl-string->list txtValue)))
      (setq numToMultiply (vl-list->string numToMultiply))
      ;; Neu numToMultiply hop le (khong rong), thi tinh toan ket qua
      (if (not (eq numToMultiply ""))
        (setq result (* sum (atof numToMultiply)))
        (setq result 0)
      )

      ;; Buoc 5: Hien thi ket qua phep tinh
      (princ (strcat "\nKet qua phep tinh: " (rtos result 2 2)))
    )
  )

  (princ)
)

 

@Lungviettri Lisp này chỉ có thể in ra được kết quả của phép tính (cộng trước nhân sau) theo yêu cầu của bạn. Không hiển thị được công thức. Bạn dùng tạm

 

@All Sau 1 hồi loay hoay với con AI, em mới nắn dc nó làm ra như này. Các bác vào chém giúp em xem nó có thông minh không nhé

 

  • Like 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
1 giờ} trướ}c, Lungviettri đã nói:

Các bác hỗ trợ em xuất công thức kết quả ra màn với ạ 

Bác conghoa thử dùng AI xem có xuất công thức được khô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
(defun c:CalcMath ( / txtSelection sum idx txtObj txtValue num txtToMultiply numToMultiply result)
  ;; Buoc 1: Yeu cau nguoi dung chon cac doi tuong Text
  (setq txtSelection (ssget '((0 . "TEXT,MTEXT"))))

  ;; Buoc 2: Loc gia tri so trong cac Text da chon va cong chung lai
(setq ckqv "(")
  (setq sum 0)
  (setq idx 0)
  (if txtSelection
    (repeat (sslength txtSelection)
      (setq txtObj (vlax-ename->vla-object (ssname txtSelection idx)))
      (setq txtValue (vla-get-textstring txtObj))
      ;; Loc cac ky tu so tu chuoi Text
      (setq num (vl-remove-if-not '(lambda (x) (or (and (>= x 48) (<= x 57)) (= x 46))) (vl-string->list txtValue)))
      (setq num (vl-list->string num))
      ;; Neu num hop le (khong rong), thi cong vao tong
      (if (not (eq num ""))
        (setq sum (+ sum (atof num)))
      )
    (setq ckqv (strcat ckqv num "+"))
      (setq idx (1+ idx)) ;; Tang chi so vong lap
    )
  )

   (setq ckqv (substr ckqv 1 (- (strlen ckqv) 1) ))
   (setq ckqv (strcat ckqv ")*"))

  ;; Buoc 3: Yeu cau nguoi dung chon doi tuong Text can nhan
  (setq txtToMultiply (car (entsel "\nChon doi tuong Text can nhan: ")))

  ;; Buoc 4: Loc gia tri so tu Text da chon va nhan voi tong
  (if txtToMultiply
    (progn
      (setq txtObj (vlax-ename->vla-object txtToMultiply))
      (setq txtValue (vla-get-textstring txtObj))
      (setq numToMultiply (vl-remove-if-not '(lambda (x) (or (and (>= x 48) (<= x 57)) (= x 46))) (vl-string->list txtValue)))
      (setq numToMultiply (vl-list->string numToMultiply))
      ;; Neu numToMultiply hop le (khong rong), thi tinh toan ket qua
      (if (not (eq numToMultiply ""))
        (setq result (* sum (atof numToMultiply)))
        (setq result 0)
      )
   (setq ckqv (strcat ckqv numToMultiply "="))

      ;; Buoc 5: Hien thi ket qua phep tinh
      (princ (strcat "\nKet qua phep tinh: "  ckqv (rtos result 2 2)))

    )
  )

(setq dvt (getpoint "\n Diem viet ket qua"))
(entmake (list (cons 0 "TEXT")(cons 10 dvt)(cons 11 dvt)(cons 40 250)(cons 50 0)(cons 72 0)(cons 1  (strcat ckqv (rtos result 2 2)) )(cons 7 (getvar "TEXTSTYLE"))(cons 8 (getvar "Clayer"))(cons 62 256))) 

  (princ)
)

Thêm đoạn xuất đây. Độ cao mặc định là 250, muốn sửa thì vào gần cuối sửa số 250 trong (entmake (list (cons 0 "TEXT")(cons 10 dvt)(cons 11 dvt)(cons 40 250) thành số mong muốn

  • Like 3

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
16 giờ trước, 7o7 đã nói:

Bác conghoa thử dùng AI xem có xuất công thức được không?

Mình cũng loay hoay yêu cầu mà nó ko làm dc, có thể do tư duy về viết code ko có nên chưa biết cách yêu cầu nó.

 

@duy782006 Good bro!

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

×