Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
14 replies to this topic

#1 victor85

victor85

    biết lệnh stretch

  • Members
  • PipPipPip
  • 169 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 21 March 2012 - 12:46 PM

Đặ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...07fzmrbx4dtk8bc
  • 0

#2 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 21 March 2012 - 01:53 PM

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

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#3 victor85

victor85

    biết lệnh stretch

  • Members
  • PipPipPip
  • 169 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 21 March 2012 - 02:51 PM

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

#4 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 21 March 2012 - 03:19 PM

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
  • 6

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#5 victor85

victor85

    biết lệnh stretch

  • Members
  • PipPipPip
  • 169 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 21 March 2012 - 04:24 PM

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

#6 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 21 March 2012 - 05:14 PM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#7 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 21 March 2012 - 09:40 PM

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))

  • 5

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#8 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 22 March 2012 - 01:22 AM

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))

  • 4

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#9 victor85

victor85

    biết lệnh stretch

  • Members
  • PipPipPip
  • 169 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 22 March 2012 - 03:54 PM

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

#10 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 22 March 2012 - 04:30 PM

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
  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#11 victor85

victor85

    biết lệnh stretch

  • Members
  • PipPipPip
  • 169 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 22 March 2012 - 05:50 PM

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

#12 proconeng86

proconeng86

    biết lệnh break

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

Đã gửi 16 July 2013 - 12:42 AM

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


  • 0

#13 proconeng86

proconeng86

    biết lệnh break

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

Đã gửi 17 July 2013 - 10:08 PM

Bạn Ketxu và Thaistreetz bận rồi ah, hic

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


  • 0

#14 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 19 July 2013 - 11:03 AM

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))

  • 1

#15 proconeng86

proconeng86

    biết lệnh break

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

Đã gửi 19 July 2013 - 08:04 PM

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  :)


  • 0