Đến nội dung


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

Học AutoLisp


  • Please log in to reply
182 replies to this topic

#81 manhhoan_47

manhhoan_47

    biết zoom

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

Đã gửi 29 December 2008 - 02:57 PM

Phần 1: bắt đầu

Đầu tiên, chúng ta hãy bắt đầu bằng chương trình viết chữ.

Hãy tạo một file mới và save nó với tên hoclisp.lsp.
(princ "\nChao cadviet")
(princ)

Đây là đoạn mã đơn giản nhất của AutoLisp nhằm viết ra một dòng 'Chao cadviet' trên màn hình nhập dữ liệu của autocad. để sử dụng, appload file hoclisp.lsp này. ta sẽ thấy trên màn hình xuất hiện chữ Chao cadviet.

Đi sâu vào phân tích lệnh, ta thấy: mỗi hàm của cad được bắt đầu bằng dấu '(' ngay sau đó là tên hàm, tiếp đến là thông số của hàm (có thể có, có thể không có) và kết thúc bằng dấu ')' Trong trường hợp này princ là tên hàm, "\nChao cadviet" là tham số của hàm princ.

Trong hai câu lệnh gọi hàm vừa rồi, câu thứ nhất là để viết chữ ra màn hình text, câu lệnh thứ 2 dùng để ẩn kết thúc mà không hiển thị thêm gì cả. Nếu thiếu câu lệnh thứ 2, bạn sẽ nhìn thấy 'Chao cadviet"\nChao cadviet"' trên màn hình, trong đó "\nChao cadviet" là kết quả của hàm (princ "\nChao cadviet").

Bac Hoanh oi, bac hay noi ro hon cach appload file hoclisp.lsp vao ban ve dc khong?
thanks
  • 0
TA BIẾT RẰNG CỐ QUÊN LÀ SẼ NHỚ
NÊN RẶN LÒNG CỐ NHỚ ĐỂ MÀ QUÊN...

#82 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 29 December 2008 - 04:33 PM

Bac Hoanh oi, bac hay noi ro hon cach appload file hoclisp.lsp vao ban ve dc khong?
thanks

Chào bạn Manhhoan_47,
1/- Bạn tải file về và lưu nó vào một thư mục dễ tìm.
2/- Mở Autocad
3/- Vào Tool -> load application -> Tìm đến thư mục vừa lưu file và chọn file hoclisp. lsp -> Load -> Close
4/- Nhập lệnh hoclisp và thế là Ok, lisp sẽ chạy ầm ầm, nó bảo bạn làm gì thì cứ thế mà làm là xong.
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.

#83 thanghaita

thanghaita

    biết vẽ ellipse

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

Đã gửi 30 March 2009 - 09:33 PM

- Tôi xin thử nghiệm một chuỗi bài viết về đào tạo AutoLisp thông qua các dự án thực tế.
Xin mọi người đóng góp ý kiến.

Bác viết đi. Em cũng muốn học hỏi thêm!
  • 0

#84 binharch77

binharch77

    biết dimcontinue

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

Đã gửi 16 April 2009 - 05:49 PM

Mổ xẻ lệnh ẩn đối tượng.
Lệnh ẩn đối tượng này là dựa trên nguyên tắc điều khiển mã dxf 60 của đối tượng. Mã này kiểm soát sự ẩn, hiện của đối tượng. Nếu đối tượng có mã dxf 60 bằng 1 có nghĩa là ẩn, 0 có nghĩa là hiện.

Để gán mã dxf 60 bằng 1 cho đối tượng (làm ẩn đối tượng), ta cần tìm xem trong mã của đối tượng đã có mã dxf 60 hay chưa? nếu có thì thay nó bằng giá trị 1, nếu chưa có thì thêm vào nó một mã dxf 60 bằng 1.

Trước tiên, chúng ta định nghĩa hàm (Dxf id obj) xem ở phần dưới. Hàm này trả về giá trị của mã id của đối tượng obj, nếu đối tượng obj không có mã id thì kết quả trả về là nil (rỗng).

