Đến nội dung


Hình ảnh

Nhờ viết lisp canh chỉnh block trong bảng thống kê


  • Please log in to reply
2 replies to this topic

#1 Hoangvulandscape

Hoangvulandscape

    biết zoom

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

Đã gửi 22 November 2012 - 11:34 AM

Chào các bạn!
Mình làm bên thiết kế cảnh quan và thường lập bảng thống kê cây xanh.
Trong quá trình làm mình hay gặp một công đoạn lôi thôi là canh chỉnh nội dung nằm giữa các ô.
Về text thì mình đã sử dụng lisp điều chỉnh rồi, chỉ có mỗi cái block là phải làm thủ công canh giữa rồi scale rất phiền.
Mình mong các pro dành chút thời gian viết giúp mình cái lisp cho việc này thì tốt quá.

Lisp sẽ tự động canh block vào giữa ô chữ nhật, scale block cho phù hợp với ô chỉ với 1 thao tác chọn ô và block.
Vì mình muốn được cơ động nên mong các bạn có thể thêm dòng nhắc nhập tỷ lệ scale (dùng đường kính block so với chiều cao ô), để có thể điều chỉnh to nhỏ theo ý muốn.
Chân thành cảm ơn trước!
P/s: Mình gởi kèm file cad để các bạn có thể hình dung dễ dàng hơn về nội dung cần trợ giúp của mình!
http://www.cadviet.c...3185_sample.dwg
  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 22 November 2012 - 02:49 PM

Lisp Move Block vào tâm Rectangle và Scale để Block nằm gọn trong Rectangle.

(defun C:HA( / ent1 ent2 pt ll ur pt1 pt2 d1 d2 sc)
;Doan Van Ha - CADViet.com - Ngay 22/11/2012
;Chuc nang: Move Block vao tam Rectangle va Scale Block cho nam gon trong Rectangle.
(command "undo" "be") (vl-load-com)
(setq osm (getvar "osmode") cmd (getvar "cmdecho") dmz (getvar "dimzin"))
(mapcar 'setvar '("osmode" "cmdecho" "dimzin") '(0 0 0))
(while
(and
(setq ent1 (car (entsel "\nChon Block: ")))
(setq ent2 (car (entsel "\nChon Boundary: "))))
(TAM_ENT ent1)
(setq pt1 pt d1 (- (cadr ur) (cadr ll)))
(TAM_ENT ent2)
(setq pt2 pt d2 (- (cadr ur) (cadr ll)))
(initget 6)
(setq sc (getreal (strcat "\nNhap ti le Scale <" (rtos (/ d2 d1) 2 2) ">: ")))
(if (not sc) (setq sc (/ d2 d1)))
(command "move" ent1 "" pt1 pt2)
(command "scale" ent1 "" pt1 sc))
(mapcar 'setvar '("osmode" "cmdecho" "dimzin") (list osm cmd dmz))
(command "undo" "end")
(princ))
;----- H&#181;m l&#202;y t&#169;m (v&#181; 2 g&#227;c ll ur) c&#241;a 1 ent b&#202;t k&#250;.
(defun TAM_ENT (ent)
(vla-getboundingbox (vlax-ename->vla-object ent) 'll 'ur)
(setq ll (vlax-safearray->list ll) ur (vlax-safearray->list ur) pt (mapcar '* (mapcar '+ ll ur) '(0.5 0.5 0.5))))

  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#3 Hoangvulandscape

Hoangvulandscape

    biết zoom

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

Đã gửi 26 November 2012 - 03:19 PM

Lisp Move Block vào tâm Rectangle và Scale để Block nằm gọn trong Rectangle.


(defun C:HA( / ent1 ent2 pt ll ur pt1 pt2 d1 d2 sc)
;Doan Van Ha - CADViet.com - Ngay 22/11/2012
;Chuc nang: Move Block vao tam Rectangle va Scale Block cho nam gon trong Rectangle.
(command "undo" "be") (vl-load-com)
(setq osm (getvar "osmode") cmd (getvar "cmdecho") dmz (getvar "dimzin"))
(mapcar 'setvar '("osmode" "cmdecho" "dimzin") '(0 0 0))
(while
(and
(setq ent1 (car (entsel "\nChon Block: ")))
(setq ent2 (car (entsel "\nChon Boundary: "))))
(TAM_ENT ent1)
(setq pt1 pt d1 (- (cadr ur) (cadr ll)))
(TAM_ENT ent2)
(setq pt2 pt d2 (- (cadr ur) (cadr ll)))
(initget 6)
(setq sc (getreal (strcat "\nNhap ti le Scale <" (rtos (/ d2 d1) 2 2) ">: ")))
(if (not sc) (setq sc (/ d2 d1)))
(command "move" ent1 "" pt1 pt2)
(command "scale" ent1 "" pt1 sc))
(mapcar 'setvar '("osmode" "cmdecho" "dimzin") (list osm cmd dmz))
(command "undo" "end")
(princ))
;----- H&#181;m l&#202;y t&#169;m (v&#181; 2 g&#227;c ll ur) c&#241;a 1 ent b&#202;t k&#250;.
(defun TAM_ENT (ent)
(vla-getboundingbox (vlax-ename->vla-object ent) 'll 'ur)
(setq ll (vlax-safearray->list ll) ur (vlax-safearray->list ur) pt (mapcar '* (mapcar '+ ll ur) '(0.5 0.5 0.5))))

Thanks bạn Hà nhé! Lisp chạy rất tốt!
  • 0