Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
manhhuy1984

help: làm sao để chia một đường polyline thành các đoạn có chiều dài khác nhau?

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

Mình đang cần chia một đường polyline thành các đoạn có chiều dài khác nhau với điểm chèn là 1 block. Ai biết cách chỉ mình với, thanks!

bạn hãy ví dụ bằng 1 file DWG,

 

nói rõ bạn nhập vào cái gì và bạn mong muốn sẽ nhận được cái gì.

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ác xem làm sao vẽ đc hình sau nhanh nhất!

http://www.cadviet.com/upfiles/Drawing1_34.dwg

Mình hiểu ý bạn. Ý của bạn là định chia Pline thành các đoạn có chiều dài khác nhau rồi chèn cái block hình vuông có 2 đường chéo vào đúng vị trí chia trên pline đó phải không?

Riêng mình để vẽ nhanh thì chỉ cần sử dụng lệnh Align và lệnh copy(Multiple) là nhanh nhất

Lệnh Align để xoay cho tâm 2 đường chéo hình vuông nằm trên Pline như trong hình vẽ (cạnh hình vuông song song; vuông góc với Pline)

copy (multilple) : để sao chép nhiều đối tượng với cách nhập direct distance (Nhập khoảng cách trực tiếp) (sử dụng chế độ truy bắt điểm Nearest) (hoặc có thể bạn sử dụng chế độ truy bắt điểm From)

Mong bạn hiểu ý của mì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

Cách của bạn Tue_NV :Lệnh Align để xoay cho tâm 2 đường chéo hình vuông nằm trên Pline như trong hình vẽ.

 

Cách của tôi: Chọn đối tượng > Ro > Bắt điểm trọng tâm hình vuông, di chuột vào đường thẳng a-b-c bắt điểm Nearest để xoay.

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ác xem làm sao vẽ đc hình sau nhanh nhất!

http://www.cadviet.com/upfiles/Drawing1_34.dwg

Chào bạn manhhuy1984,

Bạn dùng thử cái lisp này xem có đúng ý bạn không nhé. Có gì chưa đúng post lên để mình xem lại.

Bạn lư ý là lisp này chèn cái block b trên bản vẽ bạn post. Nếu bạn muốn chèn một block khác thì bạn sửa lại tên nó trong hàm insert hoặc thay vào đó là một hàm chọn tên block bạn nhé. Hơn nữa vì mình xài cái block cũ của bạn nên bạn đã đặt điểm chèn của block là tâm của hình rồi. Với các bock khác bạn phải lưu ý cái điểm chèn này nhé.

(defun C:PTEST()
;;;--- Get the entity's name 
 (setq en(car(entsel "\n Select a PolyLine: ")))

;;;--- Get the DXF group codes of the entity 
 (setq enlist(entget en))

;;;--- Create an empty list to hold the points 
 (setq ptList(list))

;;;--- Get the sub-entities name 
 (setq en2(entnext en)) 

;;;--- Get the dxf group codes of the sub-entity 
 (setq enlist2(entget en2))

 (setq ptList(append ptList (list (cdr(assoc 10 enlist2)))))

;;;--- While the polyline has a next vertice 
 (while (not (equal (cdr(assoc 0 (entget(entnext en2))))"SEQEND"))

;;;--- Get the next sub-entity 
 (setq en2(entnext en2))

;;;--- Get its dxf group codes 
 (setq enlist2(entget en2))

;;;--- Check to make sure it is not a spline reference point 
 (if(/= 16 (cdr(assoc 70 enlist2)))

 ;;;--- It is a vertex, save the point in a list [ptlist] 
   (setq ptList(append ptList (list (cdr(assoc 10 enlist2)))))

 )
 )
 (setq olmode (getvar "pdmode"))
 (setvar "pdmode" 3)
 (setq n 0)
 (while (nth (1+ n) ptlist)
	 (setq p1 (nth n ptlist)
		  p2 (nth (1+ n) ptlist)
		  x1 (car p1)
		  y1 (cadr p1)
		  x2 (car p2)
		  y2 (cadr p2)
		  k 1			
		  goc (angle p1 p2)
		  a (getreal "\n Nhap khoang cach cho block thu nhat : ")
		  b (getreal "\n Nhap khoang cach cho block thu hai :")
	 )

	 (setq p3 (list (+ x1 (* a (cos goc))) (+ y1 (* a (sin goc)))))
	 (command "point" p3)
	 (command "insert" "b" "s" 1 p3 0 "")
	 (setq p4 (list (+ x1 (* (+ a b) (cos goc))) (+ y1 (* (+ a b) (sin goc)))))
	 (command "point" p4)
	 (command "insert" "b" "s" 1 p4 0 "")


	 (setq n (1+ n))
 )
 (setvar "pdmode" olmode)	 
 (princ)
)

 

