Đến nội dung


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

Hướng dẫn lập trình Lisp


  • Please log in to reply
497 replies to this topic

#141 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 10 October 2009 - 05:39 PM

Làm cách nào để lấy được tọa độ các điểm: điểm đầu, các điểm đổi hướng và điểm cuối của Polyline?

Chào bác Thaistreetz,
Có phải bác cần cái này không:
http://www.cadviet.c...ydinhpline1.lsp
http://www.cadviet.c...aydinhpline.lsp
Đây là các lisp mình sưu tầm được, hy vọng nó đúng với yêu cầu của bác.
Chúc bác vui, khỏe, trẻ mãi không già.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#142 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 30 October 2009 - 12:19 AM

Thường khi chọn đối tượng (cụ thể ở đây mình muốn nói là một polyline đc tạo thành từ những đoạn thẳng) người ta "pick" vào nó. Các bạn có biết cách nào (hàm nào) lấy đc tọa độ hai điểm của đoạn thẳng thuộc polyline ngay tại điểm chọn ("pick") kg. Mình muốn xác định hướng polyline ngay tại điểm chọn nhưng chưa làm đc.
  • 0

#143 nataca

nataca

    biết lệnh adcenter

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

Đã gửi 30 October 2009 - 07:51 AM

Thường khi chọn đối tượng (cụ thể ở đây mình muốn nói là một polyline đc tạo thành từ những đoạn thẳng) người ta "pick" vào nó. Các bạn có biết cách nào (hàm nào) lấy đc tọa độ hai điểm của đoạn thẳng thuộc polyline ngay tại điểm chọn ("pick") kg. Mình muốn xác định hướng polyline ngay tại điểm chọn nhưng chưa làm đc.

Bác dùng hàm nentsel.
Ví dụ:
(setq pl (car (nentsel)))
plL (entget pl)
p1 (assoc 10 plL)
p2 (assoc 10 (cdr (member p1 plL)))
)
  • 1

#144 thaiquyenck

thaiquyenck

    biết vẽ polygon

  • Members
  • PipPip
  • 76 Bài viết
Điểm đánh giá: 14 (tàm tạm)

Đã gửi 30 October 2009 - 08:18 AM

:tongue2: Em cũng đang tính học lisp mà thấy nó khó quá,ở chỗ em thì chẳng có trung tâm nào dạy lisp cả.tự học thì đúng là khó thật.có bác nào biết cách nào học lisp dễ hiểu không chỉ cho em với.em cũng ghiền mấy môn đó lắm nhưng đọc sách mãi mà chẳng hiểu j` cả
  • 0
...Tặng riêng những ai thật lòng


Đang còn hát yêu thương con người ...

#145 nataca

nataca

    biết lệnh adcenter

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

Đã gửi 30 October 2009 - 08:30 AM

:tongue2: Em cũng đang tính học lisp mà thấy nó khó quá,ở chỗ em thì chẳng có trung tâm nào dạy lisp cả.tự học thì đúng là khó thật.có bác nào biết cách nào học lisp dễ hiểu không chỉ cho em với.em cũng ghiền mấy môn đó lắm nhưng đọc sách mãi mà chẳng hiểu j` cả

Bạn yên tâm đi, không quá khó như bạn nghĩ đâu. Trên diễn đàn này đa số đều do các anh em tự học. Mọi người vẫn giỏi được đấy thôi
  • 0

#146 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 30 October 2009 - 08:32 AM

Bác dùng hàm nentsel.
Ví dụ:
(setq pl (car (nentsel)))
plL (entget pl)
p1 (assoc 10 plL)
p2 (assoc 10 (cdr (member p1 plL)))
)

Ssg thấy không ổn:
- Với 2Dpolyline thì nentsel cũng như entsel
- Với 3Dpolyline thì (entget (car (nentsel))) chỉ chứa tọa độ 1 vertex, không đúng ý bạn TRUNGNGAMY

Ssg đề nghị cách này:

(defun C:VD()
(vl-load-com)
(setq
sel (entsel "\nChon polyline:")
c (car sel)
p (cadr sel)
p0 (vlax-curve-getClosestPointTo c p)
para0 (vlax-curve-getParamAtPoint c p0)
para1 (fix para0)
para2 (1+ para1)
p1 (vlax-curve-getPointAtParam c para1)
p2 (vlax-curve-getPointAtParam c para2)
)
;;;KIEM TRA
(setvar "PDMODE" 34)
(entmake (list (cons 0 "POINT") (cons 10 p1)))
(entmake (list (cons 0 "POINT") (cons 10 p2)))
)

  • 3

#147 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 30 October 2009 - 08:47 AM

:tongue2: Em cũng đang tính học lisp mà thấy nó khó quá,ở chỗ em thì chẳng có trung tâm nào dạy lisp cả.tự học thì đúng là khó thật.có bác nào biết cách nào học lisp dễ hiểu không chỉ cho em với.em cũng ghiền mấy môn đó lắm nhưng đọc sách mãi mà chẳng hiểu j` cả

Bạn đọc kỹ bài hướng dẫn của ssg ở trang đầu topic này. Vướng chỗ nào cứ mạnh dạn post lên. Vạn sự khởi đầu nan, vượt qua được vòng "nhập môn" bạn sẽ thấy nó dễ không ấy mà (như trò chơi xếp gạch!). Điều quan trọng là chịu khó thực hành và nghiền ngẫm... Chúc bạn thành công!
  • 0

#148 thaiquyenck

thaiquyenck

    biết vẽ polygon

  • Members
  • PipPip
  • 76 Bài viết
Điểm đánh giá: 14 (tàm tạm)

Đã gửi 30 October 2009 - 07:10 PM

ừ em cũng biết là vậy.Vậy lúc mới học lisp thì mình phải bắt đầu từ đâu hả anh? có phải cần hiểu biết về các ngôn ngữ lập trình (chẳng hạn như vb) thì mới học được hay là chỉ cần biết CAD là có thể học được.em nhìn vô mấy cái lệnh mà như nhìn vô .... rừng ấy :tongue2:
  • 0
...Tặng riêng những ai thật lòng


Đang còn hát yêu thương con người ...

#149 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 02 November 2009 - 08:56 AM

ừ em cũng biết là vậy.Vậy lúc mới học lisp thì mình phải bắt đầu từ đâu (1) hả anh? có phải cần hiểu biết về các ngôn ngữ lập trình (chẳng hạn như vb) (2) thì mới học được hay là chỉ cần biết CAD là có thể học được.em nhìn vô mấy cái lệnh mà như nhìn vô .... rừng (3) ấy :tongue2:

1- Thực hành, từ những bài đơn giản nhất, tương tự như bài "vẽ nhà" mà ssg đã giới thiệu trong bài viết. Nếu bạn cảm thấy bài đó phức tạp thì chọn bài đơn giản hơn. Ví dụ:
(defun C:VD()
(alert "Day la chuong trinh AutoLisp dau tien cua thaiquyenck")
)

2- Bạn không cần phải biết VB, C, C++... là cái quái quỷ gì! Điều kiện cần để có thể học Lisp, như ssg đã nói trong bài:
- Tương đối thành thạo AutoCAD
- Có 1 cuốn sách về Lisp (bất kỳ cuốn nào). Nếu bạn có khả năng đọc Help thì khỏi cần sách.
Ngoài ra, có lẽ cũng cần thêm vài điều kiện nữa:
- Đam mê
- Chịu khó
- Có khả năng tư duy logic ở mức trung bình trở lên

3- Mới đầu có thể là vậy, nhưng dần dần bạn sẽ không còn cảm giác đó nữa.
  • 2

#150 thaiquyenck

thaiquyenck

    biết vẽ polygon

  • Members
  • PipPip
  • 76 Bài viết
Điểm đánh giá: 14 (tàm tạm)

Đã gửi 03 November 2009 - 08:29 AM

1- Thực hành, từ những bài đơn giản nhất, tương tự như bài "vẽ nhà" mà ssg đã giới thiệu trong bài viết. Nếu bạn cảm thấy bài đó phức tạp thì chọn bài đơn giản hơn. Ví dụ:
(defun C:VD()
(alert "Day la chuong trinh AutoLisp dau tien cua thaiquyenck")
)

......................
Cám ơn anh nha.em cũng đã đọc bài của anh rồi.Cad thì em xài cũng kha khá,còn đam mê thì chắc chắn rồi :tongue2: .bây giờ nhìn vô lisp không giống nhìn vô rừng nữa mà giống nhìn vô vườn rồi :D
Nhân tiện cho em hỏi luôn: mấy cái ký tự như / hay \ mình phải đặt sao cho đúng? trước hay sau nó có dấu cách thì có sao ko?
  • 0
...Tặng riêng những ai thật lòng


Đang còn hát yêu thương con người ...

#151 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 06 November 2009 - 10:38 AM

Mình muốn chọn tất cả đối tượng màu đỏ , rồi thực hiện một lệnh tiếp theo, giống như lệnh Filter vậy, nhưng sao cái lisp dưới chọn đối tượng xong là nó thoát luôn???

(defun c:1 ()
(command "select" (ssget "x" (list
(cons 0 "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE,TEXT,MTEXT")
(cons 62 1)
))"")
(princ)
)
  • 0

#152 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 06 November 2009 - 10:51 AM

Mình muốn chọn tất cả đối tượng màu đỏ , rồi thực hiện một lệnh tiếp theo, giống như lệnh Filter vậy, nhưng sao cái lisp dưới chọn đối tượng xong là nó thoát luôn???
(defun c:1 ()
(command "select" (ssget "x" (list
(cons 0 "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE,TEXT,MTEXT")
(cons 62 1)
))"")
(princ)
)

Đã chỉnh lại code. tuan_thietkedien' thử lại nhé :

(defun c:1 (/ ss)
(command "select"
(setq ss (ssget "x" (list
(cons 0 "*")
(cons 62 1)
)))"")
(if ss (sssetfirst ss ss)
(alert "\n doi tuong co the o mau Bylayer
\n\nHoac khong co doi tuong nao co mau do
\n\n Hoac khong co doi tuong nao duoc chon")
)
(princ)
)

  • 1

#153 dvdcad

dvdcad

    biết vẽ arc

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

Đã gửi 06 November 2009 - 01:22 PM

chào các bn. Nh các bn vit giúp mình lisp ly mã cua HDD và lu ra mt file txt. Cm n nhiu.
  • 0

#154 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 06 November 2009 - 03:20 PM

chào các bn. Nh các bn vit giúp mình lisp ly mã cua HDD và lu ra mt file txt. Cm n nhiu.

Hề hề,
Cái này mình nhớ trên diễn đàn đã có rồi mà, bạn chịu khó kiếm thử xem, nếu không nhầm thì ở trong topic Viết líp theo yêu cầu đó. Nếu thấy có gì chưa ổn thì lại pót lên bạn nhé.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#155 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 06 November 2009 - 03:34 PM

Mình muốn chọn tất cả đối tượng màu đỏ , rồi thực hiện một lệnh tiếp theo, giống như lệnh Filter vậy, nhưng sao cái lisp dưới chọn đối tượng xong là nó thoát luôn???

(defun c:1 ()
(command "select" (ssget "x" (list
(cons 0 "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE,TEXT,MTEXT")
(cons 62 1)
))"")
(princ)
)

Chào bạn Tuan_thietkedien,
Cái đoạn lisp trên đây của bạn thoát luôn là phải quá rồi. Bởi vì bạn đã kết thúc lisp bằng hàm (princ) là thoát êm mà không hiển thị lại giá trị của biến cuối cùng. Vả lại bạn chả đặt biến cho cái tập chọn nên bạn cũng chả có cơ sở nào để gọi lại nó.
Cái lisp của bác Tue_NV đã chữa cái lỗi này bằng cách đặt biến ss cho cái tập chọn của bạn. Đồng thời sau đó gọi lại biến này ở hàm (if ss ......) rồi mới thoát êm bằng (princ).
Với việc đặt tên biến ss này, giả sử bạn chưa sử lý gì nó thì bất cứ lúc nào bạn cần nó chỉ việc gõ !ss trên dòng command là nó trả ra cho bạn tên tập chọn liền bạn ạ. Cái chốt ở đây chính là việc đặt biến ss để dễ dàng sử lý sau này thôi.
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.

#156 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 06 November 2009 - 04:16 PM

Chào bạn Tuan_thietkedien,
Cái đoạn lisp trên đây của bạn thoát luôn là phải quá rồi. Bởi vì bạn đã kết thúc lisp bằng hàm (princ) là thoát êm mà không hiển thị lại giá trị của biến cuối cùng. Vả lại bạn chả đặt biến cho cái tập chọn nên bạn cũng chả có cơ sở nào để gọi lại nó.

Không đặt biến vẫn có thể gọi được nó.
Code sau không dùng biến vẫn có cơ sở để gọi tập chọn bình thường :
Bạn phamthanhBinh nói không có cơ sở thì hơi bị vô lý đấy :tongue2:

(defun c:1 ()
(if (/= (ssget "x" (list (cons 0 "*") (cons 62 1))) nil)
(sssetfirst (ssget "P") (ssget "P"))
(alert "\n doi tuong co the o mau Bylayer
\n\nHoac khong co doi tuong nao co mau do
\n\n Hoac khong co doi tuong nao duoc chon")
)
(princ)
)

  • 0

#157 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 06 November 2009 - 05:32 PM

Không đặt biến vẫn có thể gọi được nó.
Code sau không dùng biến vẫn có cơ sở để gọi tập chọn bình thường :
Bạn phamthanhBinh nói không có cơ sở thì hơi bị vô lý đấy :tongue2:

(defun c:1 ()
(if (/= (ssget "x" (list (cons 0 "*") (cons 62 1))) nil)
(sssetfirst (ssget "P") (ssget "P"))
(alert "\n doi tuong co the o mau Bylayer
\n\nHoac khong co doi tuong nao co mau do
\n\n Hoac khong co doi tuong nao duoc chon")
)
(princ)
)

Bác Tue_NV hiểu sai ý mình rồi,
Ở đây mình muốn nói là sau khi lisp đã chạy xong mà bác muốn gọi lại nó cơ, nhất là khi đã qua vài thao tác vẽ khác bác ạ. Miễn là bác không nhét biến SS vào nhóm biến cục bộ.
Hề hề....
Mình có chút ý kiến với bác như sau:
Vì bác muốn giúp đỡ mọi người nên nếu có thể khi bác sửa lỗi của các lisp do mọi người viết, bác nên phân tích cho mọi người thấy được cái lỗi ở chỗ nào thì tốt biết mấy. Khi đó người được sửa sẽ rất vui và cả những người đọc khác cũng học được cách sửa của bác , tránh được những lỗi tương tự khi viết lisp và bác cũng sẽ bớt vất vả hơn bác ạ.
Mong bác chớ giận nếu như mình nói sai. Hề hề....
Chúc bác khỏe và 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.

#158 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 06 November 2009 - 09:55 PM

Bác Tue_NV hiểu sai ý mình rồi,
Ở đây mình muốn nói là sau khi lisp đã chạy xong mà bác muốn gọi lại nó cơ, nhất là khi đã qua vài thao tác vẽ khác bác ạ. Miễn là bác không nhét biến SS vào nhóm biến cục bộ.
Hề hề....

Hề hề...
Bạn có chắc không?
Mình không sử dụng biến ss vào nhóm biến cục bộ, đại loại là không sử dụng biến ss để gọi đối tượng và sau khi lisp đã chạy xong ; qua vài thao tác vẽ khác vẫn có thể gọi lại tập hợp chọn đó 1 cách bình thường, chỉ cần sau khi chạy Lisp ta làm thêm 1 thao tác nhỏ nữa bằng CAD và AutoCAD có thể làm chuyện đó 1 cách đơn giản

Hề hề...Bạn hơi bị vô lý khi cho rằng : "Vả lại bạn chả đặt biến cho cái tập chọn nên bạn cũng chả có cơ sở nào để gọi lại nó." Hề hề :tongue2:
  • 1

#159 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 08 November 2009 - 07:26 PM

Hề hề...
Bạn có chắc không?
Mình không sử dụng biến ss vào nhóm biến cục bộ, đại loại là không sử dụng biến ss để gọi đối tượng và sau khi lisp đã chạy xong ; qua vài thao tác vẽ khác vẫn có thể gọi lại tập hợp chọn đó 1 cách bình thường, chỉ cần sau khi chạy Lisp ta làm thêm 1 thao tác nhỏ nữa bằng CAD và AutoCAD có thể làm chuyện đó 1 cách đơn giản

Hề hề...Bạn hơi bị vô lý khi cho rằng : "Vả lại bạn chả đặt biến cho cái tập chọn nên bạn cũng chả có cơ sở nào để gọi lại nó." Hề hề :tongue2:

Chào bác Tue_Nv,
Quả thật mình hơi vô lý khi cái lý đó mình chửa được biết. Vậy mong bác đừng giận nha. Cái nghề đi mót của mình chỉ có thể mót được những cái mà người khác cho mót, bằng không thì tịt mít bác ạ. Các cụ dạy không biết thì hổng có tội, vậy mong bác bỏ quá cho mình nha.
Chúc bác luôn vui vẻ và yêu đời. Hề 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.

#160 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 2009 - 08:25 PM

Chào bác Tue_Nv,
Quả thật mình hơi vô lý khi cái lý đó mình chửa được biết. Vậy mong bác đừng giận nha. Cái nghề đi mót của mình chỉ có thể mót được những cái mà người khác cho mót, bằng không thì tịt mít bác ạ. Các cụ dạy không biết thì hổng có tội, vậy mong bác bỏ quá cho mình nha.
Chúc bác luôn vui vẻ và yêu đời. Hề hề hề....

Sau khi chạy Lisp xong. Bạn sử dụng lệnh Group -> Nhóm chúng lại về 1 nhóm thì lần sau gọi lại là được rồi.
Cụ thể như thế này :
Chạy Lisp :

(defun c:1 ()
(if (/= (ssget "x" (list (cons 0 "*") (cons 62 1))) nil)
(sssetfirst (ssget "P") (ssget "P"))
(alert "\n doi tuong co the o mau Bylayer
\n\nHoac khong co doi tuong nao co mau do
\n\n Hoac khong co doi tuong nao duoc chon")
)
(princ)
)


Sau khi chạy Lisp xong. Những đối tượng có màu đỏ(RED) -> sẽ được hiện sáng bằng Grid
-> ta sử dụng lệnh Group để nhóm chúng về 1 nhóm (group)

-> đánh lệnh G (group) vào Command -> hộp thoại Object grouping hiện lên -> ở chổ Group Name : ta đặt tên cho Group ví dụ tên RED -> Nhấn nút New (ở mục Creat Group) -> trả lại thanh command với dòng select object : -> ta nhấn chữ P(previous) vào dòng select object (tức là chọn những đối tượng màu đỏ trước đó sau khi chạy Lisp) -> Enter -> hiện lên hộp thoại Object grouping -> OK
Command: g
GROUP Select objects for grouping:
Select objects: p
634 found

Select objects: Enter

Như vậy các đối tượng có màu đỏ được nhóm lại thành 1 nhóm mang tên RED. Sau này ta muốn gọi lại nó thì ở dòng Select object của câu lệnh nào ta nhấn chữ G -> gõ tên Group -> lập tức tập hợp các đối tượng mang tên Group sẽ được chọn

Minh hoạ việc gọi lại tập hợp chọn Group bằng lệnh filter
-> gõ Filter -> hộp thoại Filter hiện lên -. Nhấn nút Apply trong filter -> Hiện lên dòng select object ở dòng Command -. gõ chữ G -> Enter group name : RED -> Gõ RED

Command: filter
Applying filter to selection.
Select object : G -> nhấn chữ G

Enter group name: RED
634 found

Select objects: Enter
Exiting filtered selection.

-> Nhấn OK trong hộp thoại filter -> Quan sát CAD, ta thấy tập hợp chọn đối tượng màu đỏ (RED) đã được chọn rồi.
  • 1