Đế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

#561 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

  • Advance Member
  • PipPipPipPip
  • 213 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 30 October 2010 - 10:13 PM

Đổ oan cho hàm lambda tội lắm.
Lý do :
Thay dòng :
(vl-sort ltn
(function (lambda (e1 e2)
(< (car e1) (car e2)) ) )
)

Thanh dòng :
(setq ltn (vl-sort ltn
(function (lambda (e1 e2)
(< (car e1) (car e2)) ) )
)
)


Hixx. Cảm ơn 2 bác nhiều lắm!!!!

Em quên mất chưa setq cho nó, hì hì. nên lúc princ ra nó in lại cái hàm lúc chưa sắp xếp.
  • 0

Lisp In bản vẽ hàng loạt:
http://www.cadviet.c...ndpost&p=139860


#562 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 08 November 2010 - 07:30 PM

Em đang tập tành sử dụng hàm ssget, hôm qua viết 1 hàm thế này
(Defun c:Class()
(Setq ss (ssget "W")
n (sslength ss)
id 0
Ds1 '())
(Repeat n
(Setq el (ssname ss id)
Info (entget el))
(if
(= (cdr(assoc 2 Info)) "ANSI31")
(Setq Ds1(Append (list el) Ds1)))
(Setq id(1+ id))
)
(Princ))
Mục đích của nó là quét 1 lần được các đối tượng, sau đó mới lọc riêng đưa vào các list khác nhau; ở đây em mới check thử cho 1 list ds1 nhưng mà bị lỗi bad argument point? Có bác nào bít lỗ này do đâu ko ah
  • 0

#563 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 08 November 2010 - 07:37 PM

Em đang tập tành sử dụng hàm ssget, hôm qua viết 1 hàm thế này
(Defun c:Class()
(Setq ss (ssget "W")
n (sslength ss)
id 0
Ds1 '())
(Repeat n
(Setq el (ssname ss id)
Info (entget el))
(if
(= (cdr(assoc 2 Info)) "ANSI31")
(Setq Ds1(Append (list el) Ds1)))
(Setq id(1+ id))
)
(Princ))
Mục đích của nó là quét 1 lần được các đối tượng, sau đó mới lọc riêng đưa vào các list khác nhau; ở đây em mới check thử cho 1 list ds1 nhưng mà bị lỗi bad argument point? Có bác nào bít lỗ này do đâu ko ah

Bạn bị lỗi ở hàm ssget
(ssget "W")
phải được viết như thế này :
(ssget "W" p1 p2)
P1 và p2 là 2 điểm tạo nên cửa sổ "W"

Bạn xem lại cú pháp của hàm ssget nhé
  • 1

#564 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 08 November 2010 - 07:53 PM

Ớ, lỗi đơn giản thế mà mình ko bít, thanks bác Tue_NV nhiều nhiều, lệnh ssget đúng là điểm tinh túy của autolisp :)
  • 0

#565 khaosat2009

khaosat2009

    biết lệnh offset

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

Đã gửi 10 November 2010 - 11:38 AM

-Mình có một Lisp về chuyển các đường nét, mình muốn nhờ các anh hướng dẫn cho việc chuyển nét với kiểu đường nét mới theo file ***. lin khác thì làm thế nào trên lisp này. Mong được các anh giúp
M;============================================================================ok

(DEFUN C:CN ( / Sset Elist Msg OldLineType NewLineType)
(princ " \Chon doi tuong can chuyen sang kieu net khac : ")
(setq Sset (ssget))
(progn
(setq OldLineType (getvar "CELTYPE"))
(setq Msg (strcat "\nNewLineType ? \nLien/Khuat/Truc/Gach/Vien/Ao/Cham/CCham/CGach: <" OldLineType "> : "))
(Initget "Lien Khuat Truc Gach Vien Ao Cham CCham CGach")
(setq NewLineType (getkword Msg))
(if (= NewLineType Nil) (setq NewLineType OldLineType))
(If (= NewLineType "Lien") (setq NewLineType "Continuous"))
(If (= NewLineType "Khuat") (setq NewLineType "Hidden"))
(If (= NewLineType "Truc") (setq NewLineType "Center"))
(If (= NewLineType "Gach") (setq NewLineType "Dashed"))
(If (= NewLineType "Vien") (setq NewLineType "Border"))
(If (= NewLineType "Ao") (setq NewLineType "Phantom"))
(If (= NewLineType "Cham") (setq NewLineType "Divide"))
(If (= NewLineType "CCham") (setq NewLineType "Dot"))
(If (= NewLineType "CGach") (setq NewLineType "Dashdot"))
(command "CHPROP" Sset "" "LT" NewLineType "")
) ;end progn
(princ)
) ;end
;============================================================================

File kí hiệu nét kèm theo : http://www.cadviet.c...s/3/acadtam.rar
  • 0

#566 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 10 November 2010 - 11:51 PM

Cái này băn khoăn lâu rồi, nhưng thấy nó chưa ảnh hưởng nghiệm trọng lắm nên hôm nay mới hỏi mọi người :
Mình có chương trình con thế này :

(Defun TinhDT(ds)
(Foreach pt ds
(Command "AREA" "O" pt)
(Setq DT(Getvar"AREA")
TDT(+ TDT DT))
)
(Princ(Strcat"\n Total Area =" (Rtos TDT 2 2) " m2"))
(Princ))
;-----------------------------------------------------
Để không ghép vào chương trình chính thì chạy ngon, nhưng muốn khai báo cho rõ ràng biến cục bộ để dễ kiểm soát thì gặp lỗi Too Few argument :
Mình sửa thế này đây (Defun TinhDT(ds / pt DT)....Các cao thủ chỉ giáo giúp mình với !
  • 0

#567 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 11 November 2010 - 02:15 AM

Cái này băn khoăn lâu rồi, nhưng thấy nó chưa ảnh hưởng nghiệm trọng lắm nên hôm nay mới hỏi mọi người :
Mình có chương trình con thế này :

(Defun TinhDT(ds)
(Foreach pt ds
(Command "AREA" "O" pt)
(Setq DT(Getvar"AREA")
TDT(+ TDT DT))
)
(Princ(Strcat"\n Total Area =" (Rtos TDT 2 2) " m2"))
(Princ))
;-----------------------------------------------------
Để không ghép vào chương trình chính thì chạy ngon, nhưng muốn khai báo cho rõ ràng biến cục bộ để dễ kiểm soát thì gặp lỗi Too Few argument :
Mình sửa thế này đây (Defun TinhDT(ds / pt DT)....Các cao thủ chỉ giáo giúp mình với !

trong đoạn code trên của bạn thì pt không thể định nghĩa là biến cục bộ đc. nó có thể gọi là 1 "biến tạm", đuợc hàm foreach tạo ra trong mỗi vòng lặp. biến này đuợc giải phóng ngay khi foreach kết thúc.
với hàm trên thì có thể định nghĩa các biến DT và TDT là biến cục bộ.
PS: bạn viết thừa 1 biến DT không cần thiết, nên viết thế này : (setq TDT (+ TDT (getvar "area")))
  • 2

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#568 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 November 2010 - 06:27 AM

-Mình có một Lisp về chuyển các đường nét, mình muốn nhờ các anh hướng dẫn cho việc chuyển nét với kiểu đường nét mới theo file ***. lin khác thì làm thế nào trên lisp này. Mong được các anh giúp
M;============================================================================ok



(DEFUN C:CN ( / Sset Elist Msg OldLineType NewLineType)
(princ " \Chon doi tuong can chuyen sang kieu net khac : ")
(setq Sset (ssget))
(progn
(setq OldLineType (getvar "CELTYPE"))
(setq Msg (strcat "\nNewLineType ? \nLien/Khuat/Truc/Gach/Vien/Ao/Cham/CCham/CGach: <" OldLineType "> : "))
(Initget "Lien Khuat Truc Gach Vien Ao Cham CCham CGach")
(setq NewLineType (getkword Msg))
(if (= NewLineType Nil) (setq NewLineType OldLineType))
(If (= NewLineType "Lien") (setq NewLineType "Continuous"))
(If (= NewLineType "Khuat") (setq NewLineType "Hidden"))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(command "CHPROP" Sset "" "LT" NewLineType "")
) ;end progn
(princ)
) ;end
;============================================================================

File kí hiệu nét kèm theo : http://www.cadviet.c...s/3/acadtam.rar

Trước hết, bạn phải Load đường nét vào trong CAD
Nếu file ACADTAM.LIN của bạn nằm trong SUpport file search Path thì bạn có thể Load như thế này :
Ví dụ tên đường nét "BOSONG52" nằm trong ACADTAM.LIN của bạn được Load bằng mã lệnh như sau :
(if (not (tblsearch "LTYPE" "BOSONG52"))
(command "linetype" "L" "BOSONG52" "ACADTAM.LIN" "")
)


Nếu file ACADTAM.LIN của bạn không nằm trong SUpport file search Path . Nằm ổ C:\ chẳng hạn. Code như sau :
(if (not (tblsearch "LTYPE" "BOSONG52"))
(command "linetype" "L" "BOSONG52" "C:\\ACADTAM.LIN" "")
)


-> Sau đó là áp dụng các code chuyển nét của bạn
Góp ý : Nên tạo 1 hàm con để sử dụng cho việc Load đường nét và chuyển đổi đường nét
Hy vọng bạn làm được
Chúc thành công :iluvyousmiley:
  • 1

#569 khaosat2009

khaosat2009

    biết lệnh offset

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

Đã gửi 11 November 2010 - 06:54 AM

Trước hết, bạn phải Load đường nét vào trong CAD
Nếu file ACADTAM.LIN của bạn nằm trong SUpport file search Path thì bạn có thể Load như thế này :
Ví dụ tên đường nét "BOSONG52" nằm trong ACADTAM.LIN của bạn được Load bằng mã lệnh như sau :
(if (not (tblsearch "LTYPE" "BOSONG52"))
(command "linetype" "L" "BOSONG52" "ACADTAM.LIN" "")
)


Nếu file ACADTAM.LIN của bạn không nằm trong SUpport file search Path . Nằm ổ C:\ chẳng hạn. Code như sau :
(if (not (tblsearch "LTYPE" "BOSONG52"))
(command "linetype" "L" "BOSONG52" "C:\\ACADTAM.LIN" "")
)


-> Sau đó là áp dụng các code chuyển nét của bạn
Góp ý : Nên tạo 1 hàm con để sử dụng cho việc Load đường nét và chuyển đổi đường nét
Hy vọng bạn làm được
Chúc thành công :iluvyousmiley:

Mình gà mờ về lisp, mong được bạn chỉ cho các hàm con để dùng load các file *.lin chọn nhanh các đường nét khi vẽ.
Cám ơn
  • 0

#570 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 November 2010 - 09:07 AM

Mình gà mờ về lisp, mong được bạn chỉ cho các hàm con để dùng load các file *.lin chọn nhanh các đường nét khi vẽ.
Cám ơn

Hàm con Load_Change sẽ load Linetype trong ACADTAM.LIN và đổi Linetype cho đối tượng chọn bởi ssget
ACADTAM.LIN nằm trong Support file search Path của CAD
Nếu không nằm trong Support file search Path của CAD thì phải khai đầy đủ đường dẫn cho nó khi hàm findfile trả về nil, tức là không tìm thấy ACADTAM.LIN trong Support file search Path

Mình viết cho Linetype BOSONG52, Các đường nét khác, bạn cứ theo đó mà viết tiếp

(DEFUN C:CN ( / Sset Elist Msg OldLineType NewLineType)
(princ " \Chon doi tuong can chuyen sang kieu net khac : ")
(if (setq Sset (ssget))
(progn
(setq OldLineType (getvar "CELTYPE"))
(setq Msg (strcat "\nBosong: <" OldLineType "> : "))
(Initget "Lien Khuat Truc Gach Vien Ao Cham CCham CGach Bosong")
(setq NewLineType (getkword Msg))
(if (= NewLineType Nil) (setq NewLineType OldLineType))
(If (= NewLineType "Bosong") (Load_Change "BOSONG52" sset))
;;;;;viet tiep vao cho nay nhe
)) ;end progn
(princ)
) ;end
;;
(defun Load_Change(duongnet ss)
(if (findfile "ACADTAM.LIN")
(progn
(if (not (tblsearch "LTYPE" duongnet))
(command "linetype" "L" duongnet "ACADTAM.LIN" "")
)
(command "CHPROP" ss "" "LT" duongnet "")
)
)
)

  • 1

#571 vothanhdn

vothanhdn

    biết vẽ ellipse

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

Đã gửi 11 November 2010 - 11:21 AM

Mọi người cho e hỏi code của hàm ARAY trong lisp với nhé.
  • 0

Ứng dụng hỗ trợ thiết kế mạng lưới thoát nước VTD

  - Tính toán mạng lưới thoát nước

  - Vẽ trắc dọc, bình đồ thoát nước

......

Truy cập http://www.vtdvn.com

------------------------------------------------------------------------------------------

"Không có gì chắc chắn, chỉ có 1 điều chắc chắn là không có gì chắc chắn"...!!!


#572 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 11 November 2010 - 12:00 PM

@ThaiStreetz: Bác nhiệt tình thật đấy, cái dòng PS của bác đúng là rất hợp ý em, em đang trong giai đoạn tinh chỉnh những Lisp đã viết mà ^^
  • 0

#573 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 11 November 2010 - 12:22 PM

Mọi người cho e hỏi code của hàm ARAY trong lisp với nhé.

Tham khảo Lisp :

Array đối tượng trong vùng ...
của Tue_NV.
  • 0

#574 khaosat2009

khaosat2009

    biết lệnh offset

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

Đã gửi 11 November 2010 - 02:51 PM

Hàm con Load_Change sẽ load Linetype trong ACADTAM.LIN và đổi Linetype cho đối tượng chọn bởi ssget
ACADTAM.LIN nằm trong Support file search Path của CAD
Nếu không nằm trong Support file search Path của CAD thì phải khai đầy đủ đường dẫn cho nó khi hàm findfile trả về nil, tức là không tìm thấy ACADTAM.LIN trong Support file search Path

Mình viết cho Linetype BOSONG52, Các đường nét khác, bạn cứ theo đó mà viết tiếp


(DEFUN C:CN ( / Sset Elist Msg OldLineType NewLineType)
(princ " \Chon doi tuong can chuyen sang kieu net khac : ")
(if (setq Sset (ssget))
(progn
(setq OldLineType (getvar "CELTYPE"))
(setq Msg (strcat "\nBosong: <" OldLineType "> : "))
(Initget "Lien Khuat Truc Gach Vien Ao Cham CCham CGach Bosong")
(setq NewLineType (getkword Msg))
(if (= NewLineType Nil) (setq NewLineType OldLineType))
(If (= NewLineType "Bosong") (Load_Change "BOSONG52" sset))
;;;;;viet tiep vao cho nay nhe
)) ;end progn
(princ)
) ;end
;;
(defun Load_Change(duongnet ss)
(if (findfile "ACADTAM.LIN")
(progn
(if (not (tblsearch "LTYPE" duongnet))
(command "linetype" "L" duongnet "ACADTAM.LIN" "")
)
(command "CHPROP" ss "" "LT" duongnet "")
)
)
)

Lisp không thực hiện được bạn ơi, mong ban giúp
  • 0

#575 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 November 2010 - 02:56 PM

Lisp không thực hiện được bạn ơi, mong ban giúp

File ACADTAM.LIN của bạn phải nằm trong Support file Search Path

Command: cn
Chon doi tuong can chuyen sang kieu net khac :
Select objects: Specify opposite corner: 1 found

Select objects:
Bosong: < ByLayer > : bosong
...
....
Hy vọng bạn làm được
  • 0

#576 khaosat2009

khaosat2009

    biết lệnh offset

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

Đã gửi 11 November 2010 - 05:01 PM

File ACADTAM.LIN của bạn phải nằm trong Support file Search Path

Command: cn
Chon doi tuong can chuyen sang kieu net khac :
Select objects: Specify opposite corner: 1 found

Select objects:
Bosong: < ByLayer > : bosong
...
....
Hy vọng bạn làm được

Mình vẩn không tạo nét được khi đã làm hết các yêu cầu theo bạn hướng dẫn.
Nhờ bạn giúp
  • 0

#577 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 November 2010 - 05:38 PM

Mình vẩn không tạo nét được khi đã làm hết các yêu cầu theo bạn hướng dẫn.
Nhờ bạn giúp

Khaosat làm lại lần nữa thử xem :
Giải nén file này :
http://www.cadviet.c...s/3/support.rar
Copy file ACADTAM.LIN vào Support file Search Path của CAD
Các đường dẫn của Support file Search Path ở đây :
Hình đã gửi
Apload file cn.lsp -> gõ lệnh cn để bắt đầu

Chạy xong -> Xem đường của đối tượng đã đổi chưa? Xem lại tỉ lệ Ltscale đã hợp lý chưa?
Đường đã hiển thị chưa?

Chúc thành công :iluvyousmiley:
  • 0

#578 khaosat2009

khaosat2009

    biết lệnh offset

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

Đã gửi 11 November 2010 - 05:54 PM

Khaosat làm lại lần nữa thử xem :
Giải nén file này :
http://www.cadviet.c...s/3/support.rar
Copy file ACADTAM.LIN vào Support file Search Path của CAD
Các đường dẫn của Support file Search Path ở đây :
Hình đã gửi
Apload file cn.lsp -> gõ lệnh cn để bắt đầu

Chạy xong -> Xem đường của đối tượng đã đổi chưa? Xem lại tỉ lệ Ltscale đã hợp lý chưa?
Đường đã hiển thị chưa?

Chúc thành công :iluvyousmiley:

Mình làm được rồi Bạn ơi, Cám ơn nha.
ĐƯỜNG NÉT THƯA QUÁ, Nhưng mà mình cảm thấy mởi lần chuyển nét thì phải đánh lệnh dài thế sao bạn, có cách nào khác cho nó tắt được không ?
Mình làm thế này và có kí hiệu tắt như "" Lien Khuat Truc Gach Vien Ao Cham CCham CGach Bosong ""
Mong được bạn hướng dẫn
  • 0

#579 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 12 November 2010 - 08:14 AM

Mọi người mình hỏi là về khả năng làm việc với file txt của Lisp :
Nếu có 1 file ghi số liệu ví dụ như sau :
1
2
3
4
Mình có thể ghi thêm vào để có file kết quả kiểu như :
1 a
2 b
3 c
4 d....
ko nhỉ?
;------------------------------------------------------------------------
He, tiện thể hỏi mọi người luôn về vấn đề này nữa :
Mình dùng một lisp tính diện tích có bản chất nằm ở lệnh Boudary, nhưng có hai lỗi gặp phải :
1- Khi pick 1 điểm trong vùng thì không thấy xuất hiện đường bao và diện tích đo được ko chính xác
2- Pick chọn nhầm đường bao mong muốn
Các cao thủ giải thích nguyên nhân hộ mình với. Thanks
  • 0

#580 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 November 2010 - 08:56 AM

Mọi người mình hỏi là về khả năng làm việc với file txt của Lisp :
Nếu có 1 file ghi số liệu ví dụ như sau :
1
2
3
4
Mình có thể ghi thêm vào để có file kết quả kiểu như :
1 a
2 b
3 c
4 d....
ko nhỉ?
;------------------------------------------------------------------------

Tue_NV rất bận nên đưa ra gợi ý. Bạn tự hoàn thành
1-> Mở file .txt -> sử dụng hàm open
2-> Dùng hàm readline để đọc từng dòng 1. Đọc cho đến khi nào không đọc được nữa thì thôi. Đọc đến dòng cuối cùng là hàm readLine trả về NIL. Qua mỗi dòng nối chuỗi của dòng đó với kí tự tăng dần (a, b, c.....)
3. Sau khi nối chuỗi rồi, đưa nó vào 1 List L duy nhất
4. Dùng hàm Foreach duyệt qua các phần tử trong List L và ghi đè lên file .txt (sử dụng hàm writeline)
5. Đóng file .txt bằng hàm closé
  • 1