Đế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
2854 replies to this topic

#261 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 07 May 2009 - 04:02 PM

Cho Tú hỏi chút:
-khi viết lisp mình dùng biến nào để khi nhập 2 điểm thì nó xuất hiện 1 nét hỗ trợ vậy.
- VD: (setq PT1 (getpoint "\n chon diêm 1:")
PT2 (getpoint "\n chon diem 2:")
)
Trong cad khi chọn từ điểm 1 đến điểm 2 có 1 nét hỗ trợ. Xin cám ơn

Sửa:
(setq PT1 (getpoint "\n chon diêm 1:")
PT2 (getpoint PT1"\n chon diem 2:")
)
  • 2

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


#262 minhtu2004

minhtu2004

    biết lệnh chamfer

  • Members
  • PipPipPipPip
  • 219 Bài viết
Điểm đánh giá: 34 (tàm tạm)

Đã gửi 07 May 2009 - 04:15 PM

Thêm 1 câu nữa nha:
-Hàm nào để nhận được giá trị trong popup_list và chọn ok thì gán cho 1 biến.
VD: có dialog
:popup_list{
list = "\n atama";
}
ok_cancel;
bây giờ mình muốn khi nhấn ok thì chữ atama gán cho 1 biến TH. Xin cám ơn
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#263 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 07 May 2009 - 08:04 PM

Thêm 1 câu nữa nha:
-Hàm nào để nhận được giá trị trong popup_list và chọn ok thì gán cho 1 biến.
VD: có dialog
:popup_list{
list = "\n atama";
}
ok_cancel;
bây giờ mình muốn khi nhấn ok thì chữ atama gán cho 1 biến TH. Xin cám ơn

Chào bạn minhtu2004,
Để có thể lấy giá trị của biến từ một hộp thoại DCL nói chung và một popup_list nói riêng bạn cần phải sử dụng hàm lưu biến (saveVars) bạn ạ. Ví dụ:
(defun SaveVars ()
(setq th (get_tile "MyValue"))
)
Trong đó MyValue là tên của cái popup_list mà bạn sẽ lấy giá trị từ đó.
Trong cái ví dụ bạn đưa ra, cú pháp sai lắm đấy bạn ạ. Bạn nên xem lại thất kỹ phần lý thuyết về cách tạo các hộp thoại DCL trước khi nghĩ đến việc sử dụng nó bạn ạ. Đừng vội vàng áp dụng khi chưa thật hiểu kỹ về nó bạn nhé.
Chúc bạn vui.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#264 minhtu2004

minhtu2004

    biết lệnh chamfer

  • Members
  • PipPipPipPip
  • 219 Bài viết
Điểm đánh giá: 34 (tàm tạm)

Đã gửi 07 May 2009 - 08:20 PM

-Cám ơn bạn đã gợi ý, mình đã hiểu rồi.
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#265 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 07 May 2009 - 08:24 PM

Cac bạn cho minh hỏi file có dạng *.fas trong autocad có thuộc loại phai lsp không? có cách nào để đọc và chỉnh sủa file đó không? Cách tạo ra file dó nhw thế nào? Rất mong được các bạn chỉ giúp cang nhanh càng tốt. Cảm ơn rất nhiều


file fas là file lsp đã mã hóa, không đọc đc, chắc mục đích không cho đọc sửa j đc. Cũng có vài ct dịch ngược lại nhưng theo mình đọc cái file dịch ngược đó còn khó hiểu hơn file gốc.
Cách tạo file fas cũng đơn giản:
-mở vlisp bằng lệnh vlide trong acad.
-chọn menu file->make application->new application wizard rồi làm theo hướng dẫn.
  • 0

#266 minhtu2004

minhtu2004

    biết lệnh chamfer

  • Members
  • PipPipPipPip
  • 219 Bài viết
Điểm đánh giá: 34 (tàm tạm)

Đã gửi 07 May 2009 - 08:31 PM

