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

Nhờ Viết LISP

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

33 phút trước, TIEN_GACXITAN đã nói:

Xin chào mọi người!

Mọi người viết giùm em Lsp. chỉnh khoảng cách giữa các lớp dim theo chiều cao chữ trong dim  với ah

Thanks!

Viết yêu cầu cho rõ ràng nhé bạn. Viết hời hợt thế này không ai hiểu và dễ bị xóa bài.

  • Like 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

Lisp này khó vãi chấy. Có quá nhiều khả năng. đề bài của bạn thì k đầy đủ. thôi mình ngồi đây lót dép hóng. chứ ngồi viết ra cái này bở hơi tai. :__

  • Like 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ủa em là 1 lisp tự động căn chỉnh khoảng cách các dòng dim bằng nhau. ví dụ:- có 3 hàng dim (dim mặt bằng, có khoảng cách không bằng nhau ). Khi dùng lisp sẽ tự động căn chỉnh khoảng cách giữa các hàng dim bằng nhau.

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 tàm tạm được 1 cái. nhưng không tự động đâu. bạn quét chọn rồi nhập khoảng cách, chọn phương thức sắp xếp. tự động khó Vler :))

(defun c:SD (/ ss dis case lstdim i pt space enx toado )
  (setq 
    ss (acet-ss-to-list (ssget '((0 . "DIMENSION"))))
    dis (getdist "\nDistance")
  )
  (initget "Right Left Up Down")
  (if (not (setq case (getkword "\nSelect function sort! [Right/Left/Up/Down] <Down>")))
    (setq case "Down")
  )
  (setq  
    lstdim (sortdim_xtd ss case (/ dis 6))
    i 0
    pt (cdr (assoc 10 (entget (caar lstdim))))
  )
  (if (vl-string-search case "Down,Left") (setq dis (- dis)))
  (if (vl-string-search case "Down,Up")
    (progn
      (setq pt (cadr pt))
      (foreach item lstdim
        (setq space (+ pt (* i dis)))
        (foreach pair item
          (setq 
            enx (assoc 10 (entget pair))
            toado (list 10 (cadr enx) space 0)
          )
          (entmod (subst toado enx (entget pair)))
        )
        (setq i (1+ i))
      )
    )
    (progn
      (setq pt (car pt))
      (foreach item lstdim
        (setq space (+ pt (* i dis)))
        (foreach pair item
          (setq 
            enx (assoc 10 (entget pair))
            toado (list 10 space (caddr enx) 0)
          )
          (entmod (subst toado enx (entget pair)))
        )
        (setq i (1+ i))
      )
    )
  )
  (princ )
)

(defun sortdim_xtd (lst key fuzz / lst1 lst2 p1 p2 case1 case2 )
  (setq 
    case1 (if (vl-string-search key "Down,Up") 'cadr 'car)
    case2 (if (vl-string-search key "Down,Left") '> '<)
  )
  (while (car lst)
    (setq 
      lst1 (list (car lst))
      p1 (cdr (assoc 10 (entget (car lst))))
      lst (cdr lst)
    )
    (foreach item lst
      (setq p2 (cdr (assoc 10 (entget item))))
      (if (equal (apply case1 (list p1)) (apply case1 (list p2)) fuzz)
        (setq 
          lst1 (cons item lst1)
          lst (vl-remove item lst)
        )
      )
    )
    (setq lst2 (cons lst1 lst2))
  )
  (vl-sort lst2 
    '(lambda (a b / c d) 
       (setq 
         c (cdr (assoc 10 (entget (car a))))
         d (cdr (assoc 10 (entget (car b))))
       )  
       (apply case2 (list (apply case1 (list c)) (apply case1 (list d))))
    )
  )
)

Lisp khó thế này mà không có Cà phê uống thì tiếc 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
19 phút trước, tannguyen291 đã nói:

Mình viết tàm tạm được 1 cái. nhưng không tự động đâu. bạn quét chọn rồi nhập khoảng cách, chọn phương thức sắp xếp. tự động khó Vler :))


(defun c:SD (/ ss dis case lstdim i pt space enx toado )
  (setq 
    ss (acet-ss-to-list (ssget '((0 . "DIMENSION"))))
    dis (getdist "\nDistance")
  )
  (initget "Right Left Up Down")
  (if (not (setq case (getkword "\nSelect function sort! [Right/Left/Up/Down] <Down>")))
    (setq case "Down")
  )
  (setq  
    lstdim (sortdim_xtd ss case (/ dis 6))
    i 0
    pt (cdr (assoc 10 (entget (caar lstdim))))
  )
  (if (vl-string-search case "Down,Left") (setq dis (- dis)))
  (if (vl-string-search case "Down,Up")
    (progn
      (setq pt (cadr pt))
      (foreach item lstdim
        (setq space (+ pt (* i dis)))
        (foreach pair item
          (setq 
            enx (assoc 10 (entget pair))
            toado (list 10 (cadr enx) space 0)
          )
          (entmod (subst toado enx (entget pair)))
        )
        (setq i (1+ i))
      )
    )
    (progn
      (setq pt (car pt))
      (foreach item lstdim
        (setq space (+ pt (* i dis)))
        (foreach pair item
          (setq 
            enx (assoc 10 (entget pair))
            toado (list 10 space (caddr enx) 0)
          )
          (entmod (subst toado enx (entget pair)))
        )
        (setq i (1+ i))
      )
    )
  )
  (princ )
)

(defun sortdim_xtd (lst key fuzz / lst1 lst2 p1 p2 case1 case2 )
  (setq 
    case1 (if (vl-string-search key "Down,Up") 'cadr 'car)
    case2 (if (vl-string-search key "Down,Left") '> '<)
  )
  (while (car lst)
    (setq 
      lst1 (list (car lst))
      p1 (cdr (assoc 10 (entget (car lst))))
      lst (cdr lst)
    )
    (foreach item lst
      (setq p2 (cdr (assoc 10 (entget item))))
      (if (equal (apply case1 (list p1)) (apply case1 (list p2)) fuzz)
        (setq 
          lst1 (cons item lst1)
          lst (vl-remove item lst)
        )
      )
    )
    (setq lst2 (cons lst1 lst2))
  )
  (vl-sort lst2 
    '(lambda (a b / c d) 
       (setq 
         c (cdr (assoc 10 (entget (car a))))
         d (cdr (assoc 10 (entget (car b))))
       )  
       (apply case2 (list (apply case1 (list c)) (apply case1 (list d))))
    )
  )
)

Lisp khó thế này mà không có Cà phê uống thì tiếc nhỉ. :))

Mình chân thành cảm ơn bạn đã bỏ thời gian giúp. Nhưng mình đang muốn lisp tự động, còn lisp bạn viết nó gần giống lệnh dimspace trong cad ah. Mỗi lần muốn chỉnh lại phải tính xem là nhân với cỡ chữ trong dim là bao nhiêu

  • 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

Mình có thể sửa thêm để không cần nhập kích thước, k cần chọn phương thức trên dưới trái phải. tuy nhiên bạn cần hiểu vài việc:

1. Bạn cần gửi bản vẽ lên. 

2. Toàn bộ dim của bạn có phải cùng 1 dimstyle hay không, kích thước text có giống nhau k.

3. Việc chọn toàn bộ cả bản vẽ là việc bất khả thi. Chỉ có thể chọn từng vùng nhỏ cho một loại hình nhất đị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
5 giờ trước, TIEN_GACXITAN đã nói:

image.png.4e4ab446e600456ca35f7c1958489859.pngDạ ý của em là như này ah. sau khi dùng lisp các dim sẽ được sắp xếp đều nhau như trong hình ah!

Bạn Xem qua video này nhé

 

  • Like 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

Của bạn nhé.

giphy.gif

Lisp của mình không chạy với DIMALIGNED nhưng có thể chạy với toàn bộ bản vẽ. 

Có thể liên lạc với mình trong inbox hoặc sđt 0395218999

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

×