Đến nội dung


Hình ảnh
* * * - - 17 Bình chọn

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


  • Please log in to reply
2851 replies to this topic

#1361 avi612

avi612

    biết lệnh move

  • Members
  • PipPipPip
  • 126 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 11 October 2012 - 12:36 PM

Phản hồi nhanh quá! Cảm ơn a Tue_NV nhiều....
Nhưng lúc nãy hậu đậu hỏi chưa hết ý...
Ý của mình là muốn lập 1 hàm điều kiện như sau:
Tìm "Menu" trong "List Menu Name" nếu "Menu" đã có thì dừng lại, nếu chưa thì thực hiện các bước khác tiếp theo.
---
Hàm trên của a Tue_NV đã lấy được danh sách rồi, bi giờ muốn dò tìm tên của 1 menu nào đó thì mình phải làm sao....Nhờ các a giúp giùm.
  • 0

#1362 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 11 October 2012 - 12:43 PM

Phản hồi nhanh quá! Cảm ơn a Tue_NV nhiều....
Nhưng lúc nãy hậu đậu hỏi chưa hết ý...
Ý của mình là muốn lập 1 hàm điều kiện như sau:
Tìm "Menu" trong "List Menu Name" nếu "Menu" đã có thì dừng lại, nếu chưa thì thực hiện các bước khác tiếp theo.
---
Hàm trên của a Tue_NV đã lấy được danh sách rồi, bi giờ muốn dò tìm tên của 1 menu nào đó thì mình phải làm sao....Nhờ các a giúp giùm.

Nếu đã có list name rồi -> Dùng hàm member đi bạn
  • 1

#1363 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5679 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 11 October 2012 - 12:57 PM

:)

If (menugroup "Tên group name của bạn") ....


  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#1364 avi612

avi612

    biết lệnh move

  • Members
  • PipPipPip
  • 126 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 11 October 2012 - 02:02 PM

Ok rồi! Thanks các sư quynh nhiều nhiều.
---------------
Edit: Vấn đề đã được giải quyết nhưng có chỗ không hiểu nên muốn hỏi cho rõ hơn.
Khi em dùng Lisp của a Tue_NV để lấy ra một List Menu Name và đây là kết quả:

custom
iso-vinx
acad
rsquirrel
acimpression
autodeskseek
acetmain
"acetmain"

Nếu đúng thì nó xuất ra 1 danh sách 7 đối tượng đầu là đủ rồi (giống với hiện thị của CAD) nhưng tại sao lại có thêm 1 giá trị cuối cùng "acetmain" nữa, và nó làm cho mình khó sử lý danh sách hơn so với khi không có nó...Vậy thì bản chất của thằng này mang ý nghĩa gì...?
  • 0

#1365 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 11 October 2012 - 02:42 PM

Ok rồi! Thanks các sư quynh nhiều nhiều.
---------------
Edit: Vấn đề đã được giải quyết nhưng có chỗ không hiểu nên muốn hỏi cho rõ hơn.
Khi em dùng Lisp của a Tue_NV để lấy ra một List Menu Name và đây là kết quả:

Nếu đúng thì nó xuất ra 1 danh sách 7 đối tượng đầu là đủ rồi (giống với hiện thị của CAD) nhưng tại sao lại có thêm 1 giá trị cuối cùng "acetmain" nữa, và nó làm cho mình khó sử lý danh sách hơn so với khi không có nó...Vậy thì bản chất của thằng này mang ý nghĩa gì...?

Giá trị "acetmain" là giá trị cuối cùng mà hàm (princ (vl-filename-base(vla-get-MenuFileName x)) trả về trên command.
Bạn có thể dùng thêm (princ) để thoát êm
Ví dụ:
(defun c:1() (princ "1") (princ))
Hãy dùng lisp trên, có sử dụng (princ) và không sử dụng (princ) để rút ra kết luận
  • 1

#1366 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 11 October 2012 - 02:56 PM

@avi612: Nếu chỉ để kiểm tra 1 menu đã tồn tại hay chưa thì chỉ cần dùng duy nhất hàm Ketxu hướng dẫn, khỏi phải list cho mất công
If (menugroup "Tên group name của bạn")
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1367 avi612

avi612

    biết lệnh move

  • Members
  • PipPipPip
  • 126 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 11 October 2012 - 03:01 PM

Giá trị "acetmain" là giá trị cuối cùng mà hàm (princ (vl-filename-base(vla-get-MenuFileName x)) trả về trên command.
Bạn có thể dùng thêm (princ) để thoát êm
Ví dụ:
(defun c:1() (princ "1") (princ))
Hãy dùng lisp trên, có sử dụng (princ) và không sử dụng (princ) để rút ra kết luận

Đã hiểu sự khác biệt của nó...:)

@Doan Van Ha: Đúng là vấn đề của mình đã được giải quyết bằng cách của Ketxu hướng dẫn, nhưng mà muốn hỏi để hiểu hết luôn phòng có khi gặp phải.
Thanks for all: đã hướng dẫn tận tình...hehe :)
  • 0

#1368 lenhatanh

lenhatanh

    biết vẽ polygon

  • Members
  • PipPip
  • 75 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 12 October 2012 - 09:49 AM

Tôi có một biến như sau: (setq dau 10)
và một list: (setq lcd '( 1 2 3 4 5 6 7 8 9)
nhờ các bạn viết hộ code để cộng "dau" vào từng phần tử trong list "lcd"
(tôi đã dùng hàm "Mapcar" nhưng báo lỗi: (setq b (mapcar '+ dau lcd))...
Xin cản ơn !
  • 0

#1369 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 12 October 2012 - 10:00 AM

Tôi có một biến như sau: (setq dau 10)
và một list: (setq lcd '( 1 2 3 4 5 6 7 8 9)
nhờ các bạn viết hộ code để cộng "dau" vào từng phần tử trong list "lcd"
(tôi đã dùng hàm "Mapcar" nhưng báo lỗi: (setq b (mapcar '+ dau lcd))...
Xin cản ơn !

Đây bạn :
(mapcar '+ (list dau dau dau dau dau dau dau dau dau) lcd)
  • 0

#1370 hochoaivandot

hochoaivandot

    biết dimradius

  • Members
  • PipPipPipPipPip
  • 310 Bài viết
Điểm đánh giá: 106 (tàm tạm)

Đã gửi 12 October 2012 - 10:08 AM

Tôi có một biến như sau: (setq dau 10)
và một list: (setq lcd '( 1 2 3 4 5 6 7 8 9)
nhờ các bạn viết hộ code để cộng "dau" vào từng phần tử trong list "lcd"
(tôi đã dùng hàm "Mapcar" nhưng báo lỗi: (setq b (mapcar '+ dau lcd))...
Xin cản ơn !

(mapcar '(lambda (x) (+ x dau)) lcd)

  • 1

Dương Bá Diệp

 

www.cadonline.duyxuyen.vn 

 

Thành viên nhóm CADMAGIC

 


#1371 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 12 October 2012 - 10:10 AM

Nếu chỉ dùng mapcar thì như bác Tue_NV, còn nếu thêm lambda thì vầy:
(setq b (mapcar '(lambda (x) (+ x dau)) lcd)))
  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1372 avi612

avi612

    biết lệnh move

  • Members
  • PipPipPip
  • 126 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 12 October 2012 - 03:19 PM

Mình có vài thắc mắc sau:
1 - Làm sao để trích ra được từng đường dẫn riêng biệt sau khi ta dùng hàm (getenv "ACAD") và khi được trích ra, giá trị của nó có phải là chuỗi không, dấu ( ; và " " ) có được loại bỏ không?
Minh định lập 1 câu điều kiện như sau, thì câu lệnh của mình sẽ phải viết như thế nào.

"Nếu đường dẫn #path chưa có trong (getenv "ACAD") thì thực hiện (load "#path") nếu có rồi thì thực hiện bước A B C D....".

2 - Câu lệnh (setenv "ACAD" #path) có tác dụng gì mà khi mình thử chạy thì tất cả các đường dẫn trong Support Files của mình mất hết và thay vào đó là đường dẫn tên #path. Làm ách nào để khôi phục lại các đường dẫn bị mất.
  • 0

#1373 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 12 October 2012 - 03:30 PM

2. Get theo mình dịch là đọc. Set theo mình dịch là gán nên bạn đã gán cho "nó" đường dẩn mới trụi lủi cái #path. nếu nuốn thêm cái #path vào cái hiện có thì dùng hàm ghép chuổi xong hảy gán. Bạn không cần kiểm tra cứ ghép chuỗi xong thì gán vì nếu trùng thì cad tự loại bớt ra thôi.

Mình đoán bạn đang đi theo đường làm bộ lisp thì phải những vấn đề tạo đường dẩn, load menu thì trên cadviet nhiều rồi có thể hơi tản mạn khó theo dõi. ôm trước có bạn cũng đã nói tham khảo bài về tạo bộ lisp di động của ình nhưng hình như bạn ko xem chứ nếu có thì số câu hỏi của bạn hổm rày giảm bớt hơn phân nửa.
  • 1

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#1374 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 12 October 2012 - 03:32 PM

Mình có vài thắc mắc sau:
1 - Làm sao để trích ra được từng đường dẫn riêng biệt sau khi ta dùng hàm (getenv "ACAD") và khi được trích ra, giá trị của nó có phải là chuỗi không, dấu ( ; và " " ) có được loại bỏ không?
Minh định lập 1 câu điều kiện như sau, thì câu lệnh của mình sẽ phải viết như thế nào.

2 - Câu lệnh (setenv "ACAD" #path) có tác dụng gì mà khi mình thử chạy thì tất cả các đường dẫn trong Support Files của mình mất hết và thay vào đó là đường dẫn tên #path. Làm ách nào để khôi phục lại các đường dẫn bị mất.

1./ Bạn nghiên cứu hàm vl-string-search
Đó là 1 string. Cứ gặp dấu ; là lấy ra đường dẫn.
Bạn làm thử xem sao

2./ (setenv "ACAD" #path) -> set toàn bộ đường dẫn ngăn cách bởi dấu ; vào support
#path chỉ có 1 đường dẫn thì nó set 1 đường dẫn là đúng rồi
  • 1

#1375 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 12 October 2012 - 03:34 PM

Hỏi gì một lúc mà lắm câu thế. Trả lời câu 1 trước:

(defun C:HA()

(reverse (cdr (reverse (LM:str->lst (getenv "ACAD") ";")))))
(defun LM:str->lst ( str del / pos ) (if (setq pos (vl-string-search del str)) (cons (substr str 1 pos) (LM:str->lst (substr str (+ pos 1 (strlen del))) del)) (list str)))

  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1376 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 12 October 2012 - 04:01 PM

Hoặc code này :


(defun str-split (sym str / lst i j)
;write by Tue_NV
(vl-load-com)
(setq i 0 j 1)
(while (setq i (vl-string-search sym str i))
(setq lst (append lst (list (substr str j (- i j -1)))))
(setq i (1+ i) j (1+ i) )
)
lst)
thử : (str-split ";" (getenv "ACAD"))
  • 1

#1377 lenhatanh

lenhatanh

    biết vẽ polygon

  • Members
  • PipPip
  • 75 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 12 October 2012 - 04:09 PM

Nếu chỉ dùng mapcar thì như bác Tue_NV, còn nếu thêm lambda thì vầy:
(setq b (mapcar '(lambda (x) (+ x dau)) lcd)))

Cám ơn mọi người rất nhiều !
  • 0

#1378 avi612

avi612

    biết lệnh move

  • Members
  • PipPipPip
  • 126 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 12 October 2012 - 05:46 PM

Đã ứng dụng được, thanks :)
  • 0

#1379 lenhatanh

lenhatanh

    biết vẽ polygon

  • Members
  • PipPip
  • 75 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 14 October 2012 - 09:36 AM

"[yêu cầu]Viết Lisp xắp xếp các List..."
Tôi có hai list như sau:
- list 1 chứa các giá trị: (setq ddat '(4 2 7 1 8 3 5 6 9))
- list 2 chứa các text: (setq tso '(d b g a h c e f i))
Nhờ các Bạn giúp CODE để xắp xếp hai list trên sao cho ra kết quả như sau:
...(xapxep ddat tso)...
thì trả về hai list: ( 1 2 3 4 5 6 7 8 9) và (a b c d e f g h i) tương ứng.
  • 0

#1380 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 14 October 2012 - 09:54 AM

(vl-sort ddat '(lambda (e1 e2) (< e1 e2)))
(vl-sort tso '(lambda (e1 e2) (< e1 e2)))
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.