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

Xin Giúp Đỡ Lisp Chèn 1 Block Vào Tâm Của Nhiều Hình Chữ Nhật

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

Xin nhờ các pro giúp đỡ!

Em có một block, muốn chèn block này vào tâm của nhiều hình chữ nhật (các hình chữ nhật này không giống nhau về chiều dài, rộng).Vì làm thủ công kẻ đường chéo rồi copy vào rất mất thời gian, mong lên diễn đàn nhờ các pro giúp đỡ e. Xin chân thành cảm ơn!

P/S: Câu lệnh như thế này các bác ạ.

- gõ lệnh: CBT

- select objects: Hãy chọn các hình chữ nhật:

- chon block

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:brc (/ retcen osmode idx rectangles ins );Chen Block vao tam rectang
(defun rectcen (rect / pl p1 p2 p3 p4 pm1 pm2 an di ceo)
(setq ceo (vlax-ename->vla-object rect))
(setq pl (vlax-safearray->list (vlax-variant-value (vla-get-coordinates ceo))))
(if (> (length pl) 6)
(progn
(setq p1 (list (nth 0 pl) (nth 1 pl)))
(setq p2 (list (nth 2 pl) (nth 3 pl)))
(setq p3 (list (nth 4 pl) (nth 5 pl)))
(setq p4 (list (nth 6 pl) (nth 7 pl)))
(setq pm1 (mapcar '/ (mapcar '+ p1 p3) '(2.0 2.0 2.0)))
(setq pm2 (mapcar '/ (mapcar '+ p2 p4) '(2.0 2.0 2.0)))
(cond
((and
(equal (distance pm1 p1)(distance pm2 p1) 0.001)
(equal (distance pm1 p2)(distance pm2 p2) 0.001)
(equal (distance pm1 p3)(distance pm2 p3) 0.001)
(equal (distance pm1 p4)(distance pm2 p4) 0.001)
)
(inters p1 p3 p2 p4 nil)
)
)
)
)
)
;----------------------------------------------
(vl-load-com)
(command "undo" "begin")
(command "ucs" "w")
(setq osmode (getvar "osmode"))
(setvar "osmode" 0)
(if
(setq rectangles (ssget '((0 . "LWPOLYLINE"))))
(progn
(setq idx 0)
(repeat (sslength rectangles)
(setq ins (rectcen (ssname rectangles idx)))
(if ins (command "-insert" "s" ins "" "" ""))
(setq idx (1+ idx))
)
)
(princ "\n Selected(s) object(s) are not Lwpolyline!")
)
(command "undo" "end")
(setvar "osmode" osmode)
(princ)
) 

thay từ "S" bôi đỏ bằng tên block của bạn

  • Vote tăng 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

thay từ "S" bôi đỏ bằng tên block của bạn

Bạn thay cái "s" bằng đoạn code lấy tên block mẫu để có thể áp dụng cho mọi block:

(setq name(cdr (assoc 2 (entget (car (entsel))))))

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 quang_lac viết cho e đoạn lisp trên sử dụng ngon.Trước tiên e cảm ơn bác đã dành ít thời gian của mình viết đoạn code trên. Tuy nhiên e có vấn đề là tỷ lệ chèn block so với block gốc có sự khác nhau cụ thể: khi khai báo trong drawing units phần insertion scale ở hệ inches thì các block chèn bằng block gốc. Còn khi ở hệ millimeter thì chèn tỷ lệ không đúng với block gốc( block chèn to hơn nhiều so với block gốc) .Các bản vẽ của e ở hệ milimet vậy bác có thể giúp e sửa lại đoạn code trên được không. Nếu bác giúp sẵn bác thêm trường hợp tổng quát chọn block nào tuỳ thích không cần phải đưa tên block vào đoạn code trên.Cảm ơn bác lần 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

Góp vui tí :)

(defun c:cbr (/ dt bl sdt id en)
  (command "Undo" "be")
  (setq osm (getvar "osmode")
	bl (cdr (assoc 2 (entget(car (entsel "\nSelect block:")))))
	dt (ssget '((-4 . "<OR")
		(0 . "LWPOLYLINE")
		(-4 . "OR>")	
		))
	sdt (sslength dt)
	id 0
	)
  (setvar "osmode" 0)
  (repeat sdt
    (setq en (ssname dt id)
	  id (1+ id)
	  )
    (midp en)
    )
  (setvar "osmode" osm)
  (command "undo" "end")
  (princ)
  )
    
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
(defun midp (en / p2 p4 pm)
  (setq p2 (vlax-curve-getPointAtParam en 2)
	p4 (vlax-curve-getPointAtParam en 4)
	pm (list (/(+(car p2)(car p4))2) (/(+(cadr p2)(cadr p4))2))
	)
  (entmake (list  (cons 0 "insert")  (cons 2 bl) (cons 10 pm)))
  )

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

Anh #lp_Hai    xài món này thì cứ gặp Polyline có số đỉnh lớn hơn 5 thì nó chèn hết Block kìa, bất chấp hình thù méo mó tròn vuông luôn ....  :D  :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

Anh #lp_Hai    xài món này thì cứ gặp Polyline có số đỉnh lớn hơn 5 thì nó chèn hết Block kìa, bất chấp hình thù méo mó tròn vuông luôn ....  :D  :D 

mình thì theo sát yêu cầu của chủ thớt là hình chữ nhật, chứ mà không phải chữ nhật phải xác định điểm giữa có phải là trọng tâm không??? :D xài hàng loạt chắc rectang thôi :D

  • Vote tăng 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

Đăng nhập để thực hiện theo  

×