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

[Xin Giúp Đỡ]Lisp Thay Đổi Giá Trị Att Theo Điều Kiện

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

Công việc của e yêu cầu chỉnh sửa Block này rất nhiều,thủ công thì mất nhiều thời gian và nhàm chán.nay nhờ các anh viết giúp e lisp chỉnh sửa tự động att này

-việc của e yêu cầu chỉnh sửa Att tag là E trong block HABA theo giá trị được gán

-Giá trị att đó được tính bằng Field

-Trong bản vẽ còn có thể có nhiều block att khác nhưng chỉ cần chỉnh sửa trong block HABA kia thôi

Yêu cầu là

giá trị <=40,chuyển thành F07

40<giá trị <=95,chuyển thành F12

95<giá trị <=150,chuyển thành F18

150<giá trị <=200,chuyển thành F23

 

Mong tin tốt từ các bác

(File đính kèm)

http://www.cadviet.com/upfiles/6/146106_drawing2_1.dwg

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

gửi bạn. lệnh là a1

Bạn xem rồi sửa lại các điều kiện biên cho đúng (bản vẽ điều kiện <, yêu cầu trên 4r lại là <= )

(defun c:a1( / k CV:ss-to-list)
  (defun CV:ss-to-list (ss vla / n e l)
    (if	ss
      (progn
	(setq n (sslength ss))
	(while (setq e (ssname ss (setq n (1- n))))
	  (setq	l (cons	(if vla
			  (vlax-ename->vla-object e)
			  e
			)
			l
		  )
	  )
	)
      )
    )
  )
  (command ".undo" "be")
  (mapcar '(lambda (y)
	      (mapcar '(lambda (x)
			 (if (and (= (vla-get-tagstring x) "E")
				  (distof(setq k (vla-get-textstring x)))
				  )
			   (progn
			     (setq k (atof k))
			     (cond
			       ((<= k 40)(vla-put-textstring x "F07"))
			       ((<= k 95)(vla-put-textstring x "F12"))
			       ((<= k 150)(vla-put-textstring x "F18"))
			       ((<= k 200)(vla-put-textstring x "F23"))
			       )
			     )
			   )
			 
			 )(vlax-invoke y 'GetAttributes))
	      )
	   (CV:ss-to-list (SSGET (list (cons 0  "INSERT")(cons 2 "HABA")(cons 66 1))) t)
   )
  (command ".undo" "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

 

gửi bạn. lệnh là a1

Bạn xem rồi sửa lại các điều kiện biên cho đúng (bản vẽ điều kiện <, yêu cầu trên 4r lại là <= )

(defun c:a1( / k CV:ss-to-list)
  (defun CV:ss-to-list (ss vla / n e l)
    (if	ss
      (progn
	(setq n (sslength ss))
	(while (setq e (ssname ss (setq n (1- n))))
	  (setq	l (cons	(if vla
			  (vlax-ename->vla-object e)
			  e
			)
			l
		  )
	  )
	)
      )
    )
  )
  (command ".undo" "be")
  (mapcar '(lambda (y)
	      (mapcar '(lambda (x)
			 (if (and (= (vla-get-tagstring x) "E")
				  (distof(setq k (vla-get-textstring x)))
				  )
			   (progn
			     (setq k (atof k))
			     (cond
			       ((<= k 40)(vla-put-textstring x "F07"))
			       ((<= k 95)(vla-put-textstring x "F12"))
			       ((<= k 150)(vla-put-textstring x "F18"))
			       ((<= k 200)(vla-put-textstring x "F23"))
			       )
			     )
			   )
			 
			 )(vlax-invoke y 'GetAttributes))
	      )
	   (CV:ss-to-list (SSGET (list (cons 0  "INSERT")(cons 2 "HABA")(cons 66 1))) t)
   )
  (command ".undo" "en")
  (princ)
  )

Cảm ơn bác rất nhiều.bác có thể ghi chú từng dòng trong lisp giúp e xem nó có ý nghĩa ntn đc ko?e đang mày mò về lisp,nên muốn hiểu mấy cái thực tế như thế này.hì

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ác rất nhiều.bác có thể ghi chú từng dòng trong lisp giúp e xem nó có ý nghĩa ntn đc ko?e đang mày mò về lisp,nên muốn hiểu mấy cái thực tế như thế này.hì

Hề hề hề,

Bạn có thể tham khảo cái này chăng;

 

http://www.cadviet.com/upfiles/6/5194_updateattribute.lsp

 

(defun c:upat (/ elst e a als) 
(setq elst (acet-ss-to-list (ssget (list (cons 0 "insert") (cons 2 "haba"))))) ;;;; Lấy danh sách tên các block có tên HABA
(foreach e elst                                                                                          ;;;; Duyệt qua danh sách này
    (setq a (entnext e) als (entget a))                                                        ;;;;; Lấy các đối tượng thuộc block
    (while (and a (/= (cdr (assoc 0 als)) "SEQEND"))
            (if (and (= (cdr (assoc 2 als)) "E") (/= (substr (cdr(assoc 1 als)) 1 1) "F") ) ;;;;; Chon thuộc tính cần xủ lý
                (progn
                    (setq a nil)
                    ( cond 
                          ((< (atof (cdr (assoc 1 als))) 40) (setq als (subst (cons 1 "F07") (assoc 1 als) als)))
                          (( and (>= (atof (cdr (assoc 1 als))) 40) (< (atof (cdr (assoc 1 als))) 95)  ) (setq als (subst (cons 1 "F12") (assoc 1 als) als)))
                          (( and (>= (atof (cdr (assoc 1 als))) 95) (< (atof (cdr (assoc 1 als))) 150) ) (setq als (subst (cons 1 "F18") (assoc 1 als) als)))
                          (( and (>= (atof (cdr (assoc 1 als))) 150) (< (atof (cdr (assoc 1 als))) 200) ) (setq als (subst (cons 1 "F23") (assoc 1 als) als)))
                          (T nil)
                    )
                 )
                 (progn 
                     (setq a (entnext a) )
                     (setq als (entget a))
                 )
             )
       )
       (entmod als) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Cập nhật thuộc tính đã xử lý
       (entupd e)    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Cập nhật block
)
)
  • 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ề,

Bạn có thể tham khảo cái này chăng;

 

http://www.cadviet.com/upfiles/6/5194_updateattribute.lsp

(defun c:upat (/ elst e a als) 
(setq elst (acet-ss-to-list (ssget (list (cons 0 "insert") (cons 2 "haba"))))) ;;;; Lấy danh sách tên các block có tên HABA
(foreach e elst                                                                                          ;;;; Duyệt qua danh sách này
    (setq a (entnext e) als (entget a))                                                        ;;;;; Lấy các đối tượng thuộc block
    (while (and a (/= (cdr (assoc 0 als)) "SEQEND"))
            (if (and (= (cdr (assoc 2 als)) "E") (/= (substr (cdr(assoc 1 als)) 1 1) "F") ) ;;;;; Chon thuộc tính cần xủ lý
                (progn
                    (setq a nil)
                    ( cond 
                          ((< (atof (cdr (assoc 1 als))) 40) (setq als (subst (cons 1 "F07") (assoc 1 als) als)))
                          (( and (>= (atof (cdr (assoc 1 als))) 40) (< (atof (cdr (assoc 1 als))) 95)  ) (setq als (subst (cons 1 "F12") (assoc 1 als) als)))
                          (( and (>= (atof (cdr (assoc 1 als))) 95) (< (atof (cdr (assoc 1 als))) 150) ) (setq als (subst (cons 1 "F18") (assoc 1 als) als)))
                          (( and (>= (atof (cdr (assoc 1 als))) 150) (< (atof (cdr (assoc 1 als))) 200) ) (setq als (subst (cons 1 "F23") (assoc 1 als) als)))
                          (T nil)
                    )
                 )
                 (progn 
                     (setq a (entnext a) )
                     (setq als (entget a))
                 )
             )
       )
       (entmod als) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Cập nhật thuộc tính đã xử lý
       (entupd e)    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Cập nhật block
)
)

hì.Có câu hỏi ko liên quan lắm,bác có thể giải thích cho e cặn kẽ về lambda và mapcar đc ko ạ?e hay thấy quá mà tìm thấy toàn tài liệu tiếng Anh nên ko hiểu lắm.Thêm ví dụ ứng dụng nữa thì quá tuyệt ạ :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

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  

×