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

giúp e lisp copy đối tượng cách đều nhau (không giống ME hay Div đâu)

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

Ý tưởng của e như sau: E có 1 đường polyline bất kỳ (phương thẳng + xiên+ cung tròn), em muốn copy 1 đối tượng (1 block chẳng hạn) sao cho block đó được rải đều lên đường polyline 1 KHOẢNG CÁCH bằng nhau CHO TRƯỚC(khoảng cách giữa 2 block gần nhau là hằng số ngen).

Mesure thì không làm được đều này.

Và đây là file cad minh hoạ: http://www.mediafire.com/?z7h98g6ol28gukg

 

e vẽ 1 đường polyline hình dạng bất kỳ, tạo 1 block tên HG. E muốn rải Block HG lên đường polyline đó sao cho khoảng cách giữa 2 block là 20, e làm như sau: vẽ các đường tròn bán kính 20, đường tròn thứ nhất tâm ngay điểm đầu polyline, các đường tròn sau đó có tâm là giao điểm của đường tròn trước đó và đường polyline, sau đó e copy từng block gắn vào các giao điểm của đường tròn và polyline.

Ae Cadviet ra tay dùm. Cám ơn ae nhiều nhiều.

PS: Block trên phải xoay đều theo phương polyline nha.

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ưởng của e như sau: E có 1 đường polyline bất kỳ (phương thẳng + xiên+ cung tròn), em muốn copy 1 đối tượng (1 block chẳng hạn) sao cho block đó được rải đều lên đường polyline 1 KHOẢNG CÁCH bằng nhau CHO TRƯỚC(khoảng cách giữa 2 block gần nhau là hằng số ngen).

Mesure thì không làm được đều này.

Và đây là file cad minh hoạ: http://www.mediafire.com/?z7h98g6ol28gukg

 

e vẽ 1 đường polyline hình dạng bất kỳ, tạo 1 block tên HG. E muốn rải Block HG lên đường polyline đó sao cho khoảng cách giữa 2 block là 20, e làm như sau: vẽ các đường tròn bán kính 20, đường tròn thứ nhất tâm ngay điểm đầu polyline, các đường tròn sau đó có tâm là giao điểm của đường tròn trước đó và đường polyline, sau đó e copy từng block gắn vào các giao điểm của đường tròn và polyline.

Ae Cadviet ra tay dùm. Cám ơn ae nhiều nhiều.

PS: Block trên phải xoay đều theo phương polyline nha.

 

Bạn đã sử dụng lệnh DIV chưa?

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

DIV rùi, nhưng khoảng cách giữa 2 block gần nhau vẫn không đều. Cái em cần là block được rải đều với khoảng cách bằng nhau kìa, và khoảng cách này được TỰ DO chọn trước.

Nhờ các ae Cadviet.

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
DIV rùi, nhưng khoảng cách giữa 2 block gần nhau vẫn không đều. Cái em cần là block được rải đều với khoảng cách bằng nhau kìa, và khoảng cách này được TỰ DO chọn trước.

Nhờ các ae Cadviet.

Anh gửi file bản vẽ mờ anh đã DIV lên thử xem???

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
file mới nhất đây, mời các ae ra tay giúp dùm

http://www.mediafire.com/?0h7ywyo99wi0w1w

Mọi ghi chú đều có trong file trên. Mọi người xem giúp cái . Thanks

Có lẽ bạn hơi cầu toàn. Trường hợp giao của đa tuyến và đường tròn khoảng trên 3 điểm bạn sẽ thấy sự mất cân đối. Còn nếu bạn cứ muốn như vậy thì có thể làm như sau. Mình chỉ gởi ý cho bạn thôi. Mình kg viết đc vì nhiều lý do

- Tìm giao của đa tuyến và đường tròn (hàm này trên diễn đàn đã có).

- Lưu giao điểm vào danh sách sau khi đã chèn cái block.

- Từ các điểm giao mới vẽ các đường tròn mới sẽ cho ra các giao điểm mới.

