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

[Thảo luận] Viết lại các hàm Express

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

Còn ACET chưa chắc làm được nhưng điều mà LISP viết thì mình không chắc vì mình chưa học ARX (nhưng hầu hết đều làm được vì ARX là 1 ngôn ngữ rất mạnh).

Và những điều ARX làm được nhưng với LISP thì không thể là 1 điều chắc chắn

ARX làm được tất cả những gì lisp làm dc.

lisp ko thể làm dc tất cả những gì ARX làm dc (tốc độ của lisp <= ARX)

tuy nhiên nếu xài 1 thứ mà mình biết rõ thì vẫn hơn là xài 1 thứ mình ko biết gì hen.

nếu độc bằng ARX thì mình chơi ARX.

Thâ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

ARX làm được tất cả những gì lisp làm dc.

lisp ko thể làm dc tất cả những gì ARX làm dc (tốc độ của lisp <= ARX)

tuy nhiên nếu xài 1 thứ mà mình biết rõ thì vẫn hơn là xài 1 thứ mình ko biết gì hen.

nếu độc bằng ARX thì mình chơi ARX.

Thân!

Mình thì thấy biết cú pháp và công dụng của nó xem như là biết rồi bạn ạ, không thể nói là không biết gì

Suy ra cho Acet và các hàm Lisp cũng vậy. Không hiểu bạn đề cập thứ không biết là thứ gì?

 

Các hàm Lisp biết cú pháp và công dụng của nó thì OK

Các hàm acet biết cú pháp và công dụng của nó thì OK luôn vậy, không thể nói là không biết gì

 

Bạn đã từng chơi ARX chưa? Mình thì kém cỏi, chưa học được ARX, chỉ biết vận dụng chúng sao cho linh động và hiệu quả hơn mà thô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

Ví dụ hàm độc nào và tại sao phải sử dụng nó bác ơi ?

acet-sys-shift-down chẳng hạn. mình rất khoái dùng em nó nhưng không viết lại được. dùng thằng này để rẽ nhánh chương trình thì sướng thôi rồi, giảm bớt được tên lệnh, tăng cường tính linh hoạt cho 1 lệnh. giống như 1 số lệnh của cad ấy (lệnh trim hay extend là 1 ví dụ)

mình thử sử dụng grread để viết lại nó nhưng chịu thua. hàm grread chỉ nhận các phím ký tự của bàn phím. không nhận các phím điều khiển mới đau

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

acet-sys-shift-down chẳng hạn. mình rất khoái dùng em nó nhưng không viết lại được. dùng thằng này để rẽ nhánh chương trình thì sướng thôi rồi, giảm bớt được tên lệnh, tăng cường tính linh hoạt cho 1 lệnh. giống như 1 số lệnh của cad ấy (lệnh trim hay extend là 1 ví dụ)

mình thử sử dụng grread để viết lại nó nhưng chịu thua. hàm grread chỉ nhận các phím ký tự của bàn phím. không nhận các phím điều khiển mới đau

Đúng là Grread không nhận các phím điều khiển như Ctrol , Shift

Ví dụ hàm độc nào và tại sao phải sử dụng nó bác ơi ?

Bên cạnh đó có các hàm mà mình thường hay sử dụng trong chương trình

Hàm

- ACET-SS-DRAG-MOVE

- ACET-SS-DRAG-ROTATE

- ACET-SS-DRAG-SCALE

 

Chào các bạn, Thiep sưu tầm được một số hàm trong thư viện Express. Xin gửi đến các bạn:

* Hàm ACET-SS-DRAG-MOVE dùng để tạo hình ảnh động khi move 1 tập hợp chọn, có cú pháp như sau:

(ACET-SS-DRAG-MOVE ss pt [prompt] [hightlight(cursor)]), trong đó

- ss là tập hợp chọn

- pt là tọa độ điểm thứ 1 (from point)

- [hightlight(cursor)] là các hình thức của cursor khi tập hợp chọn di chuyển, có các tùy chọn 0, 1, 2, không bắt buộc.

