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

Cộng trừ nhân chia các số trong block att

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

Nhờ các bác viết giúp lisp tính toán các số (giá trị) trong block attribute bằng cách đánh lệnh TT rồi chọn phép tính +-*: sau đó chọn các đối đượng ATT cần tính. Mình tìm trên diễn đàn nhưng không thấy, chỉ có lisp tính toán với các Text thường thôi. Cảm ơn mọi người trước 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

Bạn viết bài cũng nhiều rồi, tiêu đề topic đặt chưa đúng với qui định của diễn đàn, câu hỏi của Bận đặt ra không rõ ràng e là Bạn khó có được lisp như mong muốn, nên bổ sung thêm các thông tin:

- file mẫu của bạn

- kết quả tính được xử lý như thế nào: ghi ra block ATT có sẵn, text tạo mới có layer màu sắc...hay text có sẵn, thông báo kết quả ra màn hình,...

- Bài toán trừ, chia thì số nào là bị trừ, bị chia. Chia cho 0 (số không) thì sao?

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ảm ơn bạn đã nhắc nhỡ.

đây là file đính kèm: các bác xem sẽ hiểu ý em

http://www.cadviet.com/upfiles/4/136880_block_att.dwg

Hề hề hề,

Không biết cái này có đúng ý bạn chưa???

 

http://www.cadviet.com/upfiles/4/5194_attcalculation_1.lsp

(defun c:atc (/ goc cal e1 en ph)
(setq goc (atof (cdr (assoc 1 (entget (car (nentsel "\n Chon text goc tinh toan")))))))
(setq cal (getstring "\n Chon phep tinh toan <+ - * /> : "))
(while (setq e1 (nentsel "\n Chon text can tinh toan"))
     (setq ph (atof (cdr (assoc 1 (entget (car e1 ))))))
     (cond 
        ((= cal "+") (setq goc (+ goc ph)))
        (( = cal "-") (setq goc (- goc ph)))
        ((= cal "*") (setq goc (* goc ph)))
        ((= cal "/") (setq goc (/ goc ph)))
        (T nil)
     )
   goc
)
(setq en (car (nentsel "\n Chon text can thay the")))
(entmod (subst (cons 1 (rtos goc 2 2)) (assoc 1 (entget en)) (entget en)))
(entupd en)
)
  • 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ề,

Không biết cái này có đúng ý bạn chưa???

 

http://www.cadviet.com/upfiles/4/5194_attcalculation_1.lsp

(defun c:atc (/ goc cal e1 en ph)
(setq goc (atof (cdr (assoc 1 (entget (car (nentsel "\n Chon text goc tinh toan")))))))
(setq cal (getstring "\n Chon phep tinh toan <+ - * /> : "))
(while (setq e1 (nentsel "\n Chon text can tinh toan"))
     (setq ph (atof (cdr (assoc 1 (entget (car e1 ))))))
     (cond 
        ((= cal "+") (setq goc (+ goc ph)))
        (( = cal "-") (setq goc (- goc ph)))
        ((= cal "*") (setq goc (* goc ph)))
        ((= cal "/") (setq goc (/ goc ph)))
        (T nil)
     )
   goc
)
(setq en (car (nentsel "\n Chon text can thay the")))
(entmod (subst (cons 1 (rtos goc 2 2)) (assoc 1 (entget en)) (entget en)))
(entupd en)
)

Cảm ơn bạn nhiều nhé nhưng mình test lisp không tính toán được. Ý mình là thế này: đánh lệnh atc -> chọn phép tính, ví dụ chọn phép + (cộng) thì mình chọn các số cần cộng -> enter -> chọn att hoặc DText hoặc Mtext để gán kết quả. Các bạn tham khảo lisp sau: của bác q288:

http://www.cadviet.com/forum/topic/4077-yeu-cau-lisp-cong-tru-nhan-chia-text/

lisp này: http://www.cadviet.com/upfiles/4/136880_tinh_1.lsp

nhưng mình muốn áp dụng với block ATT

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ề,

Không biết cái này có đúng ý bạn chưa???

 

http://www.cadviet.com/upfiles/4/5194_attcalculation_1.lsp

(defun c:atc (/ goc cal e1 en ph)
(setq goc (atof (cdr (assoc 1 (entget (car (nentsel "\n Chon text goc tinh toan")))))))
(setq cal (getstring "\n Chon phep tinh toan <+ - * /> : "))
(while (setq e1 (nentsel "\n Chon text can tinh toan"))
     (setq ph (atof (cdr (assoc 1 (entget (car e1 ))))))
     (cond 
        ((= cal "+") (setq goc (+ goc ph)))
        (( = cal "-") (setq goc (- goc ph)))
        ((= cal "*") (setq goc (* goc ph)))
        ((= cal "/") (setq goc (/ goc ph)))
        (T nil)
     )
   goc
)
(setq en (car (nentsel "\n Chon text can thay the")))
(entmod (subst (cons 1 (rtos goc 2 2)) (assoc 1 (entget en)) (entget en)))
(entupd en)
)

Cảm ơn bạn nhiều nhé nhưng mình test lisp không tính toán được. Ý mình là thế này: đánh lệnh atc -> chọn phép tính, ví dụ chọn phép + (cộng) thì mình chọn các số cần cộng -> enter -> chọn att hoặc DText hoặc Mtext để gán kết quả. Các bạn tham khảo lisp sau: của bác q288:

http://www.cadviet.com/forum/topic/4077-yeu-cau-lisp-cong-tru-nhan-chia-text/

lisp này: http://www.cadviet.com/upfiles/4/136880_tinh_1.lsp

nhưng mình muốn áp dụng với block ATT

 

Hề hề hề,

Không hiểu bạn đã test thế nào mà nói lisp này không dùng được???

Cách sủ dụng của lisp này khác với cái lisp của bác q288. Bạn cần làm đúng như những  yêu cầu của lisp mới được.

Đầu tiên bạn phải chọn một text thuộc tính để làm giá trị đầu tiên của phép tính bạn sẽ chọn.

Tiếp theo là nhập ký tự của phép tính.

Tiếp theo bạn sẽ phải lần lượt chọn các text thuộc tinh tiếp theo và mỗi lần chọn một text thì tùy theo phép tính bạn chọn giá trị của nó sẽ được cộng trừ hoặc nhân chia thêm vào giá trị đã có trước đó. Nếu bạn không muốn chọn tiếp thì nhấn enter khi lisp yêu cầu chọn text can tinh toán.

Cuối cùng bạn chọn một text mà bạn muốn thay thế két quả của phép tinh toán vào đó.

Lisp này mình đã test trên bản vẽ bạn gửi và chưa phát hiện ra sai sót gì.

Bạn hãy test lại theo đúng hướng dẫn trên nhé. Hy vọng bạn làm đượ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

Hề hề hề,

Không hiểu bạn đã test thế nào mà nói lisp này không dùng được???

Cách sủ dụng của lisp này khác với cái lisp của bác q288. Bạn cần làm đúng như những  yêu cầu của lisp mới được.

Đầu tiên bạn phải chọn một text thuộc tính để làm giá trị đầu tiên của phép tính bạn sẽ chọn.

Tiếp theo là nhập ký tự của phép tính.

Tiếp theo bạn sẽ phải lần lượt chọn các text thuộc tinh tiếp theo và mỗi lần chọn một text thì tùy theo phép tính bạn chọn giá trị của nó sẽ được cộng trừ hoặc nhân chia thêm vào giá trị đã có trước đó. Nếu bạn không muốn chọn tiếp thì nhấn enter khi lisp yêu cầu chọn text can tinh toán.

Cuối cùng bạn chọn một text mà bạn muốn thay thế két quả của phép tinh toán vào đó.

Lisp này mình đã test trên bản vẽ bạn gửi và chưa phát hiện ra sai sót gì.

Bạn hãy test lại theo đúng hướng dẫn trên nhé. Hy vọng bạn làm được.

Thao tác của mình thế này, đánh lệnh ATC -> enter -> chọn text gốc tính toán (mình đã chọn ATT) -> chọn phép tính toán (+) -> chọn text cần tính toán -> enter -> bấm chọn và không còn thấy hiệu ứng gì hết và lệnh tự kết thúc. Bạn xem lại giúp mính nhé

 

Command: ATC

 Chon text goc tinh toan

 Chon phep tinh toan <+ - * /> : +

 Chon text can tinh toan; error: bad function: T

Command:

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ề,

Không biết cái này có đúng ý bạn chưa???

 

http://www.cadviet.com/upfiles/4/5194_attcalculation_1.lsp


Dường như Bác mod hơi bị thừa dòng (entupd en) vì theo Nhoc thì entupd thằng ename của Block ATT, nếu dùng nentsel thì entupd có tác dụng ji nữa :huh:

  • 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

Xin phép bác Bình thêm thắt chút xíu vào lisp của bác nhé.

 