Lệnh chạy lisp là ptest, trong quá trình chạy lisp sẽ yêu cầu bạn nhập polyline, nhập các khoảng cách chèn block a, b và d.e như trên bản vẽ của bạn. (khoảng cách c là không cần thiết đâu bạn ạ, có a,b tất sẽ suy ra c mà)

Nếu polyline có nhiều đoạn thẳng hơn thì bạn sẽ phải nhập như vậy cho tới đoạn cuối cùng. Ở đoạn nào bạn không muốn chèn block vào thì bạn chỉ việc enter bỏ qua khi lisp hỏi khoảng cách chèn block.

Ở lisp này mình chỉ chèn block mà không xoay nó đi. nếu cần phải xoay, bạn bổ xung góc xoay vào cuối dòng lệnh insert là được

Cái lisp này mình dựa trên lisp lấy đỉnh của polyline của bác Hoành đã post trên diễn đàn rồi bổ sung phần lấy điểm chia theo khoảng cách cho trước và chèn block thôi. Bạn xem và cho mình biết ý kiến nếu như thấy chưa đạt theo yêu cầu của bạn.

Chúc bạn vui.

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
(defun C:PTEST()
;;;--- Get the entity's name 
 (setq en(car(entsel "\n Select a PolyLine: ")))

;;;--- Get the DXF group codes of the entity 
 (setq enlist(entget en))

;;;--- Create an empty list to hold the points 
 (setq ptList(list))

;;;--- Get the sub-entities name 
 (setq en2(entnext en)) 

;;;--- Get the dxf group codes of the sub-entity 
 (setq enlist2(entget en2))

 (setq ptList(append ptList (list (cdr(assoc 10 enlist2)))))

;;;--- While the polyline has a next vertice 
 (while (not (equal (cdr(assoc 0 (entget(entnext en2))))"SEQEND"))

;;;--- Get the next sub-entity 
 (setq en2(entnext en2))

;;;--- Get its dxf group codes 
 (setq enlist2(entget en2))

;;;--- Check to make sure it is not a spline reference point 
 (if(/= 16 (cdr(assoc 70 enlist2)))

;;;--- It is a vertex, save the point in a list [ptlist] 
   (setq ptList(append ptList (list (cdr(assoc 10 enlist2)))))

 )
 )
 (setq olmode (getvar "pdmode"))
 (setvar "pdmode" 3)
 (setq n 0)
 (while (nth (1+ n) ptlist)
	 (setq p1 (nth n ptlist)
		  p2 (nth (1+ n) ptlist)
		  x1 (car p1)
		  y1 (cadr p1)
		  x2 (car p2)
		  y2 (cadr p2)
		  k 1			
		  goc (angle p1 p2)
		  a (getreal "\n Nhap khoang cach cho block thu nhat : ")
		  b (getreal "\n Nhap khoang cach cho block thu hai :")
	 )

	 (setq p3 (list (+ x1 (* a (cos goc))) (+ y1 (* a (sin goc)))))
	 (command "point" p3)
	 (command "insert" "b" "s" 1 p3 0 "")
	 (setq p4 (list (+ x1 (* (+ a b) (cos goc))) (+ y1 (* (+ a b) (sin goc)))))
	 (command "point" p4)
	 (command "insert" "b" "s" 1 p4 0 "")


	 (setq n (1+ n))
 )
 (setvar "pdmode" olmode)	 
 (princ)
)

Chào bạn phamthanhbinh.

Mình muốy nhờ bạn chỉnh giúp mình của Lisp trên,

Để đo khoảng cách và thể hiện điểm đo trên cạnh. Ví như ta có một hình tứ giác chử nhật có chiều dài và rộng, ta chọn hình đó để chia, chọn điểm bắt đầu chia và hướng chia, nhập chiều dài. Thì lisp thực hiện công ciệc xác định điểm đó và vẻ kí hiệu chấm tròn nhỏ, yêu cầu nhập số điểm đó, thể hiện lên số điểm chia đó và khoảng cách,

Lisp thực hiện chia khoảng cách, ghi kí hiệu điểm và chiều dài trên cạnh chia đó.

Rất mong được Bạn giúp

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

cho em xin cái lisp chia 1 polyline (gồm cả line +arc tạo thành) thành các đoạn có chiều dài bằng nhau được không ạ.thank 

Hề hề hề,

Thử dùng lệnh divide hay lệnh measure coi sao hè. Lisp chửa chắc đã ngon hơn đâ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
Đăng nhập để thực hiện theo  

×