Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
28 replies to this topic

#1 pawuta

pawuta

    biết lệnh move

  • Members
  • PipPipPip
  • 126 Bài viết
Điểm đánh giá: -12 (hơi kém)

Đã gửi 29 April 2015 - 12:11 AM

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


  • 0

#2 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 29 April 2015 - 09:42 AM

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?


  • 0

#3 pawuta

pawuta

    biết lệnh move

  • Members
  • PipPipPip
  • 126 Bài viết
Điểm đánh giá: -12 (hơi kém)

Đã gửi 29 April 2015 - 12:15 PM

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.c...0_block_att.dwg


  • 0

#4 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 29 April 2015 - 03:38 PM

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.c...0_block_att.dwg

Hề hề hề,

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

 

http://www.cadviet.c...lculation_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)
)

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

#5 pawuta

pawuta

    biết lệnh move

  • Members
  • PipPipPip
  • 126 Bài viết
Điểm đánh giá: -12 (hơi kém)

Đã gửi 30 April 2015 - 07:38 PM

 

Hề hề hề,

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

 

http://www.cadviet.c...lculation_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.c...nhan-chia-text/

lisp này: http://www.cadviet.c...6880_tinh_1.lsp

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


  • 0

#6 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 30 April 2015 - 11:14 PM

 

 

Hề hề hề,

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

 

http://www.cadviet.c...lculation_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.c...nhan-chia-text/

lisp này: http://www.cadviet.c...6880_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.


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

#7 pawuta

pawuta

    biết lệnh move

  • Members
  • PipPipPip
  • 126 Bài viết
Điểm đánh giá: -12 (hơi kém)

Đã gửi 01 May 2015 - 08:28 AM

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:


  • 0

#8 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 01 May 2015 - 12:10 PM

Bạn phải pick đúng text trong block ATT. chọn block ATT là không được nên lisp thoát ra


  • 0

#9 nhoclangbac

nhoclangbac

    biết vẽ circle

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

Đã gửi 01 May 2015 - 03:13 PM

 

Hề hề hề,

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

 

http://www.cadviet.c...lculation_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:


  • 1

#10 pawuta

pawuta

    biết lệnh move

  • Members
  • PipPipPip
  • 126 Bài viết
Điểm đánh giá: -12 (hơi kém)

Đã gửi 01 May 2015 - 04:24 PM

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!


  • 0

#11 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 01 May 2015 - 08:19 PM

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

  • 1

#12 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 01 May 2015 - 09:18 PM

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é.


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

#13 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 01 May 2015 - 09:19 PM

 

 

Hề hề hề,

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

 

http://www.cadviet.c...lculation_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é.


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

#14 pawuta

pawuta

    biết lệnh move

  • Members
  • PipPipPip
  • 126 Bài viết
Điểm đánh giá: -12 (hơi kém)

Đã gửi 01 May 2015 - 11:48 PM

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!


  • 0

#15 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 02 May 2015 - 09:35 AM

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


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

#16 nhoclangbac

nhoclangbac

    biết vẽ circle

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

Đã gửi 02 May 2015 - 01:06 PM

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 ạ.


  • 0

#17 pawuta

pawuta

    biết lệnh move

  • Members
  • PipPipPip
  • 126 Bài viết
Điểm đánh giá: -12 (hơi kém)

Đã gửi 02 May 2015 - 02:46 PM

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ê


  • 0

#18 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 02 May 2015 - 08:19 PM

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. 


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

#19 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 02 May 2015 - 08:32 PM

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.


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

#20 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 02 May 2015 - 09:42 PM

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


  • 0