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

[Yêu cầu] Nhờ viết lisp chia màn hình (VPort)

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

Đặt vấn đề: Mình rất hay và rất thích làm việc với công cụ chia màn hình máy tính. Ưu điểm là nó cho phép mình view đc cùng lúc nhiều vị trí khác nhau trong bản vẽ và làm việc với các đối tượng tại các vị trí có vport đó. Đặc biệt mình xin mạn phép chia sẻ kinh nghiệm: (nếu ai xem đó là bình thường thì cũng đừng chê trách nhé) Nếu vẽ 2 hình gần tương đồng, chia 2 view port rồi copy các đối tượng tương tự qua lại lẫn nhau tốc độ vẽ lên đến rất cao mà không phải mất các thao tác pan và zoom vô ích (2 thao tác này mình cực ghét. Mình nghĩ nó hợp với dân acad nghiệp dư :P)

Vì vậy: mình rất hay chia màn hình máy tính làm 2 viewport để cùng làm việc.

Thông thường acad có một số mặc định chia màn hình thành các tỉ lệ 1/2 hoặc 1/3.

Nhưng mình đều không thích vì khi làm việc với các tỷ lệ đó khả năng quan sát không được tổng quát và rất ức chế mắt.

Mình thường chia màn hình máy thành 2 viewport với 2 tỷ lệ 4/9 và 5/9 (bằng 1 chuỗi thao tác)

Màn 4/9 là màn phụ để view vùng tham khảo.

Màn 5/9 là màn chính để thao tác vẽ.

Nhưng chuỗi thao tác chia màn hình của mình tốn nhiều công đoạn và máy tính chậm sẽ mất nhiều thời gian.

 

Hy vọng các bác xem có thể viêt lisp thay chuỗi thao tác lệnh thủ công của mình được không với, Mình xin cảm ơn nhiều. :)

HÌnh minh họa: http://www.mediafire.com/?07fzmrbx4dtk8bc

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

Chuổi thao tác đó như nào?

 

Chuổi thao tác đó như nào?

 

Phiền PHẠM QUỐC DUY download link bản vẽ đính kèm có hình minh họa vậy.

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

Thông thường acad có một số mặc định chia màn hình thành các tỉ lệ 1/2 hoặc 1/3.

Mình thường chia màn hình máy thành 2 viewport với 2 tỷ lệ 4/9 và 5/9

Màn 4/9 là màn phụ để view vùng tham khảo.

Màn 5/9 là màn chính để thao tác vẽ.

Nhưng chuỗi thao tác chia màn hình của mình tốn nhiều công đoạn và máy tính chậm sẽ mất nhiều thời gian.

 

 

Tỷ lệ 4/9 và 5/9 để phân chia màn hình chính và phụ không hợp lý lắm. Tại vì bạn phải thao tác bằng lệnh của cad nên chỉ tạo được tỷ lệ này là điều dễ hiểu.

 

Mình đề xuất tỷ lệ 2/5 và 3/5 để tăng kích thước màn hình chính thêm 1 chút nữa.

 


;;; Copyright 2011 Thaistreetz from cadviet.com

