Chuyển đến nội dung
Diễn đàn CADViet
Nguyen Hoanh

Hướng dẫn sử dụng mã Lisp

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

xin chào anh Hoành và các bậc đàn anh về lĩnh vực auto lisp .

em muốn học cách viết lisp , mong các anh giúp đỡ và hướng dẫn cho em 

em xin chân thành cảm ơn ah.

Kịp thời}}, Nguyen Hoanh cho biết:

* Lisp là gì?

Lisp là một ngôn ngữ script chạy dưới CAD, sử dụng các mã lisp giúp AutoCAD mạnh hơn.

 

* Cách sử dụng file lisp

Gồm 2 bước:

a. Tải (load) file lisp vào AutoCAD

Khi đã có file lisp trên ổ cứng, dùng lệnh appload (vào menu: Tools > Load Applications ...) rồi chọn file lisp cần sử dụng, nhấn vào phím load. Với mỗi bản vẽ, thao tác tải file chỉ cần thực hiện 1 lần.

3_huongdansdlisp.png

 

b. Gọi lệnh trong file lisp vừa tải

Tại dòng command, gõ tên lệnh (xem phần tìm tên lệnh bên dưới) và nhấn enter.

 

* Lưu lại đường dẫn file sau mỗi lần load

Bạn hãy check vào ô Add to History, từ lần sau bạn chỉ cần click tên file lisp từ bảng History list.

 

___

 

  • Vote giảm 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 #VoHoan:        Thuật toán gì ở đây nhỉ: ^^:

Ý tưởng sẽ nảy sinh như thế này: Trong chuỗi 123~456.. ---> Tìm xem ký tự "~" nằm ở vị trí nào trong chuỗi.   ---> Lọc ra các ký tự bên phải , bên trái của "~".   ----> Ghép lại là xong ^^.

Nếu bác từng viết lisp rồi thì hiểu mà :) Nếu bác chưa viết bao giờ thì mọi người sẽ viết code cho @@

 

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ạn xem code này rồi múa máy
(defun C:HA()
 (setq str "1234~5678")
 (setq vt (vl-string-position (ascii "~") "1234~5678"))
 (setq a (substr str 1 vt))
 (setq b (substr str (+ vt 2) (strlen str)))
 (/ (+ (atof a) (atof b)) 2))
 

  • Like 1
  • 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

Sử dụng hàm Cal và Rep cũng hay các Bạn

(setq chu1 "1234~5678"

           so1 (/ (cal (acet-str-replace "~" "+" chu1)) 2.0)

)

 

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 hỏi các bạn cái này nhưng không biết để đâu cho tiện, đành để ở đây, nếu không đúng xin thứ lỗi.

Mình có câu lệnh lisp như sau:

(command "_.insert" "M_XY_KV" p 1 "" 0 "1")

Đây là lệnh chèn block "M_XY_KV" có thuộc tính "1" tại vị trí p.

Nếu thực hiện từ cad2013 về trước thấy vẫn bình thường,

nhưng khi làm trên cad2017 nó lại hiện lên khung đối thoại để nhập.

Vậy làm sao cho nó nhận trị "sohieu" như cad 2013 được mà không cần hiện hộp thoại.

Nhờ các bạn chỉ giúp. Cám ơn các bạn

M_XY_KV.dwg

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
18 phút trước, TRUNGNGAMY đã nói:

Mình tính hỏi các bạn cái này nhưng không biết để đâu cho tiện, đành để ở đây, nếu không đúng xin thứ lỗi.

Mình có câu lệnh lisp như sau:

(command "_.insert" "M_XY_KV" p 1 "" 0 "1")

Đây là lệnh chèn block "M_XY_KV" có thuộc tính "1" tại vị trí p.

Nếu thực hiện từ cad2013 về trước thấy vẫn bình thường,

nhưng khi làm trên cad2017 nó lại hiện lên khung đối thoại để nhập.

Vậy làm sao cho nó nhận trị "sohieu" như cad 2013 được mà không cần hiện hộp thoại.

Nhờ các bạn chỉ giúp. Cám ơn các bạn

M_XY_KV.dwg

