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

(Đã xong) XIN LISP TÍNH ĐỘ DỐC ĐOẠN THẲNG VÀ XÓA NHỮNG ĐOẠN THẲNG CÓ ĐỘ DỐC THEO ĐIỀU KIỆN

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

Mình đang làm hồ sơ hoàn công, cần tính độ dốc đường tự nhiên rất nhiều mặt cắt. Mong các bạn viết lisp giúp đỡ với yêu cầu như sau:

1. Tính độ dốc của nhiều đoạn thẳng ngắn (là đỉnh của đường polyline) trong 1 đường polyline có nhiều đỉnh.

2. Xóa hết những đoạn thẳng có độ dốc nhỏ hơn 30%

Chi tiết mình có gửi file đính kèm.

Cảm ơn các bạn!

Tinh do doc.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

Ý của Bạn là khi xóa các đoạn thẳng có độ dóc <30% thì có nghĩa là xóa đi đường polyline cũa và vẽ lạ các đường line mới tương ứng có độ dốc >=30% phải không. Sau khi có các line mới thì có cần làm thêm gì 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
5 phút trước, tien2005 đã nói:

Ý của Bạn là khi xóa các đoạn thẳng có độ dóc <30% thì có nghĩa là xóa đi đường polyline cũa và vẽ lạ các đường line mới tương ứng có độ dốc >=30% phải không. Sau khi có các line mới thì có cần làm thêm gì không?

Đúng như ý bạn nói mình muốn xóa đi polyline cũ, sau khi tách được những đoạn có độ đốc bằng và lớn hơn 30% thì mình tính chiều dài của các đoạn có polyline  >= 30% rồi pick ra text là được bạ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

Bạn dùng cái này. Lệnh là NHT

