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

[Yêu cầu] Nhờ viết lisp phát hiện kích thước đã bị thay đổi

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

Chào các cao thủ AutoCad,

 

Như tiêu đề topic, mình nhờ các bác viết giúp lisp phát hiện ra các kích thước trong 1 bản vẽ đã bị chỉnh sửa bằng tay. Mình đã search trên diễn đàn và tìm được lisp thực hiện công việc tương tự. Tuy nhiên, với lisp này, mình chỉ có 1 option là chọn tất cả kích thước có trong bản vẽ, sau đó, lisp sẽ trả những kích thước đã bị chỉnh sửa về lại ban đầu. 

 

Trong bản vẽ, có 1 số kích thước người vẽ cố tình thay đổi bằng tay cho phù hợp với bản vẽ, có những kích thước sửa tay nhưng bị sai. Do đó, nếu chỉnh sửa tất cả kích thước bị modify về lại ban đầu như thế, mình sẽ rất khó kiểm soát.

 

Mình muốn 1 lisp hoạt động như chức năng Find and Replace trong word, nghĩa là mình sẽ search từng kích thước, kích thước nào mình nghi là sai, mình sẽ check lại trước khi cập nhật, kích thước nào đúng rồi thì mình pass qua. Ngoài ra, lisp cũng có chức năng cơ bản là  thay đổi tất cả các dim đã bị thay đổi về lại ban đầu (option 2)

 

Rất cảm ơn các bác!!!

 

Chúc các bác năm mới nhiều sức khỏe và thành cô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

MÌnh nghĩ yêu cầu của bạn, là 

  1. Gõ lênh, chọn vùng "nghi ngờ" (chứ không chọn toàn bộ)
  2. List sẽ đổi màu tất cả các Dim bị Fake
  3. Làm gì đó

Nếu vậy trên diễn đàn cũng có rồi, nhớ trước cũng có yêu cầu y như thế. Như vậy đã đủ cho công việc của bạn chưa, chức còn kiểu Search and Replace, nghe có vẻ chậm hơn thì phả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

Các thấp thủ thì sao bạn :)

 

Hình như là  các thấp thủ thích dùng thủ công chứ không dám hoang phí tiêu xài lisp lủng! :) :) :)

 

http://www.cadviet.com/forum/topic/43524-kich-thuoc-bi-edit-lam-the-nao-de-tro-lai-kich-thuoc-that/

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

Lisp thay đổi Dim Overrive theo kiểu Find and Replace "gần giống" trong Word đây.


