Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đă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ị

Nguyen Hoanh    4.524
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
Tue_NV    3.841
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
phamthanhbinh    3.123
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
khaosat2009    10
(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
phamthanhbinh    3.123

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  

×