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

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

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

cho em hỏi tí nữa, ngôn ngữ lập trình dùng viết lisp là j vây? CAD có thể đọc được các ngôn ngữ khác như VB bằng cách tương tự như đọc 1 file lisp không?

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 tí nữa, ngôn ngữ lập trình dùng viết lisp là j vây? CAD có thể đọc được các ngôn ngữ khác như VB bằng cách tương tự như đọc 1 file lisp không?

Em là dân cầu đường, năm 3, em muốn tìm hiểu nhiều hơn về ACAD nhưng không biết bắt đầu từ đâu, về việc sử dụng các lệnh vẽ, hiệu chỉnh, quản lý thì em cũng khá rành rồi, nhưng về việc lập trình Autolisp hay những cái tương tự thì chưa biết j hết!em chưa biết j nên hỏi ngớ ngẩn thế, mong mọi người chỉ dạ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
em load xong file relax, chạy ngon lành rồi, nhưng tắt đi rồi, khởi động lại mà vẫn còn chữ RELAX trên menu, nhưng không dùng được nữa, làm ơn chỉ em làm sao để xóa nó đi cái!

Không rõ bạn "tắt đi rồi" như thế nào?

 

1. Load lại relax.lsp, menu "Relax" hiện ra, bấm vào "Remove this menu" là nó "biến" luôn, không còn vết tích gì nữa.

2. Nếu vì lý do gì đó nó không chịu "biến", bạn dùng cách "by hand": Tools-Customize-Menus..., tìm trong đó có cái gì liên quan đến chữ "Relax" thì cho nó "biến" đi. Mỗi đời CAD có thể khác nhau nên mình không nói cụ thể hơn, đại loại là "Unload", "Remove" gì gì đó là xong ngay thôi mà!

  • 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

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?

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
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.com/upfiles/2/laydinhpline1.lsp

http://www.cadviet.com/upfiles/2/laydinhpline.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à.

  • 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 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.

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 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)))

)

  • 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

: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ả

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
: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

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 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)))
)

  • Vote tăng 3

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
: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!

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

ừ 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:

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
ừ 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.

  • 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
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?

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 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)

)

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 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)

)

  • 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 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é.

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 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.

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 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)

)

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
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.

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 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:

  • 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ề 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ề....

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á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.

  • 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

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

×