- Kiểm tra nếu các điểm chưa có trong danh sách kia thì chèn cái block vào và append các điểm nảy vào cái danh sách đó.

- Cứ tiếp tục cho đến khi kg tìm đc điểm giao nữa.

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
Chào bạn!

Không biết mục đích của bạn làm thế để làm gì. Theo mình nghĩ nếu là rải các hố ga thoát nước dọc thì các khoảng cách đó chính là khoảng cách trên đường cong (dùng lệnh ME) là đúng chứ.

Còn cách làm theo ý bạn cũng có, nhưng hơi fức tạp chút. Tốt nhất bạn làm thủ công như bạn thì chính xác - an toàn hơn.

Thân

=> Chỉ là tiết kiệm thời gian bố trí hầm ga thôi, sau đó từ các hầm ga đã bố trí mình sẽ lấy tọa độ và tính ra chiều dài đoạn cống một cách chính xác ( tránh cho đơn vị thi công không bị cắt cống thừa). Lisp thoát nước lấy theo Hoang Anh Tuấn của 533.

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ưởng của e như sau: E có 1 đường polyline bất kỳ (phương thẳng + xiên+ cung tròn), em muốn copy 1 đối tượng (1 block chẳng hạn) sao cho block đó được rải đều lên đường polyline 1 KHOẢNG CÁCH bằng nhau CHO TRƯỚC(khoảng cách giữa 2 block gần nhau là hằng số ngen).

Mesure thì không làm được đều này.

Và đây là file cad minh hoạ: http://www.mediafire.com/?z7h98g6ol28gukg

 

e vẽ 1 đường polyline hình dạng bất kỳ, tạo 1 block tên HG. E muốn rải Block HG lên đường polyline đó sao cho khoảng cách giữa 2 block là 20, e làm như sau: vẽ các đường tròn bán kính 20, đường tròn thứ nhất tâm ngay điểm đầu polyline, các đường tròn sau đó có tâm là giao điểm của đường tròn trước đó và đường polyline, sau đó e copy từng block gắn vào các giao điểm của đường tròn và polyline.

Ae Cadviet ra tay dùm. Cám ơn ae nhiều nhiều.

PS: Block trên phải xoay đều theo phương polyline nha.

mình thay trên diễn đàn có cái lisp này: http://www.cadviet.com/upfiles/2/dividecurve.lsp

trường hợp của bạn là muốn chia đều theo khoảng cách là "theo đường chim bay" nó thật ra là dây cung của arc. lisp này cho bạn 2 sự chọn lựa là chia theo so đoạn hoặc theo khoảng cách.