(defun c:atc (/ goc cal1 e1 en ph)
(setq cal1 (getstring (strcat "\n Chon phep tinh toan (+ - * /) <"
(if gl_cal gl_cal (setq gl_cal "+")) " = Enter> : ")))
(if (/= "" cal1) (setq gl_cal cal1))
 
(while (setq e1 (nentsel "\n Chon text can tinh toan :"))
(if (assoc 1 (entget (car e1 ))) 
(if (not goc)
(setq goc (atof (cdr (assoc 1 (entget (car e1 ))))))
(if (member gl_cal '("+" "-" "*" "/"))
  (setq ph (atof (cdr (assoc 1 (entget (car e1 )))))
goc ((eval (read gl_cal)) goc ph))) 
)
)
)
(princ (strcat "\n" (cond ((= gl_cal "+") " Tong so ") ((= gl_cal "-") " Hieu so ")
((= gl_cal "*") " Tich so ") ((= gl_cal "/") " Thuong so ")) "la " (rtos goc) "." ))
(setq en (car (nentsel "\n Chon text can thay the :")))
(entmod (subst (cons 1 (rtos goc 2 2)) (assoc 1 (entget en)) (entget en)))
(entupd en) (princ)
)
  • 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

Mặc dù đã cố gắng làm nhiều lần nhưng vẫn không được. Cảm ơn mọi người!

Hề hề hề,

Bạn hãy gửi cái bản vẽ mà bạn test chưa được lên 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

 

 

Hề hề hề,

Không biết cái này có đúng ý bạn chưa???

 

http://www.cadviet.com/upfiles/4/5194_attcalculation_1.lsp


Dường như Bác mod hơi bị thừa dòng (entupd en) vì theo Nhoc thì entupd thằng ename của Block ATT, nếu dùng nentsel thì entupd có tác dụng ji nữa :huh:

 

Hề hề hề,

Nhóc thử đọc kỹ lại cái hàm nentsel trong Help của CAd xem 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

Em đang xài ASD không biết có phải cad bị lỗi không nữa. Bác tốt bụng sửa lại giúp em là chỉ làm phép tính cộng thôi. Ý em là đánh lệnh: ATC -> enter -> chọn các ATT (trong block) cần cộng -> enter, chọn Mtext hoặc Dtexxt để gán kết quả tổng vào thôi. Cảm ơn các bác đã quan tâm trả lời!

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 đang xài ASD không biết có phải cad bị lỗi không nữa. Bác tốt bụng sửa lại giúp em là chỉ làm phép tính cộng thôi. Ý em là đánh lệnh: ATC -> enter -> chọn các ATT (trong block) cần cộng -> enter, chọn Mtext hoặc Dtexxt để gán kết quả tổng vào thôi. Cảm ơn các bác đã quan tâm trả lời!

Hề hề hề,

Cách chọn các att trong block của bạn thế nào??? Bởi trong một block có thể có nhiều ATT và có cái cần tính nhưng có cái lại chả cần quan tâm tới.....

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ề,

Nhóc thử đọc kỹ lại cái hàm nentsel trong Help của CAd xem nhé.

Bác mod lại ko hiểu ý Nhoc :huh: ... Ý nhoc là dùng entupd lúc nào cho phù hợp với hoàn cảnh ạ. Dùng entupd để update cho Polylines, Blocks or Text có Fileld...khi ta thay đổi Data của chúng.

Trong Lisp của Bác Mod, Nhoc bỏ (entupd en) thì cũng chẳng ảnh hưởng đến kết quả :huh: nên Nhoc mới bảo là thừa ạ.

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ề,

Cách chọn các att trong block của bạn thế nào??? Bởi trong một block có thể có nhiều ATT và có cái cần tính nhưng có cái lại chả cần quan tâm tới.....

Bác nói chính xác, vì các block mình làm toàn nhiều att, mà sao nhấp chọn cái ATT cần tính lại bị thoát lệnh. Mặc dù đã làm thep hướng dẫn của bác. Mình cài mới lại cad cũng bị thế luôn, buồn ghê

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ác mod lại ko hiểu ý Nhoc :huh: ... Ý nhoc là dùng entupd lúc nào cho phù hợp với hoàn cảnh ạ. Dùng entupd để update cho Polylines, Blocks or Text có Fileld...khi ta thay đổi Data của chúng.

Trong Lisp của Bác Mod, Nhoc bỏ (entupd en) thì cũng chẳng ảnh hưởng đến kết quả :huh: nên Nhoc mới bảo là thừa ạ.

Hề hề hề,

Trước hết xin thành thật cám ơn Nhóc vì đã quan tâm và góp ý cho cái lisp mình viết. Qua đó mình thấy được những điều cần xem xét về cách suy nghĩ của mình.

Thực ra thì mình cũng không hiểu hết tác dụng của hàm entupd. Đọc trong help thì hiểu rằng nó cập nhật lại việc hiển thị các đối tượng được entmod lên màn hình. Với một số đối tượng thì ngay sau khi entmod cad sẽ cập nhật lại đối tượng thể hiện luôn trên màn hình , nhưng với một số đối tượng thì việc entmod chỉ cập nhật về dữ liệu mà không cập nhật lại hình ảnh trên màn hình (thường là các đối tượng phức hợp). Do không nắm chắc được các loại đối tượng này nên để chắc ăn thì cứ sau entmod mình nhét thêm entupd thôi. (nhất là trong trường hợp này lại là thuộc tính trong block ).

Theo thiển nghĩ của mình thì có nhẽ thừa hơn thiếu và chắc không có trục trặc gì khi thêm hàm entupd này vào. Vậy thôi, nếu chủ thớt cảm thấy không cần thì hoàn toàn có quyền loại bỏ mà đâu cần phải xin phép ai. 

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ác nói chính xác, vì các block mình làm toàn nhiều att, mà sao nhấp chọn cái ATT cần tính lại bị thoát lệnh. Mặc dù đã làm thep hướng dẫn của bác. Mình cài mới lại cad cũng bị thế luôn, buồn ghê

Hề hề hề,

Thật tình là khó giải thích quá. Nói bạn gửi cái bản vẽ có chứa các block mà bạn đã test lên để mình kiểm tra mà bạn hổng chịu gửi. Không có nó thì mình biết nó lỗi chỗ mô mà sửa với chỉnh chớ. Cái bản vẽ bạn gửi lần trước làm ví dụ minh họa thì mình test thấy lisp chạy bon quá xá nên chả biết nó có lỗi chi.

Vậy nên nếu bạn muốn viết lisp mới hoặc chỉnh sửa lisp cũ thì phải gửi cái bản vẽ mà bạn test không được lên.

Còn nếu bạn chỉ trình bày theo cái cách nói xuông như vầy thì có nhẽ cần phải có các bác đèn giời mới soi xét được và bạn phải chịu khó chờ các bác ấy ra tay vậy chớ với cái vốn học mót của mình chưa đủ để hiểu và biết được cái lỗi nó nằm chỗ mô bạn ạ.

 

Mình đoán mò rằng có thể do bạn đang đặt biến osmode ở một giá trị nào đó khác 0 nên khi pick chọn CAD sẽ chọn nhầm đối tượng khác chứ không phải cái text bạn muốn. Hãy thử đặt biến osmode về 0 trước khi chạy lisp và test lại xem sao.

  • 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

Bạn chú ý cần phải pick chọn đúng textATT cần tính toán trong block, không pick chọn block

block của bạn có nhiều att nhưng chỉ có 1 tag nên không viết cụ thể được phải viết tổng quát, vì tổng quát nên phải thao tác nhiều và thao tác phải chính xá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

Khổ thân bạn Pawuta! Tôi down về test thì cũng bị lỗi như bạn. Hóa ra do lỗi của forum nên lisp sinh lỗi. Bạn down file này xem:

 

(defun c:atc (/ goc cal e1 en ph)
 (setq goc (atof (cdr (assoc 1 (entget (car (nentsel "\n Chon text goc tinh toan")))))))
 (setq cal (getstring "\n Chon phep tinh toan <+ - * /> : "))
 (while (setq e1 (nentsel "\n Chon text can tinh toan"))
  (setq ph (atof (cdr (assoc 1 (entget (car e1))))))
  (cond
   ((= cal "+") (setq goc (+ goc ph)))
   ((= cal "-") (setq goc (- goc ph)))
   ((= cal "*") (setq goc (* goc ph)))
   ((= cal "/") (setq goc (/ goc ph)))
   (T nil))
  goc)
 (setq en (car (nentsel "\n Chon text can thay the")))
 (entmod (subst (cons 1 (rtos goc 2 2)) (assoc 1 (entget en)) (entget en)))
 (entupd en))
  • 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

Oke, mình làm được rồi, cảm ơn mọi người đã nhiệt tình giúp đỡ, chúc mọi người luôn thành công trong cuộc sống 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

Nhờ các bác sửa thêm một chút lisp ATC này là khi select ATT ở block nào thì block đó sáng lên với nhé, chứ cái này dễ bị lộn quá. thanhks mọi người trước nha!

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ờ các bác sửa thêm một chút lisp ATC này là khi select ATT ở block nào thì block đó sáng lên với nhé, chứ cái này dễ bị lộn quá. thanhks mọi người trước nha!

 

Bạn thêm dòng 

(redraw (car e1) 3)

dưới dòng : (while (setq e1 (nentsel "\n Chon text can tinh toan"))

  • 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

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


×