(defun C:HA( / VPCords pllur lst key)
 (defun VPCords()
  ((lambda (offset) ((lambda (viewctr) (list (mapcar '- viewctr offset) (mapcar '+ viewctr offset))) (getvar "viewctr")))
   ((lambda (halfHeight aspectRatio) (list (* halfHeight aspectRatio) halfHeight))
    (* 0.5 (getvar "viewsize"))
    (apply '/ (getvar "screensize")))))
 (setq pllur (vpcords))
 (command "undo" "be")
 (princ "\nChon cac DIM da bi Override de Convert...")
 (if (setq ss (ssget '((0 . "DIMENSION") (1 . "~"))))
  (progn
   (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
   (initget "All  Individually")
   (setq key (getkword "\nSelect type [All/Individually] <All>: "))
   (if (not key) (setq key "All"))
   (cond
    ((= key "All")
     (foreach ent lst
      (entmod (subst (cons 1 "") (assoc 1 (entget ent)) (entget ent)))))
    ((= key "Individually")
     (foreach ent lst
      (command "zoom" "c" "non" (cdr (assoc 11 (entget ent))) 5)
   (command "ddedit" ent pause))))))
 (command "zoom" "w" "non" (car pllur) "non" (cadr pllur))
 (command "undo" "e")
 (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

Cảm ơn bác Hạ,

 

Cho mình hỏi, khi mình chọn lệnh ha theo lisp bác viết, những dim nào đã bị chỉnh tay sẽ được chọn, dưới dòng nhắc lệnh có 2 option, 1 là All (revise lại tất cả) và 1 là Individually (mình chọn thì nó báo lỗi Invalid option keyword). bác hướng dẫn thêm tí được ko a?

 

Cảm ơn cácbác đã giúp đỡ 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

Cảm ơn bác Hạ,

 

Cho mình hỏi, khi mình chọn lệnh ha theo lisp bác viết, những dim nào đã bị chỉnh tay sẽ được chọn, dưới dòng nhắc lệnh có 2 option, 1 là All (revise lại tất cả) và 1 là Individually (mình chọn thì nó báo lỗi Invalid option keyword). bác hướng dẫn thêm tí được ko a?

 

Cảm ơn cácbác đã giúp đỡ rất nhiều!

Chắc là bạn nhập sai ký tự hay sao đó. Chọn trực tiếp hoặc nhập chữ I (I ngắ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

Chắc là bạn nhập sai ký tự hay sao đó. Chọn trực tiếp hoặc nhập chữ I (I ngắn)

 

TUE_NV chưa thử Lisp bác viết nhưng đọc thì thấy điều kiện logic là: 

(cond ((= key "All")

;;;;;;

((= key "Individually")

;;;;;

thì Bác biểu bạn chủ topic nhập chữ I (I ngắn) sao được?  

  • 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

Cảm ơn bác Hạ,

 

Cho mình hỏi, khi mình chọn lệnh ha theo lisp bác viết, những dim nào đã bị chỉnh tay sẽ được chọn, dưới dòng nhắc lệnh có 2 option, 1 là All (revise lại tất cả) và 1 là Individually (mình chọn thì nó báo lỗi Invalid option keyword). bác hướng dẫn thêm tí được ko a?

 

Cảm ơn cácbác đã giúp đỡ rất nhiều!

Có thể là do lỗi codeBox hoặc phiên bản Cad đời cũ khi dùng lệnh ZOOM

Cad 2010 chạy tốt, nhưng phần zoom cho thấy toàn bộ đ/tượng Dim thì dễ nhìn hơn (BoundingBox)

@TUE : trước đó có dòng InitGet mà.

15454_error0.jpg

  • 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

Có thể là do lỗi codeBox hoặc phiên bản Cad đời cũ khi dùng lệnh ZOOM

Cad 2010 chạy tốt, nhưng phần zoom cho thấy toàn bộ đ/tượng Dim thì dễ nhìn hơn (BoundingBox)

@TUE : trước đó có dòng InitGet mà.

15454_error0.jpg

Mình dùng cad 2014, khi nhâp chữ "I" tại dòng nhắc Individually thì báo lỗi invaild. Mình làm nhiều lần rồi nhưng vẫn bị lỗi như thế. Các bác kiểm tra lại code giúp mình vớ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

@Gia_bach: có <span> thì cũng không ảnh hưởng. Không biết bị lỗi chỗ nào.

@quocphong_ctm: bạn thử post lại lisp mà bạn đã down lên đây xem quá trình down có lỗi gì không.

Tôi không có cad 2014 nên không test đượ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

@Gia_bach: zoom bounding box đôi lúc to quá khiến không thể nhận ra Dim đó đang nằm ở đâu mà check sự đúng sai để sửa.

Có <span> thì cũng không ảnh hưởng. Không biết bị lỗi chỗ nào.

@quocphong_ctm: bạn thử post lại lisp mà bạn đã down lên đây xem quá trình down có lỗi gì không.

Tôi không có cad 2014 nên không test được.

@Doan Van Ha: Mình load lisp của bác không báo lỗi gì cả, lisp hoạt động rất ok. TUy nhiên đến lúc chọn theo dòng nhắc lệnh (All or Individually) thì bị báo lỗi Invaild Option Keyword.

 

Thật ra, nếu chỉ dừng ở bước đầu tiên của lisp nghĩa là sau khi chọn đối tượng, các dims đã bị edit sẽ hiện nét đứt là mình có thể control được rồi. Nhưng lỡ nhờ các bác rồi thì nhờ cho trót :). Neu chọn được từng dim (individually) rồi kiểm tra trước khi edit thì hay biết mấy!

 

Có bác nào dùng Autocad 2014 như mình thì nhờ test thử đoạn lisp của bác Hạ xem có bị như mình khô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

1). Sửa lisp để zoom 2 lần bounding box entity cho dễ nhìn.

2). Bổ sung thêm lệnh HA1 chỉ để dùng cho việc convert từng dim (vì không hiểu tại sao lại lỗi).


;; Doan Van Ha - CadViet.com - 16/01/2014
;; Lisp thay doi Dim Override gan giong Find and Replace trong Word. Co 2 option: All or Individually
(defun C:HA( / VPCords pllur lst key p1 p2 p11 p22)
 (defun VPCords()
  ((lambda (offset) ((lambda (viewctr) (list (mapcar '- viewctr offset) (mapcar '+ viewctr offset))) (getvar "viewctr")))
   ((lambda (halfHeight aspectRatio) (list (* halfHeight aspectRatio) halfHeight))
    (* 0.5 (getvar "viewsize"))
    (apply '/ (getvar "screensize")))))
 (setq pllur (vpcords))
 (command "undo" "be")
 (princ "\nChon cac DIM da bi Override de Convert...")
 (if (setq ss (ssget '((0 . "DIMENSION") (1 . "~"))))
  (progn
   (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
   (initget "All  Individually")
   (setq key (getkword "\nSelect type for convert [All/Individually] <All>: "))
   (if (not key) (setq key "All"))
   (cond
    ((= key "All")
     (foreach ent lst
      (entmod (subst (cons 1 "") (assoc 1 (entget ent)) (entget ent)))))
    ((= key "Individually")
     (foreach ent lst
      (vla-getboundingbox (vlax-ename->vla-object ent) 'll 'ur)
 (setq p1 (safearray-value ll) p2 (safearray-value ur))
 (setq p11 (polar p1 (angle p2 p1) (/ (distance p1 p2) 2)) p22 (polar p2 (angle p1 p2) (/ (distance p1 p2) 2)))
      (command "zoom" "w" "non" p11 "non" p22)
   (command "ddedit" ent pause))))))
 (command "zoom" "w" "non" (car pllur) "non" (cadr pllur))
 (command "undo" "e")
 (princ))
;; Doan Van Ha - CadViet.com - 17/01/2014
;; Lisp thay doi Dim Override gan giong Find and Replace trong Word. Mac dinh chi co 1 option: Individually
(defun C:HA1( / VPCords pllur lst key p1 p2 p11 p22)
 (defun VPCords()
  ((lambda (offset) ((lambda (viewctr) (list (mapcar '- viewctr offset) (mapcar '+ viewctr offset))) (getvar "viewctr")))
   ((lambda (halfHeight aspectRatio) (list (* halfHeight aspectRatio) halfHeight))
    (* 0.5 (getvar "viewsize"))
    (apply '/ (getvar "screensize")))))
 (setq pllur (vpcords))
 (command "undo" "be")
 (princ "\nChon cac DIM da bi Override de Convert tung Dim...")
 (if (setq ss (ssget '((0 . "DIMENSION") (1 . "~"))))
  (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
   (vla-getboundingbox (vlax-ename->vla-object ent) 'll 'ur)
   (setq p1 (safearray-value ll) p2 (safearray-value ur))
   (setq p11 (polar p1 (angle p2 p1) (/ (distance p1 p2) 2)) p22 (polar p2 (angle p1 p2) (/ (distance p1 p2) 2)))
   (command "zoom" "w" "non" p11 "non" p22)
   (command "ddedit" ent pause)))
 (command "zoom" "w" "non" (car pllur) "non" (cadr pllur))
 (command "undo" "e")
 (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

1). Sửa lisp để zoom 2 lần bounding box entity cho dễ nhìn.

2). Bổ sung thêm lệnh HA1 chỉ để dùng cho việc convert từng dim (vì không hiểu tại sao lại lỗi).


;; Doan Van Ha - CadViet.com - 16/01/2014
;; Lisp thay doi Dim Override gan giong Find and Replace trong Word. Co 2 option: All or Individually
(defun C:HA( / VPCords pllur lst key p1 p2 p11 p22)
 (defun VPCords()
  ((lambda (offset) ((lambda (viewctr) (list (mapcar '- viewctr offset) (mapcar '+ viewctr offset))) (getvar "viewctr")))
   ((lambda (halfHeight aspectRatio) (list (* halfHeight aspectRatio) halfHeight))
    (* 0.5 (getvar "viewsize"))
    (apply '/ (getvar "screensize")))))
 (setq pllur (vpcords))
 (command "undo" "be")
 (princ "\nChon cac DIM da bi Override de Convert...")
 (if (setq ss (ssget '((0 . "DIMENSION") (1 . "~"))))
  (progn
   (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
   (initget "All  Individually")
   (setq key (getkword "\nSelect type for convert [All/Individually] <All>: "))
   (if (not key) (setq key "All"))
   (cond
    ((= key "All")
     (foreach ent lst
      (entmod (subst (cons 1 "") (assoc 1 (entget ent)) (entget ent)))))
    ((= key "Individually")
     (foreach ent lst
      (vla-getboundingbox (vlax-ename->vla-object ent) 'll 'ur)
 (setq p1 (safearray-value ll) p2 (safearray-value ur))
 (setq p11 (polar p1 (angle p2 p1) (/ (distance p1 p2) 2)) p22 (polar p2 (angle p1 p2) (/ (distance p1 p2) 2)))
      (command "zoom" "w" "non" p11 "non" p22)
   (command "ddedit" ent pause))))))
 (command "zoom" "w" "non" (car pllur) "non" (cadr pllur))
 (command "undo" "e")
 (princ))
;; Doan Van Ha - CadViet.com - 17/01/2014
;; Lisp thay doi Dim Override gan giong Find and Replace trong Word. Mac dinh chi co 1 option: Individually
(defun C:HA1( / VPCords pllur lst key p1 p2 p11 p22)
 (defun VPCords()
  ((lambda (offset) ((lambda (viewctr) (list (mapcar '- viewctr offset) (mapcar '+ viewctr offset))) (getvar "viewctr")))
   ((lambda (halfHeight aspectRatio) (list (* halfHeight aspectRatio) halfHeight))
    (* 0.5 (getvar "viewsize"))
    (apply '/ (getvar "screensize")))))
 (setq pllur (vpcords))
 (command "undo" "be")
 (princ "\nChon cac DIM da bi Override de Convert tung Dim...")
 (if (setq ss (ssget '((0 . "DIMENSION") (1 . "~"))))
  (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
   (vla-getboundingbox (vlax-ename->vla-object ent) 'll 'ur)
   (setq p1 (safearray-value ll) p2 (safearray-value ur))
   (setq p11 (polar p1 (angle p2 p1) (/ (distance p1 p2) 2)) p22 (polar p2 (angle p1 p2) (/ (distance p1 p2) 2)))
   (command "zoom" "w" "non" p11 "non" p22)
   (command "ddedit" ent pause)))
 (command "zoom" "w" "non" (car pllur) "non" (cadr pllur))
 (command "undo" "e")
 (princ))
 

Bác Hạ ơi! Mình cảm ơn bác rất nhiều. TUy nhiên, mình vẫn thấy lisp đầu bác viết hay hơn lisp thứ 2 vì:

 

1. Chọn tất cả các đối tượng sẽ phát hiện dim nào đã bị edit;

2. có 2 option để lựa chọn: 1 là sửa toàn bộ dim về dim gốc; 2 là chỉnh sửa từng dim 1 theo ý người dùng.

 

Bác có thể sửa lỗi ở option 2 1 tí để lisp work properly được không ạ. 

 

Và khi Find and Replace, có cách nào Find next tự động (như word ấy) được không bác!

 

Lúc trước mấy lisp mình nhờ toàn do bác viết, work ngon lành lắm.

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). Bạn bị lỗi ở option thứ 2, mà tôi không biết do đâu (hay do bạn?) nên khổ sở để viết thêm lệnh HA1 chứ sung sướng gì đâu.

2). Dùng HA1 có OK không thì bạn cũng không nói. Nếu chưa dùng thì làm sao biết là có Find Next hay không? Nếu dùng rồi thì nó rõ ràng có Find Next đấy chứ, chỉ là nó "gần giống" Word thôi.

3). Chỉ 1 lisp mà có 2 lệnh thì lúc nào cần cái nào ta dùng cái ấy: HA hoặc HA1.

4). Nếu bị lỗi ở lệnh HA thì bạn F2 rồi chụp màn hình dán lên đây cho tôi coi vớ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

1). Bạn bị lỗi ở option thứ 2, mà tôi không biết do đâu (hay do bạn?) nên khổ sở để viết thêm lệnh HA1 chứ sung sướng gì đâu.

2). Dùng HA1 có OK không thì bạn cũng không nói. Nếu chưa dùng thì làm sao biết là có Find Next hay không? Nếu dùng rồi thì nó rõ ràng có Find Next đấy chứ, chỉ là nó "gần giống" Word thôi.

3). Chỉ 1 lisp mà có 2 lệnh thì lúc nào cần cái nào ta dùng cái ấy: HA hoặc HA1.

 

Sorry bác! lúc này mình có dùng lisp HA1 rồi nhưng do khi mình edit lại dim thì không nhắc lại lệnh nên không biết là có chức năng next.

 

Chân thành cảm ơn sự giúp đỡ rất nhiệt tình của bác! Hôm nào rãnh xin được mời bác buổi coffee. Mình ở TPHCM

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

Sorry bác! lúc này mình có dùng lisp HA1 rồi nhưng do khi mình edit lại dim thì không nhắc lại lệnh nên không biết là có chức năng next.

 

Chân thành cảm ơn sự giúp đỡ rất nhiệt tình của bác! Hôm nào rãnh xin được mời bác buổi coffee. Mình ở TPHCM

Mời coffee thì bao luôn tiền vé máy bay nhé! Thôi, đổi "Like" cho nó nhẹ vậy.

  • Vote tăng 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

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

×