Đến nội dung


Hình ảnh
* * * * * 1 Bình chọn

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


  • Please log in to reply
10 replies to this topic

#1 tuananhcd04

tuananhcd04

    biết pan

  • Members
  • Pip
  • 9 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 06 August 2010 - 12:16 AM

Ý 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...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.
  • 0

#2 tuananhcd04

tuananhcd04

    biết pan

  • Members
  • Pip
  • 9 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 06 August 2010 - 12:20 AM

à quên nữa, thêm vào dùm em cái chức năng hoán vị 2 điểm đầu và cuối của polyline được không ta?
  • 0

#3 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 06 August 2010 - 06:22 AM

Ý 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...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?
  • 0

#4 tuananhcd04

tuananhcd04

    biết pan

  • Members
  • Pip
  • 9 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 06 August 2010 - 10:34 PM

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.
  • 0

#5 hoan2182

hoan2182

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 2646 Bài viết
Điểm đánh giá: 832 (rất tốt)

Đã gửi 06 August 2010 - 10:54 PM

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???
  • 0

Gió đưa cây cải về trời

Rau răm ở lại chịu lời đắng cay...


#6 tuananhcd04

tuananhcd04

    biết pan

  • Members
  • Pip
  • 9 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 07 August 2010 - 01:21 AM

file mới nhất đây, mời các ae ra tay giúp dùm
http://www.mediafire...0h7ywyo99wi0w1w
Mọi ghi chú đều có trong file trên. Mọi người xem giúp cái . Thanks
  • 0

#7 hoan2182

hoan2182

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 2646 Bài viết
Điểm đánh giá: 832 (rất tốt)

Đã gửi 07 August 2010 - 07:22 AM

Trường hợp của anh chắc chỉ có làm thủ công là hợp lý.
  • 0

Gió đưa cây cải về trời

Rau răm ở lại chịu lời đắng cay...


#8 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 07 August 2010 - 08:35 AM

file mới nhất đây, mời các ae ra tay giúp dùm
http://www.mediafire...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.
  • 0

#9 tuananhcd04

tuananhcd04

    biết pan

  • Members
  • Pip
  • 9 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 07 August 2010 - 10:22 AM

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.
  • 0

#10 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 11 August 2010 - 03:13 PM

Ý 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...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.c...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ạn hay thử nhé
  • 0
Hình đã gửi

#11 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 11 August 2010 - 04:20 PM

file mới nhất đây, mời các ae ra tay giúp dùm
http://www.mediafire...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.c...&...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)
)

  • 0