Đến nội dung


Hình ảnh
- - - - -

Lisp có hàm nào thay thế lệnh zoom không?


  • Please log in to reply
8 replies to this topic

#1 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 09 April 2009 - 08:44 PM

Các bạn có ai biết trong Lisp có hàm nào thay thế lệnh zoom không? Các biến hệ thống của CAD liên quan đến zoom hay view như VIEWSIZE, VIEWCTR.. đều ở dạng readonly cho nên mình chỉ có thể getvar mà không thể setvar được. Do đó muốn view tới một vùng nào đó mà không muốn dùng lệnh (command ...) thì không biết làm cách nào. Có ai biết xin chỉ giáo dùm. Cám ơn nhiều.
  • 0

#2 haanh

haanh

    biết lệnh adcenter

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

Đã gửi 09 April 2009 - 09:09 PM

Các bạn có ai biết trong Lisp có hàm nào thay thế lệnh zoom không? Các biến hệ thống của CAD liên quan đến zoom hay view như VIEWSIZE, VIEWCTR.. đều ở dạng readonly cho nên mình chỉ có thể getvar mà không thể setvar được. Do đó muốn view tới một vùng nào đó mà không muốn dùng lệnh (command ...) thì không biết làm cách nào. Có ai biết xin chỉ giáo dùm. Cám ơn nhiều.


ko hiểu lắm về câu hỏi của bác nhưng em cứ nghĩ cái lệnh zoom nó chỉ làm thay đổi về kích thước ở dạng ảo giác... khi nhìn nó từ môi trường khác nhau ví như nhìn trong môi trường nước và môi trường khí nó chỉ khách nhau về khúc khúc xạ ánh sáng khi tia nhìn đi qua môi trường khác nhau thôi. Chính vì thế khi tìm kiếm ...nó ra thế này đây:

Lệnh tắt trong AutoCAD, giúp vẽ nhanh hơn

http://www.cadviet.c...p?showtopic=276
  • 0

“Sống trong đời sống cần có một tấm lòng / Để làm gì em biết không ? / Để gió cuốn đi, để gió cuốn đi...”


#3 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 09 April 2009 - 09:19 PM

ko hiểu lắm về câu hỏi của bác nhưng em cứ nghĩ cái lệnh zoom nó chỉ làm thay đổi về kích thước ở dạng ảo giác... khi nhìn nó từ môi trường khác nhau ví như nhìn trong môi trường nước và môi trường khí nó chỉ khách nhau về khúc khúc xạ ánh sáng khi tia nhìn đi qua môi trường khác nhau thôi. Chính vì thế khi tìm kiếm ...nó ra thế này đây:

Lệnh tắt trong AutoCAD, giúp vẽ nhanh hơn

http://www.cadviet.c...p?showtopic=276


không phải mình muốn dùng lệnh tắt. Mình đang viết ct tìm lỗi, khi đã tìm ra lỗi thí dụ ở 10 điểm khác nhau thì khi chạy ct thì nó sẽ zoom màn hình tới từng chô một để mình chỉnh sửa. Nói đúng hơn thì mình muốn tìm 1 cái hàm (function) nào đó tương tự như lệnh zoom.
  • 0

#4 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 09 April 2009 - 09:25 PM

không phải mình muốn dùng lệnh tắt. Mình đang viết ct tìm lỗi, khi đã tìm ra lỗi thí dụ ở 10 điểm khác nhau thì khi chạy ct thì nó sẽ zoom màn hình tới từng chô một để mình chỉnh sửa. Nói đúng hơn thì mình muốn tìm 1 cái hàm (function) nào đó tương tự như lệnh zoom.

bạn có thể nói rõ hơn cái lỗi thí dụ ở 10 điểm khác nhau không?
Mình chưa hiểu là file bản vẽ của bạn gặp lỗi gì?
Bạn có thể nói rõ hơn và có thể minh hoạ bằng file .dwg
Mình cũng không biết chắc là có thể giúp bạn được hay không?
Nếu nằm trong tầm hiểu biết của mình, thì mình cũng sẵn lòng giúp bạn.
  • 0

#5 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 09 April 2009 - 09:40 PM

bạn có thể nói rõ hơn cái lỗi thí dụ ở 10 điểm khác nhau không?
Mình chưa hiểu là file bản vẽ của bạn gặp lỗi gì?
Bạn có thể nói rõ hơn và có thể minh hoạ bằng file .dwg
Mình cũng không biết chắc là có thể giúp bạn được hay không?
Nếu nằm trong tầm hiểu biết của mình, thì mình cũng sẵn lòng giúp bạn.


Cái ct mình đang viết như sau:

(defun viewd(l)
(setq caoview (getvar "VIEWSIZE"))
(if (not ttview) (setq ttview 0))
(command "zoom" "c" (nth ttview l) caoview)
(if (< ttview (1- (length l)))
(setq ttview (1+ ttview))
(setq ttview 0))
)

(defun c:test()
(setq l (list '(73780.4 65756.3 0.0)
'(73835.0 65799.0 0.0)
'(74000.0 65779.2 0.0)
'(73731.7 65888.8 0.0)
'(73663.0 65918.6 0.0)
'(73620.2 65910.1 0.0)
'(73620.2 65851.2 0.0)
'(73619.9 65793.3 0.0)))
(viewd l)
)

đầu vào của nó là một list các point. Hàm viewd sẽ zoom màn hình đến từng điểm trong cái list đó, rồi thoát ra khòi lệnh. Sau đó mình có thể chỉnh sửa bất cứ cái gì tại vị trí đó. Tiếp theo mình lại đánh lại lệnh test, Hàm viewd sẽ zoom màn hình đến điểm tiếp theo trong cái list point đó. Cứ như vậy cho tới hết các point. Mục đích là khi xác định được list các point thì mình không cần phải zoom bằng lệnh zoom rất phiền phức, nhất là đối với các bản vẽ lớn mà các lỗi cần sửa nằm rải rác khắp nơi. Vấn đề mình cần hỏi là có thể thay thế cái dòng (command "zoom" "c" (nth ttview l) caoview) bằng các hàm khác của lisp không mà cho ra kết quả tương tự như nó .
  • 1

#6 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 09 April 2009 - 10:29 PM

Mình muốn hỏi là vì sao bạn muốn tìm phương án khác trong khi phương án này (lệnh zoom) không có gì là nhược điểm?

Autodesk có lý khi đặt các biến liên quan đến view là readonly. Bởi vì việc zoom không đơn thuần là thay đổi vị trí quan sát. Nó sẽ làm thay đổi các đối tượng chọn của hàm như ssget, của lệnh như boundary, hatch, trim,... Ngoài ra, việc đổi tỷ lệ zoom trong nhiều trường hợp còn phát sinh lệnh regen.

Tóm lại, việc thay đổi màn hình zoom ảnh hưởng tới nhiều lệnh khác. Vì vậy Autodesk ắt sẽ bảo vệ không cho set zoom chỉ bằng biến hệ thống mà phải bằng lệnh. Chúng ta khó có thể tìm cách để đổi được chỉ bằng cách set biến hệ thống.

Trong thực tế có một cách khác không cần dùng đến lệnh zoom, là:
- Tạo một View với thông số mà bạn muốn (gồm tọa độ tâm, kích thước màn hình) bằng cách can thiệp vào dữ liệu DXF của table view.
- Dùng lệnh -view rồi restore view đó ra.
Về bản chất, cách này còn phức tạp hơn cả zoom.
  • 0

#7 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 09 April 2009 - 11:16 PM

Cái ct mình đang viết như sau:

(defun viewd(l)
(setq caoview (getvar "VIEWSIZE"))
(if (not ttview) (setq ttview 0))
(command "zoom" "c" (nth ttview l) caoview)
(if (< ttview (1- (length l)))
(setq ttview (1+ ttview))
(setq ttview 0))
)

(defun c:test()
(setq l (list '(73780.4 65756.3 0.0)
'(73835.0 65799.0 0.0)
'(74000.0 65779.2 0.0)
'(73731.7 65888.8 0.0)
'(73663.0 65918.6 0.0)
'(73620.2 65910.1 0.0)
'(73620.2 65851.2 0.0)
'(73619.9 65793.3 0.0)))
(viewd l)
)

đầu vào của nó là một list các point. Hàm viewd sẽ zoom màn hình đến từng điểm trong cái list đó, rồi thoát ra khòi lệnh. Sau đó mình có thể chỉnh sửa bất cứ cái gì tại vị trí đó. Tiếp theo mình lại đánh lại lệnh test, Hàm viewd sẽ zoom màn hình đến điểm tiếp theo trong cái list point đó. Cứ như vậy cho tới hết các point. Mục đích là khi xác định được list các point thì mình không cần phải zoom bằng lệnh zoom rất phiền phức, nhất là đối với các bản vẽ lớn mà các lỗi cần sửa nằm rải rác khắp nơi. Vấn đề mình cần hỏi là có thể thay thế cái dòng (command "zoom" "c" (nth ttview l) caoview) bằng các hàm khác của lisp không mà cho ra kết quả tương tự như nó .

Mình mạo muội sửa cái lisp của bạn thành như vậy. Bác tham khảo xem dùng được không
(defun viewd(l)
(if (not ttview) (setq ttview 0))
(command "-pan" (nth ttview l) (getvar "viewctr"))
(if (< ttview (1- (length l)))
(setq ttview (1+ ttview))
(setq ttview 0))
)
(defun c:test()
(setq l (list '(73780.4 65756.3 0.0)
'(73835.0 65799.0 0.0)
'(74000.0 65779.2 0.0)
'(73731.7 65888.8 0.0)
'(73663.0 65918.6 0.0)
'(73620.2 65910.1 0.0)
'(73620.2 65851.2 0.0)
'(73619.9 65793.3 0.0)))
(viewd l)
)
Mình cũng thường dùng cái kiểu này để quản lý các vị trí của các đối tượng cần tìm tới trong một bản vẽ phức tạp.
  • 0

#8 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 10 April 2009 - 07:41 AM

Mình muốn hỏi là vì sao bạn muốn tìm phương án khác trong khi phương án này (lệnh zoom) không có gì là nhược điểm?

Autodesk có lý khi đặt các biến liên quan đến view là readonly. Bởi vì việc zoom không đơn thuần là thay đổi vị trí quan sát. Nó sẽ làm thay đổi các đối tượng chọn của hàm như ssget, của lệnh như boundary, hatch, trim,... Ngoài ra, việc đổi tỷ lệ zoom trong nhiều trường hợp còn phát sinh lệnh regen.

Tóm lại, việc thay đổi màn hình zoom ảnh hưởng tới nhiều lệnh khác. Vì vậy Autodesk ắt sẽ bảo vệ không cho set zoom chỉ bằng biến hệ thống mà phải bằng lệnh. Chúng ta khó có thể tìm cách để đổi được chỉ bằng cách set biến hệ thống.

Trong thực tế có một cách khác không cần dùng đến lệnh zoom, là:
- Tạo một View với thông số mà bạn muốn (gồm tọa độ tâm, kích thước màn hình) bằng cách can thiệp vào dữ liệu DXF của table view.
- Dùng lệnh -view rồi restore view đó ra.
Về bản chất, cách này còn phức tạp hơn cả zoom.


Sở dĩ mình muốn xài hàm thay vì xài lệnh là vì muốn cho hàm của mình nó trong suốt (transparent), tức là có thể dùng hàm này đan xen với lệnh khác. Thí dụ như mình muốn copy một vật ở vị trí này đến vị trí khác mà mình đã biết rõ vị trí của nó, thì trong khi thực hiện lệnh copy mình có thể đánh vào 'test thì màn hình sẽ zoom tới vị trí kế tiếp trong list point để mình dán vật copy đó. Nếu dùng (command "zoom" ...) thì CAD sẽ báo lỗi ngay.
  • 0

#9 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 10 April 2009 - 09:16 AM

Sở dĩ mình muốn xài hàm thay vì xài lệnh là vì muốn cho hàm của mình nó trong suốt (transparent), tức là có thể dùng hàm này đan xen với lệnh khác. Thí dụ như mình muốn copy một vật ở vị trí này đến vị trí khác mà mình đã biết rõ vị trí của nó, thì trong khi thực hiện lệnh copy mình có thể đánh vào 'test thì màn hình sẽ zoom tới vị trí kế tiếp trong list point để mình dán vật copy đó. Nếu dùng (command "zoom" ...) thì CAD sẽ báo lỗi ngay.

Bạn có thể viết thành 2 hàm. Một hàm cung cấp tọa độ cho lệnh copy và một hàm pan đến tọa độ đó.
Còn nếu bạn muốn kết hợp thì bạn phải viết lại lệnh copy, sau khi chọn đối tượng xong bạn lập một đoạn code nhận sự kiện, dùng hàm (initget 128) và (getpoint) để nhận gần như tất cả các đối số do người dùng nhập vào. Đại khái nếu người dùng nhập :
point-> bạn xử lý sự kiện nhập point và tiếp tục cho nhập point thứ 2 sau đó copy từ p1 đến p2
"test"-> bạn xử lý sự kiện nhập "test", ở đây bạn gọi hàm của bạn
...
Cái này mình đã từng lập để zoom p, zoom w hay pan đến vị trí nình cần trong khi đang thực hiện một lệnh "line" do mình viết lại. Trong các lệnh mới tạm đặt tên là dpan va dzoomp, dzoomw có sử dụng lệnh pan và zoom "p,w" nguyên thủy của cad và tọa độ có thể lấy từ chương trình hay do người dùng nhập

Mình nghĩ để pan đến vị trí cần thiết còn có thể lập trình cho thanh cuộn ngang và dọc, thường người ta dùng VBA.
  • 0