(defun c:nht (/ EN L LAY LSP P X Y)
  (while (setq en (entsel "\nChon duong pline"))
    (setq en (car en))
    (setq lay (cdr (assoc 8 (entget en))))
    (setq lsp
	   (mapcar
	     'cdr
	     (vl-remove-if-not '(lambda (x) (= 10 (car x))) (entget en))
	   ) ;_ end of mapcar
    ) ;_ end of setq
    (mapcar
      '(lambda (x y)
	 (setq l (mapcar '- x y))
	 (if (>= (abs (/ (cadr l) (car l))) 0.3);DO DOC LON HON 30%
	   (entmakex
	     (append
	       (list (cons 0 "LWPOLYLINE")
		     (cons 100 "AcDbEntity")
		     (cons 100 "AcDbPolyline")
		     (cons 90 2)
		     (cons 8 LAY)
	       ) ;_ end of list
	       (mapcar (function (lambda (p) (cons 10 p))) (LIST X Y))
	     ) ;_ end of append
	   ) ;_ end of entmakex
	 ) ;_ end of if
       ) ;_ end of lambda
      lsp
      (cdr lsp)
    ) ;_ end of mapcar
    (entdel en)
  ) ;_ end of while
  (princ)
) ;_ end of defun

 

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ạn đã giúp đỡ. Mình chạy thử lisp trên một số mặt cắt ngang thì những polyline có có độ dốc lớn hơn 30% bị xóa bạn ạ (đặc biệt là pick đâu xóa đấy), ban thử kiểm tra lại giúp mình 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

Do mình chưa test kỹ, lisp nhận đường polyline. Được voi đòi tiên tí, bạn đã giúp thì giúp cho trót nhé hihi, lisp trên làm việc được từng mặt cắt bạn có thể giúp mình thao tác khi chọn polyline thì mình quét nhiều đường polyline để lisp xử lý nhiều mặt cắt cùng một lúc được k bạn? mình xin cảm ơn

  • 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

@hatrongquan88của bạn đây

(defun c:nht (/ EN L LAY LSP P X Y)
  (princ "\nChon duong pline")
  (while (setq en (ssget '((0 . "*POLYLINE"))))
    (foreach en	(vl-remove-if 'listp (mapcar 'cadr (ssnamex en)))
      (setq lay (cdr (assoc 8 (entget en))))
      (setq lsp
	     (mapcar
	       'cdr
	       (vl-remove-if-not '(lambda (x) (= 10 (car x))) (entget en))
	     ) ;_ end of mapcar
      ) ;_ end of setq
      (mapcar
	'(lambda (x y)
	   (setq l (mapcar '- x y))
	   (if (>= (abs (/ (cadr l) (car l))) 0.3) ;DO DOC LON HON 30%
	     (entmakex
	       (append
		 (list (cons 0 "LWPOLYLINE")
		       (cons 100 "AcDbEntity")
		       (cons 100 "AcDbPolyline")
		       (cons 90 2)
		       (cons 8 LAY)
		 ) ;_ end of list
		 (mapcar (function (lambda (p) (cons 10 p))) (LIST X Y))
	       ) ;_ end of append
	     ) ;_ end of entmakex
	   ) ;_ end of if
	 ) ;_ end of lambda
	lsp
	(cdr lsp)
      ) ;_ end of mapcar
      (entdel en)
    ) ;_ end of foreach
  ) ;_ end of while
  (princ)
) ;_ end of defun

 

  • 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
1 giờ} trướ}c, tien2005 đã nói:

@hatrongquan88của bạn đây


(defun c:nht (/ EN L LAY LSP P X Y)
  (princ "\nChon duong pline")
  (while (setq en (ssget '((0 . "*POLYLINE"))))
    (foreach en	(vl-remove-if 'listp (mapcar 'cadr (ssnamex en)))
      (setq lay (cdr (assoc 8 (entget en))))
      (setq lsp
	     (mapcar
	       'cdr
	       (vl-remove-if-not '(lambda (x) (= 10 (car x))) (entget en))
	     ) ;_ end of mapcar
      ) ;_ end of setq
      (mapcar
	'(lambda (x y)
	   (setq l (mapcar '- x y))
	   (if (>= (abs (/ (cadr l) (car l))) 0.3) ;DO DOC LON HON 30%
	     (entmakex
	       (append
		 (list (cons 0 "LWPOLYLINE")
		       (cons 100 "AcDbEntity")
		       (cons 100 "AcDbPolyline")
		       (cons 90 2)
		       (cons 8 LAY)
		 ) ;_ end of list
		 (mapcar (function (lambda (p) (cons 10 p))) (LIST X Y))
	       ) ;_ end of append
	     ) ;_ end of entmakex
	   ) ;_ end of if
	 ) ;_ end of lambda
	lsp
	(cdr lsp)
      ) ;_ end of mapcar
      (entdel en)
    ) ;_ end of foreach
  ) ;_ end of while
  (princ)
) ;_ end of defun

 

Cảm ơn bạn mình đã giải quyết được vấ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

Em có ý kiến thêm, anh chủ topic và anh viết lisp xem thế nào:

Thêm lựa chọn góc dốc lớn hơn "đánh số độ vào" thay vì như mặc định 30 độ.

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
8 giờ trước, phongnh đã nói:

Em có ý kiến thêm, anh chủ topic và anh viết lisp xem thế nào:

Thêm lựa chọn góc dốc lớn hơn "đánh số độ vào" thay vì như mặc định 30 độ.

Bạn có thể sửa độ dốc theo độ dốc mình cần tại dòng này:

            (if (>= (abs (/ (cadr l) (car l))) 0.3) ;DO DOC LON HON 30%

Bạn có thể nhờ bạn viết lisp để hoàn thiện thêm. Mình thì ít khi dùng lisp dạng thế này, tuy chưa hoàn thiện nhưng chỉ cần giải quyết được vấn đề là ok rồi bạn :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
Vào lúc 1/8/2019 tại 21:20, hatrongquan88 đã nói:

Bạn có thể sửa độ dốc theo độ dốc mình cần tại dòng này:

            (if (>= (abs (/ (cadr l) (car l))) 0.3) ;DO DOC LON HON 30%

Bạn có thể nhờ bạn viết lisp để hoàn thiện thêm. Mình thì ít khi dùng lisp dạng thế này, tuy chưa hoàn thiện nhưng chỉ cần giải quyết được vấn đề là ok rồi bạn :D

Em góp ý cho nó tốt hơn thôi.

Hiện giờ em không có cần dùng lisp này. Khi nào cần giúp đỡ em sẽ nhờ.

Cảm ơn!

  • 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

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

×