Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
phạm sơn

[Yêu Cầu] Cộng Tất Cả Các Demension Trong Một Layer

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

Chào mọi người trong diễn đàn! Chả là e đang bốc khối lượng tường xây. Để giải trình với chủ đầu tư thì em phải dim tất cả kích thước ra rồi trừ cho phần lỗ mở của cửa xong nhập vào file tính. Em muốn kiểm tra chiều dài e nhập và chiều dài trong file cad. Có bác nào có autolisp tính tổng tất cả các demension trong cùng một layer ra tổng chiều dài 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

Chào mọi người trong diễn đàn! Chả là e đang bốc khối lượng tường xây. Để giải trình với chủ đầu tư thì em phải dim tất cả kích thước ra rồi trừ cho phần lỗ mở của cửa xong nhập vào file tính. Em muốn kiểm tra chiều dài e nhập và chiều dài trong file cad. Có bác nào có autolisp tính tổng tất cả các demension trong cùng một layer ra tổng chiều dài không ạ!

Thử cái này xem nhé ^_^

(defun c:sumdim	(/ ss layer)

  (if (and (setq ss (car (entsel "\nChon 1 dim dien hinh layer: ")))
	   (eq (cdr (assoc 0 (entget ss))) "DIMENSION")
	   );and
    (progn
      (setq ss (ssget "_X"
		      (list (cons 0 "DIMENSION")
			    (setq layer (assoc 8 (entget ss)))
		      )
	       )
      );setq
      (alert
	(strcat	"Total Dim layer <" (cdr layer) ">: "
		(vl-princ-to-string
		  (apply '+
			 (mapcar 'vla-get-measurement
				 (mapcar 'vlax-ename->vla-object
					 (vl-remove-if
					   'listp
					   (mapcar 'cadr (ssnamex ss))
					 )
				 )
			 )
		  )
		)
	)
      )
    );progn then
    (princ "\nBan da khong chon dim.!")
  )
  (princ)
)
(vl-load-com)

 

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

hic, bác sửa lại code cho e với, em công nó ra không đúng 

 

:D  :D  :D Muốn đúng, thì trước tiên người đặt ra câu hỏi phải nêu rõ mục đích, yêu cầu, kết quả.... thì mới đúng được.

sơ sơ vài ý như: 

+ Dimention có trường hợp sửa số như bác @Ha nói thì sao?

+ Sơ suất do người dùng ko dim hết kích thước.

+ Sơ suất do người dùng dim thừa kích thước.

+ Kết quả có tính đến trường hợp làm tròn số hay ko?

 

..... Thêm cái nữa, yêu cầu tính tổng dimetion theo layer của bạn hơi tù túng.... Việc dim kích thước có thể sảy ra bất cứ lúc nào, nó sẽ theo layer hiện tại mà ra. Ko kiểm soát được layer chứa dim thì kết quả ko đúng là điều đương nhiên.

 

Lisp ko sai, thì phải xem lại người dùng sử dụng như thế nào  B)  B)  B)

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

Sửa số, làm tròn số, tiền tố hậu tố,ký hiệu đặc biệt, <> [] kèm chữ , alternate dimention ... là một số trường hợp cần phải lưu ý khi thực hiện các phép tính liên quan đến Dimension. Nếu dim thực và không có thiết đặt gì đặc biệt đối với đối tượng dim thì bài toán sẽ dễ hơn rất nhiều

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

hic, bác sửa lại code cho e với, em công nó ra không đúng 

Đã thêm trường hợp Dim sửa số và đã test.

Còn dim mà thêm các hậu tố tiền tố linh cu tinh thì trong trường hợp  này chắc không dùng. ^_^ Nếu cần dùng thì post chi tiết bản vẽ để mọi người check cho nhé.

