-
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
-
-
Cái này dễ màchọn dt
dùng lệnh Pedit chuyển qua SPL
Việc vẽ 1 Spline bằng lệnh SPL qua các đỉnh của 1 pline hoàn toàn khác với việc Convert 1 pline sang Spline bằng lệnh PEdit, hàm số biểu diễn 2 đuờng này là khác nhau
-
Nói chung là ok, chỉ thi thoảng mới gặp phải kiểu 1 ; pick mà ko xuất hiện đường bao do lệnh Boudary tạo ra, nên có khi pick đi pick lại 1 vùng(nếu ko nhầm đã lỗi thì cái phần diện tích ấy cũng ko đúng)Trường hợp thứ 2 là kiểu 1 vùng giao giữa các đường, chắc chắn là vùng kín, nhưng pick xong thì đường bao tạo ra lại bao ra cả các phần bên ngoài
Cái này là một lỗi cực kỳ khó hiểu của lệnh Boudary. Mình gặp trường hợp này khá nhiều rồi. nhất là khi bo diện tích trắc ngang của nova. Không đơn giản là do miền kín đc tạo bởi Spline như phamngoctu nói ở trên đâu. Các đối tượng được tạo ra trên trắc ngang nova hoàn toàn là 2D polyline và line nhưng vẫn cứ bị lỗi này như thường (thỉnh thoảng mới dính thôi nhé :D )
Gặp trường hợp này thì chỉ có cách là dùng lệnh fatten cho các đối tượng bao miền kín đó rồi bo lại là đc. Trong 1 vài trường hợp mình tắt 1 vài layer không liên quan cũng thấy có hiệu quả. Cực kỳ khó hiểu :iluvyousmiley:
-
1
-
-
2- Chỗ này ssg không hiểu, sao lại phải lằng nhằng như vậy? Cứ theo đúng quy ước vế path trong lisp.Ví dụ: bạn có file exe ở "D:\vi du\vncalc.exe"
thì cứ (startapp "D:\\vi du\\vncalc.exe") là nó chạy phà phà! Thử là biết liền mà?
Việc các hàm lisp thường trả về đường dẫn dạng "\\" gây ra nhiều khó khăn trong quá trình sử dụng nên buộc phải chuyển về dạng "/". một vài lần em gặp phải trường hợp này khi lập trình điều khiển DCL. Có thể bạn PhanThanhTu cũng đã rơi vào trường hợp như em từng gặp. Em nghĩ không phải tự nhiên mà autolisp sinh ra 2 cách nhận diện đường dẫn file bác ạ
-
Mình đang có ý tưởng sử dụng lệnh startapp để chạy một đoạn modun chương trình ở bên ngoài, có thể ở dạng EXE-DLLNhư thế vừa chuyên môn hoá đc những công vịệc mà Lisp khó làm , đóng gói dễ dàng
Tuy nhiên, thứ nhất là vấn đề đường dẫn, có thể chúng ta đặt file LSP và EXE trong cùng một thư mục
Khi người dùng chạy lệnh được đặt thông qua Defun c:command trong lsp sẽ gọi hàm startapp
Giờ có 2 khó khăn ở đây:
-Lấy đường dẫn của LSP và EXE (giống nhau vì đặt cùng 1 thư mục): cái này mình có cách là đọc registry nhưng mình nghĩ không hay lắm, vì nó sẽ lấy giá trị của tệp LISP cuối cùng được Load vào thông qua lệnh AP ( đọc khóa
(setq K (strcat
"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\"
"CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU\\*"
))
Không biết có cách nào hay hơn không??
-Thứ 2 , việc chuyển đổi từ đường dẫn tìm ra ví dụ D:\LISP CONG VIEC\2010\LISP-HAY\
sang đường dẫn cho lệnh startapp mình chưa hiểu lắm )D:\\LISP CONG VIEC . D:/ LISP CONG VIEC???
Nếu được bạn nào có thể viết hộ 1 đoạn lisp chuyển đổi này thì tốt quá
Trong trường hợp có dấu cách có bị hiểu lầm là Enter hay không???
Mong các bạn nghiên cứu và giải đáp hộ mình
Bạn tham khảo các hàm Acet-filename-xxxx, và các hàm trong thư viện DosLib thử xem (fiên bản mới nhất là 8.3 hỗ trợ cad2007 trở lên, với cad đời cũ hơn thì dùng fiên bản 6.1.5)
Việc chuyển đổi đuờng dẫn bạn có thể sử dụng 1 hàm thay thế chuỗi trong 1 chuỗi nào đó. hàm kiểu này thì nhiều rồi. ACET-STR-REPLACE chẳng hạn
-
Em siêu tầm được cái lisp chọn nhiều layer nhưng khi sử dụng, đối tượng được chon không thể hiện (thông thường trong cad khi đối tượng được chon sẽ thể hiện nét đữt),nên không biết layer đó mình đã chọn hay chưa? Mọi người chỉnh sửa lại giúp.(defun C:SLL (/ e lay ss layl)
(setq layl ""
ss (ssadd)
)
(while (setq e (nentsel "\nSelect entity on a layer : "))
(setq layl (strcat layl "," (cdr (assoc 8 (entget (car e))))))
) ;while
(setq layl (substr layl 2))
(if (> layl "")
(setq ss (ssget "_X" (list (cons 8 layl))))
)
(if (zerop (getvar "CMDACTIVE"))
(progn (sssetfirst ss ss)
(princ "Use 'P' for this selection set: ")
)
)
ss
)
(princ "\nVTH")
(princ)
Thay đoạn code này
(setq layl ""
ss (ssadd)
)
(while (setq e (nentsel "\nSelect entity on a layer : "))
(setq layl (strcat layl "," (cdr (assoc 8 (entget (car e))))))
) ;while
Bằng đoạn code này
(setq layl "" ss (ssget) i 0)
(repeat (sslength ss) (setq layl (strcat layl "," (cdr (assoc 8 (entget (ssname ss i))))) i (1+ i)))
(setq ss (ssadd))
PS: xoá 2 biến định nghĩa thừa là e và lay ở dòng đầu tiên nữa nhé
-
1
-
-
Cái này băn khoăn lâu rồi, nhưng thấy nó chưa ảnh hưởng nghiệm trọng lắm nên hôm nay mới hỏi mọi người :Mình có chương trình con thế này :
(Defun TinhDT(ds)
(Foreach pt ds
(Command "AREA" "O" pt)
(Setq DT(Getvar"AREA")
TDT(+ TDT DT))
)
(Princ(Strcat"\n Total Area =" (Rtos TDT 2 2) " m2"))
(Princ))
;-----------------------------------------------------
Để không ghép vào chương trình chính thì chạy ngon, nhưng muốn khai báo cho rõ ràng biến cục bộ để dễ kiểm soát thì gặp lỗi Too Few argument :
Mình sửa thế này đây (Defun TinhDT(ds / pt DT)....Các cao thủ chỉ giáo giúp mình với !
trong đoạn code trên của bạn thì pt không thể định nghĩa là biến cục bộ đc. nó có thể gọi là 1 "biến tạm", đuợc hàm foreach tạo ra trong mỗi vòng lặp. biến này đuợc giải phóng ngay khi foreach kết thúc.
với hàm trên thì có thể định nghĩa các biến DT và TDT là biến cục bộ.
PS: bạn viết thừa 1 biến DT không cần thiết, nên viết thế này : (setq TDT (+ TDT (getvar "area")))
-
2
-
-
-
Nếu về quan niệm lập trìnhTạo đối tượng wipeout không thông qua command có sẵn của Cad đối với VBA là khó , Lisp thì mình ko dám chắc lắm
Bởi lẽ không có đối tượng được hỗ trợ nào trong Vba cad có nghĩa là wipeout và lisp cũng vậy
đối tượng này đc tạo qua việc load object arx Wipeout , mà việc sử dụng cái này thì mình chưa rõ lắm :iluvyousmiley:
Chắc chỉ còn cách chuyển tất cả về pline rồi phải dùng lệnh Wipeout có sẵn thôi, mặc dù chưa cảm thấy thỏa mãn lắm :D
Đối tuợng wipeout có record dữ liệu mô tả rất rõ ràng (mình thử với cad2010). như vậy về nguyên tắc hoàn toàn có thể sử dụng hàm entmake để tạo ra 1 đối tuợng WIPEOUT. Tuy nhiên theo như mình hiểu thì đây lại là 1 đối tuợng phức và mỗi 1 đối tuợng wipeout có 1 UCS riêng. việc chuyển đổi toạ độ các đỉnh của wipeout cần tao từ UCS hiện hành sang UCS của chính wipeout đó thực sự là khá phức tạp và nhức đầu. Thôi thì cứ chơi hàm command cho lành, lisp chạy chậm 1 chút nhưng code đơn giản dễ đọc, dễ hiểu, dễ sử dụng. đỡ mệt mỏi với mấy cái ma trận biến đổi tọa độ. Mình thấy ngay cả các lisp trong express tool họ cũng chỉ xài hàm command
-
Tiếp nhé:
(ACET-GROUP-MAKE-ANON
"Description")Tạo group không tên. (với chú thích Description do người dùng đưa vào)
(ACET-GEOM-PIXEL-UNIT)
Không tham số, Trả về tỷ lệ giữa chiều dài tính theo đơn vị bản vẽ và 1 pixel độ phân giải màn hình.
(ACET-GEOM-OBJECT-POINT-LIST ename [-1,0,1])
Trả về list tọa độ các đỉnh của curve. tham số [-1; 0; 1] chỉ có ý nghĩa với các đường cong. nếu tham số này = -1, hàm sẽ chia đường cong thành các đoạn nhỏ và lấy ra tọa độ các đỉnh chia đó.
(ACET-GEOM-OBJECT-END-POINTS ename)
Trả về tọa độ các điểm cuối của *Line,Cicle, Elip...
(ACET-GEOM-MTXTBOX [nmbr offset] [entget..])
Trả về tọa độ 4 điểm của Mtextbox có xét đến hệ số offset
(ACET-FILENAME-ACAD-ROOT)
Không tham số. trả về đường dẫn thư mục cài đặt của cad hiện hành
(ACET-FILE-REMOVE "filename")
Xóa 1 file, tham số là đường dẫn đầy đủ (gồm cả phần mở rộng) của file cần xóa
(ACET-EXPLODE ename)
Phá khối đối tượng phức (block, pline...) và trả về tập hợp chọn của các đối tượng tạo ra sau khi phá khối.
(acet-currentviewport-ename)
không tham số. trả về ename của viewport hiện hành
Các bạn có thể nghiên cứu bổ xung thêm các hàm thư viện acet bằng cách nghiên cứu bộ express tool của cad. tốt nhất là dùng vlide tạo 1 project chứa toàn bộ các lisp trong bộ express tool để dễ dàng tra cứu.
-
6
-
-
@Thiep : Đang nóng lòng chờ bác cập nhật tiếp đây này ^^Cái hàm (acet-geom-intersectwith en1 en2 flag) thay được cho đoạn lisp GiaoDT của bác Hoành đấy mọi người nhỉ ?!
Bác Thiệp đi vắng rồi, để mình tiếp vậy
(acet-geom-intersectwith EN1 EN2 flag)
Trả về list giao điểm của 2 đối tượng curve. Tham số flag có giá trị từ 0-3
flag = 0 : Chỉ lấy giá trị các điểm giao thực giữa 2 curve
flag = 1 : lấy giá trị các điểm giao thực và các điểm giao ảo nếu có khi extend EN1 đến EN2
flag = 2 : lấy giá trị các giao điểm thực và các giao điểm ảo nếu có khi extend EN2 đến EN1
flag = 3 : lấy tất cả các giao điểm thực và ảo nếu có khi extend cả 2 đối tượng EN1 và EN2 với nhau
Thứ tự giao điểm sắp xếp lần lượt theo chiều của EN1
(ACET-UI-ENTSEL (list "string" [flags initget] [initget keywork] [T or nil] 'filter [T or nil])
Hàm chọn đối tượng kèm theo điều kiện rẽ nhánh trước khi chọn. Trả về tập hợp ename các đối tượng đc chọn, hoặc kết quả rẽ nhánh khi nhập vào 1 ký tự từ bàn phím. list tham số gồm:
- "string" : thông báo điều kiện rẽ nhánh
- flags initget: bit code
- initget key work: kết quả trả về tương tứng với các ký tự đc nhập
- T or nil 1: điều kiện cho phép chọn chỉ 1 hay nhiều đối tượng.
- 'filter: điều kiện lọc
- T or nil 2: điều kiện cho phép chọn đối tượng thuộc layer bị khóa hay không
(ACET-UI-SINGLE-SELECT '(filter) lockOk)
Hàm này áp dụng các chế độ lọc Filter giống như (ssget) để chọn 1 đối tượng duy nhất và trả về ename của nó. Nếu tại vị trí pick chuột không tìm thấy đối tượng nào thì hàm tự chuyển sang trạng thái multiple select giống như (ssget) nhưng sẽ chỉ trả về ename của đối tượng đầu tiên thỏa mãn điều kiện lọc được tìm thấy. Hàm chỉ kết thúc khi chọn được đối tượng thỏa mãn hoặc nhấn space
VD: (acet-ui-single-select '((0 . "TEXT")) nil)
lockOk = T : cho phép chọn đối tượng thuộc layer bị khóa, lockOK = nil: ngược lại
(ACET-UI-TXTED "nội dung tạm" "title")
hiện cửa sổ soạn thảo giống lệnh RText với tille tùy người dùng. trả về nội dung soạn thảo
(AcetRText:modify ename [T or nil])
Edit Rtext
(ACET-STR-FIND string1 string)
kiểm tra xem chuỗi string có chứa chuỗi string1 không, nếu có hàm trả về vị trí đầu tiên tìm thấy của trong chuỗi string.
(ACET-STR-M-FIND string1 string)
Tương tự ACET-STR-FIND, nhưng kết quả trả về tất cả các vị trí được tìm thấy của string1
(ACET-STR-REPLACE "A" "B" "C")
Tìm và thay thế 1 các chuỗi giống "B" nhau trong một chuỗi "C" bởi 1 chuỗi khác "A"
(ACET-SS-CONVERT-ELLIPSES-TO-PLINES ss)
Convert đối tượng tất cả các đối tượng elipe nếu có của 1 tập hợp chọn thành pline. tham số là tập hợp chọn ssget. trả về tên tập hợp chọn selection set
(ACET-SS-CLEAR-PREV)
Xóa tập hợp chọn Previous ra khỏi bộ nhớ tại thời điểm hàm thực thi. Không tham số, luôn trả về nil
-
3
-
-
Chức năng tìm kiếm của diễn đàn hình như đang bị lỗi.
Mình post lại lisp của bác ssg cho bạn
;;*********************************************************** ;;;CONVERT TO PLINES PROGRAM WITH FULL COMMENTS! ;;;Convert all objects: Line, Pline, Spline, Arc, Circle, Ellipse_ ;;;to Plines. Length of 1 segment is specified by user ;;;Copy & Paste to Notepad, Saveas *.lsp, Appload then Type C2P to run ;;;Happy New Year 2008! ;;;Written by ssg - January 2008 - www.cadviet.com ;;;*********************************************************** ;;;------------------------------------------------------------- (defun makepl ( e d1 / ps pe d d2 p2);;;Make pline along curve e. Length of 1 segment = d1 (vl-load-com);;;Load Visual LISP extensions before use vlax-xxxx functions (setq ps (vlax-curve-getStartPoint e);;;Start point pe (vlax-curve-getEndPoint e);;;End point d (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e));;;Length of curve e d2 d1;;;Init variable distance ) (command "pline");;;Call pline command (command ps);;;Start point (while (<= d2 d);;;While not over end point pe (setq p2 (vlax-curve-getPointAtDist e d2));;;Variable point at d2 = length along curve (command p2);;;Continue pline command from current point to p2 (setq d2 (+ d2 d1));;;Increase distance d2 by d1 );;;End while (command pe "");;;Pline to pe and finish command ) ;;;------------------------------------------------------------- (defun C:C2P( / d1 ss oldos i e ans);;;Convert to Plines (if (not d0) (setq d0 0.5));;;Init dividual distance, global variable (setq d1 (getreal (strcat "\nLength of 1 segment <" (rtos d0) ">:")));;;Input distance (if d1 (setq d0 d1) (setq d1 d0));;;Reset or get distance (setq ss (ssget '((0 . "LINE,LWPOLYLINE,SPLINE,ARC,CIRCLE,ELLIPSE")));;;Selection set oldos (getvar "osmode");;;Save osmode i 0;;;Init counter ) (setvar "osmode" 0);;;Disable osmode (repeat (sslength ss);;;Repeat for all entities in ss (setq e (ssname ss i));;;Set e for entity with ordinal i in selection set ss (makepl e d1);;;Use makepl function. Make pline along e (setq i (1+ i));;;Increase counter ) (initget "Y N");;;Init keywords (setq ans (getkword "\nDelete source objects? [Yes/No] :"));;;Get answer from user (if (= ans "Y") (command "erase" ss ""));;;Erase source objects if ans = "y" or "Y" (setvar "osmode" oldos);;;Reset osmode (princ);;;Silent quit ) ;;;-------------------------------------------------------------
-
2
-
-
Vì wipeout chỉ làm việc với pline đóng và được cấu tạo bởi hoàn toàn là các đoạn thẳng nên có thể dùng xử lý trường hợp này bằng cách vẽ lại đường pline (gồm cả các đoạn cong) hoặc spline bằng 1 đường Pline được chia nhỏ bởi các đoạn thẳng (độ dài các đoạn thẳng đó là tùy ý người dùng). Lisp này trên diễn đàn có rất lâu rồi thì phải, bạn chịu khó search sẽ ra thôi. Mình cũng hay dùng cách này
-
nói rồi đấy thôi. chưa hiểu à?
-
Ê hungtv0102: mày thử hỏi thằng cho mày cái lisp này xem, với 2 phút nó có sửa được cho mày không?
mịa, ngu lại cứ tỏ ra nguy hiểm
-
Em cảm ơn anh Bình đã giúp em sửa hộ ceddtu nha :)
@ceddtu: Đây là lisp đầu tay của mình, (nói đúng hơn là mình sửa từ 1 lisp của người khác) học hành bài bản, không sách vở, học từ ngọn xuống gốc nên cái lisp này nỏ rác lắm, mỗi lần thấy nó là mình lại ngại sửa. hề hề, thế nên bạn tự nghiên cứu nó để tự sửa cho đúng ý bạn đi nhé.
Topic này mình post lại 1 cái lisp tương tự nhưng không cần phải dùng thêm block ngoài nữa. bạn có thể tham khảo thêm
-
2
-
-
haizzz
Nếu 1 lúc nào đó mình có cái nhu cầu này mình cũng chẳng ngồi lọ mọ viết ra cái lisp để làm việc đó đâu. mình ctrl+A 1 cái, pick chuột thêm 2 nhát nữa vào hộp color trên thanh công cụ hoặc trong hộp thoại properties là xong
-
1
-
-
Đơn giản mà hiệu quả, em vừa check xong, ko biết các bác tự mò hay đọc được mấy cái thủ thuật này ở đâu vậy ?Chưa hiểu ý tưởng 3 cái hàm của bác Thaistreetz như thế nào cả ?????
đây bạn
(defun start-progn () (setq CMDLAST (getvar "cmdecho")) (setvar "cmdecho" 0) (command "Undo" "BEGIN") (command "UCS" "W") (setq OSMLAST (getvar "osmode") DMZLAST (getvar "dimzin") OTHLAST (getvar "orthomode") TSTLAST (getvar "textstyle") COLLAST (getvar "cecolor") LAYLAST (getvar "clayer") DPMLAST (getvar "DYNPROMPT") DYNLAST (getvar "DYNMODE") ERR *error* *error* error-progn ) ) ;defun ;======================= THIET LAP LAI GIA TRI BIEN HE THONG BAN DAU CUA BAN VE ======================== (defun done-progn () (setvar "osmode" OSMLAST) (setvar "dimzin" DMZLAST) (setvar "orthomode" OTHLAST) (setvar "textstyle" TSTLAST) (setvar "cecolor" COLLAST) (setvar "clayer" LAYLAST) (setvar "DYNPROMPT" DPMLAST) (setvar "DYNMODE" DYNLAST) (command "UCS" "P") (if SSe (command "erase" SSe "")) (command "undo" "end") (if cmdname (progn (princ (strcat "\nEnd of [" cmdname "]")) (setq cmdname nil))) (setq *error* ERR) (setvar "cmdecho" CMDLAST) );defun ;=====================THONG BAO LOI VA THIET LAP LAI GIA TRI BIEN HE THONG BAN DAU====================== (defun error-progn (msg) (if OSMLAST (setvar "osmode" OSMLAST)) (if DMZLAST (setvar "dimzin" DMZLAST)) (if OTHLAST (setvar "orthomode" OTHLAST)) (if TSTLAST (setvar "textstyle" TSTLAST)) (if COLLAST (setvar "cecolor" COLLAST)) (if COLLAST (setvar "clayer" LAYLAST)) (if DPMLAST (setvar "DYNPROMPT" DPMLAST)) (if DYNLAST (setvar "DYNMODE" DYNLAST)) (if SShd (command "erase" SShd "")) (if SSe (command "erase" SSe "")) (command "UCS" "P") (command "undo" "end") (if cmdname (progn (princ (strcat "\n" msg "\nEnd of [" cmdname "], Reset System Variables\n" ) ) (setq cmdname nil) ) (princ (strcat "\n" msg ", Reset System Variables\n")) ) (setq *error* ERR) (setvar "cmdecho" CMDLAST) );defun
Đây là 3 hàm luôn đuợc gọi trong mỗi chuơng trình của mình. hàm start-progn đuợc gọi ngay đầu lisp, hàm error-progn được gọi trong hàm start-progn, hàm này được tự động gọi khi hàm báo lỗi của cad được gọi. hàm done-progn đuợc gọi truớc khi đóng chuơng trình:
(defun c:... ()
(start-progn)
viết code
(done-progn)
(princ)
);end defun
3 hàm này sẽ đuợc bổ sung chỉnh sửa để thích hợp cho toàn bộ dự án (xem thêm Menu project của vlide) lisp của bạn trong quá trình viết lisp
-
2
-
-
1. Khi bạn muốn viết 1 đoạn lisp theo một ý tưởng nào đó trong quá trình làm việc thì bạn nên copy một đoạn mã chuẩn làm mẫu. Sau đó, bạn xóa đi một số dòng câu lệnh không phù hợp đi để có được 1 cú pháp tốt nhấtVD :
(defun c:abc (/) (setvar "cmdecho" 0) (command "_.undo" "be") (setvar "regenmode" 1) (setq osmode (getvar "osmode")) (setq colo (getvar "clayer")) (setvar "osmode" 0) (command "ucs" "") ;;;bat dau viet tu day ;;;ket thuc (setvar "clayer" colo) (setvar "osmode" osmode) (command "_.undo" "e") )
2. Sau đó bạn sẽ triển khai viết tiếp các dòng lệnh tiếp theo ....
Làm 3 cái hàm con Start-progn, Done-progn, Error-progn cho lành. Mình chỉ cần 3 hàm này để kiểm soát toàn bộ biến hệ thống của mỗi chương trình.
Và tôi thường hay dùng một số lệnh tắt dùng để bắt lỗi chương trình như sau (vào AutoCad bấm lệnh Vlide) : Tại vị trí con trỏ viết lệnh- Ctrl+Shift+] : kiểm tra đoạn mã có thiếu dấu ( hoặc ) hay không
- F9 : dùng để đánh dấu câu lệnh tại vị trí con trỏ (sau khi load file, vào Cad đánh lệnh ... thì chương trình lisp chỉ chạy tới vị trí đánh dấu này và dừng
- F8 : dùng phím này để tiếp tục chạy chương trình sau khi dừng tại vị trí F9. Tiếp tục bấm F8 chạy cho đến hết chương trình. Nếu bị dừng tại vị trí nào thic câu lệnh đó bị lỗi
- Ctrl+Shift+I : trả ra kết quả của câu lệnh. Nếu không hiện ra kết quả thì câu lệnh đó bị sai (hoặc thiếu biến số)
....
- Có thể kiểm tra xem đoạn code đã đủ các dấu đóng mở ngoặc, các dấu nháy kép bằng cách kích đúp chuột vào vị trí đầu hoặc cuối các đoạn code cần kiểm tra
- Bật thêm cái cửa sổ Watch (Ctrl+shift+W) trong cửa sổ này add tất cả các biến cần theo dõi và 1 biến không thể thiếu là LastValue. với công cụ này thì việc kiểm tra lỗi trở lên đơn giản rất nhiêu.
- Ngoài ra còn 1 công cụ hữu ích nữa là "Check edit window" (trên thanh công cụ của Vlide bấm nút có biểu tuợng tờ giấy trắng và chữ V màu xanh). công cụ này sẽ kiểm tra toàn bộ các lỗi có thể gặp phải trong code (thiếu dấu đóng mở ngoặc, thiếu dấu nháy kép, khai báo thừa hoặc thiếu biến...) nếu sảy ra lỗi sẽ đuợc thông báo bằng cửa sổ Buil output các lỗi sẽ đuợc thông báo bằng dòng chữ tô màu xanh, kích đúp vào dòng chữ này con trỏ sẽ nhảy về vị trí đoạn code bị lỗi.
-
2
-
-
Xử lý List_box
trong AutoLisp
Bạn đặt thuộc tính allow_accept=truevd : list_box { key = "dwgs"; allow_accept=true; height = 10;}
Như vậy là bản thân hệ thống đã coi 1 cú double-click = Enter rồi phải không ạ. em hỏi thêm điều này vì nếu đúng như thế thì ta có thể áp dụng nó trong một số truờng hợp khác
-
Xử lý List_box
trong AutoLisp
Mình có 1 thắc mắc chưa tìm được câu trả lời. Có cách nào để list_box có thể nhận biết được 1 cú double-click không? Với 1 danh sách như list_box thì người dùng có thói quen chọn 1 phần tử bằng cách nhấp đúp chuột vào fần tử đó thay vị chọn phần tử rồi nhấn OK. thực tế rất nhiều phần mềm được viết để tương tác với người dùng theo cách này
-
lôĩ đứt nét của nova
trong Nova
lỗi này hay sảy ra khi chạy file ntd của nova 16 bằng các bản nova thấp hơn. Nguyên nhân có thể là do khi lưu file ntd bạn đã không chuyển số liệu về dạng cơ bản : Khoảng cách: Cộng dồn - Cao độ: Tuyệt đối
nếu bạn để khoảng cách là khoảng cách lẻ và cao độ là tương đối thì các bản nova thấp hơn vẫn hiểu nó là khoảng cách cộng dồn và cao độ là tuyệt đối. chính vì thế mới sảy ra trường hợp khoảng cách cộng dồn bị âm và tuyến của bạn bay lung tung như trên
-
Em tìm trên diễn đàn có khá nhiều lisp về text nhưng có điều này muốn giải quyết mà chưa làm được như ý :Giả sử trong cad em có 2 chuỗi text :
1. 0.12; 0.23; 0.24
2. 0.25; 0.26; 0.27
Giờ em muốn lisp có chức năng như sau:
+ Chọn chuỗi text cần thay thế (chuỗi 2)
+ Chọn chuỗi text được thay thế ( chuỗi 1)
( số text trên hàng của 2 chuỗi bằng nhau )
Cám ơn sự giúp đỡ !
Thân !
Sao không dùng lệnh find? đây là lệnh cơ bản của gần như mọi fần mềm
-
Mình muốn xây dựng hộp thoại có 1 bảng biểu như hình đánh dấu màu đỏ này. không biết Lisp có hỗ trợ tạo loại bảng này không? nếu có thì sử dụng hàm gì?
nếu không thì nguời ta tạo nó bằng cách nào?

-
Với trường hợp viết text unicode. Em có lisp sau làm theo ý anh phamthanhbinh.(defun C:txt () (setq cont_uni "Chào Cad Vi?t. Tôi là h?c hoài v?n d?t") (command "-style" "TEXT_UNICODE" "Arial" "" "" "" "" "") (entmake (list (cons 0 "TEXT") (cons 1 cont_uni) (cons 10 (list 0 0 0)) (cons 40 2) (cons 7 "TEXT_UNICODE"))) )
Chào Cad Vi?t. Tôi là h?c hoài v?n d?t trong đoạn code làm theo ý anh em đánh bằng Vietkey bảng mã Unicode.
Kết quả không như ý
Nếu viết như sau thì cho kết quả đúng :
(defun C:txt1 () (setq cont_uni "Chào Cad Vi\\U+1EC7t. Tôi là h\\U+1ECDc hoài v\\U+1EABn d\\U+1ED1t.") (command "-style" "TEXT_UNICODE" "Arial" "" "" "" "" "") (entmake (list (cons 0 "TEXT") (cons 1 cont_uni) (cons 10 (list 0 5 0)) (cons 40 2) (cons 7 "TEXT_UNICODE"))) )
Vấn đề là Chào Cad Vi\\U+1EC7t. Tôi là h\\U+1ECDc hoài v\\U+1EABn d\\U+1ED1t có quy luật như thế nào. Làm thế nào để biết phải ghi các ký tự Vi\\U+1EC7t
h\\U+1ECDc v\\U+1EABn d\\U+1ED1t
Có thể em chưa hiểu hết ý anh phamthanhbinh. Mong được anh giải thích chỗ này. Cảm ơn lời chúc của anh. Hi!
Không cần thiết phải biết quy luật của nó. hình như bạn muốn viết hộp thoại sử dụng unicode, Bạn làm đúng huớng rồi đó. Bạn co the tham khảo cách làm của bác Hoành tại đây
-
1
-
Hỏi về Lisp (thuật toán, ý tưởng, coding,...)
trong AutoLisp
Đã đăng · Trả lời báo cáo
Tất cả các hàm lisp dùng góc đơn vị là radian, Còn các lệnh trong cad thì dùng đơn vị Degrees