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

Lisp sửa giá trị của dim

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

Bác nào có lisp thay đổi giá trị của dim khi mình pick vào 1 điểm, vd như hình vẽ của e dưới đây. Làm sao líp dùng chọn đối tượng dim có giá trị 1358.98 rồi pick vào điểm thuộc đường đỏ dim này sẽ biến thành giá trị của dim dưới có giá trị 1094,02.

đây là file cad của em.

http://www.cadviet.com/upfiles/3/sua_gia_tri_dim.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
Bác nào có lisp thay đổi giá trị của dim khi mình pick vào 1 điểm, vd như hình vẽ của e dưới đây. Làm sao líp dùng chọn đối tượng dim có giá trị 1358.98 rồi pick vào điểm thuộc đường đỏ dim này sẽ biến thành giá trị của dim dưới có giá trị 1094,02.

đây là file cad của em.

http://www.cadviet.com/upfiles/3/sua_gia_tri_dim.dwg

mình viết cho bạn rồi đó. chúc thành công

http://www.cadviet.com/upfiles/3/md.lsp

(defun ttt(AA / aa pt1 pt2 pt3 pt4 pt5 so d1 d2 pt11 k50)
   (SETQ PT1 (CDR (ASSOC '13 AA)))
   (SETQ PT2 (CDR (ASSOC '14 AA)))
   (SETQ pt3 (list (car pt2) (cadr pt1)))
   (SETQ pt4 (list (car pt1) (cadr pt2)))
   (SETQ PT11 (CDR (ASSOC '11 AA)))
   (setq d1 (distance pt1 pt3))
   (setq d2 (distance pt1 pt4))
   (setq k50 (cdr (ASSOC '50 AA)))
   (if (= k50 0)
     (setq so (rtos d1))
     (setq so (rtos d2))
     )
   )

;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun c:md(/ so dt m dtc t1 t2 ent ent_ht sodoituong index)
 (prompt "\nChon dim thay doi gia tri: ")
 (setq dtc (ssget '((0 . "dimension"))))
 (prompt "\nChon dim tham chieu: ")
 (setq dtm (entsel))  
 (setq t1 (entget (car dtm)))
 (if (= (atof (cdr(assoc 1 t1))) 0.0)	
(setq so (ttt t1))
(setq so (cdr(assoc 1 t1)))
)
 (defun chu (ent / ent)
   (setq t2 (entget ent))
   (setq t2 (subst (cons 1 so) (assoc 1 t2) t2 ))
   (entmod t2)
   )
 (setq
   sodoituong (sslength dtc)
   index 0    
   )
 (repeat sodoituong
   (setq
     ent_ht (ssname dtc index)
     index (1+ index)
     )
   (chu ent_ht)
   )
 (princ)  
 )

bạn có thể chọn nhiều đối tượng dim để thay đổi giá trị theo một đối tượng tham chiễu

  • 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ình viết cho bạn rồi đó. chúc thành công

http://www.cadviet.com/upfiles/3/md.lsp

(defun ttt(AA / aa pt1 pt2 pt3 pt4 pt5 so d1 d2 pt11 k50)
   (SETQ PT1 (CDR (ASSOC '13 AA)))
   (SETQ PT2 (CDR (ASSOC '14 AA)))
   (SETQ pt3 (list (car pt2) (cadr pt1)))
   (SETQ pt4 (list (car pt1) (cadr pt2)))
   (SETQ PT11 (CDR (ASSOC '11 AA)))
   (setq d1 (distance pt1 pt3))
   (setq d2 (distance pt1 pt4))
   (setq k50 (cdr (ASSOC '50 AA)))
   (if (= k50 0)
     (setq so (rtos d1))
     (setq so (rtos d2))
     )
   )

;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun c:md(/ so dt m dtc t1 t2 ent ent_ht sodoituong index)
 (prompt "\nChon dim thay doi gia tri: ")
 (setq dtc (ssget '((0 . "dimension"))))
 (prompt "\nChon dim tham chieu: ")
 (setq dtm (entsel))  
 (setq t1 (entget (car dtm)))
 (if (= (atof (cdr(assoc 1 t1))) 0.0)	
(setq so (ttt t1))
(setq so (cdr(assoc 1 t1)))
)
 (defun chu (ent / ent)
   (setq t2 (entget ent))
   (setq t2 (subst (cons 1 so) (assoc 1 t2) t2 ))
   (entmod t2)
   )
 (setq
   sodoituong (sslength dtc)
   index 0    
   )
 (repeat sodoituong
   (setq
     ent_ht (ssname dtc index)
     index (1+ index)
     )
   (chu ent_ht)
   )
 (princ)  
 )

bạn có thể chọn nhiều đối tượng dim để thay đổi giá trị theo một đối tượng tham chiễu

Lisp này không đúng yêu cầu của bạn vminh_ct rồi

Bác nào có lisp thay đổi giá trị của dim khi mình pick vào 1 điểm, vd như hình vẽ của e dưới đây. Làm sao líp dùng chọn đối tượng dim có giá trị 1358.98 rồi pick vào điểm thuộc đường đỏ dim này sẽ biến thành giá trị của dim dưới có giá trị 1094,02.

đây là file cad của em.

http://www.cadviet.com/upfiles/3/sua_gia_tri_dim.dwg

Theo như yêu cầu của bạn vminh_ct thì Lisp có thể xây dựng được nhưng Tue_NV nghĩ rằng nó cũng không nhanh hơn CAD là bao nhiêu (Chỉ cần dùng Grid mà kéo là được)

 

Lisp của lp_hai là Lisp sửa giá trị Dim hay nói cách khác là "độ chế" Dim. Nó cũng như lệnh Ded (dimedit) nhưng lệnh Ded (dimedit) có nhiều tính năng hơ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

đúng là như bác Tue_NV nói là có thể dùng grip, nhưng trong bản vẽ có nhiều dim và khi các dim đã bị chặt chân đi rồi thì dùng grip bực lắm, lại phỉa di chuyển grip vào đối tượng rồi lại chặt lại Dim, thế thì mệt chết bác à. Các bác xem thế nào giúp e

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 anh lp_hai, đúng là a hiểu nhầm ý e, e muốn không phải sửa giá trị của dim mà cả chân dim,tức là trong bản vẽ có nhiều đối tượng, e "S" 1 vài đối tượng mà không Stretch dim theo nên e muốn sửa dim theo cách đấy, chứ không kéo grip thì lâu mà lại phải chỉnh sửa chân dim 1 lần nữa hì 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
đúng là như bác Tue_NV nói là có thể dùng grip, nhưng trong bản vẽ có nhiều dim và khi các dim đã bị chặt chân đi rồi thì dùng grip bực lắm, lại phỉa di chuyển grip vào đối tượng rồi lại chặt lại Dim, thế thì mệt chết bác à. Các bác xem thế nào giúp e

Đúng là mình nhầm to rồi

mình có ý này ko biết có giúp dc bạn ko nhé!

đầu tiên bạn có 1 dim và một dt(ví dụ là đường thẳng nha).

bgiờ bạn muốn dim này là dim cho dt kia?

với Dim bạn có mã DXF 13 và 14 cho tọa độ 2 điểm vị trí của chân dim. còn với đường line bạn có được tọa độ 2 diểm dầu và cuối (chọn bằng cách pick diểm với osmode chọn end)

với Dim nằm ngang bạn thay giá trị X của diểm 1 vào giá trị X của mã DXF 13, X2 vào X của DXF 14 bằng hàm subst và entmod.

nếu dim nằm dứng thì bạn thay gt Y. dụa vào mã DXF 50 bạn biết dim đúng hay ngang.

làm theo cách mình nói thì bạn phải chọn 2 điểm trên đối tượng mới. nhưng bạn không cần phải cắt lại chân dim.

nếu ko giúp dc bạn xin dừng cười nha!

heheheee

  • 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

hic, cám ơn anh Lp_hai nhé, nhưng về lisp e chỉ mới tâp toẹ thôi, thú thật anh bảo cách của anh e không hiểu gì mấy, hì hì, dù sao cũng cảm ơn anh, chắc phải stop bài viết ở đây vì chưa ai giúp được anh à, :undecided:

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, cám ơn anh Lp_hai nhé, nhưng về lisp e chỉ mới tâp toẹ thôi, thú thật anh bảo cách của anh e không hiểu gì mấy, hì hì, dù sao cũng cảm ơn anh, chắc phải stop bài viết ở đây vì chưa ai giúp được anh à, :(

mình cũng chẵn biết nhiều lắm. mong giúp dc bạn

(defun ldx(ent xasso nasso / ds l2 xasso nasso yasso l6 ent)
 (setq ds (entget ent))
 (setq l2 (assoc nasso ds))  
 (setq yasso (nth 2 l2))
 (setq l6 (list nasso xasso yasso 0.0))
 (setq ds (subst l6 (assoc nasso ds) ds ))
 (entmod ds)
 (princ)
 )
;;;;;;;;;;;;;;
(defun ldy(ent yasso nasso / ds l2 xasso nasso yasso l6 ent)
 (setq ds (entget ent))
 (setq l2 (assoc nasso ds))  
 (setq xasso (nth 1 l2))
 (setq l6 (list nasso xasso yasso 0.0))
 (setq ds (subst l6 (assoc nasso ds) ds ))
 (entmod ds)
 (princ)
 )
;;;;;;;;;;;;;;


(defun c:ad(/ dt pt1 pt2 x1 x2 y1 y2 oso)
 (prompt "\nChon dim : ")
 (setq dt (car(entsel)))
 (setq oso (getvar "osmode"))
 (setvar "osmode" 33)
 (setq pt1(getpoint "\nchon diem 1:"))  
 (setq pt2(getpoint pt1 "\nchon diem 2:"))
 (setq
   x1 (car pt1)
   x2 (car pt2)
   y1 (cadr pt1)
   y2 (cadr pt2)
   )
 (setq k50 (cdr (ASSOC '50 (entget dt))))
 (if (= k50 0)
   ((ldx dt x1 13)
   (ldx dt x2 14))
   ((ldy dt y1 13)
   (ldy dt y2 14))
   )
 (setvar "osmode" oso)
 (princ)
 )

http://www.cadviet.com/upfiles/3/ad.lsp

  • 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

hi , cũng gần đúng với ý em rồi, nhưng Bác lp_hai xem khi bắt điểm 1 và điểm 2 bác gán hàm gì mà nó chỉ bắt điêm end thôi, em muốn nó bắt tất cả các điểm cơ. hì hì

có phỉa sửa dòng này 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
(setvar "osmode" 33).

nếu bạn muốn chọn các kiểu bắt điểm khác nhau thì bỏ cái dòng đó đi.

còn bạn muốn chọn dt bằng Crossing(bạn muồn chọn nhiều ĐT ??), mình thấy hơi khó vì bạn ko thể chọn nhiều đường dim rồi lại lấy theo một giá trị giống nhau. nếu ý bạn muốn chọn một lượt nhiều dim rồi sửa lần lượt theo nhiều điểm thì có lẽ dc. bạn nhờ các cao thủ khác viết hộ. mình còn gà lắm. heeee

  • 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

Nhân tiện đây bác Tue_NV và các bác cho mình hỏi thêm xíu nhé:

Có lisp nào mà khi mình chọn vào đối tượng dim nào, đối tượng đó vẫn giữ nguyên giá trị khi bị stretch hay ko? Thông thường muốn làm như vậy thì phải edit từng giá trị dim, rất mất thời gian.

Mod thông cảm vì ko sành về mấy dzụ post bài trên mạng lắm. Nên mạo mụi hỏi nơi đây luô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
Nhân tiện đây bác Tue_NV và các bác cho mình hỏi thêm xíu nhé:

Có lisp nào mà khi mình chọn vào đối tượng dim nào, đối tượng đó vẫn giữ nguyên giá trị khi bị stretch hay ko? Thông thường muốn làm như vậy thì phải edit từng giá trị dim, rất mất thời gian.

Mod thông cảm vì ko sành về mấy dzụ post bài trên mạng lắm. Nên mạo mụi hỏi nơi đây luôn. :)

Bạn có thể sử dụng Lisp fakedim của bác NguyenHoanh

Lisp FakeDim

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ờ anh viết dùm em lisp với nội dung như ở dưới được không ạ.

 Click vào đối tượng dim => dim doi thanh mau vang+đánh stt vào trước dim  và xuất ra TEXT

(VD: em đang có dim ghi kích thước 2000 => click chuột dim chuyển thành 1-2000 (màu vàng) và xuất giá trị này ra text

Mong được các anh giúp đỡ

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 làm theo cách này không cần lisp:

1. Copy các dim mà bạn cần riêng ra một chỗ

2. Dùng lệnh explode để phá dim thành text

3. Dùng lệnh TCOUNT để đánh số thứ tự các text bạn vừa phá ra, bạn đến khi lệnh TCOUNT hỏi Overite, Prefix, Suffix, thì bạn chọn Prefix là đượ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
Vào lúc 2/2/2018 tại 10:44, Nguyen Hoanh đã nói:

Bạn làm theo cách này không cần lisp:

1. Copy các dim mà bạn cần riêng ra một chỗ

2. Dùng lệnh explode để phá dim thành text

3. Dùng lệnh TCOUNT để đánh số thứ tự các text bạn vừa phá ra, bạn đến khi lệnh TCOUNT hỏi Overite, Prefix, Suffix, thì bạn chọn Prefix là được.

Dạ, emcảm ơn anh Hoành, 
- Tại em muốn tận dụng LISP để cho bớt thao tác đi một xíu
- HIện tại em có sưu tầm một đoạn code của các anh trên diễn đàn nhưng không nhớ rõ của ai
- Nhờ các anh hiệu chỉnh lại LISP dùm em với.
- Em muốn thêm tiền tố số thứ tự tăng dần mỗi khi click dimension vào trước MTEXT để kiểm soát (tránh sai xót)
 

(Defun c:cdt  (/ ent poi)
  (while (and (setq ent (car (nentsel "\nChon DIMTEXT: ")))
              (eq (cdr (assoc 0 (entget ent))) "MTEXT")
              (Setq poi (getpoint "\nPick diem dat Mtext: " (cdr (assoc 10 (entget ent))))))
    (entmake (subst (cons 10 poi) (assoc 10 (entget ent)) (entget ent))))
  (princ))
 

Nhờ các anh giúp dùm em 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

Của bạn đây:

(defun c:cdt  (/ els ent poi)
  ((lambda (i / str)
     (while
       (and (setq ent (car (nentsel "\nChon DIMTEXT: ")))
            (eq (cdr (assoc 0 (setq els (entget ent)))) "MTEXT")
            (setq poi (getpoint "\nPick diem dat Mtext: " (trans (cdr (assoc 10 els)) 0 1))))
        (setq str (strcat (itoa (setq i (1+ i))) "-" (cdr (assoc 1 els)))
              els (subst (cons 1 str) (assoc 1 els) els))
        (entmake (subst (cons 10 (trans poi 1 0)) (assoc 10 els) els))))
    0)
  (princ))

Hay là cái này:

 

(defun c:cdt  (/ dim els ent poi)
  ((lambda (i / str)
     (while
       (and (setq dim (entsel "\nChon DIMTEXT: "))
            (setq ent (car (nentselp (cadr dim))))
            (eq (cdr (assoc 0 (setq els (entget ent)))) "MTEXT")
            (setq poi (getpoint "\nPick diem dat Mtext: " (trans (cdr (assoc 10 els)) 0 1))))
        (setq str (strcat (itoa (setq i (1+ i))) "-" (cdr (assoc 1 els))))
        (entmod (subst (cons 1 str) (assoc 1 (entget (car dim))) (entget (car dim))))
        (entmake (subst (cons 10 (trans poi 1 0)) (assoc 10 els) els))))
    0)
  (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
25 phút trước, quocmanh04tt đã nói:

Của bạn đây:

(defun c:cdt  (/ els ent poi)
  ((lambda (i / str)
     (while
       (and (setq ent (car (nentsel "\nChon DIMTEXT: ")))
            (eq (cdr (assoc 0 (setq els (entget ent)))) "MTEXT")
            (setq poi (getpoint "\nPick diem dat Mtext: " (trans (cdr (assoc 10 els)) 0 1))))
        (setq str (strcat (itoa (setq i (1+ i))) "-" (cdr (assoc 1 els)))
              els (subst (cons 1 str) (assoc 1 els) els))
        (entmake (subst (cons 10 (trans poi 1 0)) (assoc 10 els) els))))
    0)
  (princ))

Hay là cái này:

 

(defun c:cdt  (/ dim els ent poi)
  ((lambda (i / str)
     (while
       (and (setq dim (entsel "\nChon DIMTEXT: "))
            (setq ent (car (nentselp (cadr dim))))
            (eq (cdr (assoc 0 (setq els (entget ent)))) "MTEXT")
            (setq poi (getpoint "\nPick diem dat Mtext: " (trans (cdr (assoc 10 els)) 0 1))))
        (setq str (strcat (itoa (setq i (1+ i))) "-" (cdr (assoc 1 els))))
        (entmod (subst (cons 1 str) (assoc 1 (entget (car dim))) (entget (car dim))))
        (entmake (subst (cons 10 (trans poi 1 0)) (assoc 10 els) els))))
    0)
  (princ))

Cả 2 cái đều ok cả,  đúng ý em rồi. ^^
Cảm ơn anh 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

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

×