Sau đó, dùng câu lệnh rẽ nhánh: nếu đối tượng có mã dxf 60 thì thay bằng giá trị mới, nếu không có thì thêm một giá trị dxf 60=1 mới vào. Câu lệnh đó như sau:
(if (dxf 60 Elem) ; kiểm tra xem có mã 60 không?
;nếu có? thay:
(entmod (subst (cons 60 1) (cons 60 (dxf 60 elem)) (entget Elem)))

;nếu không? thêm:
(entmod (append (entget Elem) (list '(60 . 1))))
)
Trong cụm lệnh trên, Elem là ent name của đối tượng cần ẩn. Hàm entmod có tác dụng modify các thuộc tính một đối tượng theo tập hợp các thuộc tính đã cho (bao gồm thuộc tính tên của đối tượng cần sửa) . Hàm entget trả về tập hợp các thuộc tính của một đối tượng. hàm subst là hàm thay giá một giá trị trong tập hợp bằng một giá trị khác. hàm append là hàm trộn hai tập hợp. Dòng lệnh (entmod (subst (cons 60 1) (cons 60 (dxf 60 elem)) (entget Elem))) để thay mã dxf 60 của đối tượng từ giá trị "(dxf 60 elem)" về giá trị 1.

Như vậy, chúng ta có thể viết được một hàm đơn giản để ẩn một đối tượng:
(defun c:ivone()
(defun Dxf (Id Obj) ;định nghĩa hàm dxf
(cdr (assoc Id (entget Obj)))
);end Dxf
(setq elem (car (entsel "\nDoi tuong can an: "))) ;chọn đối tượng
(if (dxf 60 Elem) ; kiểm tra xem có mã 60 không?
;nếu có? thay:
(entmod (subst (cons 60 1) (cons 60 (dxf 60 elem)) (entget Elem)))
;nếu không? thêm:
(entmod (append (entget Elem) (list '(60 . 1))))
)
)

Và hàm ẩn nhiều đối tượng sẽ như sau (xin xem thêm ở phần tutor tính diện tích để biết cách biến cách làm 1 đối tượng thành nhiều đối tượng):
(defun c:InVis (/ SSet Count Elem)
(defun Dxf (Id Obj)
(cdr (assoc Id (entget Obj)))
);end Dxf
(prompt "\nSelect object(s) to hide: ")
(cond
((setq SSet (ssget))
(repeat (setq Count (sslength SSet))
(setq Count (1- COunt)
Elem (ssname SSet Count))
(if (/= 4 (logand 4 (Dxf 70 (tblobjname "layer" (Dxf 8 Elem)))))
(if (Dxf 60 Elem)
(entmod (subst '(60 . 1) (assoc 60 (entget Elem)) (entget Elem)))
(entmod (append (entget Elem) (list '(60 . 1))))
)
(prompt "\nEntity on a locked layer. Cannot hide this entity. ")
);end if
);end repeat
)
);end cond
(princ)
);end c:InVis

ÔI....... HAY WÁ
cám ơn bác Hoanh nhá. bác có năng khiếu trong truyền đạt kiến thức nhỉ
khi nào có bài mới nũa đây bác
  • 0

#85 Trung.Nghiem

Trung.Nghiem

    Chưa sử dụng CAD

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

Đã gửi 20 June 2009 - 01:00 AM

Tuyệt cú mèo!!!
Em mới bắt đầu biết về AutoLisp, đọc bài này của bác NguyenHoanh thấy hay quá.
Mong bác sớm có thêm nhiều bài viết hay như thế nữa cho em học hỏi.
Cảm ơn bác Hoanh và các bác trong diễn dàn!
  • 0

#86 nguyendat_hut48

nguyendat_hut48

    Chưa sử dụng CAD

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

Đã gửi 14 July 2009 - 11:25 AM

Mọi người ơi...mình hỏi chút?? mình muốn mở nhiều file cad với nhiều cửa sổ giống như mở trình duyệt firefox...nếu có thể gửi email cho minh theo địa chỉ này nhé.. ........Cảm ơn mọi người nhiều...
  • 0

#87 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 14 July 2009 - 12:41 PM

Mọi người ơi...mình hỏi chút?? mình muốn mở nhiều file cad với nhiều cửa sổ giống như mở trình duyệt firefox...nếu có thể gửi email cho minh theo địa chỉ này nhé.. ........Cảm ơn mọi người nhiều...

bạn search từ khoá tab cad
  • 1

#88 VO7T

VO7T

    Chưa sử dụng CAD

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

Đã gửi 21 July 2009 - 10:07 PM

Bro nào có tài liệu về Lisp (từ cơ bản) thì share cho mình với.. Mới tập tành nghiên cứu nên cũng chưa biết bắt đầu từ đâu nữa.. :s_dead:
  • 0

#89 hiepgass

hiepgass

    Chưa sử dụng CAD

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

Đã gửi 06 August 2009 - 09:42 AM

các bạn cho mình hỏi với là trong autolisp thì đường pline đc kí hiệu là j nhỉ?
mình thử sửa 1 chương trình dùng với đg line để có thể dùng với đg pline nhưng khi thay thế line thành pline hay PL đều k đc!
  • 0

#90 vostro 1500

vostro 1500

    biết zoom

  • Members
  • Pip
  • 17 Bài viết
Điểm đánh giá: 27 (tàm tạm)

Đã gửi 14 August 2009 - 01:24 PM

Phần 1: bắt đầu

Đầu tiên, chúng ta hãy bắt đầu bằng chương trình viết chữ.

Hãy tạo một file mới và save nó với tên hoclisp.lsp.
(princ "\nChao cadviet")
(princ)

Đây là đoạn mã đơn giản nhất của AutoLisp nhằm viết ra một dòng 'Chao cadviet' trên màn hình nhập dữ liệu của autocad. để sử dụng, appload file hoclisp.lsp này. ta sẽ thấy trên màn hình xuất hiện chữ Chao cadviet.

Đi sâu vào phân tích lệnh, ta thấy: mỗi hàm của cad được bắt đầu bằng dấu '(' ngay sau đó là tên hàm, tiếp đến là thông số của hàm (có thể có, có thể không có) và kết thúc bằng dấu ')' Trong trường hợp này princ là tên hàm, "\nChao cadviet" là tham số của hàm princ.

Trong hai câu lệnh gọi hàm vừa rồi, câu thứ nhất là để viết chữ ra màn hình text, câu lệnh thứ 2 dùng để ẩn kết thúc mà không hiển thị thêm gì cả. Nếu thiếu câu lệnh thứ 2, bạn sẽ nhìn thấy 'Chao cadviet"\nChao cadviet"' trên màn hình, trong đó "\nChao cadviet" là kết quả của hàm (princ "\nChao cadviet").


Mình là người mới bắt đầu tìm hiểu Autolisp, mong bác chỉ dùm mình làm như bác hướng dẫn mà ko thấy dòng chữ 'Chao cadviet':
- B1: mình mở Acad 2007, vào Visual LISP chọn new rồi chép đúng đoạn mã bác HD vào. Save với tên hoclisp.
- B2: vào Tool\ Load Application load file hoclisp. Kết quả ko thấy dòng chữ nào hết?
Mình cũng làm thử phần 2 đúng các bước HD, gõ lệnh 'chao' kết quả cũng ko thấy chữ nào hết?
Mong bác giúp đỡ.
THANKS!
  • 0

#91 tomboy

tomboy

    biết vẽ polygon

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

Đã gửi 15 August 2009 - 10:19 AM

Mình là người mới bắt đầu tìm hiểu Autolisp, mong bác chỉ dùm mình làm như bác hướng dẫn mà ko thấy dòng chữ 'Chao cadviet':
- B1: mình mở Acad 2007, vào Visual LISP chọn new rồi chép đúng đoạn mã bác HD vào. Save với tên hoclisp.
- B2: vào Tool\ Load Application load file hoclisp. Kết quả ko thấy dòng chữ nào hết?
Mình cũng làm thử phần 2 đúng các bước HD, gõ lệnh 'chao' kết quả cũng ko thấy chữ nào hết?
Mong bác giúp đỡ.
THANKS!

Các bước bạn làm là đúng rồi, nhưng bạn hãy thêm dòng lệnh này vào đầu file và cuối file nhé:
dòng đầu file: (defun c:gt()
dòng cuối file: )
sau đó tại dòng lệnh Command: bạn gõ lệnh GT thì nó sẽ xuất hiện dòng đó trên màn hình
bạn ạ dòng đầu tiên là tên lệnh, nếu không có chữ C: đứng trước chữ gt thì nó là hàm
bắt đầu một hàm bao giờ cũng bằng dấu ( và kết thúc bằng dấu )
đây là chương trình giải pt bậc 1 đơn giản nhất bạn hãy tham khảo nhé: ax+b=0
mục đích là phải tìm được các giá trị x trong phương trình x=-b/a
như vậy ta phải gán giá trị a và b cho phương trình từ bàn phím hoặc màn hình máy tính
cách làm như sau:
tên lệnh (defun c:b1()
nhập giá trị a: (setq a(getreal "\nNhap vao gia tri a: "))
------------- b: (setq b(getdist "\nNhap vao gia tri b: "))
tính nghiệm x=-b/a: (setq x (/ (- 0 b ) a ))
xuất kết quả ra màn hình: (alert (strcat "gia tri a: " (rtos a 2) "\n"
"gia tri b: " (rtos b 2) "\n"
"nghiem x = " (rtos x 2) ))
kết thúc chương trình: )
  • 1

#92 chandatn

chandatn

    biết pan

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

Đã gửi 05 September 2009 - 10:37 AM

Phần 3:

Trong phần 2, chúng ta đã tạo được một chương trình lisp có giao tiếp với AutoCAD thông qua tên lệnh.
Tại phần 3 này, chúng ta sẽ viết một chương trình thực sự, có ích hẳn hoi.

Đó là chương trình tính diện tích của một đối tượng. Trên file hoclisp.lsp, hãy sửa tên hàm chao thành tdt và thêm các mã lệnh như sau:
(defun c:tdt( / sel ent dientich)
(princ "\nChao cadviet")

(setq sel (entsel "\nHay chon doi tuong: "))
(setq ent (car sel))
(command ".area" "o" ent)
(setq dientich (getvar "area"))
(princ "\nDien tich doi tuong vua roi la: ")
(princ dientich)
(princ "\nm2")

(princ)
)

Bạn thử appload file hoclisp.lsp mới và gọi lệnh tdt thử xem, chương trình sẽ yêu cầu bạn nhập vào 1 đối tượng. Và nó sẽ kết xuất diện tích đối tượng vừa rồi ra màn hình:
Command: tdt
Chao cadviet
Hay chon doi tuong: .area
Specify first corner point or [Object/Add/Subtract]: o
Select objects:
Area = 46546736.0000, Perimeter = 28320.0000

Command:
Dien tich doi tuong vua roi la: 4.65467e+007m2

Điều gì làm nên sự khác biệt này vậy: chúng ta hãy lần theo từng lệnh nhé.
- Lệnh (entsel "\nHay chon doi tuong: ") là lệnh trả về đối tượng được pick, kết quả trả về là một tập hợp gồm 2 thành phần: thứ nhất là đối tượng được pick, thứ 2 là tọa độ pick.
- Lệnh (setq sel (entsel "\nHay chon doi tuong: ")) là lệnh gán kết quả vừa pick vào biến sel. Bạn nhớ là lệnh (setq a :s_big: là gán giá trị a bằng giá trị b. Trong trường hợp này a là sel, b là kết quả của hàm entsel.
- Lệnh (car sel) là lệnh lấy giá trị đầu tiên của biến sel (biến sel có dạng tập hợp) tức là đối tượng được chọn.
- lệnh (setq ent (car sel)) là lệnh gán giá trị biến ent bằng ename của đối tượng được chọn. ename của một đối tượng là giá trị chỉ ra đối tượng trong một bản vẽ cad.
Như vậy, 2 dòng lệnh
(setq sel (entsel "\nHay chon doi tuong: "))
(setq ent (car sel))
có ý nghĩa là gán giá trị biến ent cho đối tượng vừa được chọn bằng phương pháp pick.

Tiếp đến, lệnh (command ".area" "o" ent) tương đương với gõ tại dòng lệnh command: .area rồi gõ tiếp o và pick đối tượng. Bạn nhớ là lệnh (command a b c d e f...) tương đương với việc gõ các giá trị a, b, c, d, e, f ... vào dòng lệnh của cad. Như vậy, lệnh trên tương đương với việc tính diện tích của đối tượng vừa được chọn.

- Lệnh (setq dientich (getvar "area")): gán giá trị biến dientich bằng giá trị của biến hệ thống AREA (biến hệ thống AREA chứa diện tích vừa được tính bằng lệnh AREA trước đó của cad).

-cụm lệnh:
(princ "\nDien tich doi tuong vua roi la: ")
(princ dientich)
(princ "m2")
chắc chắn bạn biết đó là lệnh viết dòng chữ 'Dien tich doi tuong vua roi la: ' diện tích đối tượng vừa rồi 'm2'.
Trên màn hình bạn còn nhìn thấy các dòng chữ khác ngoài dòng chữ trên đó là do các lệnh area của CAD sinh ra. Trong bài học sau chúng ta sẽ biết cách loại bỏ chữ này.

Cho tui xin mạn phép hỏi Hoành và anh em trên diễn đàn: Khi ta viết dòng lệnh (command ".area" "o" ent)
thi trên màn hình nó sẽ chạy
Specify first corner point or [Object/Add/Subtract]: o
Select objects:
Area = 46546736.0000, Perimeter = 28320.0000
như Hoành đã viết, nhưng nếu khi ta chạy vòng lặp thì nó sẽ hiển thị rất nhiều khi đôí tượng được chọ là lớn. Vậy có thể sửa dòng lệnh như thế nào để ta vẫn thực hiện công việc nhưng không trình bày lên màn hình nhữn diện tích thành phần mà chỉ cho ra kết quả cuôí cùng được không?. Xin chân thành cám ơn mọi người.
  • 0

#93 truongthanh

truongthanh

    biết lệnh text

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

Đã gửi 14 September 2009 - 08:49 AM

Mình mới bắt đầu học LISP cho nên mình hỏi 1 câu hơi gà 1 tí mong các anh giúp đỡ!Hàm PRINC và hàm PROMPT khác nhau cái gì vậy?
nhờ các anh chỉ dùm!
  • 0

#94 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 14 September 2009 - 09:17 AM

Mình mới bắt đầu học LISP cho nên mình hỏi 1 câu hơi gà 1 tí mong các anh giúp đỡ!Hàm PRINC và hàm PROMPT khác nhau cái gì vậy?em tập viết thử 1 cái lisp vẽ hình tròn mà nó báo lỗi là sao vậy?
(defun c:ve()
(setq pt1 (getpoint "\nPick 1 diem tren man hinh ")
r1 (getdist "\nNhap ban kinh duong tron: "))
(command ".circle" pt1 r1)
princ)
nó báo lỗi như vầy nè:SUBR @0815730c PRINC
nhờ các anh chỉ dùm!

Một hàm mở đầu bằng dấu mở ngoặc ( và kết thúc bởi dấu đóng ngoặc )
Sửa lại như sau :
(defun c:ve()
(setq pt1 (getpoint "\nPick 1 diem tren man hinh ")
r1 (getdist "\nNhap ban kinh duong tron: "))
(command ".circle" pt1 r1)
(princ)
) -> kết thúc hàm defun
(defun c:ve()
(setq pt1 (getpoint "\nPick 1 diem tren man hinh ")
r1 (getdist "\nNhap ban kinh duong tron: "))
(command ".circle" pt1 r1)
(princ)
)
Hàm Prompt : in dòng nhắc ra màn hình. Dòng nhắc là kieẻu chuỗi string
Ví dụ : (prompt "\nPick 1 diem tren man hinh ")
-> In ra màn hình (dòng command) dòng nhắc : nPick 1 diem tren man hinh
Hàm Princ : có thể in 1 biểu thức ra màn hình,. Biểu thức này có thể là chuỗi, là số.
Ví dụ :
(princ "\nPick 1 diem tren man hinh ") -> cái này giống prompt
ví dụ 2 :
(princ (+ 2 3)) -> kết quả trả về 5
Ví dụ trên của bạn
(Princ r1) -> Kết quả sẽ trả về trị số bán kính r1 mà bạn đã nhập từ bàn phím
  • 1

#95 truongthanh

truongthanh

    biết lệnh text

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

Đã gửi 14 September 2009 - 09:18 AM

Cảm ơn TUE rất nhiều!Mong được sự chỉ giáo nhiều hơn của TUE và anh em trong CV!thanks mọi người!
  • 0

#96 truongthanh

truongthanh

    biết lệnh text

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

Đã gửi 14 September 2009 - 09:50 AM

Cho mình hỏi thêm cái này 1 tí nữa đi!
(defun c:XXX( / sst ent old tt)  
(defun c:cv( sst / ent old tt)  
(defun c:XXX( / sst ent old tt)
Sau tên hàm là mình liệt kê tất cả các biến ra phải ko?
Cho mình hỏi ý nghĩa và vị trí của dấu / đó là gì?
Có phải sau dấu / là các biến cục bộ được giải phóng khi hàm kết thúc không, còn trước dấu / là biến toàn cục phải ko?

Mình vẫn chưa hiểu lắm biến nào cần giải phóng và biến nào ko cần giải phóng nữa?
  • 0

#97 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 14 September 2009 - 11:23 AM

Cho mình hỏi thêm cái này 1 tí nữa đi!
(defun c:XXX( / sst ent old tt)  
(defun c:cv( sst / ent old tt)  
(defun c:XXX( / sst ent old tt)
Sau tên hàm là mình liệt kê tất cả các biến ra phải ko?
Cho mình hỏi ý nghĩa và vị trí của dấu / đó là gì?
Có phải sau dấu / là các biến cục bộ được giải phóng khi hàm kết thúc không, còn trước dấu / là biến toàn cục phải ko?

Mình vẫn chưa hiểu lắm biến nào cần giải phóng và biến nào ko cần giải phóng nữa?

Chào bạn Truongthanh,
Bạn hiểu đúng rồi đó, nhưng có chút xíu chưa chuẩn, đó là không nhất thiết phải khai báo tất cả các biến đâu bạn ạ. Điều đó chỉ bắt buộc đối với các biến cục bộ mà thôi.
Trên diễn đàn bạn thấy có rất nhiều lisp mà chỉ sử dụng các biến toàn cục và do vậy chả thấy có khai báo gì cả mà chỉ có mỗi hai cái ngoặc đóng mở sau tên hàm. Vậy mà nó vẫn chạy phăm phăm đó thôi, phải không bạn.
Bạn hãy tham khảo bài viết của bác SSG ở đây nhé. Trong đó có phần giải thích khá cụ thể về các biến toàn cục và biến cục bộ bạn ạ.
http://www.cadviet.c...?showtopic=2480

Chúc bạn chóng thành công.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#98 master_worse

master_worse

    biết lệnh offset

  • Advance Member
  • PipPipPip
  • 170 Bài viết
Điểm đánh giá: 87 (tàm tạm)

Đã gửi 14 September 2009 - 11:29 AM

[ quote]Cho mình hỏi thêm cái này 1 tí nữa đi!
(defun c:XXX( / sst ent old tt)
(defun c:cv( sst / ent old tt)
(defun c:XXX( / sst ent old tt)
Sau tên hàm là mình liệt kê tất cả các biến ra phải ko?
Cho mình hỏi ý nghĩa và vị trí của dấu / đó là gì?
Có phải sau dấu / là các biến cục bộ được giải phóng khi hàm kết thúc không, còn trước dấu / là biến toàn cục phải ko?

Mình vẫn chưa hiểu lắm biến nào cần giải phóng và biến nào ko cần giải phóng nữa?[ /quote]

sau dấu / là các biến cục bộ được giải phóng khi hàm kết thúc
còn trước dấu / là các tham số cần thiết khi gọi hàm

nên sử dụng biến cục bộ, để không ảnh hưỡng đến các hàm khác nếu vô tình ta đặt trùng tên biến cho 2 hàm khác nhau.
  • 0

Ngu dốt không đáng thẹn bằng thiếu ý chí học hỏi


Tri thức làm người ta khiêm tốn, ngu si làm người ta kiêu ngạo (Ngạn ngữ Anh)


#99 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 14 September 2009 - 11:29 AM

Cho tui xin mạn phép hỏi Hoành và anh em trên diễn đàn: Khi ta viết dòng lệnh (command ".area" "o" ent)
thi trên màn hình nó sẽ chạy
Specify first corner point or [Object/Add/Subtract]: o
Select objects:
Area = 46546736.0000, Perimeter = 28320.0000
như Hoành đã viết, nhưng nếu khi ta chạy vòng lặp thì nó sẽ hiển thị rất nhiều khi đôí tượng được chọ là lớn. Vậy có thể sửa dòng lệnh như thế nào để ta vẫn thực hiện công việc nhưng không trình bày lên màn hình nhữn diện tích thành phần mà chỉ cho ra kết quả cuôí cùng được không?. Xin chân thành cám ơn mọi người.

Chào bạn Chandatn,
Chưa hiểu ý bạn hỏi, bạn muốn chỉ hiển thị kết quả cuối cùng là kết quả gì vậy??? Là giá trị diện tích của đối tượng bạn chọn cuối cùng hay là tổng diện tích của các đối tượng đã chọn, hay là chỉ hiển thị giá trị chu vi (perimeter) của các đối tượng?????
Mong bạn giải thích rõ thì mới có thể có cách làm được bạn nhé.
Chào bạn và chúc bạn may mắn.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#100 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 27 September 2009 - 12:23 PM

Nhờ các anh giúp chu lisp về giao hội cạnh.
Mình có 2 điểm trên đoạn thẳng cần xác định điểm thứ 3
Lisp yêu cầu nhập điểm 1, bán kính. điểm 2 bán kính.
2 điểm trên vẽ ra 2 vòng tròn cắt nhau 2 điểm ở 2 phía. chọn phí cần xác định điểm 3.
Chèn vào kí hiệu vòng tròn nhỏ , xoá 2 đường tròn
Mình viết được tới đây, không biết thế nào tiếp nửa, mong được giúp đở.
;;-----------------
(defun c:giaohoi()
(setq pt1 (getpoint "\nPick diem 1 tren man hinh ")
          r1 (getdist "\nNhap ban kinh duong tron: "))
    (command ".circle" pt1 r1)
(setq pt2 (getpoint "\nPick diem 2 tren man hinh ")
          r2 (getdist "\nNhap ban kinh duong tron: "))
    (command ".circle" pt2 r2)
  (princ)
)
  • 0