Hàm sẽ trả 1 tọa độ điểm thứ 2 (to point), và sử dụng điểm 1 và 2 này trong lệnh ".move".

* Tượng tự như hàm trên, có các hàm sau:

- ACET-SS-DRAG-ROTATE

- ACET-SS-DRAG-SCALE

.....

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

acet-sys-shift-down chẳng hạn. mình rất khoái dùng em nó nhưng không viết lại được. dùng thằng này để rẽ nhánh chương trình thì sướng thôi rồi, giảm bớt được tên lệnh, tăng cường tính linh hoạt cho 1 lệnh. giống như 1 số lệnh của cad ấy (lệnh trim hay extend là 1 ví dụ)

mình thử sử dụng grread để viết lại nó nhưng chịu thua. hàm grread chỉ nhận các phím ký tự của bàn phím. không nhận các phím điều khiển mới đau

 

Đúng là Grread không nhận các phím điều khiển như Ctrol , Shift

 

Bên cạnh đó có các hàm mà mình thường hay sử dụng trong chương trình

Hàm

- ACET-SS-DRAG-MOVE

- ACET-SS-DRAG-ROTATE

- ACET-SS-DRAG-SCALE

Theo tìm hiểu của em thì :

- Thuần lisp nhận sự kiện có mặt [Ctrl và/hoặc shift] + Chuột phải, nếu chẳng may thuộc tổ hợp này thì bỏ qua ACET

- Nếu muốn check sự kiện này thì cũng có thể viết 1 đoạn ARX tường minh và ngắn gọn, search là thấy ngay ạ ^^. K thì e up theo cái này dịch sẵn rồi, load -> dùng hàm (shiftkeydown) hoặc (ctrlkeydown) ^^

http://www.cadviet.com/upfiles/3/24067_keylog17.rar

 

- ACET-SS-Drag-move + rotate e đang có trong Lib, bác search cũng sẽ thấy.

Không thể phủ nhận Express giúp ta rất nhiều, nhưng các lập luận e đã nói rõ rồi, đôi khi không cần phải cài cả win để đọc 1 file txt ^^

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

Mình thì thấy biết cú pháp và công dụng của nó xem như là biết rồi bạn ạ, không thể nói là không biết gì

Suy ra cho Acet và các hàm Lisp cũng vậy. Không hiểu bạn đề cập thứ không biết là thứ gì?

 

Các hàm Lisp biết cú pháp và công dụng của nó thì OK

Các hàm acet biết cú pháp và công dụng của nó thì OK luôn vậy, không thể nói là không biết gì

 

Bạn đã từng chơi ARX chưa? Mình thì kém cỏi, chưa học được ARX, chỉ biết vận dụng chúng sao cho linh động và hiệu quả hơn mà thôi

Bạn nói đúng, biết cú pháp + biết công dụng -> xài dc.

Nhưng biết nó xử lý ra sau -> edit dc vẫn hơn.

Hình như có vài cái hàm nó có lỗi oái oăm trong topic lỗi khó hiểu thì phải. Chắc gì ACET ko bị giống vậy hehe chỉ là chưa thấy thôi

 

Mình chưa xài ACET bao giờ cả toàn chơi lisp do ít khi dùng chủ yều viết mấy cái lệnh dạng combine nhiều thao tác lại với nhau.

 

Nhưng quan điểm của mình là xài những thứ mình hiểu rõ thì vẫn hơn là xài thứ ng khác bảo là đúng. Do đó mình vẫn ủng hộ các bạn viết lại các hàm ACET mặc dù ko biết mình có xài ké dc ko. hehehe

 

ARX đã thử qua vài cái bé bé xinh xinh, nó có ưu điểm của nó nhưng cũng có nhược điểm mà cái nhược lớn nhất đối với đa số là khó.

Đúng là Grread không nhận các phím điều khiển như Ctrol , Shift

 

Bên cạnh đó có các hàm mà mình thường hay sử dụng trong chương trình

