-
Số lượng nội dung
905 -
Đã tham gia
-
Lần ghé thăm cuối
-
Ngày trúng
30
Bài đăng được đăng bởi Thaistreetz
-
-
Mình cũng đã từng thử mày mò học .Net vì thấy lisp có nhiều hạn chế quá, thấy phần mềm các bác post bên .Net thì thèm lắm. Tuy nhiên mình gặp khó khăn về kiến thức khi tiếp cận ngôn ngữ này, công việc cũng bận bịu nên chưa dành nhiều thời gian để học. Ngoài ra thì mình cũng còn lăn tăn vấn đề tương thích ngược của các framework giữa các phiên bản .Net. Mặc dù có hỗ trợ nhưng có vẻ như không hoàn toàn thì phải.
-
lisp này của ku LM chỉ được mỗi cái ý tưởng (cho cad đời thấp). còn cách thực hiện thì có thể đánh giá là tồi bởi lẽ nó liên tục tao ra rồi lại xóa đi các đối tượng text để hiển thị thông tin. => chậm + phát sinh dữ liệu mới vô nghĩa vào bản vẽ.
Các bản cad mới cung cấp tính năng hiển thị thông tin đối tượng ngon lành hơn (dù chả mấy khi dùng, chỉ thấy vướng). Tuy nhiên có một số thông tin về đối tượng mà đôi khi chúng ta cần tra nhưng không khai thác được từ những gì cad cung cấp thì có thể dùng cách này. Chẳng hạn:
- tra nhanh thông tin xdata của đối tượng (đối tượng có xdata hay không, có những kiểu xdata gì...)
- kiêm tra đối tượng có liên kết vào 1 reactor hay không, data của reactor đó là gì...
- tra nóng thông tin cao độ đường đồng mức, cao độ lưới tam giác tại vị trí con trỏ chuột...
- ...v.v
Tất nhiên không thể làm theo cái cách mà Lm đã làm. nên sử dụng vector tạm để hiển thị thông tin thì hay hơn. Mình dùng cách này thấy chấp nhận được.
-
1
-
-
:D haha. Bạn này khai quật được cái topic hơn 2 năm trước của mình. làm mình nhớ con bé quá :">
Tùy vào cách cảm nhận của bạn thôi, với bọn trẻ thì những khung hình nhiều màu sắc tơi tắn sẽ càng làm tôn lên sự trong sáng đáng yêu của chúng. đó là cảm nhận riêng của mình
-
ý tưởng hay đấy. bạn viết đi
-
Lệnh Wipeout gốc chỉ dùng được với pline colsed và không chứa arc. Đây là 1 khiếm khuyết của autodesk chăng? Cái pline của bạn dù kín nhưng vẫn open chứ không closed. Có thể h/c lisp để chuyển từ pline kín mà open sang closed thì dùng được, nhưng hơi vất vả tí.
Hiểu biết của bạn bị khiếm khuyết chứ không phải autodesk khiếm khuyết.
Đối tương wipeout bản chất là 1 raster. Nó tương tự như image. người ta không thể tạo được 1 bức ảnh có biên cong hoặc biên không đóng. Wipeout cũng vậy.
-
1
-
-
Cái này khó đấy. Mình đang nghiên cứu cách đưa tỷ lệ (annotation scale) vào đối tượng, hay nói cách khác là mình muốn make được các đối tượng có chứa thuộc tính annotative. cách thức của nó cũng giống hệt như điều bạn muốn làm, nhưng hiện tại mình chưa thành công. Đây là công việc phải can thiệp vào DICTIONARY và Xrecord. sam8xd cứ nghiên cứu đi nhé, có gì chúng ta cùng trao đổi thông tin
-
Có hàm make wipeout rồi mà bạn. vấn đề chỉ là bạn xử lý hatch và bock của bạn như thế nào thôi
-
Đặt gạch hóng phát. đang cần, chờ bác Hà ra là múc luôn :ph34r:
-
Nó nằm trong phần ActiveX and VBA reference. Các hàm VLA-* chính là các Methods của VBA được viết sang ngôn ngữ lisp. bạn hỏi thêm google để nhận được hướng dẫn cụ thể hơn vì nói đến mấy hàm này thì dài dòng lắm, mà chưa chắc mình đã nói đúng :D
-
1
-
-
Mình tình cờ phát hiện ra Vlide xác nhận các chuỗi variant-value và safearray-value là các chuỗi được bảo vệ. ban đầu mình tưởng chúng là các hằng hoặc các đối số của các hàm Vla hay Vlax nhưng kiểm tra lại thì không phải. Chúng chính xác là các hàm. Và chúng tương đương với 2 hàm lần lượt là vlax-variant-value và vlax-safearray->list. Nghĩa là sử dụng như nhau, chả thấy khác tẹo nào (không fải kiểu như vlax-invoke nhé, mình mới chỉ kiểm thử với một vài kiểu variant và safearray, chưa kiểm tra hết).Tìm trong help thì không thấy đả động gì đến 2 thằng này.
Bằng cách trên thì mình cũng đã tìm ra rất nhiều hàm kiểu như 2 hàm trên và có tính chất tương đương với các hàm vlax khác. Như vậy là đã có một số thứ Autodesk đã không công khai cho người dùng. Có bác nào có thông tin gì về việc này không? mình tìm trên mạng thấy mù mờ quá.
-
Uh, Mình cũng mới phát hiện ra điều này. Cứ tưởng ngon rồi cứ thế mà xơi, kú thật :(
-
Một hàm mình hay dùng để thay thế hàm alert là (Acet-ui-message "noi dung thong bao" "tieu de" flags), vì nó đẹp: Hàm này tạo 1 hộp thoại thông báo như hàm alert nhưng với nhiều lựa chọn hơn: OK, Cancel, Abort, Retry, Ignore.. Có kèm âm thanh và các icon cảnh báo đặc trưng từ thư viện shell32 của window.
[Tham số flags = Base types + Icons +Default buttons]Base types
0 = Acet:OK
1 = Acet:OKCANCEL
2 = Acet:ABORTRETRYIGNORE
3 = Acet:YESNOCANCEL
4 = Acet:YESNO
5 = Acet:RETRYCANCEL
Icons
16 = Acet:ICONSTOP
32 = Acet:ICONQUESTION
48 = Acet:ICONWARNING
64 = Acet:ICONINFORMATION
Nút chọn mặc định
0 = Acet:DEFBUTTON1
256 = Acet:DEFBUTTON2
512 = Acet:DEFBUTTON3
768 = Acet:DEFBUTTON4
Giá trị trả về tùy theo lựa chọn khi nhấn nút chọn
1 = Acet:IDOK
2 = Acet:IDCANCEL
3 = Acet:IDABORT
4 = Acet:IDRETRY
5 = Acet:IDIGNORE
6 = Acet:IDYES
7 = Acet:IDNO
8 = Acet:IDCLOSE
9 = Acet:IDHELP
Định nghiên cứu viết lại thì thấy thằng lee-mac nó viết từ đời nào rồi. Quăng link của nó qua đây cho các bác tham khảo. http://www.lee-mac.com/popup.html
-
Mình bắt buộc phải dùng Visual lisp để xóa xdata của đối tượng. Nếu dùng Entmod của autolisp thì đơn giản, nhưng với visual thì thấy khó quá. Nhờ các bác trợ giúp
-
-
Vì hàm con VxGetTextStyles đã trả về 1 dotted pair rồi nên trong hàm chính ta cũng không cần phải dùng vòng lặp Foreach để duyệt qua từng phần tử mà lúc này ta chỉ cần dùng hàm assoc . Code sẽ ngắn gọn hơn.
Chả cần phải là dotted pair list mới dùng được hàm assoc. list bình thường có các phần tử là list cũng dùng được mà bác.
-
Mình đã nghĩ rằng không thể làm được nó. nhưng khi bạn đưa lên Clip đầu tiên thì mình đã thấy có cơ sở để thực hiện được. Nhìn qua các even bạn sử dụng thì đúng là cùng 1 thuật toán để giải, có thể khác nhau chút xíu.
@ketxu: bạn cứ vẽ nhiều thì sẽ thấy lệnh SX mình viết trên là cần thiết. Nếu chưa bao giờ dùng cách này để select đối tượng thì sẽ nghĩ rằng không cần nó bởi chúng ta quen với việc select theo cách khác rồi. Nhưng nếu dùng quen thì thấy...sướng! đỡ được tương đối nhiều thời gian cho việc select đối tượng. Bản thân các lệnh hỗ trợ chọn đối tượng nhanh của cad cũng không có lựa chọn để select loại đối tượng này nên việc viết nó là cần thiết chứ.
Vấn đề dim thì có thể sửa khá đơn giản. nhưng dùng cho các lệnh của ngôn ngữ khác thì chắc là chịu rùi. thôi đành vậy
-
Vừa kiểm tra lại phản hồi của Ketxu. Như vậy có lẽ là với các đối tượng phức thì gặp vấn đề. để mai mình kiểm tra lại vậy. :(
-
he he. Mình post ẩu khi copy không đúng biến. đã sửa
Đọc qua đoạn này của bạn ở bài trước: start lisp - invoke command (trong lisp) - end lisp - end command (ngoài lisp). thì có vẻ như bạn cũng có hướng đi giống như mình để giải quyết vấn đề nan giải này nhỉ. nhức hết cả đầu với nó.
-
hà hà. chương trình của Detailing đạt 99% rồi. 1% còn lại hỏng khi có bước 4. cái này lúc trước bạn đã làm được nên mình đoán là có thể sửa được.
Vừa hay mình cũng viết xong bằng lisp. Lệnh này thực hiện công việc tưởng chừng đơn giản nhưng không ngờ viết lại phức tạp vậy. đây là lisp khiến mình vất vả nhất để nghĩ ra thuật toán kể từ khi viết lisp đến giờ. Mình phải kết hợp cả 2 ý tưởng của mình và của Detailing mới ra được kết quả này.
;;; Copyright 2012 Thaistreetz from Cadviet.com (vl-load-com) (defun C:SX (/ list->ss last-en lst) (defun list->ss (lst / ss) (setq ss (ssadd)) (foreach s lst (ssadd s ss))) (if *New-object* (progn (setq last-en *New-object* lst (list *New-object*)) (while (setq last-en (entnext last-en)) (setq lst (cons last-en lst))) (sssetfirst nil (list->ss lst))) (prompt "** Khong co doi tuong moi nao duoc tao **")) (if *Reactor-CmdStart* (or (vlr-added-p *Reactor-CmdStart*) (vlr-add *Reactor-CmdStart*) (setq *Reactor-CmdStart* (vlr-editor-reactor "Editor Reactor: Command Start" '((:vlr-Lispwillstart . Callback-CmdStart)(:vlr-commandwillstart . Callback-CmdStart))))) (setq *Reactor-CmdStart* (vlr-editor-reactor "Editor Reactor: Command Start" '((:vlr-Lispwillstart . Callback-CmdStart)(:vlr-commandwillstart . Callback-CmdStart))))) (princ)) ; Callback defun (foreach x (cdar (vlr-reactors :vlr-editor-reactor)) (if (= (vlr-data x) "Editor Reactor: Command Start") (vlr-remove x))) (setq *Reactor-CmdStart* (vlr-editor-reactor "Editor Reactor: Command Start" '((:vlr-Lispwillstart . Callback-CmdStart)(:vlr-commandwillstart . Callback-CmdStart)))) (defun Callback-CmdStart (reactor lst) (vlr-remove reactor) (if *Reactor-Append* (or (vlr-added-p *Reactor-Append*) (vlr-add *Reactor-Append*) (setq *Reactor-Append* (vlr-acdb-reactor "Acdb Reactor: Select The new Objects" '((:vlr-objectAppended . Callback-objectadd))))) (setq *Reactor-Append* (vlr-acdb-reactor "Acdb Reactor: Select The new Objects" '((:vlr-objectAppended . Callback-objectadd))))) (if (eq (vlr-current-reaction-name) :vlr-commandwillstart) (setq *Cmdstart* T) (setq *Cmdstart* nil))) ;end (defun Callback-objectadd (reactor object) (vlr-remove reactor) (setq *New-object* (cadr object)) (if *Cmdstart* (if *Reactor-CmdEnd* (or (vlr-added-p *Reactor-CmdEnd*) (vlr-add *Reactor-CmdEnd*) (setq *Reactor-CmdEnd* (vlr-editor-reactor "Editor Reactor: Command End" '((:vlr-commandEnded . Callback-CmdEnd) (:vlr-commandCancelled . Callback-CmdEnd) (:vlr-commandFailed . Callback-CmdEnd))))) (setq *Reactor-CmdEnd* (vlr-editor-reactor "Editor Reactor: Command End" '((:vlr-commandEnded . Callback-CmdEnd) (:vlr-commandCancelled . Callback-CmdEnd) (:vlr-commandFailed . Callback-CmdEnd))))) (if *Reactor-CmdStart* (or (vlr-added-p *Reactor-CmdStart*) (vlr-add *Reactor-CmdStart*) (setq *Reactor-CmdStart* (vlr-editor-reactor "Editor Reactor: Command Start" '((:vlr-Lispwillstart . Callback-CmdStart)(:vlr-commandwillstart . Callback-CmdStart))))) (setq *Reactor-CmdStart* (vlr-editor-reactor "Editor Reactor: Command Start" '((:vlr-Lispwillstart . Callback-CmdStart)(:vlr-commandwillstart . Callback-CmdStart))))))) ;end (defun Callback-CmdEnd (reactor lst) (vlr-remove reactor) (if *Reactor-CmdStart* (or (vlr-added-p *Reactor-CmdStart*) (vlr-add *Reactor-CmdStart*) (setq *Reactor-CmdStart* (vlr-editor-reactor "Editor Reactor: Command Start" '((:vlr-Lispwillstart . Callback-CmdStart)(:vlr-commandwillstart . Callback-CmdStart))))) (setq *Reactor-CmdStart* (vlr-editor-reactor "Editor Reactor: Command Start" '((:vlr-Lispwillstart . Callback-CmdStart)(:vlr-commandwillstart . Callback-CmdStart)))))) ;end
Lisp này sẽ chọn được các đối tượng mới tạo của lệnh cuối cùng bất cứ lúc nào người dùng muốn. không phải lo việc đánh dấu thủ công trước khi có nhu cầu chọn.
Các bác dùng thử xem nó có vướng phải vấn đề nào mà mình chưa ngờ tới hay không. Mình không có điều kiện để kiểm tra với các đối tượng tạo bằng lệnh của các ngôn ngữ lập trình khác nên chưa biết nó có chạy được không. còn với lệnh của cad hoặc lệnh lisp thì thấy có vẻ ổn rồi. Cảm ơn Detailing rất nhiều về đóng góp ý tưởng của bạn.
-
1
-
2
-
-
Bạn xem lại xem có post nhầm file không. mình down về dùng với 5 bước như trên nó vẫn chọn đủ đám 7 đối tượng bình thường,
Các lệnh mình đã dùng:
- Line (command) : bước 1
- Copy (command trong lisp) : bước 2 và 3 (defun C:C (/ SS) (if (setq SS (ssget))(vl-cmdf "Copy" SS "" "M")(vl-cmdf "Copy" "P" "" "M"))(princ))
- Move (command) :bước 4
Hoặc có thể thuật toán hay ngôn ngữ của bạn dùng không ổn định với các đời cad. mình dùng cad 2010 .net3
-
1
-
-
Bức xúc với việc fải lòng vòng để bật tắt wipeout bằng lệnh wipeout của cad và việc nó cứ tự động thêm 1 bước regen bản vẽ khi thực hiện thao tác bật hoặc tắt, bản vẽ nhẹ thì không sao chứ bản vẽ nặng thì cứ việc ngồi chờ dài cổ. Thế nên mình viết lại lệnh này cho dễ dùng hơn. Tặng các bạn dùng chơi.
;;; Copyright 2012 Thaistreetz from Cadviet.com (defun c:wr (/ entmod-en ss->list en) (defun entmod-en (code value en / elist) (entmod (subst (cons code value) (assoc code (setq elist (entget en '("*")))) elist))) (defun ss->list (ss / i lst) (if ss (repeat (setq i (sslength ss)) (setq lst (cons (ssname ss (setq i (1- i))) lst))))) (if (not (setq en (dictsearch (namedobjdict) "ACAD_WIPEOUT_VARS"))) (prompt "<< Khong co doi tuong Wipeout nao trong ban ve >>") (progn (if (= (cdr (assoc 70 en)) 0) (progn (entmod-en 70 1 (cdr (assoc -1 en))) (prompt ": << Bat Wipeout >>")) (progn (entmod-en 70 0 (cdr (assoc -1 en))) (prompt ": << Tat Wipeout >>"))) (foreach en (ss->list (ssget "x" '((0 . "WIPEOUT,INSERT")))) (entupd en)))) (princ))Bật và tắt đều dùng 1 lệnh duy nhất WR. không phải regen bản vẽ nên em nó nuột hơn hàng của Cad nhiều :D
-
5
-
-
Cảm ơn Detailing đã nhiệt tình với topic của mình. Tuy nhiên lần này cũng vẫn chưa đạt yêu cầu. không biết có sự khác biệt nào giữa máy của bạn và máy của mình (Cad 2010) hay không? tuy nhiên trên máy của mình tập hợp đối tượng được chọn sau khi gõ lệnh zz vẫn cứ là tập hợp đối tượng được tạo của rất nhiều lênh trước đó.
Cụ thể khi mình test với ví dụ 5 bước như bài số #15 thì tại bước 5 gõ lệnh zz chương trình chọn luôn đủ 7 đối tượng. không fải chỉ 4 đối tượng cuối cùng.
-
Các chế độ bắt điểm của cad được quy định bằng các bitcode như sau:
0 NONe
1 ENDpoint
2 MIDpoint
4 CENter
8 NODe
16 QUAdrant
32 INTersection
64 INSertion
128 PERpendicular
256 TANgent
512 NEArest
1024 Clears all object snaps
2048 APParent Intersection
4096 EXTension
8192 PARallel
Tại 1 thời điểm bạn có thể thiết lập nhiều chế độ bắt điểm cùng lúc. khi đó giá trị của biến Osmode sẽ bằng tổng các bitcode tương ứng của các chế độ bắt điểm trên
Ví dụ. nếu bạn thiết lập đồng thời 2 chế độ bắt điểm: ENDpoint và CENter thì biến Osmode sẽ có giá trị là 1+ 4 =5
-
2
-
-
Cách mà bác hỏi người ta dùng cho thời trước năm 2000 khi mà chưa có Vlisp hỗ trợ viết code, bằng cách đặt các hàm bẫy lỗi trong code. tuy nhiên đó vẫn là cách làm rất cực khổ cho lập trình viên.
còn giờ chúng ta cách thời đó những 13 năm và chúng ta có Vlisp. Mình hướng dẫn sơ qua:
- bác dùng Vlisp để viết code. (gõ lênh vlide trong cad)
- tại cửa sổ vlisp editor, bác nghi ngờ chỗ nào lỗi thì đặt con trỏ vào vị trí đầu hàm rồi bấm F9 để tạo 1 BreakPoint. hiểu nôm na thì nó là 1 điểm dừng cho quá trình chạy lisp.
- tải code từ vlisp editor vào bản vẽ bằng cách gõ lệnh tắt Ctrl+alt+E hoặc bấm chuột vào nút tren menu có hình bình hành và 1 mũi tên chỉ xuống để load (tooltip của nút đó là load active edit window. bác thông cảm, mình ngại chụp hình)
- trở về cửa sổ cad. bác gõ tên lệnh, chương trình sẽ chạy đến điểm BreakPoint thì dừng lại. (tất nhiên nếu nó chưa gặp lỗi trước đó)
- lúc này cửa sổ vlisp editor mặc định được gọi, trên menu bác tìm nút có tooltip "watch window", bật nó lên
- trong cửa sổ hiện ra bác bấm tiếp nút addwatch, bấm mũi tên chọn *last-value* <- đây là giá trị trả về sau khi mỗi hàm autolisp được thực hiện. ngoài ra bác có thể gõ tên các biến hoặc 1 đoạn code gồm các hàm và các biến vào đây và chọn OK để đưa vào danh sách theo dõi giá trị trả về.
- OK, để nguyên cái cửa sổ watch đấy. quay lại code của bác ở vlisp editor. bác bấm nút có tooltip "step to" để chạy phần còn lại của code từng bước 1 đồng thời theo dõi giá trị của *last-value* ở cửa sổ watch. cứ thế bấm cho đến khi gặp lỗi, hàm dừng lại, nó sẽ giữ con trỏ chuột và bôi đen hàm bị lỗi. sau đó xử lý thế nào thì tùy bác.
1 vài chú ý:
- nên đặt breakpoint ngay đầu code nếu không đoán được nó lỗi ở đâu. có thể đặt vài điểm breakpoint 1 lần.
- cần tìm hiểu cách sử dụng linh hoat 3 nút "step to" "step out" "step over" để có thể tìm thấy lỗi nhanh nhất.
- khi kiểm tra lỗi bằng cách này. các hàm không tên tạo bằng hàm lambda cần fải được đặt trong hàm function, nghĩa là: không được viết thế này '(lambda ...) mà fải viết thế này (function (lambda...)) thì mới kiểm tra được các giá trị trả về trong quá trình chạy hàm không tên.
- bật và tắt điểm breakpoint đều dùng chung 1 phím F9.
.... và rất nhiều vấn đề nữa, nhưng mình chỉ nói đến đây thôi. bác tự tìm hiểu thêm
-
3
-
[Yêu cầu] Lisp insert field file name bỏ đi một số ký tự
trong AutoLisp
Đã đăng · Trả lời báo cáo
=)) nửa đêm đọc bài này của bạn chủ thớt cười như điên!
Bạn Chủ thớt đâu rồi, mau vào giúp đỡ bạn chủ thớt đi =))
có fải bài này được tách ra từ topic khác không nhỉ? :lol: