Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

HÌ, nốt hỏi, Jin hỏi tiếp: muốn chọn một đối tượng bằng một điểm trên đối tượng đó thì làm thế nào Sách quảng cáo rằng hàm ENTSEL còn cho phép chọn đối tượng bằng cách nhập toạ độ điểm Ví dụ như đường tròn gốc '(0 0) , bán kính r = 20 Jin muốn chọn đưòng tròn đó bằng điểm '(20 0), nhưng cú pháp (setq Sel1 (entsel '(20 0))) lại không mang lại kết quả Lệnh đúng phải như thế nào vậy?

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

Cho em hỏi có hàm nào của líp như thế này ko nhỉ:

cho chuỗi : "abcad"

bây h muốn thay chữ a trong chuỗi trên thành aa ko nhỉ?

"abcad" >>>> "aabcaad"

:wacko:

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

Cho em hỏi có hàm nào của líp như thế này ko nhỉ:

cho chuỗi : "abcad"

bây h muốn thay chữ a trong chuỗi trên thành aa ko nhỉ?

"abcad" >>>> "aabcaad"

:wacko:

 

 

(vl-string-subst new-str pattern string [start-pos])

Bạn thử đúng không nhé : (vl-string-subst "aa" "a" "abcad")

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

(vl-string-subst new-str pattern string [start-pos])

Bạn thử đúng không nhé : (vl-string-subst "aa" "a" "abcad")

 

Nếu chưa đúg ý bạn xem cái này của Express thử xem sao:

(acet-str-replace find replace string [ignoreCase [useRegExp [count]]])

(acet-str-replace "a" "aa" "abcad")

Nhưng Cad phải cài Express đó bạn nhé

  • 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

Nếu chưa đúg ý bạn xem cái này của Express thử xem sao:

(acet-str-replace find replace string [ignoreCase [useRegExp [count]]])

(acet-str-replace "a" "aa" "abcad")

Nhưng Cad phải cài Express đó bạn nhé

Lisp thì như vầy :

(defun tthe (find rep str)
;copyright by Tue_NV
(vl-list->string
 (apply 'append (subst (vl-string->list rep) (vl-string->list find)
	      (mapcar '(lambda(x) (list x))
		      (vl-string->list str)
		)
	  )
 )
)
)

thử :

(tthe "a" "aa" "abcad" )

  • 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 entsel có cú pháp đầy đủ là (entsel [msg]), trong đó [msg] là dòng ký tự.

Hàm này chọn 1 đối tượng bằng cách pick vào nó. Hàm trả về tên đối tượng và tọa độ điểm pick.

Như vậy, hàm này không đáp ứng các y/c mà bạn đặt ra, nên bạn không thể dùng cú pháp như vậy để chọ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

:) Câu bày bác Jin hỏi từ lâu lắc rồi, bạn ấy quote lại thôi ^^

Nếu đạt tiêu chí có thể dùng ssget hoặc nentselp :)

@bác Tuệ : VL kia 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

....

@bác Tuệ : VL kia mà ^^

Đúng là VL, còn đây là Lisp:

(defun tthe (find rep str)
;copyright by Tue_NV
(defun str->list(str / res i)
 (setq i 0)
 (Repeat (strlen str)
   (setq res (append res (list (ascii (substr str (setq i (1+ i)) 1)))))
 )
res
)  
(apply 'strcat 
 (mapcar 'chr
   (apply 'append (subst (str->list rep) (str->list find)
	      (mapcar '(lambda(x) (list x))
		      (str->list str)
		)
	  )
    )
 )
)
)

thử :

(tthe "a" "aa" "abcad" )

  • 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

Đúng là VL, còn đây là Lisp:

(defun tthe (find rep str)
;copyright by Tue_NV
(defun str->list(str / res i)
 (setq i 0)
 (Repeat (strlen str)
   (setq res (append res (list (ascii (substr str (setq i (1+ i)) 1)))))
 )
res
)  
(apply 'strcat 
 (mapcar 'chr
   (apply 'append (subst (str->list rep) (str->list find)
	      (mapcar '(lambda(x) (list x))
		      (str->list str)
		)
	  )
    )
 )
)
)

thử :

(tthe "a" "aa" "abcad" )

thay vì viết thế này: (mapcar '(lambda(x)(list x)...

Chỉ cần viết thế này là đuợc rồi bác ạ: (mapcar 'list ...

Bác vừa dùng hàm lambda để định nghĩa 1 hàm không tên chức năng y hệt hàm list

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ác bạn trên diễn đàn cho hỏi với:

1. Cú pháp lệnh trong lisp để chuyển đơn vị trong bản vẽ được không? Ví dụ từ đơn vị "inches" sang đơn vị "meters",

2. Viết code khi thực hiện lệnh vòng lặp (while hoặc repeat) mà trong đó có vòng bị lỗi thì bỏ qua vòng đó đế thựcc hiện vòng lặp tiếp theo.

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ác bạn trên diễn đàn cho hỏi với:

1. Cú pháp lệnh trong lisp để chuyển đơn vị trong bản vẽ được không? Ví dụ từ đơn vị "inches" sang đơn vị "meters",

2. Viết code khi thực hiện lệnh vòng lặp (while hoặc repeat) mà trong đó có vòng bị lỗi thì bỏ qua vòng đó đế thựcc hiện vòng lặp tiếp theo.

1. Có thể sửa bằng lệnh "Options". Còn list thì:

(setvar "INSUNITSDEFSOURCE" 1)

(setvar "INSUNITSDEFTARGET" 6)

2. Đang botay.com

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ác bạn trên diễn đàn cho hỏi với:

......

2. Viết code khi thực hiện lệnh vòng lặp (while hoặc repeat) mà trong đó có vòng bị lỗi thì bỏ qua vòng đó đế thựcc hiện vòng lặp tiếp theo.

Bắt bệnh kiểu này, khó chẩn đoán đúng lắm. Chi bằng bạn post code của bạn lên đây, anh em sẽ tháo gỡ cho bạ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

1. Có thể sửa bằng lệnh "Options". Còn list thì:

(setvar "INSUNITSDEFSOURCE" 1)

(setvar "INSUNITSDEFTARGET" 6)

Mình đã chép đoạn lệnh này vào lisp rồi nhưng không thấy thay đổi gì. Vậy còn cách nào nữa không bạn hay mình đã làm sai ở đâu?

Bắt bệnh kiểu này, khó chẩn đoán đúng lắm. Chi bằng bạn post code của bạn lên đây, anh em sẽ tháo gỡ cho bạn.

Mình lấy VD như sau:

(repeat N

(lệnh 1)

(lệnh 2)

.......

(lệnh m)

)

Nếu trong quá trình chạy lisp giả sử ở vòng lặp thứ i, (lệnh 2) bị lỗi không thực hiện thì bỏ qua vòng này tiếp tục chạy vòng tiếp sau.

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 đã chép đoạn lệnh này vào lisp rồi nhưng không thấy thay đổi gì. Vậy còn cách nào nữa không bạn hay mình đã làm sai ở đâu?

 

Mình lấy VD như sau:

(repeat N

(lệnh 1)

(lệnh 2)

.......

(lệnh m)

)

Nếu trong quá trình chạy lisp giả sử ở vòng lặp thứ i, (lệnh 2) bị lỗi không thực hiện thì bỏ qua vòng này tiếp tục chạy vòng tiếp sau.

Còn tùy thuộc "lệnh" của bạn nó là cái j nữa mà.Có lệnh cho try, có lệnh k cho try, rồi còn phu thuộc vào giá trị của nó nhận về có ảnh hưởng gì đến thằng lệnh tiếp theo k

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

Nhờ các anh giúp em code lấy list tấc cả các pattern hatch (cả predefine và userdefine)

Cảm ơn các anh!

 

Bạn thử đoạn này xem sao. Lấy list các pH trong 1 file

 

(defun lstHatch(patFile / lst line tmp)
(vl-directory-files (vl-filename-directory (findfile patFile)) "*.pat") 
(setq file_open (open (findfile patFile) "r"))  
(while (setq line (read-line file_open))
   (setq tmp (cons line tmp))) 
(close file_open) 
(setq tmp (reverse tmp)) 
(setq lst (vl-remove-if-not '(lambda (string) (if (eq (substr string 1 1) "*") string)) tmp)) 
(setq lst (mapcar '(lambda (string) (substr string 2 (- (vl-string-search "," string) 1))) lst)) 
)

Test : (lsthatch "acadiso.pat")

  • 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

Thông thường, để đọc 1 danh sách lên dialoge cần phải dùng 3 hàm. Ví dụ, muốn đọc danh sách "ds1" thì:

(start_list "ds1")

(mapcar 'add_list ds1)

(end_list)

Vậy, có cách gì tạo 1 hàm với biến toàn cục là "ds" để gom 3 hàm này lại? Ví dụ hàm đó là (GOM ds) thì:

- Khi cần đọc ds2 ta viết (GOM ds2)

- Khi cần đọc ds3 ta viết (GOM ds3)...

Bác nào biết xin chỉ giùm vớ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

Thông thường, để đọc 1 danh sách lên dialoge cần phải dùng 3 hàm. Ví dụ, muốn đọc danh sách "ds1" thì:

(start_list "ds1")

(mapcar 'add_list ds1)

(end_list)

Vậy, có cách gì tạo 1 hàm với biến toàn cục là "ds" để gom 3 hàm này lại? Ví dụ hàm đó là (GOM ds) thì:

- Khi cần đọc ds2 ta viết (GOM ds2)

- Khi cần đọc ds3 ta viết (GOM ds3)...

Bác nào biết xin chỉ giùm với.

Hàm sau của anh ssg được anh em Cadviet sử dụng như thư viện hàm con.

(defun set_list(MyTile MyList MyVal / j x)
(start_list MyTile)
(setq j 0)
(while (setq x (nth j MyList))
	(add_list x)
	(setq j (1+ j))
)
(end_list)
(set_tile MyTile MyVal)
)

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

Thông thường, để đọc 1 danh sách lên dialoge cần phải dùng 3 hàm. Ví dụ, muốn đọc danh sách "ds1" thì:

(start_list "ds1")

(mapcar 'add_list ds1)

(end_list)

Vậy, có cách gì tạo 1 hàm với biến toàn cục là "ds" để gom 3 hàm này lại? Ví dụ hàm đó là (GOM ds) thì:

- Khi cần đọc ds2 ta viết (GOM ds2)

- Khi cần đọc ds3 ta viết (GOM ds3)...

Bác nào biết xin chỉ giùm với.

Chào bạn DOANVANHA

(start_list "ds1")

(mapcar 'add_list ds1)

(end_list)

 

"ds1" ở dòng (start_list "ds1")là key

ds1 ở dòng (mapcar 'add_list ds1) chính là 1 List

Bạn có thể viết 1 function con

(defun GOM(key Lst)

(start_list key)

(mapcar 'add_list Lst)

(end_list)

)

;;;

- Khi cần đọc list ds2 với key là "ds2" ta viết (GOM "ds2" ds2)

  • 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

Chào bạn DOANVANHA

(start_list "ds1")

(mapcar 'add_list ds1)

(end_list)

 

"ds1" ở dòng (start_list "ds1")là key

ds1 ở dòng (mapcar 'add_list ds1) chính là 1 List

Bạn có thể viết 1 function con

(defun GOM(key Lst)

(start_list key)

(mapcar 'add_list Lst)

(end_list)

)

;;;

- Khi cần đọc list ds2 với key là "ds2" ta viết (GOM "ds2" ds2)

Cám ơn bác Tue_NV! Giá mà biến được list qua key để hàm GOM chỉ còn 1 biến thì hay biết mấy.

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ám ơn bác Tue_NV! Giá mà biến được list qua key để hàm GOM chỉ còn 1 biến thì hay biết mấy.

Bạn có thể gom key và List đó thành 1 list mẹ.

List mẹ này có phần tử đầu tiên là key

Hàm GOM sẽ viết lại như sau :

(defun GOM(lst)

(start_list (car lst))

(mapcar 'add_list (cdr Lst))

(end_list)

)

  • Vote tăng 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

Bạn có thể gom key và List đó thành 1 list mẹ.

List mẹ này có phần tử đầu tiên là key

Hàm GOM sẽ viết lại như sau :

(defun GOM(lst)

(start_list (car lst))

(mapcar 'add_list (cdr Lst))

(end_list)

)

Trò của bác hơi "đểu" nhưng... độc! Tuy nhiên, cái này áp dụng cho list mới thì tiện, nhưng list cũ thì hơi bị khổ, vì phải lôi các list này ra để add thêm phần tử đầu, mà tôi có trên mấy trăm list nên hơi bị mệt. Dù sao cũng thanks thêm 1 lần nữa.

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

Trò của bác hơi "đểu" nhưng... độc! Tuy nhiên, cái này áp dụng cho list mới thì tiện, nhưng list cũ thì hơi bị khổ, vì phải lôi các list này ra để add thêm phần tử đầu, mà tôi có trên mấy trăm list nên hơi bị mệt. Dù sao cũng thanks thêm 1 lần nữa.

Mình viết đường hoàng, đâu có "đểu"

Bạn có thể sử dụng cái này để thêm key làm phần tử đầu trong List đã có sẵn

Cả trăm List cũng nhanh

Ví dụ như thế này :

-> Tue_NV có 3 key :

(setq a '("key1" "key2" "key3"))

Có 3 List ứng với 3 biến L1, L2, L3

(setq L1 '(1 5 6))

(setq L2 '(3 5 7))

(setq L3 '(6 4 9))

-> Gom "key1" vào L1, "key2" vào L2, "key3" vào L3 -> set cho biến b

(setq b(mapcar '(lambda(x y) (append (list x) y)) a (list L1 L2 L3)))

-> gán từng phần tử trong biến b lại cho L1; L2; L3

(mapcar 'set '(L1 L2 L3) b )

 

-> Kết quả nằm trong biến L1; L2 ; L3. Bạn thử xem

  • 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ình viết đường hoàng, đâu có "đểu"

Bạn có thể sử dụng cái này để thêm key làm phần tử đầu trong List đã có sẵn

Cả trăm List cũng nhanh

Ví dụ như thế này :

-> Tue_NV có 3 key :

(setq a '("key1" "key2" "key3"))

Có 3 List ứng với 3 biến L1, L2, L3

(setq L1 '(1 5 6))

(setq L2 '(3 5 7))

(setq L3 '(6 4 9))

-> Gom "key1" vào L1, "key2" vào L2, "key3" vào L3 -> set cho biến b

(setq b(mapcar '(lambda(x y) (append (list x) y)) a (list L1 L2 L3)))

-> gán từng phần tử trong biến b lại cho L1; L2; L3

(mapcar 'set '(L1 L2 L3) b )

 

-> Kết quả nằm trong biến L1; L2 ; L3. Bạn thử xem

1. Có 2 loại đểu: đểu và "đểu". "Đểu" này là "đểu" khen mà bác!

2. Bác đã nói đúng. Tuy nhiên, chơi 2 biến sửa ít hơn 1 biến, nên thôi, đành chơi 2 biến vậy. Thanks 1 lần nữa.

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

×