Bác thử (setvar 'attdia 0)  xem

  • Like 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

Chào các bạn. Mình có cái này chưa xử lý được mong nhờ các bạn giúp đỡ.

Mình có 1 danh sách bất kỳ, VD (("11" "12" "13" "14") ("21" "22" "23" "24") ("31" "32" "33" "34")). nó giống như ma trận 3 hàng 4 cột

Mình muốn tạo một danh sách mới từ danh sách đã có trên nhưng theo mô tả (mẫu) của một list bất kỳ mà phần từ của nó chỉ là hiển thị chỉ số cột của danh sách trên

Vi dụ:

với mẫu (1 2) sẽ trả về (("11" "12") ("21" "22") ("31" "32")).

với mẫu ((1 2) 3) sẽ trả về ((("11" "12") "13") (("21" "22") "23) (("31" "32") "33"))

với mẫu (1 (2 (3 4))) sẽ trả về (("11" ("12" ("13" "14"))) ("21" ("22" ("23" "24"))) ("31" ("32" ("33" "34"))))

Không biết mình diễn đạt như vậy đã rõ ràng chưa. Mong các bạn giúp đỡ.

Cám ơn các bạn nhiều

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

(Defun test(mau lt / lix)

(Defun lix(m1)

(mapcar ‘(lambda(x) (if (numberp x) (nth x list1) (lix x))) m1))

(mapcar ‘(lambda(list1) (lix mau)) lt))

 

Thử vài dòng trên iPad nên chưa test.

 

  • Like 2

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
20 giờ trước, TRUNGNGAMY đã nói:

Cám ơn bạn. Bạn viết rất ngắn gọn, độc đáo mà chính xác. Mình cũng nghĩ phải viết theo kiểu đệ qui nhưng không viết được

Cách viết này đơn giản là tính từng phần tử 1. Chứ không tính 1 lần được. Có cách khác là đổi lisp mẫu thành hàm và dùng eval nếu dữ liệu lớn.

 

Sửa lại lỗi nth tính từ 0

 

(Defun test(mau mt / dq)
  (Defun dq(m)
    (mapcar '(lambda(x) (if (numberp x) (nth (1- x) n) (dq x))) m))
  (mapcar '(lambda(n) (dq mau)) mt))

(Defun test1(mau mt / dq)
  (Defun dq(m)
    (cons 'list 
	  (mapcar '(lambda(x) (if (numberp x) (list 'nth (1- x) 'x) (dq x))) m)))
  (setq mau (dq mau))
  (mapcar '(lambda(x) (eval mau)) mt))

 

 

  • Like 2

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 có bài toán như sau nhờ mọi người ai có cách giải hay giúp (đã giải được nhưng code dài quá)

Có 2 list points: ds1 và ds2.

ds1 = (P1 P2 P3... Pn). Ví dụ trong hình là 3 điểm màu đỏ P1, P2, P3

ds2 = (Q1 Q2 Q3... Qm). Ví dụ trong hình là 12 điểm màu xanh Q1 đến Q12

(m và n nói chung khác nhau)

Làm thế nào để nhóm ds2 vào từng điểm của ds1 thành n nhóm sao cho các khoảng cách từ các điểm được nhóm (Qi) đến điểm đó (Pj)

là nhỏ hơn khoảng cách đến các điểm P còn lại. Có thể có các nhóm không có điểm Q nào.
Ví dụ nhóm thành 3 nhóm như hình.
image.png

Bản vẽ test: Nhóm điểm gần các tâm.dwg

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ài này làm từ Q1 duyệt qua ds1 để tìm cặp ngắn nhất Q1:Pj. Qua ds2 bác sẽ được m cặp Q:P. Rút gọn lại là được. Bản chất của nó là mỗi Q chỉ dành riêng cho 1 P duy nhất

  • Like 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
2 giờ trước, cuongtk2 đã nói:

Bài này làm từ Q1 duyệt qua ds1 để tìm cặp ngắn nhất Q1:Pj. Qua ds2 bác sẽ được m cặp Q:P. Rút gọn lại là được. Bản chất của nó là mỗi Q chỉ dành riêng cho 1 P duy nhất

Bác DVH đã viết code rồi tức là bác ý đã biết thuật toán của bác nói rồi. Chỉ có điều bác ý cần ai viết cái code ngắn hơn thôi.

  • Like 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
13 phút trước, 7o7 đã nói:

Bác DVH đã viết code rồi tức là bác ý đã biết thuật toán của bác nói rồi. Chỉ có điều bác ý cần ai viết cái code ngắn hơn thôi.

Đúng vậy. Hôm qua viết được rồi nhưng dài (nên dở), nay viết lại như vậy chắc ngắn hơn. Cám ơn mọi người đã quan tâm.


(defun Group(dsp dsq / x y z)
 (foreach p (reverse dsp) 
  (setq y nil)
  (foreach q dsq 
   (setq x (car (vl-sort (mapcar '(lambda(p) (list p q (distance q p))) dsp) '(lambda(ds1 ds2) (< (caddr ds1) (caddr ds2))))))
   (if (equal (car x) p 1e-5) (setq y (cons x y))))
   (setq z (cons y z))))

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
1 giờ trước, 7o7 đã nói:

Bác DVH đã viết code rồi tức là bác ý đã biết thuật toán của bác nói rồi. Chỉ có điều bác ý cần ai viết cái code ngắn hơn thôi.

Code dài ngắn không quan trọng. Làm sao để đúng mà thời gian chạy ngắn nhất thôi (ít phép tính nhất)

  • Like 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
(defun _map (lp lq / f1 f2 f3)
	;; where lp = dsQ && lq = dsP (query points)
	((lambda (lp lq f1 f2 / l1 l2 a)
			(setq l1 (f1 (vl-sort lp '(lambda (a b) (< (car a) (car b)))) 0)
					l2 (f1 (vl-sort lq '(lambda (a b) (< (car a) (car b)))) 0)
					a (vlax-make-safearray vlax-vbinteger (cons 0 (1- (length lp))))
			)
			(foreach p l1 (f2 p l2 a))
			(f1 (vlax-safearray->list a) -1)
		)
		lp lq
		(lambda (l i) (mapcar (function (lambda (x) (cons (setq i (1+ i)) x))) l))
		(lambda (p l a / d d1 q q1 i)
				(cond 
					((null l))
					((setq q (car l) i (car p) p (cdr p)  l (cdr l) d (distance p (cdr q)) q1 q)
						(while l
							(setq q (car l) l (cdr l))
							(cond ((< d (abs (- (car p) (cadr q)))) (setq l nil))
									((< (setq d1 (distance p (cdr q))) d) (setq d d1 q1 q))
							)
						)
						;;(princ (strcat  "\n" (vl-prin1-to-string (list (1- i) d (1- (car q1))))))
						(vlax-safearray-put-element a (1- i) (1- (car q1)))
					)
				)
		)
	)
)
;; (_map dsQ dsP)

 

  • Like 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
7 giờ trước, snowman.hms đã nói:

 

Nhờ bạn giải thích giùm để chỉnh sửa:
1. Hàm của tôi sai ở chỗ nào?

2. Test hàm (_map dsp dsq) >> ((0 . 3) (1 . 7) (2 . 10)) nghĩa là sao?

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
10 giờ trước, Doan Van Ha đã nói:

Nhờ bạn giải thích giùm để chỉnh sửa:
1. Hàm của tôi sai ở chỗ nào?

2. Test hàm (_map dsp dsq) >> ((0 . 3) (1 . 7) (2 . 10)) nghĩa là sao?

Ah. Xin lỗi bác! Sai ở em, lâu rồi k lisp lủng gì ^^

còn các số kia là index.,

  • Like 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
1 giờ} trướ}c, snowman.hms đã nói:

Ah. Xin lỗi bác! Sai ở em, lâu rồi k lisp lủng gì ^^

còn các số kia là index.,

Nếu là index thì chưa đủ. VD khi test với p1 thì có 5 q, p2 có 3 q, p3 có 4 q. Mà tôi thì cần biết đủ q của từng nhóm.

Dù sao cũng cám ơn bạn. Bạn là 1 trong số ít người luôn đưa ra những thuật toán hay, tôi rất thích.

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

×