-Đây là đọan code mình làm thử bạn xem dùm.
NB : dialog{
label = "Thu";
:popup_list{
label = "Chon";
list = "Atama \nNegarami";
value = 0;
edit_width = 30;
key = "btn";
}
ok_cancel;
}
Đây là đọan lisp:
(defun SaveVars()
(setq LE(get_tile "btn"))
)
(defun c:tu()
(setq dcl_id (load_dialog "tmp.dcl"))
(new_dialog "NB" dcl_id)
(start_dialog)
(unload_dialog dcl_id)
(setq PT1(getpoint "\n Chon diem thu 1:")
PT2(getpoint PT1"\n Chon diem thu 2:")
)
(command "leader" PT1 PT2 "A" LE "")
(princ)
)
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#267 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 08 May 2009 - 02:05 PM

-Đây là đọan code mình làm thử bạn xem dùm.
NB : dialog{
label = "Thu";
:popup_list{
label = "Chon";
list = "Atama \nNegarami";
value = 0;
edit_width = 30;
key = "btn";
}
ok_cancel;
}
Đây là đọan lisp:
(defun SaveVars()
(setq LE(get_tile "btn"))
)
(defun c:tu()
(setq dcl_id (load_dialog "tmp.dcl"))
(new_dialog "NB" dcl_id)
(start_dialog)
(unload_dialog dcl_id)
(setq PT1(getpoint "\n Chon diem thu 1:")
PT2(getpoint PT1"\n Chon diem thu 2:")
)
(command "leader" PT1 PT2 "A" LE "")
(princ)
)

Chào bạn Minhtu2004,
Đọc đoạn code của bạn thấy khái niệm của bạn về việc sử dụng các hộp thoại trong lập trình autolisp còn mỏng quá bạn ạ. Bạn không thể tạo cái popup_list ở trong file DCL được. File DCL chỉ giúp bạn định dạng hộp thoại tức là hiển thị ra màn hình dạng hộp thoại mà bạn muốn sử dụng. Còn nội dung của các tile trong hộp thoại phải được bạn làm trong file lsp chớ. Sửa lại đoạn code của bạn không phải quá khó nhưng bạn sẽ không hiểu được vấn đề. Vì vậy mình đề nghị bạn hãy tìm hiểu kỹ hơn về vấn đề sử dụng hộp thoại, các cấu trúc cú pháp cơ bản trong file DCL, cách nhập dữ liệu cho các tile của hộp thoại,.......
Bạn có thể tham khảo việc lấy dữ liệu từ hộp thoại với popup_list qua ví dụ cụ thể ở đây: http://www.cadviet.c...oipopuplist.doc
Sau khi bạn đọc kỹ ví dụ này, hãy thử áp dụng vào yêu cầu của bạn, có chỗ nào chưa được bạn hãy post lên, chúng ta cùng giải quyết.
Đây chỉ là một ví dụ đơn gỉan, để hiểu rõ hơn về vấn đề này bạn nên tìm hiểu thêm các tài liệu khác nữa nhé.
Chúc bạn thành công.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#268 minhtu2004

minhtu2004

    biết lệnh chamfer

  • Members
  • PipPipPipPip
  • 219 Bài viết
Điểm đánh giá: 34 (tàm tạm)

Đã gửi 08 May 2009 - 03:05 PM

-Cám ơn.
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#269 binharch77

binharch77

    biết dimcontinue

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

Đã gửi 08 May 2009 - 03:20 PM

có đồng chí nào cho hỏi với :
trên layer 1, có duy nhất 1 Mtext, làm sao có thể chọn Mtext đó một cách tự động và lọc ra nội dung của text đó??
cám ơn nhiều
  • 0

#270 binharch77

binharch77

    biết dimcontinue

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

Đã gửi 08 May 2009 - 03:53 PM

có đồng chí nào cho hỏi với :
trên layer 1, có duy nhất 1 Mtext, làm sao có thể chọn Mtext đó một cách tự động và lọc ra nội dung của text đó??
cám ơn nhiều

