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

Nhờ viết lisp căn dãn khoảng cách giữa các đối tượng

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

Vào lúc 20/4/2020 tại 08:25, Doan Nguyen Van đã nói:

(Defun c:te (/ ss p1 p2 x a e)
  (Setq ss (ssget '(( 0 . "INSERT"))))
  (setq p1 (getpoint  "pick diem chen")
	p2 (getpoint p1 "pick phuong, khoang cach"))
  (setq x (distance p1 p2) a (angle p1 p2))
  (while (setq e (ssname ss 0))
    (setq ss (ssdel e ss))
    (command "copy" e "" "_NON" (cdr (assoc 10 (entget e))) "_NON" p1)
    (setq p1 (polar p1 a x)))
  )

ezgif.com-gif-maker.gif.ae785db1323bef504b5db86519e564ae.gif

e chào a, a có thể sửa giúp e lisp này để sắp xếp các khung rectang thành 1 hàng và khoảng cách giữa các rectang là một hằng số (ví dụ: 100) được không ạ.

Điểm chèn của rectang là đỉnh trên bên trái ạ

e cảm ơn a!

 

image.thumb.png.a2635afa21c23c4b489bb08c1cf94d6a.png

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

@HauDV Lệnh viết khác một chút, bạn có thể điều chỉnh giá trị khoảng hở tại d 100, 

(defun c:test ( / D KC KQ P0 P1 P2 SS TONG)
(defun upleft (obj)
   (vla-getboundingbox obj 'p1 'p2)
(setq p1 (vlax-safearray->list p1)
      p2 (vlax-safearray->list p2))
  (list (- (car p2) (car p1)) (list (car p1) (cadr p2) (caddr p2)))
  )

(setq ss (mapcar 'vlax-ename->vla-object (ACET-SS-TO-LIST (ssget '(( 0 . "LWPOLYLINE"))))))
(setq ss (vl-sort ss '(lambda (o1 o2) (< (car (cadr (upleft o1)))
                                        (car (cadr (upleft o2))))
                        )
                  )
      )
(setq tong 0
      d 100 ; dat gia tri khoang ho la 100
      p0 (cadr (upleft (car ss)))
      )
(foreach obj ss
  (progn
    (setq kq (upleft obj)
          kc (car kq)
          p1 (cadr kq))
          
    (vla-move obj (vlax-3d-point p1)
              (vlax-3d-point (list (+ (car p0) tong) (cadr p0) (caddr p0)))
              )
    (setq tong (+ tong kc 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
16 giờ trước, cuongtk2 đã nói:

@HauDV Lệnh viết khác một chút, bạn có thể điều chỉnh giá trị khoảng hở tại d 100, 


(defun c:test ( / D KC KQ P0 P1 P2 SS TONG)
(defun upleft (obj)
   (vla-getboundingbox obj 'p1 'p2)
(setq p1 (vlax-safearray->list p1)
      p2 (vlax-safearray->list p2))
  (list (- (car p2) (car p1)) (list (car p1) (cadr p2) (caddr p2)))
  )

(setq ss (mapcar 'vlax-ename->vla-object (ACET-SS-TO-LIST (ssget '(( 0 . "LWPOLYLINE"))))))
(setq ss (vl-sort ss '(lambda (o1 o2) (< (car (cadr (upleft o1)))
                                        (car (cadr (upleft o2))))
                        )
                  )
      )
(setq tong 0
      d 100 ; dat gia tri khoang ho la 100
      p0 (cadr (upleft (car ss)))
      )
(foreach obj ss
  (progn
    (setq kq (upleft obj)
          kc (car kq)
          p1 (cadr kq))
          
    (vla-move obj (vlax-3d-point p1)
              (vlax-3d-point (list (+ (car p0) tong) (cadr p0) (caddr p0)))
              )
    (setq tong (+ tong kc d))
    )
  )
  )

 

e cảm ơn a 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

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

×