Hàm

- ACET-SS-DRAG-MOVE

- ACET-SS-DRAG-ROTATE

- ACET-SS-DRAG-SCALE

Muốn bắt phím điều khiển chắc phải hook keyboard.

mấy cái này thì mình nghĩ nó xài AcGiDrawableOverrule bạn xài .NET vẫn làm dc bằng cách kế thừa lớp DrawableOverrule

wrap từ lớp trên.

Nói thế thôi chứ muốn làm thì e khả năng mình ko tới, các bạn cứ nghiên cứu thử chơi cũng là 1 cách học mà.

Have fun!

 

 

 

 

 

  • 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

Mấy hàm extents hay dùng hình như chưa ai viết thì fải. mod ketxu chả chịu cập nhật tất cả các hàm đã viết lên #1 để anh em tiên theo dõi gì cả. angry.png

1. (ACET-ENT-GEOMEXTENTS ename) và (ACET-GEOM-EXTENTS ename): 2 hàm này giống hệt nhau, trả về 2 điểm Bottom Left và Top Right của đối tượng (chả hiểu bọn tây nó viết 2 hàm này khác nhau cái gì nữa)

(defun Cv:geoem-extents (en / LB RT)
(if en
(progn
(vla-getboundingbox (vlax-ename->vla-object en) 'LB 'RT)
(list (vlax-safearray->list LB) (vlax-safearray->list RT)))))

2. (ACET-GEOM-SS-EXTENTS-FAST ss): trả về 2 điểm Bottom Left và Top Right của tập hợp đối tượng (selection set). 2 hàm tương tự nó nữa là ACET-GEOM-SS-EXTENTS và ACET-GEOM-SS-EXTENTS-ACCURATE, 2 hàm này có thêm 1 đối số nữa dạng number hoặc để nil. mới đầu mình tưởng là hệ số offset nhưng ko fải, chưa hiểu là để làm gì.

(defun Cv:geom-ss-extents-fast (ss / i ssl lstx lsty lstz LB RT)
(if ss
(progn
(setq i -1 ssl (sslength ss))
(while (< (setq i (1+ i)) ssl)
(vla-getboundingbox (vlax-ename->vla-object (ssname ss i)) 'LB 'RT)
(setq lstx (cons (car (setq LB (vlax-safearray->list LB))) lstx)
lstx (cons (car (setq RT (vlax-safearray->list RT))) lstx)
lsty (cons (cadr LB) lsty)
lsty (cons (cadr RT) lsty)
lstz (cons (caddr LB) lstz)
lstz (cons (caddr RT) lstz)))
(list (list (apply 'min lstx) (apply 'min lsty) (apply 'min lstz)) (list (apply 'max lstx) (apply 'max lsty) (apply 'max lstz))))))

3. (ACET-SS-ZOOM-EXTENTS ss) : zoom đến tập hợp đối tượng (selection set)

(defun Cv:ss-zoom-extents (ss / box lstx lsty)
(if ss
(progn
(setq i -1 ssl (sslength ss))
(while (< (setq i (1+ i)) ssl)
(vla-getboundingbox (vlax-ename->vla-object (ssname ss i)) 'LB 'RT)
(setq lstx (cons (car (setq LB (vlax-safearray->list LB))) lstx)
lstx (cons (car (setq RT (vlax-safearray->list RT))) lstx)
lsty (cons (cadr LB) lsty)
lsty (cons (cadr RT) lsty)))
(vla-ZoomWindow
(vlax-get-acad-object)
(vlax-3d-point (list (apply 'min lstx) (apply 'min lsty)))
(vlax-3d-point (list (apply 'max lstx) (apply 'max lsty)))))))

3 code trên mình định cho thêm hệ số offset vào để dùng cho linh động nhưng lại thôi. để thế này cho nó giống bạn ACET

  • 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

Hàm zoomextent nên là bước kế thừa của hàm ss-bounding bác ạ, trong hàm cuối bác có code ấy r thì add luôn vào đi th^^