(defun c:sumdim1  (/ ss layer)
  (vl-load-com)
  (if (and (setq ss (car (entsel "\nChon 1 dim dien hinh layer: ")))
           (eq (cdr (assoc 0 (entget ss))) "DIMENSION")
           ) ;and
    (progn
      (setq ss (ssget "_X"
                      (list (cons 0 "DIMENSION")
                            (setq layer (assoc 8 (entget ss)))
                            )
                      )
            ) ;setq
      (alert
        (strcat "Total Dim layer <"
                (cdr layer)
                ">: "
                (vl-princ-to-string
                  (apply '+
                         (mapcar '(lambda (vla)
                                    (if (= "" (vlax-get vla 'TextOverride))
                                      (vlax-get vla 'Measurement)
                                      (distof (vlax-get vla 'TextOverride))
                                      )
                                    )
                                 (mapcar 'vlax-ename->vla-object
                                         (vl-remove-if
                                           'listp
                                           (mapcar 'cadr (ssnamex ss))
                                           )
                                         )
                                 )
                         )
                  )
                )
        )
      ) ;progn then
    (princ "\nBan da khong chon dim.!")
    )
  (princ)
  )
(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

em tạo ra dim riêng và chỉ cần tính những dim e đã làm thôi! chứ không phải cộng các dim mà người vẽ đã sử dụng trong đó vì thực chất e cũng không dùng tới nó. :) Cảm ơn các bác ạ! để e kiểm tra lại autolisp xem sao! Vẫn sai thì sẽ đưa bản vẽ lên để mọi người sửa luôn !

  • Vote giảm 2

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

 

Đã thêm trường hợp Dim sửa số và đã test.

Còn dim mà thêm các hậu tố tiền tố linh cu tinh thì trong trường hợp  này chắc không dùng. ^_^ Nếu cần dùng thì post chi tiết bản vẽ để mọi người check cho nhé.

(defun c:sumdim1  (/ ss layer)
  (vl-load-com)
  (if (and (setq ss (car (entsel "\nChon 1 dim dien hinh layer: ")))
           (eq (cdr (assoc 0 (entget ss))) "DIMENSION")
           ) ;and
    (progn
      (setq ss (ssget "_X"
                      (list (cons 0 "DIMENSION")
                            (setq layer (assoc 8 (entget ss)))
                            )
                      )
            ) ;setq
      (alert
        (strcat "Total Dim layer <"
                (cdr layer)
                ">: "
                (vl-princ-to-string
                  (apply '+
                         (mapcar '(lambda (vla)
                                    (if (= "" (vlax-get vla 'TextOverride))
                                      (vlax-get vla 'Measurement)
                                      (distof (vlax-get vla 'TextOverride))
                                      )
                                    )
                                 (mapcar 'vlax-ename->vla-object
                                         (vl-remove-if
                                           'listp
                                           (mapcar 'cadr (ssnamex ss))
                                           )
                                         )
                                 )
                         )
                  )
                )
        )
      ) ;progn then
    (princ "\nBan da khong chon dim.!")
    )
  (princ)
  )
(princ)

Mình check thấy lisp chạy tốt rồi nhưng nếu thêm lựa chọn một chút nữa sẽ hay hơn

-1.  Tên lệnh

-2. Chọn dim mẫu

-3. Quét chọn các dim cần tính

-4. Thực hiện lệnh ra kết quả

Vậy là thêm lựa chọn thứ 3 nữa thì lisp sẽ thuận lợi khi sử dụng hơn

Ps: bạn @Bee là lisper mới nối nhé, rất hot đây

  • Vote giảm 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

em tạo ra dim riêng và chỉ cần tính những dim e đã làm thôi! chứ không phải cộng các dim mà người vẽ đã sử dụng trong đó vì thực chất e cũng không dùng tới nó. :) Cảm ơn các bác ạ! để e kiểm tra lại autolisp xem sao! Vẫn sai thì sẽ đưa bản vẽ lên để mọi người sửa luôn !

Muốn select cái của mình dim thì bỏ đoạn "_X" đi là select bằng tay dc :D

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ình check thấy lisp chạy tốt rồi nhưng nếu thêm lựa chọn một chút nữa sẽ hay hơn

-1.  Tên lệnh

-2. Chọn dim mẫu

-3. Quét chọn các dim cần tính

-4. Thực hiện lệnh ra kết quả

Vậy là thêm lựa chọn thứ 3 nữa thì lisp sẽ thuận lợi khi sử dụng hơn

Ps: bạn @Bee là lisper mới nối nhé, rất hot đây

Uhm, bỏ cái "_X" là select tay đc mà.

 

==>PS; cám ơn bác đã cho nhận xét. ^_^ Thời gian rảnh rỗi vào đây sinh hoạt trí óc tí chút cho đỡ buồn thôi mà. Đồng thời xem học mót được gì thì mót thô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

Bác Bee ơi! cho e hỏi thêm một xíu nữa là: lệnh công dim theo layer này có thể viết thêm code chọn vùng cộng dim được không bác.

VD: em chọn một vùng nào đó để kiểm tra tổng chiều dài của các dim đã dim thì e quét vùng đó và chọn loại dim để cộng thôi, như thế sẽ tránh cộng tất cả các dim cùng layer trong bản vẽ ở những vùng không cần, sẽ tiện kiểm tra hơn. Chứ trường hợp e coppy nó ra nhiều lần trong cùng một bản vẽ khi sử dụng lệnh nó cộng hết như thế khó kiểm tra lắm! Cảm ơn bác ạ !!

  • Vote giảm 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

Người bình luận trước đã trả lời rồi, bạn ko chịu khó đọc vài dòng ah.

 

 

Bác Bee ơi! cho e hỏi thêm một xíu nữa là: lệnh công dim theo layer này có thể viết thêm code chọn vùng cộng dim được không bác.

VD: em chọn một vùng nào đó để kiểm tra tổng chiều dài của các dim đã dim thì e quét vùng đó và chọn loại dim để cộng thôi, như thế sẽ tránh cộng tất cả các dim cùng layer trong bản vẽ ở những vùng không cần, sẽ tiện kiểm tra hơn. Chứ trường hợp e coppy nó ra nhiều lần trong cùng một bản vẽ khi sử dụng lệnh nó cộng hết như thế khó kiểm tra lắm! Cảm ơn bác ạ !!

 

Muốn select cái của mình dim thì bỏ đoạn "_X" đi là select bằng tay dc :D

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ột cách tiếp cận khác: tổng các dim sắp xếp theo Layer.

(defun c:sumDimByLayer  (/ asoc lst lay msg tOver)
  (vl-load-com)
  (if (ssget (list (cons 0 "DIMENSION")  )  )
    (progn		
      (vlax-for e (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-Acad-Object)))
	(setq lay (vla-get-Layer e)
	      len (if (= "" (setq tOver (vla-get-TextOverride e)))(vla-get-Measurement e)(distof tOver)))
	(if (setq asoc (assoc lay lst))
	    (setq lst (subst (cons lay (+ len (cdr asoc))) asoc lst))	    
	    (setq lst (append lst (list (cons lay len))) ))	)
      (setq msg "Total Dim by Layer :\n")
      (alert
	(foreach x lst (setq msg (strcat msg "\n" (car x) " = " (rtos (cdr x) 2 1)) ))  ) )
    (princ "\nBan da khong chon dim.!")    )
  (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

 

Một cách tiếp cận khác: tổng các dim sắp xếp theo Layer.

(defun c:sumDimByLayer  (/ asoc lst lay msg tOver)
  (vl-load-com)
  (if (ssget (list (cons 0 "DIMENSION")  )  )
    (progn		
      (vlax-for e (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-Acad-Object)))
	(setq lay (vla-get-Layer e)
	      len (if (= "" (setq tOver (vla-get-TextOverride e)))(vla-get-Measurement e)(distof tOver)))
	(if (setq asoc (assoc lay lst))
	    (setq lst (subst (cons lay (+ len (cdr asoc))) asoc lst))	    
	    (setq lst (append lst (list (cons lay len))) ))	)
      (setq msg "Total Dim by Layer :\n")
      (alert
	(foreach x lst (setq msg (strcat msg "\n" (car x) " = " (rtos (cdr x) 2 1)) ))  ) )
    (princ "\nBan da khong chon dim.!")    )
  (princ)  )

Like :)

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  

×