(defun c:DC(/ vl ov Ent isClosed lst_pt dis dis0 bit khcach sodoan p pt ); DC -> Divide Curve
 (vl-load-com)
 (if (and (setq Ent (car (entsel "\nChon doi tuong can chia :")))
   (wcmatch (cdr (assoc 0 (entget ent))) "*LINE,ARC")
   (not (setq isClosed (vlax-curve-isClosed ent)))
   )
   (progn
     (command "undo" "be")
     (setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
    ov (mapcar 'getvar vl))           ; Get Old values
     (mapcar 'setvar vl '(0 0 0))
     (or *sodoan* (setq *sodoan* 10))
     (or *khcach* (setq *khcach* 250))
     (setq lst_Pt nil
    dis0 (vlax-curve-getDistAtParam Ent (vlax-curve-getEndParam Ent))  )
     (initget "K D")
     (setq bit (getkword "\nChia theo Khoang cach hay chia deu theo so Doan : " ) )
     (if (= bit "K")
(progn
  (setq khcach (getreal (strcat"\nNhap khoang cach <" (rtos *khcach*) ">:")) )
  (if khcach (setq *khcach* khcach) (setq khcach *khcach*))
  (initget "G B")
  (setq bit (getkword "\nCan Giua hay can tu Bien : " ) )
  (if (= bit "G")
    (progn
      (setvar "osmode" 513)
      (setq p (getpoint (vlax-curve-getPointAtDist Ent (/ dis0 2))"\nDiem bat dau:"))
      (if (< (distance p (vlax-curve-getStartPoint ent))(distance p (vlax-curve-getEndPoint ent)))
	(setq dis 0)
	(setq dis (rem dis0 khcach)) )
      )
    (setq dis (/(rem dis0 khcach)2))
    )	  
  )
(progn
  (setq sodoan (getint (strcat"\nNhap so doan <" (itoa *sodoan*) ">:")) )
  (if sodoan (setq *sodoan* sodoan) (setq sodoan *sodoan*))
  (setq dis 0
	khcach (/ dis0 sodoan) )
  )
)
     (while (< dis dis0)
(setq pt (vlax-curve-getPointAtDist Ent dis)
      dis (+ dis khcach)
      lst_Pt (append lst_Pt (list pt)) )
)
     (if lst_Pt
(foreach pt (reverse lst_Pt)
  (command "._break" ent "_non" (trans pt 0 1) "_non" (trans pt 0 1)) ))
     (mapcar 'setvar vl ov) ; reset Sys Vars
     (command "undo" "e")
     )
   (if isClosed
     (alert "List khong chay duoc tren doi tuong kin ")
     (alert "Khong chon duoc doi tuong !")))
 (princ))/b>/d>

bạn hay thử 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
file mới nhất đây, mời các ae ra tay giúp dùm

http://www.mediafire.com/?0h7ywyo99wi0w1w

Mọi ghi chú đều có trong file trên. Mọi người xem giúp cái . Thanks

Nếu đường không cong lắm thì cống đặt thẳng => kc hố ga không đổi là hợp lý

Bạn dùng lisp này (chưa align hố ga)

copy 1 block vào đầu đường cong bạn muốn rồi đấnh lệnh

Tham khảo lisp này (bài viết số #1518) để align hố ga theo đường cong

http://www.cadviet.com/forum/index.php?s=&...st&p=102888

	
(defun C:hoga ( / bl pl ci l lo li b pt p1 p2 ptl sn om)
(defun get_interpts (obj1 obj2 / iplist)
 (if (not (vl-catch-all-error-p
            (setq iplist (vl-catch-all-apply
                           'vlax-safearray->list
                           (list
                             (vlax-variant-value
                               (vla-intersectwith obj1 obj2 acextendnone)
                             ))))))
   iplist
 )
)
;; 
(while (not bl)
	(progn
	(princ "\nChon block :")
	(setq bl (ssget  ":S" '((0 . "Insert"))))
))
(while (not pl)
	(progn
	(princ "\nChon duong chuan :")
	(setq pl (ssget  ":S" '((0 . "LWPOLYLINE"))))
))
(setq om (getvar "OSMODE")) (setvar "OSMODE" 0)
(setq bl (ssname bl 0) pl (vlax-ename->vla-object (ssname pl 0)) pt (cdr (assoc 10 (entget bl))))
(setq l (getdist "\nKhoang cach:") p1 pt p2 (vlax-curve-getClosestPointTo pl pt))
(setq lo (vlax-curve-getDistAtPoint pl p2))
(setq sn
	(if (> 0.5 ( / (vlax-curve-getParamAtPoint pl p2)(vlax-curve-getEndParam pl))) 1 -1	))

(while (not B )
	(progn
		(command "_Circle" p1 l)
		(setq ci (vlax-ename->vla-object (entlast)))
		(setq ptl (get_interpts pl ci) b T)
		(command "_Erase" "l" "")
		(while ptl
			(setq p2 (list (car ptl) (cadr ptl) (caddr ptl)))
			(setq li (vlax-curve-getDistAtPoint pl p2))
			(setq ptl (cdddr ptl))
			(if (>(* sn (- li lo)) (/ l 2))
				(progn
					(command "copy" bl "" pt p2)
					(setq ptl nil b nil p1 p2 lo li)
				)
			)
		)
		;(setq)
)	)
(setvar "OSMODE" om)
)

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


×