(defun C:VV (/ get-coordinate-screen TS:zoom PT1 PT2)
(defun get-coordinate-screen (coner / Y1 X1)
(cond ((= (strcase coner) "TL")
(polar(polar(getvar "viewctr")(* 0.5 pi) (setq Y1 (* 0.5 (getvar"viewsize")))) pi (/(* Y1 (car(setq X1 (getvar"screensize"))))(cadr X1))))
((= (strcase coner) "TR")
(polar(polar(getvar "viewctr")(* 0.5 pi) (setq Y1 (* 0.5 (getvar"viewsize")))) 0 (/(* Y1 (car(setq X1 (getvar"screensize"))))(cadr X1))))
((= (strcase coner) "BL")
(polar(polar(getvar "viewctr")(* -0.5 pi)(setq Y1 (* 0.5 (getvar"viewsize")))) pi (/(* Y1 (car(setq X1 (getvar"screensize"))))(cadr X1))))
((= (strcase coner) "BR")
(polar(polar(getvar "viewctr")(* -0.5 pi)(setq Y1 (* 0.5 (getvar"viewsize")))) 0 (/(* Y1 (car(setq X1 (getvar"screensize"))))(cadr X1))))))
(defun TS:zoom (pt1 pt2) (vlax-invoke (vlax-get-acad-object) 'zoomwindow pt1 pt2))
(command "propertiesclose")
(if (= (length (vports)) 1)
(progn
(if (not(tblsearch "vport" "ThaistreetzView")) (progn
(entmakex '((0 . "VPORT")(100 . "AcDbSymbolTableRecord")(100 . "AcDbViewportTableRecord")(2 . "ThaistreetzView")
(70 . 0)
(10 0.0 0.0) (11 0.6 1.0)
(13 0.0 0.0 0.0)(14 0.5 0.5 0.0)(15 0.5 0.5 0.0)
(16 0.0 0.0 1.0)(17 0.0 0.0 0.0)
(41 . 0.974843)
(42 . 50.0) (43 . 0.0) (44 . 0.0)
(50 . 0.0) (51 . 0.0)
(71 . 0) (72 . 1000) (73 . 1) (74 . 3) (75 . 0) (76 . 0) (77 . 0) (78 . 0)
(281 . 0) (65 . 1)
(110 0.0 0.0 0.0) (111 1.0 0.0 0.0) (112 0.0 1.0 0.0)
(79 . 0) (146 . 0.0)
(60 . 2) (61 . 5)
(292 . 1) (282 . 1)
(141 . 0.0) (142 . 0.0)
(63 . 250) (421 . 3355443)))
(entmakex '((0 . "VPORT") (100 . "AcDbSymbolTableRecord") (100 . "AcDbViewportTableRecord") (2 . "ThaistreetzView")
(70 . 0)
(10 0.6 0.0 0.0)(11 1.0 1.0 0.0)
(13 0.0 0.0) (14 0.5 0.5) (15 0.5 0.5)
(16 0.0 0.0 1.0) (17 0.0 0.0 0.0)
(41 . 0.973617)
(42 . 50.0) (43 . 0.0) (44 . 0.0)
(50 . 0.0) (51 . 0.0)
(71 . 0) (72 . 1000) (73 . 1) (74 . 3) (75 . 0) (76 . 0) (77 . 0) (78 . 0)
(65 . 1)
(110 0.0 0.0 0.0) (111 1.0 0.0 0.0) (112 0.0 1.0 0.0)
(79 . 0) (146 . 0.0)
(60 . 2) (61 . 5)
(292 . 1) (282 . 1)
(141 . 0.0) (142 . 0.0)
(63 . 250) (421 . 3355443)))))
(setq PT1 (get-coordinate-screen "TL") PT2 (get-coordinate-screen "BR"))
(vl-cmdf "vports" "r" "ThaistreetzView")
(ts:zoom pt1 pt2)
(setvar "cvport" 3)
(ts:zoom pt1 pt2))
(vl-cmdf "vports" "si"))
(princ))

Cả 2 lệnh bật và tắt chế độ chia màn hình được dùng chung 1 lệnh là VV

Nếu không ưng với tỷ lệ của mình thì bạn sửa 2 dòng này:

 

(10 0.0 0.0) (11 0.6 1.0) -> (10 0.0 0.0) (11 0.5555 1.0) (hoặc 0.44445 = 4/9) <= đây là kích thước màn hình bên trái

 

(10 0.6 0.0 0.0)(11 1.0 1.0 0.0) -> (10 0.5555 0.0 0.0)(11 1.0 1.0 0.0) (hoặc 0.44445) <= đây là kích thước màn hình bên phải

 

