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

Help: Lisp chọn các đối tượng bên Trái hoặc Phải đường tham chiếu

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

Xin chào các bác, hiện tại em đang cần 1 lisp có thể chọn 1 đường tham chiếu, sau đó có thể chọn các đối tượng phía bên TRÁI hoặc bên PHẢI đường đó (vì hiện tại em đang làm tuyến dài hơn 100km, nếu quét tay để chọn thì không biết bao giờ mới xong). Mong các bác giúp đỡ, em có 1 bản Cad đi kèm để mô tả ạ. Cảm ơn các bác.

TALUY.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

Mô tả : Lấy 1 đường pline tham chiếu, Offset thêm 1 đường pline về phía hướng chọn. Kiểu chọn sẽ là WindowPolygon cho tập hợp các đỉnh của 2 pline.

(defun c:seloffset ( / D ENT ENT1 ENT2 ENT3 OB OB1 OB2 PENT PT PT1 PT2 PTS PTS1 SS)
(defun pline_points (e / pts)
  (setq pts (mapcar 'cdr
                (vl-remove-if-not
                  (function (lambda (pt) (= (car pt) 10)))
                  (entget e)
                )
            )
      )
  )

(setq pent (entsel "\nPick pline")
      ent (car pent)
      pt (cadr pent) 
      )
(setq ob (vlax-ename->vla-object ent)
      pt1 (vlax-curve-getclosestpointto ob pt t))
(setq pt2 (getpoint "\nHuong offset:" pt1)
      d (distance pt1 pt2))
(vla-Offset ob d)
(setq ent1 (entlast))

(vla-Offset ob (- d))
(setq ent2 (entlast))

(setq ob1 (vlax-ename->vla-object ent1)
      ob2 (vlax-ename->vla-object ent2))
(setq ent3  (if (< (distance pt2 (vlax-curve-getclosestpointto ob1 pt2 t))
                  (distance pt2 (vlax-curve-getclosestpointto ob2 pt2 t))
                  )
             ent1
             ent2))
(setq pts (pline_points ent)
      pts1 (REVERSE(pline_points ent3))
      pts (append pts pts1))
(setq ss (ssget "WP" pts))
(entdel ent1)
(entdel ent2)
 (command "select" ss "")     
      )

 

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 Cuongtk2 đã giúp em :D. Bác xem lại giúp em 1 chút được không ạ. Em dùng đến phần hướng offset thì nó cứ bị lỗi như thế này bác ạ.

image.png.3d0a6b9fcc3a0cd94163a304b8b6164a.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
18 giờ trước, minhmani đã nói:

Cảm ơn bác Cuongtk2 đã giúp em :D. Bác xem lại giúp em 1 chút được không ạ. Em dùng đến phần hướng offset thì nó cứ bị lỗi như thế này bác ạ.

 

 

Không hiểu sao lại không thể up lên được file lsp.

Em thay dòng: (command "select" ss "")

bằng: (command "copy" ss "" pt1 (getpoint "\nVi tri dat:" pt1))

seloffset.lsp

  • 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
Vào lúc 19/9/2022 tại 14:54, cuongtk2 đã nói:

Mô tả : Lấy 1 đường pline tham chiếu, Offset thêm 1 đường pline về phía hướng chọn. Kiểu chọn sẽ là WindowPolygon cho tập hợp các đỉnh của 2 pline.


(defun c:seloffset ( / D ENT ENT1 ENT2 ENT3 OB OB1 OB2 PENT PT PT1 PT2 PTS PTS1 SS)
(defun pline_points (e / pts)
  (setq pts (mapcar 'cdr
                (vl-remove-if-not
                  (function (lambda (pt) (= (car pt) 10)))
                  (entget e)
                )
            )
      )
  )

(setq pent (entsel "\nPick pline")
      ent (car pent)
      pt (cadr pent) 
      )
(setq ob (vlax-ename->vla-object ent)
      pt1 (vlax-curve-getclosestpointto ob pt t))
(setq pt2 (getpoint "\nHuong offset:" pt1)
      d (distance pt1 pt2))
(vla-Offset ob d)
(setq ent1 (entlast))

(vla-Offset ob (- d))
(setq ent2 (entlast))

(setq ob1 (vlax-ename->vla-object ent1)
      ob2 (vlax-ename->vla-object ent2))
(setq ent3  (if (< (distance pt2 (vlax-curve-getclosestpointto ob1 pt2 t))
                  (distance pt2 (vlax-curve-getclosestpointto ob2 pt2 t))
                  )
             ent1
             ent2))
(setq pts (pline_points ent)
      pts1 (REVERSE(pline_points ent3))
      pts (append pts pts1))
(setq ss (ssget "WP" pts))
(entdel ent1)
(entdel ent2)
 (command "select" ss "")     
      )

 

Bác có thể sửa nó nhận theo điểm tâm của block khô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
25 phút trước, cuongtk2 đã nói:

Thay đổi chế độ chọn từ WindowPolygon "WP" sang CrossingPolygon "CP" là được.

"CP" thì nó chọn cả các thành phần khác của block mà chưa chắc basepoint đã nằm trong.

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
2 phút trước, Doan Van Ha đã nói:

"CP" thì nó chọn cả các thành phần khác của block mà chưa chắc basepoint đã nằm trong.

Dạ anh, vậy mới sinh ra lệnh CBPR trên Lee-Mac

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ư bản vẽ em đính kèm này nó không chọn các block mà có 1 phần đè lên đường tham chiếu. Nếu thay đổi điểm chèn block thì em không muốn vì nó làm thay đổi lý trình đặt block ạ

test.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

@Doan Nguyen Van: Bạn nên đưa lisp lên (và có thể kèm video) thì tốt hơn là chỉ show video và yêu cầu liên hệ riêng để nhận lisp, vì như thế không phù hợp lắm với tiêu chí của form là tính public.

  • Like 5

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

×