lyky
-
Số lượng nội dung
69 -
Đã tham gia
-
Lần ghé thăm cuối
-
Ngày trúng
8
Bài đăng được đăng bởi lyky
-
-
Thuật toán trên không đúng trong trường hợp tổng quát là 2 line bất kỳ. Nếu 2 line // mà có phương // trục x hoặc y và ngược chiều nhau (VD explode 1 HCN) kết quả cũng sai.
Với 2 line AB và CD cần so sánh tổng AC+BD và AD+BC để quyết định
không quan tâm 2 line co song song hay không, chỉ cần vẽ đường giữa là đủ.
Thêm osmode kẻo nguy hiểm.
Bạn Tot77 đã không hiểu ý bác NDT rồi.
1/- Nếu bạn vẽ một HCN (// hệ trục Oxy) rồi nổ ra, chọn 2 đoạn đối diện (là 2 đoạn song song ngược chiều) để test thì kết quả cho ra đường chéo (chứ không phải đường trung bình?!!)
2/- Nếu bạn vẽ một HCN rồi quay đi một góc nào đó, sau đó nổ ra, test sẽ cho ra kết qủa là một đoạn thẳng có chiều dài bằng 0, vì điểm đầu điểm cuối trùng nhau?! (Tương đương một điểm).
3/- Không cần đâu 2 đường thẳng song song, chỉ cần 2 đường thẳng trái chiều là LISP của bạn đã trả ra kết quả sai rồi?!
4/- Có một điều rất kì quặc trong code của bạn Tot77:
(defun c:test(/ n ss l1 l2 cl) .... (setq n 0) (while (/= 2 n) ....
Đặt: n = 0 thì đương nhiên là: 0 ≠ 2 chứ mắc mớ gì phải kiểm tra rồi mới chạy vòng lặp?!5/- Trước dòng (command "line" (midp (car l1) (car l2)) (midp (last l1) (last l2)) ""), bạn nên đặt OSMODE bằng 0 để tắt chế độ bắt điểm - đối với những đường line gần nhau - nếu không làm vậy sẽ xuất ra kết quả sai (đặc biệt là đối với bài toán mà chúng tôi đề nghị sau đây, ở mục [7]).
6/- Bạn nên thêm vào code: Kiểm tra xem bản vẽ đã có sẵn layer "DUONG BAO" chưa, nếu đã có, đặt hiện hành nó trước khi vẽ line, nếu không, tạo layer "DUONG BAO" trước rồi mới đặt hiện hành, vẽ line xong, phục hồi về layer cũ... Nếu không làm như vậy, trong bản vẽ chưa có sẵn layer "DUONG BAO" lisp sẽ báo lỗi.
7/- Vì sao chúng ta không mở rộng bài toán này cho trường hợp vẽ n đoạn thẳng "rải xoè quạt" bên trong 2 đoạn thẳng ban đầu chọn làm biên? Bài toán này sẽ ứng dụng trong vẽ kết cấu mặt sàn dạng hình thang, cốt thép rải xòe quạt.
- 1
-
Autoload LISP
Trở lại một vấn đề quen thuộc là Autoload LISP, chúng ta có rất nhiều cách như sau:
1. Dùng Startup Suite.
2. Bổ xung Autoload vào file Acad.lsp hoặc Acadxxxxdoc.lsp…
Tuy nhiên, đối với những cách này, file LISP mà bạn muốn đặt Autoload cần phải nằm trong Support (Trừ phi bạn biên đầy đủ đường dẫn của nó!), Có thể là bất tiện và khó khăn trong việc trao đổi (Share - Copy – Move…). Chúng ta có thể dùng một cách khác, cách này phù hợp với các bạn xài trình soạn Visual LISP IDE để coding và test LISP, ứng dụng Project vào việc Autoload. Khi đó, Folder chứa các file LISP bạn cần Autoload, có thể đặt ở một nơi nào tùy thích, miễn là thuận tiện cho bạn!
2.1 Trước tiên, bạn cần có sẵn một Project.
2.2 Sau đó, bạn vào Options > Files > Support File Search Path > Add > Nhập (hoặc Browse) đến Project mà bạn cần Autoload với tên đầy đủ của Project đó (có đuôi *.prj)
2.3 Move Up lên đầu, để được load trước (chuyện này không cần thiết lắm!)
2.4 Apply > OKei.
Từ nay, bạn muốn thêm bớt file LISP cần Autoload vào Project rất dễ dàng (tương tự như Startup Suite). Tuy nhiên, khi máy (hoặc Acad) bị sự cố đột ngột – chúng ta cũng không sợ mất LISP (vì bạn có thể tạo Project trên các ổ đĩa khác C).
Chúc các bạn thật nhiều niềm vui nhé!
- 2
-
Nếu muốn như vậy, bạn có thể tạo file Template (*.dwt) chứa sẵn những thứ bạn cần là được rồi! Đâu cần xài LISP, mất công nhiều hơn!
P/S: Ý của bạn nói là DIM Style và TEXT Style phải không ạ?
-
Có 3 cách sau:
1/- Bạn post bộ LISP của bạn lên, mọi người mới kiểm tra giúp bạn được, tìm được nguyên nhân bệnh, mới chữa được bệnh chứ!
2/- Những điều bạn nêu: Tạo dim, tạo layer... Như 2 trường hợp này trên cadviet mình có nhốc, bạn có thể tổng hợp lại một lần nữa - sẽ không mất công lắm đâu.
3/- Bạn sẽ nghiên cứu, tự viết lại những đoạn code ấy - hoặc nhờ những sự hổ trợ của các anh em trên diễn đàn.
Cách 3 hiệu quả nhất, vì sau khi tự làm được bằng cách 3 - bạn sẽ không bao giờ hỏi lại câu hỏi tương tự này nữa!
- 1
-
Thay vì phải nhập số gia trước, mình chuyển sang chọn đối tượng trước, ngoài ra, mặc định độ chính xác 0.000 chưa hợp lý lắm, mình thêm độ chính xác nữa (mặc định là nguyên 0). Code của bạn được "gọt" lại như sau:
(defun c:as ( / cont i n0 p s txt txt_ent txt_name) (if (not n) (setq n 0)) (prompt "\nChon cac so can hieu chinh:") (setq txt (ssget '((0 . "TEXT,MTEXT,RTEXT")))) (setq n0 n n (getreal (strcat "\Nnhap so gia <" (rtos n) ">:"))) (if (= n nil) (setq n n0)) (setq p (getint "\nNhap do chinh xac [1;2;3]: <0>\n")) (if (= p nil) (setq p 0)) (setq i 0) (repeat (sslength txt) (setq txt_name (ssname txt i)) (setq txt_ent (entget txt_name)) (setq cont (cdr(assoc 1 txt_ent))) (setq cont (atof cont)) (setq s (+ cont n)) (setq txt_ent (subst (cons 1 (rtos s 2 p)) (assoc 1 txt_ent) txt_ent)) (entmod txt_ent) (setq i (+ i 1))) (princ))
Chúc các bạn thật nhiều niềm vui nhé! 9weekend!
P/S: mình quên không để ý yêu cầu lưu lại số gia cho lần kế tiếp - đã bổ xung trong code trên rồi!
- 2
-
nhờ các anh sửa giúp em để khi gõ lệnh => Pick chọn đối tượng (theo Layer) => thì tất cả các đối tượng thuộc Layer đó sẽ chuyển thành màu số 4 (Cyan).
cảm ơn các anh!
(defun c:dm ( / layy m ss ss1) (princ "\nChon doi tuong thuoc layer ban muon doi mau:\n") (setq ss (ssget)) (setq layy (cdr (assoc 8 (entget (ssname ss 0))))) (setq ss1 (ssget "X" (list (cons 8 layy)))) (setq m (getint "\nChon mau muon doi <4>:\n")) (if (= m nil) (setq m 4)) (command "_.change" ss1 "" "p" "c" m "") (princ))
Xài tạm bạn nhé, bẫy lỗi và né lỗi gì gì đó thì bạn tự bổ xung vào nhé! :D
- 3
-
1/- Cám ơn bác NĐT và bác Lyky, để mình dùng thử cái Lisp xem còn lỗi đó ko cái. Thanks ae nhà mình nhiều.
2/- Thanks 2 bác nhiều nhiều nha. okie rùi, lỗi đó đã sữa được. Chỉ còn như bác lyky nói thôi, khi Dim Oblique thì kết quả không theo phương đứng hoặc ngang.
Dim Oblique thì kết quả không theo phương đứng hoặc ngang: Bạn viết câu này thấy tối nghĩa lắm?!! Không hiểu ý bạn là đối với những DIM Oblique thì bạn không xài được?!! Bạn có thể nói rõ hơn?
-
[Hỏi]Đố vui với LISP
trong AutoLisp
..........
(defun thu (d m y) ...)
Để đơn giản, xem như user nhập d m y hợp lệ
Yêu cầu: chỉ dùng +, - , * , / và rem trong hàm và gọi hàm "thu"
2 vote cho lời giải đúng đầu tiên, 1 cho những lời giải sau nếu ngắn hơn các lời giải trước.
(defun thu (d m y) (if (<= m 2) (setq m (+ m 12) y (1- y))) (if (<= m 2) (setq dt1 (atoi (substr (rtos (* (1+ m) 2.6)) 1 1))) (setq dt1 (atoi (substr (rtos (* (1+ m) 2.6)) 1 2)))) (if (< (atoi (substr (rtos y) 1 2)) 20) (setq dt2 (atoi (substr (rtos (* (atoi (substr (rtos y) 1 2)) 5.25)) 1 2))) (setq dt2 (atoi (substr (rtos (* (atoi (substr (rtos y) 1 2)) 5.25)) 1 3)))) (if (< (atoi (substr (rtos y) 3 2)) 80) (setq dt3 (atoi (substr (rtos (* (atoi (substr (rtos y) 3 2)) 1.25)) 1 2))) (setq dt3 (atoi (substr (rtos (* (atoi (substr (rtos y) 3 2)) 1.25)) 1 3)))) (rem (+ (1- d) dt1 dt2 dt3) 7)) Hoặc: (defun thu1 (d m y) (if (< m 3) (setq m (+ m 12) y (1- y))) (rem (- (+ (* m 2) (/ (* (1+ m) 3) 5) y (/ y 4) (/ y 400) 1) (/ y 100)) 7))
Chỉ đúng khi y nằm trong khoảng từ 15/10/1582 trở đi.
P/S: Vì giới hạn chỉ dùng các hàm + - * / và rem nên viết dài và "rào cản" có vẻ lỏng lẽo!
Nếu không dùng hàm IF, mong chờ mọi người có biện pháp thay thế để thực hiện điều kiện này: (if (< m 3) (setq m (+ m 12) y (1- y))) ??!
Mong mọi người vui nhé!
- 1
-
Sau khi sửa theo bác NĐT xong, bạn có thể tổng hợp 2 phần riêng lẻ thành một code chung, phần bẫy lỗi bạn tự bổ xung nhé (bởi vì: theo ý mình phần bẫy lỗi - thiết định và phục hồi giá trị các biến hệ thống được thực hiện bằng các hàm riêng (như là một Public function))
(defun CBD (p / dem ds gocx gocy kdl lth n10 n11 n13 n14 n70 o10 o11 o13 o14 pt pt10 pt10i pt10n pt11 pt11n pt13 pt13i pt13n pt14 pt14i pt14n pti ss) (princ "\nVui long chon vung dimmensions can thao tac:\n") (setq ss (ssget)) (setq pt (getpoint "\nPick diem moc:\n")) (setq pt (trans pt 1 0)) (setq lth (sslength ss)) (setq dem 0) (while (< dem lth) (progn (setq ds (entget (ssname ss dem)) kdl (cdr (assoc 0 ds))) (if (and (= "DIMENSION" kdl) (> 2 (setq n70 (rem (cdr (assoc 70 ds)) 32)))) (progn (setq pt10 (cdr (assoc 10 ds)) pt11 (cdr (assoc 11 ds)) pt13 (cdr (assoc 13 ds)) pt14 (cdr (assoc 14 ds))) (setq gocx (if (= n70 1) (angle pt13 pt14) (cdr (assoc 50 ds)))) (setq gocy (- gocx (/ pi 2))) (setq pti (polar pt gocx 2) pt13i (polar pt13 gocy 2) pt14i (polar pt14 gocy 2) pt10i (polar pt10 gocy 2)) (setq pt13n (inters pt pti pt13 pt13i nil) pt14n (inters pt pti pt14 pt14i nil) pt10n (inters pt pti pt10 pt10i nil) pt11n (polar pt11 (angle pt10 pt10n) (distance pt10 pt10n))) (setq o13 (assoc 13 ds ) o14 (assoc 14 ds ) o10 (assoc 10 ds ) o11 (assoc 11 ds ) n13 (cons 13 pt13n) n14 (cons 14 pt14n) n10 (cons 10 pt10n) n11 (cons 11 pt11n)) (if p (progn (setq ds (subst n13 o13 ds) ds (subst n14 o14 ds))) (progn (setq ds (subst n10 o10 ds) ds (subst n11 o11 ds)))) (entmod ds))) (setq dem (+ dem 1))))) ;;;====================================================================== (defun C:CD () (CBD T )) ; Cat moc DIM theo diem giong ;;<> (defun C:BD () (CBD NIL)) ; Doi moc DIM theo diem giong ;;<>
P/S: Vote Bác NĐT, Cám ơn Bác đã hướng dẫn em sửa lại code nhé!
- 2
-
Bạn Explode Table để được Text (hoặc MText) trước đã, sau đó sử dụng LISP sau, Mở file lyky.txt được xuất ra tại "C:\\lyky.txt" bằng Excel.
(defun C:C2T ( / e f lst ss y z)
(setq ss (acet-ss-to-list (ssget '((0 . "TEXT,MTEXT,RTEXT"))))
lst (mapcar '(lambda (e) (cons(Dxf 10 (entget e)) (Dxf 1 (entget e)))) ss)
z (* (Dxf 40 (entget (car ss))) 0.5)
lst (vl-sort lst (function (lambda (e1 e2) (Compare2D (car e1) (car e2) z))))
f (open "C:\\lyky.txt" "w"))
(foreach e lst
(princ (if (equal y (cadr (car e)) z) "\t" "\n") f)
(princ (cdr e) f) (setq y (cadr (car e)))) (close f)
(prompt "Ket qua xuat ra tai C:/lyky.txt"))
(defun Compare2D (p q f / ) (if (equal (cadr p) (cadr q) f) (< (car p) (car q)) (> (cadr p) (cadr q))))
(defun Dxf(n e) (cdr (assoc n e)))- 1
-
Sao bạn không vào box AutoLISP để tìm kiếm hoặc đặt câu hỏi? Một câu hỏi thuần về LISP mà bạn post ở đây, e rằng sẽ bị các Mod chém mất thôi! Câu trả lời nằm ngay trong câu hỏi của bạn, bạn xem hình sau nhé!
- 1
-
Quả này ngon ha, Bác ếch_gờ_xê_cu trình bày vấn đề thật tỷ mỹ. Không có nhu cầu nhưng vẫn vote vì sự nhiệt tình của Bác!
Sẵn Bác mần luôn tool tạo dạng đường (linetype) theo cách như tạo Hatch (kể trên) thì thật tuyệt diệu! :D
P/S: Ủa sao Bác lại ghi: "nhanh chân kẻo vào thùng rác" là vì sao vậy?
-
Nhờ các bác viết giùm đoạn lisp:
Đánh lệnh
Chọn đối tượng
Chọn hướng (Nếu đối tượng nằm xiên thì chọn hướng rồi nó sẽ move theo hướng xiên)
enter thì nó sẽ di chuyển đối tượng một khoảng là 50.
Lisp này tương tự lệnh offset nhưng nó sẽ nhanh hơn.Lisp này đã có topic nhưng do diễn đàn bị lỗi nên down về sử dụng không được nên mình tạo topic này nhờ các bác.Thanks.
+ Đối với LINE (XLINE) thì Offset là phép biến hình tương đương Copy và tịnh tiến theo một phương cố định một khoảng cách cố định, trường hợp này thì Offset giống Copy (nếu có kèm thêm xóa đối tượng gốc nữa thì tương đương với Move!!?).
+ Đối với đường tròn; đường cung tròn; đường tam giác đều; đường vuông (đường đa giác đều nói chung!), Offset là một phép vị tự (tâm vị tự mặc định tại trọng tâm + tỉ cự (căn cứ từ cự ly nhập vào)), bởi vì Scale theo mọi phương đều như nhau → Đảm bảo sự đồng dạng của đối tượng mới so với đối tượng gốc!
+ Đối với các đối tượng khác (còn lại như: đường chữ nhật; đường ô van...) Offset là một phép biến hình đặc biệt, không phải là một phép vị tự, bởi vì nó không đảm bảo được yêu cầu đồng dạng của đối tượng mới so với đối tượng gốc!
Yêu cầu của bạn không khó, nhưng bạn nên cân nhắc là không có gì đảm bảo cho bạn: "nhưng nó sẽ nhanh hơn". Nếu thật sự cần thiết, bạn trình bày cụ thể những trường hợp (loại đối tượng mà bạn thao tác) để anh em mần giúp bạn nhé!
- 2
-
Chạy Debug code LISP bán tự động
Hôm nay SN xin được trình bày cách chạy Debug bán tự động, không dùng tiện ích Animate, nghĩa là khi chạy debug chúng ta không check chọn Animate trong tab Debug.
Thực ra, chúng ta có thể linh động hơn một chút xíu - bằng cách, trong lúc chạy thủ công, đang ở một bước nào đó, bạn cũng có thể gọi tiện ích animate lên và Ctrl+F8 để tiếp tục chạy tự động. Tuy nhiên, điều ngược lại không thực hiện được, nghĩa là nếu đã bắt đầu chuyển qua chạy bằng animate, chúng ta chỉ có thể thoát ra: abort evaluation, thoát lệnh và trả sang màn hình acad.
Ngoài ra, chức năng watching variables xem như tiện dụng để theo dõi sự liên đới của các biến. Tuy nhiên, có thể là sẽ rất khó xem đầy đủ với các list dài, chẳng hạn ... Do đó, nếu chỉ xem và theo dõi sự thay đổi giá trị của một biến nào đó, chúng ta có thể sử dụng console window để xem giá trị sau mỗi thay đổi.
Một điều nhỏ nữa là bạn cần lưu ý, uncheck tiện ích animate sau khi chạy xong, nếu không, khi bạn trở lại acad, sử dụng một lệnh nào đó liên quan đến file LISP hiện hành, sẽ vấp phải sự "delay" vì y cứ tưởng bạn đạng chạy debug (animate chỉ dùng để chạy debug mà thôi!).
- 2
-
Ví dụ vẽ 1 mặt bằng của 1 khu đô thị cao cấp gồm gần 20 tòa nhà chung cư, t thấy bản vẽ đó lớn quá nên quá ngạc nhiên ko biết người ta vẽ kiểu j, phải vẽ ntn và có thủ thuật j để quản lý được bản vẽ lớn như thế
Nếu vậy, bạn nên bắt đầu từ những bản vẽ nhỏ nhỏ trước bạn à, vạn sự khởi đầu nan, gian nan bắt đầu nản! Không hiểu vì sao bạn bắt mình phải bắt đầu với một hồ sơ "bự" như vậy?! Anh em cũng chẳng thể biết làm, chẳng thể hiểu được, làm sao họ giúp bạn được?!
Với một khu đô thị cao cấp, 20 block, bạn nên bắt đầu từ một block, có thể nhỏ hơn là một tầng điển hình, nhỏ hơn nữa là một căn hộ, nhỏ hơn nữa là một phòng ... Cứ thế, bạn "quán triệt" được cái nhỏ, dần dần tích lũy sẽ thành cái bự bạn à!
- 1
-
Thêm chức năng "thu gom rác" : biến toàn cục -> biến cục bộ
@ Song Nhi: Hảo Song Nhi! Đối với những Lisp đã check rồi và "dọn rác" theo cách anh Gia_Bach đã hướng dẫn, sau khi check lại sẽ không còn Global Var, trừ trường hợp vì ý đồ khác của người viết!
Trong vấn đề giải phóng bộ nhớ sau khi chạy LISP cũng còn nhiều vấn đề khác, cần được quan tâm, trước tiên bạn cần nắm các khái niệm biến cục bộ; biến toàn cục và các tính chất của nó, nếu cần thiết các bạn có thể tham khảo tại đây, hoặc tìm kiếm trên diễn đàn.
Danh sách trả về trong tiện ích kiểm tra của VLIDE sẽ liệt kê tất cả các đối tượng được xác định trong code. Danh sách này có thể bao gồm: Các ký hiệu bảo vệ (chẳng hạn như các hàm hoặc các hằng số được bảo vệ). Nếu các đối tượng đó đều vô tình cục bộ hóa, chương trình của bạn có thể không chạy như mong đợi ...
Vì vậy, các bạn cần lưu ý thêm, khi thanh lọc bộ nhớ bằng cách chép danh sách xuất ra của biến toàn cục vào phía sau: (defun( /, cần loại ra các đối tượng sau đây, không thanh lọc chúng, như sau:
1. Ký hiệu bảo vệ (được đánh dấu màu xanh), chẳng hạn như các hàm hoặc các hằng số được bảo vệ (ví dụ: Vlax-true).
2. Đối tượng trong DCL được xác định tại thời gian chạy (chẳng hạn như: $key, $reason, $value, $data).
3. Từ Pause, như có thể được sử dụng trong command expressions, vd: (command "rotate"
pause""...4. Biến mà bạn muốn giữ lại giá trị sau khi chạy vì mục đích khác (nào đó!?), danh sách các biến trả về bởi các tiện ích kiểm tra được sắp xếp theo thứ tự abc, cho nên bằng cách đặt trước tên biến toàn cục với dấu sao (*) hoặc ... , làm cho nó xuất hiện ở đầu của danh sách để chúng ta có thể dễ dàng loại bỏ ra.
Không nhất nhiết check đối với một LISP đầy đủ, đối với một file tổng hợp nhiều LISP, bạn cũng có thể Check toàn bộ, bằng cách chọn Check edit window trên thanh công cụ Tools. Danh sách trả ra tổng hợp như sau:
Đối với danh sách trả về sau khi check, các biến ở dạng chữ in hoa, về mặt hình thức nếu bạn muốn chuyển về chữ thường, hãy chạy list đó qua hàm sau:
(defun VarList (lst) (vl-princ-to-string (mapcar '(lambda ( x ) (strcase (vl-princ-to-string x) t)) lst))) ;;; Vi du: (VarList '( C a d V i e t. c o m)) ---> "(c a d v i e t. c o m)"
Sau đó, bạn hãy lựa chọn những đối tượng mà bạn muốn cục bộ hóa, chép vào phía sau: (defun( / để giải phóng bộ nhớ, tiết kiệm dung lượng và hạn chế tương tác giữa các LISP với nhau!
Nguồn bài viết: Lý Mẹc
Chúc các bạn thật nhiều niềm vui, hình như các bạn không thích topic này lắm?!
Có cách nào làm cho nó sinh động lên không? Các bạn vui lòng đóng gốp ý kiến!
- 4
-
Cám ơn bạn Lyky+Tue_NV đã có ý kiến trao đổi.
1). Để "ghi nhớ" cái gì đó cho lần sau thì: hoặc không được khử nó (lisp DVH - với a), hoặc không thể khử nó (lisp Lyky - với sn) >> làm gì có chuyện nó vừa cục bộ vừa toàn cục nhỉ?
2). Nếu để tạo 1 hàm nhập liệu vừa bẫy lỗi vừa lưu biến như ý Lyky thì liệu cái này có gọn nhẹ hơn không?
Bạn hiểu nhầm ý lyky mất rồi! lyky muốn tạo một hàm con, dùng nhập số nguyên trong các lisp khác thay hàm getint mà, có một số khác nhau chứ:
1. Nếu dùng hàm (HA):
a/- Dòng nhắc luôn cố định là “Nhập số nguyên <gợi ý>:” , một hàm con sẽ thân thiện hơn nếu dòng nhắc “mềm” hơn, ví dụ trong một chương trình nào đó, muốn bạn nhập số con của bạn (chẳng hạn!) mà dòng nhắc: “Nhập số nguyên <gợi ý>:” thì kỳ kỳ. Nên lyky mới thêm ưu tiên nếu có MSG, nếu không có mới trở về mặc định!
b/- Hàm chỉ dùng một biến toàn cục a, vì vậy, mặc dù tiết kiệm dung lượng, nhưng nó không mang tính “rẽ nhánh”, ví dụ: có 2 lisp cùng dùng hàm (HA) để nhập số nguyên → khi lisp1 chạy, lưu lại biến toàn cục a, tiếp tục chạy lisp2: a lại đưa lên làm gợi ý, tuy nhiên, gợi ý đối với lisp1 và lisp2 thì thường khác nhau! Vì vậy, gợi ý đó không xác thực lắm!
2. Nếu dùng hàm (TgI ‘a “msg” <gợi ý>):
c/- Dòng nhắc tùy nhu cầu cụ thể mà thay đổi theo cho phù hợp, khi không cần thay đổi thì “msg” = nil, mặc dù dài loằn ngoằn, nhưng số bước chạy không nhiều hơn mấy?!
d/- (TgI) đưa biến toàn cục ra ngoài hàm con này, do đó, đối với mỗi lisp có dùng nó sẽ có một biến toàn cục riêng, và vì vậy mà nó “rẽ nhánh” tốt hơn, khi chạy nhiều lisp có dùng nó sẽ tránh bị tương tác như trên! Mặc dù rằng, số biến toàn cục nhiều hơn - nếu bạn chấp nhận được!
Mấy lời phân trần, mong các bác vui! Chúc các bác thật nhiều sức khỏe và thành công trong công tác nhé!
@ Bác Doan Van Ha: Topic thật tuyệt diệu, đặc biệt là có được một người “thư ký” kiêm “điều hành” mẫn cán! Mong và hi vọng thật nhiều điều hay và kinh nghiệm các bác chia sẽ cùng anh em!
- 1
-
Doan Van Ha, on 31 May 2013 - 14:09, said:
(defun C:HA() (or (and a (= (type a) 'int)) (setq a 1)) (setq a (cond ((getint (strcat "\nNhap 1 so nguyen <" (itoa a) ">: "))) (a))) (1+ a)) ;;; Tuy nhien, neu: (defun C:HA( / a)....) ;;; Thi gia tri tham khao khong duoc luu lai!
Cách này chẳng những hạn chế được lỗi, mà còn rất tiện dụng trong trường hợp giá trị nhập thường được lặp lại, chúng ta có thể sắp xếp thành một hàm con dùng để nhập số nguyên "an toàn" hơn và nếu có thể, thay thế hàm getint, như sau:
(defun TgI (RV MSG REF / S U V) (setq s (if msg msg (strcat "\nNhap so nguyen " (vl-symbol-name rv)))) (setq v (eval rv) u (if (= (type v) 'int) v ref)) (setq v (getint (strcat s " [" (itoa u) "]:"))) (set rv (if v v u))) ;;;........................Vi du;;; (TgI 'sn "Vo Nguyen Giap" 19110825)
- 1
-
Lisp này dùng giống như ý mình muốn nhưng phải thông qua lệnh, mình muốn khi sửa text thì giá trị L tự động tính theo!
1. Theo bạn: "nhưng phải thông qua lệnh" nếu không thông qua lệnh, thì bạn muốn thông qua "cái gì" để giao tiếp với CAD nhỉ? Bằng ánh mắt nhìn ư?
2. Thì LISP của bác Gia_Bách đã đáp ứng được yêu cầu: "khi sửa text thì giá trị L tự động tính theo" đó chứ?!! Sau khi dùng LISP để link tổng giá trị các TEXT với ATT (LTHANH) của Block THONG KE THEP. Từ sau đó, bạn cứ sửa giá trị TEXT thoả mái, sau đó RE (REgen) lại bạn vẽ để update chứ bạn!
@Tue_NV đi. Bác ấy có ứng dụng thống kê thép tự động nhảy block. Nhưng có phí
Nếu bạn thấy như vậy bất tiện quá thì liên hệ với bác Tue_VN, Trong video của bác ấy biểu diễn, update tự động, không cần RE, bạn có thể tham khảo thêm ở đây.
- 1
-
Sau khi gia công xong, nếu bạn hiệu chỉnh giá trị chiều dài biểu kiến trên thanh thép ---> kết quả tự động link vào Block Attribute thì thật là tiện dụng. Tuy nhiên, nếu có thể chấp nhận một chút phiền toái, sau khi bạn hiệu chỉnh giá trị chiều dài biểu kiến, sử dụng code sau để hiệu chỉnh giá trị trong Block:
(defun C:CBA( / ENT KQUA LST LST2 LST3 OBJLST SS SS1) (vl-load-com) (prompt"\nChon so lieu:\n") (setq ss (ssget '((0 . "TEXT")))) (setq kqua 0) (while (and ss (> (sslength ss) 0)) (setq kqua (+ kqua (atof (cdr (assoc 1 (entget (setq ent (ssname ss 0)))))))) (ssdel ent ss)) (prompt"\nChon Block:\n") (setq ss1 (ssget '((0 . "INSERT")))) (setq objlst (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss1))))) (foreach obj objlst (setq lst (GetAtt obj)) (foreach lst1 lst (if (= (strcase (car lst1)) "LTHANH") (setq lst2 (cons (car lst1) kqua)) (setq lst2 lst1)) (setq lst3 (cons lst2 lst3))) (SetAtt obj lst3)) (princ)) ;-----by MENZI ENGINEERING GmbH, Switzerland-----; (defun GetAtt (obj) (mapcar '(lambda (att) (cons (vla-get-TagString att) (vla-get-TextString att))) (vlax-invoke obj 'GetAttributes))) (defun SetAtt (obj lst / attval) (mapcar '(lambda (att) (if (setq attval (cdr (assoc (vla-get-TagString att) lst))) (vla-put-TextString att attval))) (vlax-invoke obj 'GetAttributes)) (vla-update obj))
Download LISP file
Download TEST file
P/S: À, nếu bạn muốn làm tròn 10 kết quả tổng chiều dài trước khi gán vào Block thì bổ xung thêm vào code nhé!- 1
-
Chức năng xem trước giao diện DCL của VLISP
Ở đây chúng ta không nói về kiến thức để thiết kế một giao diện DCL, chúng ta chỉ đơn thuần xét đến chức năng xem trước giao diện DCL trong VLISP. Các bạn có thể tham khảo thêm về DCL: Tại đây
Trước tiên, các bạn copy đoạn code sau, paste vào cửa sổ soạn thảo (Ctrl+N) của VLISP, lưu lại với tên là: *.DCL
LAYER:dialog { label="Chuc nang xem truoc DCL"; spacer_1; :boxed_radio_column{ label="Cai dat Layer"; :radio_button{ label="Su dung Layer hien huu"; key="IsCuLA"; } :radio_button{ label="Cai dat Layer"; key="IsSetLA"; } :popup_list{ key="La"; } } ok_cancel; }
Vào Tools » Interface Tools » Preview DCL in Editor (Preview DCL in Selection).
VLISP chuyển sang cửa sổ ACAD và hiển thị hộp thoại xem trước như sau:
Chúng ta sử dụng chức năng này để thiết kế hộp thoại DCL, bởi DCL được viết toàn bằng code, trong khi hộp thoại của các ngôn ngữ lập trình hướng đối tượng khác, được thiết kế trực quan!- 2
-
Xem cú pháp hàm trực tiếp trong VLISP
Trong quá trình coding, nhiều lúc không nhớ chính xác cú pháp của hàm, chúng ta sẽ làm cách nào?
Đối với MS. Excel; VBA … Sau khi các bạn nhập hàm, sẽ xuất hiện một dòng nhắc cú pháp, ví dụ:Đối với Visual LISP IDE, mặc dù không trực quan như vậy, nhưng khi cần thiết – chúng ta không cần thiết phải phải truy cập một cách gián tiếp – bằng cách vào Help hoặc vào Internet để tìm kiếm. Một cách trực tiếp là chúng ta tô chọn đối tượng muốn tìm hiểu, vào Help trên thanh Tools (hoặc tổ hợp phím Ctrl+F1)
Chúc các bạn thật nhiều niềm vui! Mong chờ sự chia sẽ kinh nghiệm sử dụng trình VLISP của các bạn!P/S: @ Tue_NV: Cám ơn Bác đã hướng dẫn chúng tôi chức năng AutoComplex, vote Bác. Xin được hỏi thêm Bác là sau khi chọn, các hàm được in ra dưới dạng chữ IN HOA, làm sao để sau khi chọn, hàm in ra với dạng chữ thường vậy Bác? Chúc Bác thật nhiều sức khỏe và thành công trong công việc!
- 2
-
Bạn dùng code này để tách loạt bảng vẽ nằm theo phương ngang, đặt sát nhau:
(defun pxy(d x y) (polar (polar d 0 x) (* 0.5 pi) y))
(defun C:exf( / A FF I NAM NM NN PT1 PT10 PT11 PT2 PT20 PT21 SS)
(princ "\nVui long to chon khung ban ve khoi dau\n")
(setq pt10 (getpoint "\nPick Bottom Left:\n")
pt20 (getcorner pt10 "\nPick Top Right:\n"))
(setq pt11 (pxy pt10 -500 -500)
pt21 (pxy pt20 500 500))
(setq a (- (car pt20) (car pt10)))
(setq nn (getint "\nNhap so ban ve can tach: <5>\n"))
(setq nm (getvar "dwgname") nam (substr nm 1 (- (strlen nm) 4)))
(setq i 0)
(while (< i nn)
(setq pt1 (pxy pt11 (* i a) 0) pt2 (pxy pt21 (* i a) 0))
(command "_zoom" "W" pt1 pt2) (setq ss (ssget "_W" pt1 pt2))
(setq ff (strcat (getvar "dwgprefix") nam (itoa (+ i 1))))
(command "_.wblock" ff "" '(0 0 0) ss "") (setq i (+ i 1))))- 1
-
Vấn đề này thật thiết thực, vì chúng ta thường thao tác các bản vẽ chung trên một file, sau khi hoàn thành lại phải tách ra làm từng trang riêng...
Tách thì có thể dùng đỡ lệnh WBLOCK thôi, nhập thì thật khó, e rằng LIPS không đáp ứng được?!
Xin lỗi mình đã comment tào lao!
Song Nhi có thể sử dụng lisp của Bác Nguyen Hoanh ở đây: http://www.cadviet.com/forum/topic/13203-viet-lisp-theo-yeu-cau-phan-2/page-50?do=findComment&comment=90892
- 1
VẼ DẦM (BV xây dựng)
trong AutoLisp
Đã đăng · Trả lời báo cáo
Hoan nghênh và trân trọng một ý tưởng!
Mình xin có một số ý kiến
1. Chương trình của bạn, cần tương đối nhiều dữ kiện đầu vào - mình nên mần cái Dialog (DCL) để được thuận tiện.
2. Nhìn sơ lược mình thấy bạn viết theo kiểu set điểm tường minh... cách này căn bản - dễ hiểu - nhưng, chỉ thích hợp cho những trường hợp đơn giản... Nếu muốn xây dựng một chương trình thực sự (?!) Bạn - có lẽ sẽ nên thay đổi quan niệm một chút đó, ví dụ như: Thay vì set từng điểm từng điểm một, mình có thể chỉ cần set một điểm đầu tiên thôi - sau đó trong lúc vẽ mình sẽ viết thêm một public function để set gián tiếp chương trình sẽ gọn, dễ đọc, dễ gỡ lỗi hơn - kiểm soát và sữa chữa cũng đuợc thuận tiện nữa.
3. Một điều nữa, với mức độ mà bạn vừa trình bày, thì điều tôi sắp nói không cần thiết - nhưng nếu như bạn muốn phát triển tiếp, tất nhiên vẽ mặt cắt dọc như vậy, rồi phải vẽ luôn mặt cắt ngang nữa chứ... gia công thép nữa chứ... thống kê nữa chứ... nhiều thứ lắm. Trước tiên, bạn phải bố cục môi trường vẽ cái đã, rùi mới vẽ ha!
4. Rãi thép (ý tôi đang nói cốt đai đó mà) theo bước và chiều dài cho trước - mình cũng nên viết một public function chuyên làm việc này, tất nhiên là chạy vòng lặp để vẽ chứ ha!
Một số lỗi:
Một số ý kiến thôi - có trái ý thì mong các đồng chí tha lỗi - nhiều lời!