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

TIEN_GACXITAN

Thành viên
  • Số lượng nội dung

    8
  • Đã tham gia

  • Lần ghé thăm cuối

Bài đăng được đăng bởi TIEN_GACXITAN


  1. 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
×