ôi, làm được rồi, vui quá
LISP muôn năm :(
  • 0

#271 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 08 May 2009 - 03:54 PM

có đồng chí nào cho hỏi với :
trên layer 1, có duy nhất 1 Mtext, làm sao có thể chọn Mtext đó một cách tự động và lọc ra nội dung của text đó??
cám ơn nhiều

Đây bạn : (cdr(assoc 1 (entget(ssname (ssget "x" '((0 . "MTEXT") (8 . "Layer1"))) 0))))
  • 0

#272 binharch77

binharch77

    biết dimcontinue

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

Đã gửi 08 May 2009 - 03:58 PM

Đây bạn : (cdr(assoc 1 (entget(ssname (ssget "x" '((0 . "MTEXT") (8 . "Layer1"))) 0))))

cám ơn Tue_NV nhiều nhé. mình cũng vừa làm được. :( :(
  • 0

#273 binharch77

binharch77

    biết dimcontinue

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

Đã gửi 08 May 2009 - 04:13 PM

Đây bạn : (cdr(assoc 1 (entget(ssname (ssget "x" '((0 . "MTEXT") (8 . "Layer1"))) 0))))

ôi, sao hàm của bạn mình nhập kg đưọc,
của mình như thế này thì được :
(cdr (assoc 1 (entget (ssname (ssget "x" (list (cons 0 "mtext") (cons 8 "b-data"))) 0))))
  • 0

#274 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 08 May 2009 - 04:19 PM

có đồng chí nào cho hỏi với :
trên layer 1, có duy nhất 1 Mtext, làm sao có thể chọn Mtext đó một cách tự động và lọc ra nội dung của text đó??
cám ơn nhiều

Lúc đầu bạn nói là trên layer 1, có duy nhất 1 Mtext thì mình viết là layer1
Còn Layer của bạn muốn tìm là b-data thì phải sửa lại là :
(cdr(assoc 1 (entget(ssname (ssget "x" '((0 . "MTEXT") (8 . "b-data"))) 0))))
mới đúng phải không bạn?
  • 0

#275 binharch77

binharch77

    biết dimcontinue

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

Đã gửi 08 May 2009 - 04:22 PM

Lúc đầu bạn nói là trên layer 1, có duy nhất 1 Mtext thì mình viết là layer1
Còn Layer của bạn muốn tìm là b-data thì phải sửa lại là :
(cdr(assoc 1 (entget(ssname (ssget "x" '((0 . "MTEXT") (8 . "b-data"))) 0))))
mới đúng phải không bạn?

ồ xin lỗi về chỗ tên layer, vần đề là có thêm hàm (cons 0 "mtext") cái này không giống cái bạn = (0 . "MTEXT")
mình kg hiểu lắm
  • 0

#276 binharch77

binharch77

    biết dimcontinue

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

Đã gửi 08 May 2009 - 04:30 PM

hỏi cái nữa hề hề
nếu mtext đó có nhiều hàng, vậy có cách nào chọn hàng được kg ? vd hàng thứ 3 chẳng hạn???
  • 0

#277 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 08 May 2009 - 06:33 PM

ồ xin lỗi về chỗ tên layer, vần đề là có thêm hàm (cons 0 "mtext") cái này không giống cái bạn = (0 . "MTEXT")
mình kg hiểu lắm

Chào bạn Binharch77 hề hề,
Cái hàm (cons 0 "mtext") của bạn là hàm nối hai đối tượng đơn thành một association_list nghĩa là một danh sách tương tác. Kết quả của nó là một list có giá trị là '(0 . "mtext"). Còn cái hàm của bác Tue_NV là gọi đích danh cái thằng cu association_list ấy ra mà chả phải nối niếc gì cả.
Thực chất kết quả của hai thằng là như nhau nhưng chẳng qua là khác cách gọi nó ra mà thôi. Bạn gọi nó ra theo kiểu "Ới Tèo ơi" còn bác Tue_Nv thì "Tèo" thế thôi. hề hề.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#278 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 08 May 2009 - 07:15 PM

Thực chất kết quả của hai thằng là như nhau nhưng chẳng qua là khác cách gọi nó ra mà thôi. Bạn gọi nó ra theo kiểu "Ới Tèo ơi" còn bác Tue_Nv thì "Tèo" thế thôi. hề hề.

(setq em "em_day")
nếu:
(setq timkiem (ssget "X" '((0 . "em_day")))) ->9 xác :(
nếu:
(setq timkiem (ssget "X" '((0 . em )))) -> em đâu rồi? :lol:
nếu:
(setq timkiem (ssget "X" (list (0 ."em_day")))) -> lạc mất em rồi :(
nếu:
(setq timkiem (ssget "X" (list (0 . em )))) -> lạc mất em thật rồi :(
nếu:
(setq timkiem (ssget "X" (list '(0 ."em_day")))) -> may quá tìm thấy em rỗi :cheers:
nếu:
(setq timkiem (ssget "X" '( (cons 0 "em_day")))) -> chán anh quá cơ :(
nếu:
(setq timkiem (ssget "X" '( (cons 0 em)))) -> hu hu lần tiếp mà không được nữa là em .... :cheers:
nếu:
(setq timkiem (ssget "X" (list (cons 0 em )))) -> có...có ...phải em không ... :gun: 9 xác :gun:
nếu:
(setq timkiem (ssget "X" (list (cons 0 "em_day")))) -> anh thật là tài :(

Hy vọng ví dụ vui trên giúp mọi người hiểu rõ hơn về sự khác nhau giữa hàm quote (chính là ') và hàm list. Đồng thời giải thích tại sao có trường hợp ta lại phải dùng làm cons và các ý nghĩa của 1 list trong hàm ssget

- Hàm '(....) : luôn trả về giá trị cố định, hằng số. Không thực hiện phép toán nào trong hàm này được
- Hàm (list .....): cho thực hiện phép toán, có thể chứa biến trong hàm này. Giá trị trả về giá trị cuối cùng của biến.
Nhưng chú ý trường hợp này là không đúng: (list (0 . em )) và (list (0 . "em_day" ))
Mà phải là (list (cons 0 em )) hoặc (list '(0 . "em_day" ))
Hàm (cons ...): nối một đối tượng vào 1 list. Nếu đối tượng sau không phải là list thì sẽ có dạng ( a . b ) . Hàm này có thể chứa biến (trả về giá trị của biến) hoặc hằng số cố định
  • 2

#279 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 08 May 2009 - 08:17 PM

hỏi cái nữa hề hề
nếu mtext đó có nhiều hàng, vậy có cách nào chọn hàng được kg ? vd hàng thứ 3 chẳng hạn???

Có. Nếu lấy list dữ liệu của Mtext thì mỗi hàng ngăn với nhau bởi dấu "\\". Muốn lấy hàng nào thì phải đặt ra bài toán lọc text theo điều kiện. Hề hề
  • 0

#280 binharch77

binharch77

    biết dimcontinue

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

Đã gửi 08 May 2009 - 09:39 PM

(setq em "em_day")
nếu:
(setq timkiem (ssget "X" '((0 . "em_day")))) ->9 xác :(
nếu:
(setq timkiem (ssget "X" '((0 . em )))) -> em đâu rồi? ;)
nếu:
(setq timkiem (ssget "X" (list (0 ."em_day")))) -> lạc mất em rồi :lol:
nếu:
(setq timkiem (ssget "X" (list (0 . em )))) -> lạc mất em thật rồi :(
nếu:
(setq timkiem (ssget "X" (list '(0 ."em_day")))) -> may quá tìm thấy em rỗi :cheers:
nếu:
(setq timkiem (ssget "X" '( (cons 0 "em_day")))) -> chán anh quá cơ :cheers:
nếu:
(setq timkiem (ssget "X" '( (cons 0 em)))) -> hu hu lần tiếp mà không được nữa là em .... :gun:
nếu:
(setq timkiem (ssget "X" (list (cons 0 em )))) -> có...có ...phải em không ... :( 9 xác :(
nếu:
(setq timkiem (ssget "X" (list (cons 0 "em_day")))) -> anh thật là tài :(

Hy vọng ví dụ vui trên giúp mọi người hiểu rõ hơn về sự khác nhau giữa hàm quote (chính là ') và hàm list. Đồng thời giải thích tại sao có trường hợp ta lại phải dùng làm cons và các ý nghĩa của 1 list trong hàm ssget

ô hô hay quá hehhe he he
bác nataca đưa ra ví dụ vui thật
À, BÂY GIỜ THÌ EM ĐÃ HIỂU

:gun:
  • 0