Với quy tắc trên, bạn có thể chia theo bất kỳ tỷ lệ nào mà bạn muốn

  • Vote tăng 6

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ảm ơn bác Thaistreetz nhé. Lisp thực hiện đúng ý định của mình. Nhưng tiếc là khi minh sửa các thông số đúng như bạn viết thì lisp vẫn không chia tì lệ như mình muốn. Bạn kiểm tra lại hộ mình với đc ko. Mình muốn màn hình bên phải rộng 3/5 và màn trái 2/5 cơ.

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ên phải 3/5 bên trái 2/5 thì thay giá trị 0.6 bằng 0.4. Có 2 vị trí cần phải thay, bạn mới chỉ thay 1 vị trí. Xem lại hướng dẫn, sau khi sửa bạn lưu file lisp lại và load lại nó.

Đừng chạy lệnh VV vội. Trước tiên bạn gõ lệnh Vports -> chuyển sang tab Named Viewports -> xóa thằng "ThaistreetzView" đi. sau đó chạy lại lệnh VV rồi xem kết quả thế nào

 

PS: Lisp trên mình post ẩu. vẫn chạy được nhưng kết quả chưa được chuẩn. bạn sửa lại dòng này

(defun TS:zoom (pt1 pt2) (vlax-invoke *acad-object* 'zoomwindow pt1 pt2))

thành

(vl-load-com)(defun TS:zoom (pt1 pt2) (vlax-invoke (vlax-get-acad-object) 'zoomwindow pt1 pt2))

Hoặc có thể down lại, mình đã sửa trực tiếp vào bài viết bên trên.

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 Thái hứng thú với các bài toán có cái Screen nhỉ ^^

Theo e thì nâng lên 1 tẹo nữa là dễ xài ngay :

(defun C:VV (/ get-coordinate-screen TS:zoom PT1 PT2)
(defun get-coordinate-screen (coner / Y1 X1)
(cond ((= (strcase coner) "TL")
(polar(polar(getvar "viewctr")(* 0.5 pi) (setq Y1 (* 0.5 (getvar "viewsize")))) pi (/(* Y1 (car(setq X1 (getvar "screensize"))))(cadr X1))))
((= (strcase coner) "TR")
(polar(polar(getvar "viewctr")(* 0.5 pi) (setq Y1 (* 0.5 (getvar "viewsize")))) 0 (/(* Y1 (car(setq X1 (getvar "screensize"))))(cadr X1))))
((= (strcase coner) "BL")
(polar(polar(getvar "viewctr")(* -0.5 pi)(setq Y1 (* 0.5 (getvar "viewsize")))) pi (/(* Y1 (car(setq X1 (getvar "screensize"))))(cadr X1))))
((= (strcase coner) "BR")
(polar(polar(getvar "viewctr")(* -0.5 pi)(setq Y1 (* 0.5 (getvar "viewsize")))) 0 (/(* Y1 (car(setq X1 (getvar "screensize"))))(cadr X1))))))
(defun TS:zoom (pt1 pt2) (vlax-invoke (vlax-get-acad-object) 'zoomwindow pt1 pt2))
(command "propertiesclose")
(setq PT1 (get-coordinate-screen "TL") PT2 (get-coordinate-screen "BR") x (abs (- (car pt1)(car pt2))))
(if (= (length (vports)) 1)
(progn
(or tl (setq tl (/ (- (car (getpoint "\nPart :")) (car pt1)) x)))
(if (not(tblsearch "vport" "ThaistreetzView")) (progn
(entmakex (append '((0 . "VPORT")(100 . "AcDbSymbolTableRecord")(100 . "AcDbViewportTableRecord")(2 . "ThaistreetzView")
(70 . 0)
(10 0.0 0.0)
(13 0.0 0.0 0.0)(14 0.5 0.5 0.0)(15 0.5 0.5 0.0)
(16 0.0 0.0 1.0)(17 0.0 0.0 0.0)
(41 . 0.974843)
(42 . 50.0) (43 . 0.0) (44 . 0.0)
(50 . 0.0) (51 . 0.0)
(71 . 0) (72 . 1000) (73 . 1) (74 . 3) (75 . 0) (76 . 0) (77 . 0) (78 . 0)
(281 . 0) (65 . 1)
(110 0.0 0.0 0.0) (111 1.0 0.0 0.0) (112 0.0 1.0 0.0)
(79 . 0) (146 . 0.0)
(60 . 2) (61 . 5)
(292 . 1) (282 . 1)
(141 . 0.0) (142 . 0.0)
(63 . 250) (421 . 3355443))(list (cons 11 (list  tl 1.0)))))
(entmakex (append '((0 . "VPORT") (100 . "AcDbSymbolTableRecord") (100 . "AcDbViewportTableRecord") (2 . "ThaistreetzView")
(70 . 0)
(11 1.0 1.0 0.0)
(13 0.0 0.0) (14 0.5 0.5) (15 0.5 0.5)
(16 0.0 0.0 1.0) (17 0.0 0.0 0.0)
(41 . 0.973617)
(42 . 50.0) (43 . 0.0) (44 . 0.0)
(50 . 0.0) (51 . 0.0)
(71 . 0) (72 . 1000) (73 . 1) (74 . 3) (75 . 0) (76 . 0) (77 . 0) (78 . 0)
(65 . 1)
(110 0.0 0.0 0.0) (111 1.0 0.0 0.0) (112 0.0 1.0 0.0)
(79 . 0) (146 . 0.0)
(60 . 2) (61 . 5)
(292 . 1) (282 . 1)
(141 . 0.0) (142 . 0.0)
(63 . 250) (421 . 3355443))(list (cons 10 (list  tl 0.0 0.0)))))
))
(vl-cmdf "vports" "r" "ThaistreetzView")
(ts:zoom pt1 pt2)
(setvar "cvport" 3)
(ts:zoom pt1 pt2))
(vl-cmdf "vports" "si"))
(princ))

  • Vote tăng 5

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

hà hà. ketxu giải quyết vấn đề đơn giản mà hiệu quả. Cứ thấy thế nào vừa mắt là chơi, đỡ fải lăn tăn tỷ lệ.

Đã nâng thì nâng cho tới z luôn nhé. bỏ thằng "ThaistreetzView" kia đi khi không dùng nó nữa. như thế sẽ mềm dẻo hơn cho nhu cầu sử dụng

(defun C:VV (/ get-coordinate-screen TS:zoom PT1 PT2 tl)
(defun get-coordinate-screen (coner / Y1 X1)
(cond ((= (strcase coner) "TL")
(polar(polar(getvar "viewctr")(* 0.5 pi) (setq Y1 (* 0.5 (getvar "viewsize")))) pi (/(* Y1 (car(setq X1 (getvar "screensize"))))(cadr X1))))
((= (strcase coner) "TR")
(polar(polar(getvar "viewctr")(* 0.5 pi) (setq Y1 (* 0.5 (getvar "viewsize")))) 0 (/(* Y1 (car(setq X1 (getvar "screensize"))))(cadr X1))))
((= (strcase coner) "BL")
(polar(polar(getvar "viewctr")(* -0.5 pi)(setq Y1 (* 0.5 (getvar "viewsize")))) pi (/(* Y1 (car(setq X1 (getvar "screensize"))))(cadr X1))))
((= (strcase coner) "BR")
(polar(polar(getvar "viewctr")(* -0.5 pi)(setq Y1 (* 0.5 (getvar "viewsize")))) 0 (/(* Y1 (car(setq X1 (getvar "screensize"))))(cadr X1))))))
(vl-load-com)(defun TS:zoom (pt1 pt2) (vlax-invoke (vlax-get-acad-object) 'zoomwindow pt1 pt2))
(command "propertiesclose")
(setq PT1 (get-coordinate-screen "TL") PT2 (get-coordinate-screen "BR") x (abs (- (car pt1)(car pt2))))
(if (= (length (vports)) 1)
(progn
(setq tl (/ (- (car (getpoint "\nPart :")) (car pt1)) x))
(if (not(tblsearch "vport" "ThaistreetzView")) (progn
(entmakex (append '((0 . "VPORT")(100 . "AcDbSymbolTableRecord")(100 . "AcDbViewportTableRecord")(2 . "ThaistreetzView")
(70 . 0)
(10 0.0 0.0)
(13 0.0 0.0 0.0)(14 0.5 0.5 0.0)(15 0.5 0.5 0.0)
(16 0.0 0.0 1.0)(17 0.0 0.0 0.0)
(41 . 0.974843)
(42 . 50.0) (43 . 0.0) (44 . 0.0)
(50 . 0.0) (51 . 0.0)
(71 . 0) (72 . 1000) (73 . 1) (74 . 3) (75 . 0) (76 . 0) (77 . 0) (78 . 0)
(281 . 0) (65 . 1)
(110 0.0 0.0 0.0) (111 1.0 0.0 0.0) (112 0.0 1.0 0.0)
(79 . 0) (146 . 0.0)
(60 . 2) (61 . 5)
(292 . 1) (282 . 1)
(141 . 0.0) (142 . 0.0)
(63 . 250) (421 . 3355443))(list (cons 11 (list  tl 1.0)))))
(entmakex (append '((0 . "VPORT") (100 . "AcDbSymbolTableRecord") (100 . "AcDbViewportTableRecord") (2 . "ThaistreetzView")
(70 . 0)
(11 1.0 1.0 0.0)
(13 0.0 0.0) (14 0.5 0.5) (15 0.5 0.5)
(16 0.0 0.0 1.0) (17 0.0 0.0 0.0)
(41 . 0.973617)
(42 . 50.0) (43 . 0.0) (44 . 0.0)
(50 . 0.0) (51 . 0.0)
(71 . 0) (72 . 1000) (73 . 1) (74 . 3) (75 . 0) (76 . 0) (77 . 0) (78 . 0)
(65 . 1)
(110 0.0 0.0 0.0) (111 1.0 0.0 0.0) (112 0.0 1.0 0.0)
(79 . 0) (146 . 0.0)
(60 . 2) (61 . 5)
(292 . 1) (282 . 1)
(141 . 0.0) (142 . 0.0)
(63 . 250) (421 . 3355443))(list (cons 10 (list  tl 0.0 0.0)))))))
(vl-cmdf "vports" "r" "ThaistreetzView")
(ts:zoom pt1 pt2)
(setvar "cvport" 3)
(ts:zoom pt1 pt2))
(progn
(vl-cmdf "vports" "si")
(vl-cmdf "vports" "d" "ThaistreetzView")))
(princ))

  • Vote tăng 4

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ạy lisp của cả 2 bác thì ổn rồi. Nhưng mà cái chữ "part" hiện ra sau khi đánh lisp nghĩa là thế nào? và cụ thể cái tỉ lệ mình cần tính nó như thế nào?

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ạn dùng lisp trong bài số #8. Gõ lệnh xong rồi muốn chia màn hình tại đâu thì pick điểm tại đó, khỏi phải quan tâm đến tỷ lệ nữa.

Còn nếu bạn thực sự muốn hiểu bản chất của việc tính toán tỷ lệ chia màn hình thì thế này:

- Màn hình cad được viewport đặt vào đó 1 hệ trục tọa độ tương đối. Gốc (0,0) tại góc trái bên dưới, góc phải bên trên sẽ có tọa độ (1,1)

- Tọa độ của 1 viewport được xác đinh bởi 2 điểm: góc trái bên dưới và góc phải bên trên của viewport đó theo hệ tọa độ trên.

- Lệnh trên tạo ra 2 viewport kề nhau chia màn hình theo phương đứng có tọa độ lần lượt là [(0 , 0) ; (x , 1)] và [(1-x , 0) ; (1 , 1)]

Các tọa độ này được quy định vào 2 mã dxf 10 và 11 của đối tượng viewport. Nếu bạn có chút kiến thức về autolisp có thể tự sửa code trên để chia màn hình theo ý thích: 2 hoặc 3 hoặc nhiều viewport cùng lúc chẳng hạn. hay có thể chia theo phương đứng hoặc phương ngang tùy nhu cầu.

Ngoài ra bằng cách này bạn có thể tạo được cả những viewport đặc biệt, có tọa độ đè lên nhau để tăng thêm diện tích cho mỗi viewport mà bằng lệnh cad thông thường thì không bao giờ có thể tạo được

  • 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

ok, cảm ơn bác nhé. Mình đã làm đc rồi. Hi nghe cái 2 viewport chèn lên nhau dùng cũng thích thế.

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

lisp này rất hay nhưng mình thì cần chia theo phương ngang ra 2 màn hình để khi vẽ mặt cắt thì dóng từ trên xuống. Ketxu hay Thaistreetz có thể sửa lại hộ mình có được không. thanks

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ạn Ketxu và Thaistreetz bận rồi ah, hic

Có cao thủ nào giúp mình cái

Chắc các cao thủ bận thi đại học, ý nhầm: các cao thủ bận chấm thi và tuyển sinh rồi,

 

Sửa lại lisp của Thaistreetz cho bạn nè :

;;; Copyright 2011 Thaistreetz from cadviet.com
;;; Edit by Gia_Bach - Ngay 19/7/2013
(defun C:sv (/ dxf10 dxf11 phuong pt pt1 pt2 tl);Split View
  (vl-load-com)
  (defun get-coordinate-screen (coner / Y1 X1)
    (cond ((= (strcase coner) "TL")
	   (polar(polar(getvar "viewctr")(* 0.5 pi) (setq Y1 (* 0.5 (getvar"viewsize")))) pi (/(* Y1 (car(setq X1 (getvar"screensize"))))(cadr X1))))
	  ((= (strcase coner) "BR")
	   (polar(polar(getvar "viewctr")(* -0.5 pi)(setq Y1 (* 0.5 (getvar"viewsize")))) 0 (/(* Y1 (car(setq X1 (getvar"screensize"))))(cadr X1))))))
  (defun TS:zoom (pt1 pt2) (vlax-invoke (vlax-get-acad-object) 'zoomwindow pt1 pt2))
  ;(command "propertiesclose")  
  (if (= (length (vports)) 1)
    (progn
      (setq pt (getpoint "\nChon diem chia :"))
      (setq PT1 (get-coordinate-screen "TL") PT2 (get-coordinate-screen "BR"))
      (initget 1 "Ngang Doc")
      (setq phuong (getkword "\nChia theo phuong ? (Ngang/Doc) "))
      (if (= phuong "Doc")
	(setq tl (/ (- (car pt) (car pt1)) (- (car pt2)(car pt1)))
	      dxf11 (cons 11 (list  tl 1.0))
	      dxf10 (cons 10 (list  tl 0.0 0.0)) )
	(setq tl (/ (- (cadr pt) (cadr pt2)) (- (cadr pt1)(cadr pt2)))
	      dxf11 (cons 11 (list 1.0 tl))
	      dxf10 (cons 10 (list 0.0 tl 0.0)) ) )
      (if (not(tblsearch "vport" "ThaistreetzView"))
	(progn
	  (entmakex (append '((0 . "VPORT")(100 . "AcDbSymbolTableRecord")(100 . "AcDbViewportTableRecord")(2 . "ThaistreetzView")(70 . 0)(10 0.0 0.0) )
			    (list dxf11)))
	  (entmakex (append '((0 . "VPORT")(100 . "AcDbSymbolTableRecord")(100 . "AcDbViewportTableRecord")(2 . "ThaistreetzView")(70 . 0)(11 1.0 1.0 0.0) )
			    (list dxf10) ))))
      (vl-cmdf "vports" "r" "ThaistreetzView")
      (ts:zoom pt1 pt2)
      (setvar "cvport" 3)
      (ts:zoom pt1 pt2))
    (progn
      (vl-cmdf "vports" "si")
      (if (tblsearch "vport" "ThaistreetzView") (vl-cmdf "vports" "d" "ThaistreetzView"))
      (vlax-invoke (vlax-get-acad-object) 'zoomall) ) )
  (princ))
  • 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

 

Chắc các cao thủ bận thi đại học, ý nhầm: các cao thủ bận chấm thi và tuyển sinh rồi,

 

Sửa lại lisp của Thaistreetz cho bạn nè :

;;; Copyright 2011 Thaistreetz from cadviet.com
;;; Edit by Gia_Bach - Ngay 19/7/2013
(defun C:sv (/ dxf10 dxf11 phuong pt pt1 pt2 tl);Split View
  (vl-load-com)
  (defun get-coordinate-screen (coner / Y1 X1)
    (cond ((= (strcase coner) "TL")
	   (polar(polar(getvar "viewctr")(* 0.5 pi) (setq Y1 (* 0.5 (getvar"viewsize")))) pi (/(* Y1 (car(setq X1 (getvar"screensize"))))(cadr X1))))
	  ((= (strcase coner) "BR")
	   (polar(polar(getvar "viewctr")(* -0.5 pi)(setq Y1 (* 0.5 (getvar"viewsize")))) 0 (/(* Y1 (car(setq X1 (getvar"screensize"))))(cadr X1))))))
  (defun TS:zoom (pt1 pt2) (vlax-invoke (vlax-get-acad-object) 'zoomwindow pt1 pt2))
  ;(command "propertiesclose")  
  (if (= (length (vports)) 1)
    (progn
      (setq pt (getpoint "\nChon diem chia :"))
      (setq PT1 (get-coordinate-screen "TL") PT2 (get-coordinate-screen "BR"))
      (initget 1 "Ngang Doc")
      (setq phuong (getkword "\nChia theo phuong ? (Ngang/Doc) "))
      (if (= phuong "Doc")
	(setq tl (/ (- (car pt) (car pt1)) (- (car pt2)(car pt1)))
	      dxf11 (cons 11 (list  tl 1.0))
	      dxf10 (cons 10 (list  tl 0.0 0.0)) )
	(setq tl (/ (- (cadr pt) (cadr pt2)) (- (cadr pt1)(cadr pt2)))
	      dxf11 (cons 11 (list 1.0 tl))
	      dxf10 (cons 10 (list 0.0 tl 0.0)) ) )
      (if (not(tblsearch "vport" "ThaistreetzView"))
	(progn
	  (entmakex (append '((0 . "VPORT")(100 . "AcDbSymbolTableRecord")(100 . "AcDbViewportTableRecord")(2 . "ThaistreetzView")(70 . 0)(10 0.0 0.0) )
			    (list dxf11)))
	  (entmakex (append '((0 . "VPORT")(100 . "AcDbSymbolTableRecord")(100 . "AcDbViewportTableRecord")(2 . "ThaistreetzView")(70 . 0)(11 1.0 1.0 0.0) )
			    (list dxf10) ))))
      (vl-cmdf "vports" "r" "ThaistreetzView")
      (ts:zoom pt1 pt2)
      (setvar "cvport" 3)
      (ts:zoom pt1 pt2))
    (progn
      (vl-cmdf "vports" "si")
      (if (tblsearch "vport" "ThaistreetzView") (vl-cmdf "vports" "d" "ThaistreetzView"))
      (vlax-invoke (vlax-get-acad-object) 'zoomall) ) )
  (princ))

quá hay, ngoài mong đợi của mình. lúc đầu mình chỉ muốn thêm lisp chia ngang nhưng bạn gia_bach còn làm hơn thế, đưa ra 1 lựa chọn để chọn chia ngang hay chia dọc, quá tuyệt vời. cám ơn bạn gia_bach nhé

bạn đúng là đại cao thủ rồi  :)

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  

×