E chờ chức năng add Link nó như ngày xưa thì làm, chứ sửa mãi mỏi lắm ạ

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

Mình tính làm thế rồi. nhưng vì làm thế thì lại fải thêm 1 bước sử lý điểm 3D thành 2D (hàm Cv:geom-ss-extents-fast trả về tọa độ điểm 3D) mà hàm vla-ZoomWindow thì không chơi 3D. như thế bước này vô nghĩa quá!

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ại e đọc dòng này này :<pre class="cadvietlispcode">(vla-ZoomWindow(vlax-get-acad-object)(vlax-3d-point (list (apply 'min lstx) (apply 'min lsty)))(vlax-3d-point (list (apply 'max lstx) (apply 'max lsty))</pre>

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

.......

 

- ACET-SS-Drag-move + rotate e đang có trong Lib, bác search cũng sẽ thấy.

......

- ACET-SS-Drag-move + rotate có trong Lib nào Ketxu ơi!

Tue_NV không thấy Lib nào có ACET-SS-Drag-move + rotate cả????

Nếu có thể Ketxu cho Tue_NV xin cái Link có hàm Lisp viết lại hàm ACET-SS-Drag-move + rotate .

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

Có thể viết lại 3 hàm SS-Drag của acet bằng autolisp. chỉ khác 1 chút ở chế độ bắt điểm không được ngon như acet nhưng dùng được. bác sử dụng mấy hàm dưới khéo léo 1 chút là viết được thôi: Grread, redraw, osnap, grvecs và biến *error*. em đã viết 1 ứng dụng kiểu này nhưng không viết thành hàm con nên chưa post đượ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

- ACET-SS-Drag-move + rotate có trong Lib nào Ketxu ơi!

Tue_NV không thấy Lib nào có ACET-SS-Drag-move + rotate cả????

Nếu có thể Ketxu cho Tue_NV xin cái Link có hàm Lisp viết lại hàm ACET-SS-Drag-move + rotate .

Thanks

Link đây bác. trong đó Lee mac có viết 1 hàm gần giống acet-ss-drag-move. Nhưng nó viết chưa triệt để, chưa giải quyết được vấn đề bắt điểm (do hạn chế của hàm grread) và trả về lỗi khi người dùng nhấn Esc mà không chọn điểm.

Nếu bác còn hứng thú với hàm này thì em gợi ý bác chỉnh sửa luôn code của nó 1 chút cho nhanh:

- kết hợp hàm osnap và biến hệ thống osmode để giải quyết được vấn đề bắt điểm (nếu bác thích thì có thể dùng thêm hàm grvecs để mô tả chế độ bắt điểm cho nó chuyên nghiệp)

- định nghĩa lại biến *error* giải quyết vấn đề người dùng Esc để hàm có thể trả về nil.

giải quyết đươc 2 vấn đề trên thì ta có 1 hàm gần như giống hoàn toàn acet-ss-drag-move.

  • 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

Có lẽ các bác tuệ không còn hứng thú với mấy hàm drag nên mình viết lại vậy.

(acet-ss-drag-move <selection-set> <base-pt> [<prompt>] [<hilight> [<cursor>]]): trong đó các đối số trong ngoặc vuông [...] là không bắt buộc

- Prompt: dòng nhắc khi chọn điểm.

- hilight : T hoặc nil. nếu T thì hàm sẽ vẽ 1 vector từ điểm base-pt đến vị trí con trỏ.

- cursor: hình dạng con trỏ., 1-không hiện sợi tóc; 2-sợi tóc hình vuông (pickbox); giá trị khác hoặc nil thì con trỏ ở trạng thái bình thường.

Đây là hàm mình viết lại. Có thể truy bắt điểm bình thường.

 

(defun Cv:ss-drag-move ( ss pt prm highlight cursor flag / *error* er escape get-osnap cursor osmode snap p1 p2 p3 gr dk kc objlst)
(defun escape (msg / )
(redraw)
(if flag
(mapcar '(lambda (x) (vl-catch-all-apply 'vla-delete (list x))) objlst)
(mapcar '(lambda (x) (vla-move x p1 (vlax-3d-point pt))) objlst)) (setq *error* er))
(defun get-osnap (osmode / snap osmode)
(setq snap "")
(if (> osmode 16384)
(while (> osmode 0)
(cond ((>= osmode 8192) (setq osmode (- osmode 8192) snap (strcat snap "_par,")))
((>= osmode 4096) (setq osmode (- osmode 4096) snap (strcat snap "_ext,")))
((>= osmode 2048) (setq osmode (- osmode 2048) snap (strcat snap "_app,")))
((>= osmode 1024) (setq osmode (- osmode 1024) snap (strcat snap "")))
((>= osmode 512) (setq osmode (- osmode 512) snap (strcat snap "_nea,")))
((>= osmode 256) (setq osmode (- osmode 256) snap (strcat snap "_tan,")))
((>= osmode 128) (setq osmode (- osmode 128) snap (strcat snap "_per,")))
((>= osmode 64) (setq osmode (- osmode 64) snap (strcat snap "_ins,")))
((>= osmode 32) (setq osmode (- osmode 32) snap (strcat snap "_int,")))
((>= osmode 16) (setq osmode (- osmode 16) snap (strcat snap "_qua,")))
((>= osmode 8) (setq osmode (- osmode 8) snap (strcat snap "_nod,")))
((>= osmode 4) (setq osmode (- osmode 4) snap (strcat snap "_cen,")))
((>= osmode 2) (setq osmode (- osmode 2) snap (strcat snap "_mid,")))
((>= osmode 1) (setq osmode (- osmode 1) snap (strcat snap "_end,"))))))
snap)
(setq er *error* *error* escape)
(if ss
(progn
(setq dk T p1 (vlax-3d-point pt) objlst (CV:ss-to-list ss t))
(if (not (eq (type cursor) 'INT)) (setq cursor 0))
(if flag (mapcar 'vla-copy objLst))
(if prm (prompt prm))
(while dk
(if (not (= (getvar "osmode") osmode)) (setq osmode (getvar "osmode") snap (get-osnap osmode)))
(setq gr (grread 't 14 cursor))
(cond
((= (car gr) 5)
(redraw)
(if (setq p2 (osnap (cadr gr) snap))
(grvecs (list 2
(polar p2 0.785398 (setq kc (* 9 (Cv:pixel-unit))))
(polar p2 -2.356194 kc) (polar p2 2.356194 kc) (polar p2 -0.785398 kc)))
(setq p2 (cadr gr)))
(if highlight (grdraw pt p2 8))
(setq p3 (vlax-3d-point p2))
(mapcar '(lambda (x) (vla-move x p1 p3)) objlst)
(setq p1 p3))
((= (car gr) 3)
(setq dk (redraw))
(if flag
(mapcar '(lambda (x) (vl-catch-all-apply 'vla-delete (list x))) objlst)
(mapcar '(lambda (x) (vla-move x p1 (vlax-3d-point pt))) objlst))
p2)
((= (car gr) 25) (command "dsettings"))
((equal gr '(2 6))
(if (= (setvar "osmode" (+ (if (< (getvar "osmode") 16384) 16384 -16384) (getvar "osmode"))) 0) (command "dsettings")))
((or (equal gr '(2 32)) (equal gr '(2 13)))
(if flag
(mapcar '(lambda (x) (vl-catch-all-apply 'vla-delete (list x))) objlst)
(mapcar '(lambda (x) (vla-move x p1 (vlax-3d-point pt))) objlst))
(setq dk (redraw))))))))

 

 

 

so với hàm acet thì mình thêm vào 1 đối số cuối cùng. đối số này bằng T hoặc nil. cho phép có hiển thị đối tượng gốc trong quá trình drag hay không. thực tế tất cả những lần mình sử dụng acet-ss-drag mình đều phải sử dụng kèm với hàm acet-ss-draw để ẩn đi đối tượng gốc. việc thêm chức năng này vào hàm sẽ tránh được bất tiện đó.

để sử dụng hàm này các bạn phải load 2 hàm CV:ss-to-list và Cv:pixel-units đã có trong topic này.

Test:

(CV:ss-drag-move (ssget) (getpoint) "Chon diem move: " t 1 nil)

(CV:ss-drag-move (ssget) (getpoint) "Chon diem move: " nil 2 t)

 

- Nhược điểm so với acet: không trả về nil khi nhấn Esc (cái này mình thất bại rồi :(); hiển thị ký hiệu bắt điểm không giống cad được như acet, (mấy cái hình vuông, tam giác, x màu vàng ấy...). nếu điểm base-pt nằm trên chính đối tượng drag thì khi drag sẽ hơi giật giật do nó tự bắt điểm với chính nó.

 

- Ưu điểm: nhanh và mượt mà hơn Acet nhiều. Acet làm việc với số lượng đối tượng lớn 1 chút là lag luôn. (cái này mình cũng hơi bất ngờ :D)

bật-tắt chế độ bắt điểm trong khi drag bằng cách gõ F (hoặc F2 hay Ctrl+F theo thói quen) bình thường. chuột phải để thay đổi chế độ bắt điểm.

  • 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

Khi test thì e lại thấy ngược lại bác ạ, với số lượng lớn thì acet bên máy e chạy bình thường - N với hàm này thì bị giật :( K biết nó có liên quan gì đến vấn đề máy móc hay không ^^

Mà sao ta k lợi dụng chính hàm copy - move của CAD để mần việc này các bác nhỉ :o Hồi trước e nhớ là e đã nghĩ ra bất cập của vấn đề này, rồi cũng mày mò viết lại, n rồi cũng k dùng bao giờ, đến giờ mãi chưa nhớ ra vấn đề đó là gì.

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

- không thể dùng command vì khi ta enter mà không pick điểm đối tượng sẽ bay lung tung, không trả đối tượng về vị trí cũ, không nắm được quy luật ketxu ạ

- khi mình test lisp này trên máy của mình. nếu dùng acet-ss-drag cho tập hợp gồm nhiều loại đối tượng thì nó hiển thị rất kém trong quá trình drag, một số đối tượng không hiển thị được, với bản vẽ nặng thì nó giật giật rất ngứa mắt. còn nếu dùng lisp trên thì ổn hơ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

- không thể dùng command vì khi ta enter mà không pick điểm đối tượng sẽ bay lung tung, không trả đối tượng về vị trí cũ, không nắm được quy luật ketxu ạ

- khi mình test lisp này trên máy của mình. nếu dùng acet-ss-drag cho tập hợp gồm nhiều loại đối tượng thì nó hiển thị rất kém trong quá trình drag, một số đối tượng không hiển thị được, với bản vẽ nặng thì nó giật giật rất ngứa mắt. còn nếu dùng lisp trên thì ổn hơn.

Phải undo mark hoặc lấy list đặng mà xóa đi chứ bác, vì cái mình lấy là point thôi

  • 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

lấy list đối tượng rồi sau đó xóa đi đã có point thì chắc là được. ý tưởng hay đấy, giải quyết được vấn đề bắt điểm triệt để lun. mình quên mất là có thể làm cách này.

còn dùng undo mark chắc chắn là không ổn rồi. nếu ta pan hoặc zoom trong quá trình drag, khi undo lại chắc chắn màn hình sẽ bị nhảy. vả lại cách này không hay :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

lấy list đối tượng rồi sau đó xóa đi đã có point thì chắc là được. ý tưởng hay đấy, giải quyết được vấn đề bắt điểm triệt để lun. mình quên mất là có thể làm cách này.

còn dùng undo mark chắc chắn là không ổn rồi. nếu ta pan hoặc zoom trong quá trình drag, khi undo lại chắc chắn màn hình sẽ bị nhảy. vả lại cách này không hay :D

Vậy bác thử cuốc làm quà tặng anh em năm mới đ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

Đang bận nên mình cuốc tạm ý tưởng thực hiện của ketxu để các bác hoàn thiện:

(defun ss-drag-move (ss pt / i sscp el box ang kc p ssl)
(setq el (entlast) i -1 ssl (sslength ss) sscp (ssadd))
(while (< (setq i (1+ i)) ssl) (vla-copy (vlax-ename->vla-object (ssname ss i))))
(while (setq el (entnext el)) (setq sscp (ssadd el sscp)))
(setq box (Cv:geom-ss-extents-fast sscp))
(command "move" sscp "" pt pause)
(setq p (cadr (grread t)) ang (angle pt p) kc (distance pt p))
(if (equal (Cv:geom-ss-extents-fast sscp) (mapcar '(lambda (x) (polar x ang kc)) box) 0.00001)
(progn (command "erase" sscp "") p)
(command "erase" sscp ""))) 

  • 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

một họ hàm khá hay nữa là acet-ui-progress. mấy hàm này rất hữu ích khi chương trình fải xử lý 1 lượng công việc lớn. mình đang cần nhưng bận nên chưa viết lại được, tạm thời vẫn fải dùng acet. bác nào rảnh thì viết bổ sung em nó vào thư viện này đi.

À quên: ý tưởng của mình là sử dụng vector để vẽ pogress bar trực tiếp lên màn hình cad hoặc hộp thoại chứ không dùng thanh status bar của cad nữa (muốn dùng cũng chả làm được). bác nào khéo tay chút có khi còn làm được cái pogress bar đẹp hơn ấy chứ :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

Đang bận nên mình cuốc tạm ý tưởng thực hiện của ketxu để các bác hoàn thiện:

(defun ss-drag-move (ss pt / i sscp el box ang kc p ssl)
(setq el (entlast) i -1 ssl (sslength ss) sscp (ssadd))
(while (< (setq i (1+ i)) ssl) (vla-copy (vlax-ename->vla-object (ssname ss i))))
(while (setq el (entnext el)) (setq sscp (ssadd el sscp)))
(setq box (Cv:geom-ss-extents-fast sscp))
(command "move" sscp "" pt pause)
(setq p (cadr (grread t)) ang (angle pt p) kc (distance pt p))
(if (equal (Cv:geom-ss-extents-fast sscp) (mapcar '(lambda (x) (polar x ang kc)) box) 0.00001)
(progn (command "erase" sscp "") p)
(command "erase" sscp ""))) 

Cuốc thêm 1 code nhỏ nữa

(defun Cv:ss-drag-move (ss p / el)
 (setq el (entlast))
 (if (vl-cmdf "copy" ss "" p pause)
 	(progn
(while (setq el (entnext el)) (entdel el)) (getvar "lastpoint") ) nil)
 )

  • 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

bác Tue_NV xem lại gạch đầu dòng thứ nhất của #141.hàm trên bác viết thế thì không bao giờ nó trả được về nil

ps: command thì luôn trả về nil. còn vl-cmdf thì ngược lại. luôn trả về T nếu lệnh hoàn thành bá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ác Tue_NV xem lại gạch đầu dòng thứ nhất của #141.hàm trên bác viết thế thì không bao giờ nó trả được về nil

ps: command thì luôn trả về nil. còn vl-cmdf thì ngược lại. luôn trả về T nếu lệnh hoàn thành bác ạ

Không bao giờ thì không có đâu. SS=NIL thì sẽ trả về NIL

Tue_NV xét thiếu 1 trường hợp

dòng thứ nhất của #141 của bạn khắc phục bằng code dưới đây :

(defun Cv:ss-drag-move (ss p / el)
 (setq el (entlast))
 (if (and (vl-cmdf "copy" ss "" p pause) (null (equal (getvar "lastpoint") p)))
  (progn
(while (setq el (entnext el)) (entdel el)) (getvar "lastpoint") ) nil)
 )

  • Vote tăng 3

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  

×