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

#141 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 20 July 2013 - 09:56 AM

Command: l LINE Specify first point: !p
#<variant 8197 ...>

Kết quả trả về (màu đỏ) là danh sách nhưng được biểu diễn dưới dạng Variant. Từ đây, muốn chuyển qua danh sách các điểm dạng (p1 p2... pn) thì còn vài bước nữa, hơi khó hiểu với bạn >> không đơn giản để lấy giao điểm của 2 curve chỉ bằng 1 hàm như vậy.

Tặng bạn 1 hàm lấy danh sách các giao điểm của 2 curve để thấy nó cũng khá phức tạp.

;; Get intersection of entity1 and entity2, by flag (flags: acExtendNone ; acExtendThisEntity ; acExtendOtherEntity ; acExtendBoth).
(defun #Inter:2Ent(ent1 ent2 flag / l r)
 (setq l (vlax-invoke (vlax-ename->vla-object ent1) 'intersectwith (vlax-ename->vla-object ent2) flag))
 (repeat (/ (length l) 3)
  (setq r (cons (list (car l) (cadr l) (caddr l)) r)
        l (cdddr l)))
 (reverse r))
 

  • 2

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#142 hiepttr

hiepttr

    Edu level: li10

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

Đã gửi 20 July 2013 - 11:05 AM

Kết quả trả về (màu đỏ) là danh sách nhưng được biểu diễn dưới dạng Variant. Từ đây, muốn chuyển qua danh sách các điểm dạng (p1 p2... pn) thì còn vài bước nữa, hơi khó hiểu với bạn >> không đơn giản để lấy giao điểm của 2 curve chỉ bằng 1 hàm như vậy.

Tặng bạn 1 hàm lấy danh sách các giao điểm của 2 curve để thấy nó cũng khá phức tạp.

 

;; Get intersection of entity1 and entity2, by flag (flags: acExtendNone ; acExtendThisEntity ; acExtendOtherEntity ; acExtendBoth).
(defun #Inter:2Ent(ent1 ent2 flag / l r)
 (setq l (vlax-invoke (vlax-ename->vla-object ent1) 'intersectwith (vlax-ename->vla-object ent2) flag))
 (repeat (/ (length l) 3)
  (setq r (cons (list (car l) (cadr l) (caddr l)) r)
        l (cdddr l)))
 (reverse r))
 

Bác lại "chơi khó" nên mình lạ hỏi :D

1. Mình thấy bác hay dùng dấu nháy ( ' ) để kết hợp 2 hàm đi liền đc với nhau thì phải >>> cách dùng thế nào bác nhỉ ???

2. Bác có thể nói sơ qua cái được biểu diễn dưới dạng Variant là như thế nào ???

Phải chăng cái (vlax-invoke) là để biến dạng Variant thành các thành phần x1, y1, z1,x2, y2, z2,x3, y3, z3... nó xếp liền nhau (mình đọc help mà thấy ghi ko rõ lắm) ?

3. Còn em (reverse)  là gì nữa ... ??? :(


  • 0

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#143 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 20 July 2013 - 11:24 AM

Bác lại "chơi khó" nên mình lạ hỏi :D

1. Mình thấy bác hay dùng dấu nháy ( ' ) để kết hợp 2 hàm đi liền đc với nhau thì phải >>> cách dùng thế nào bác nhỉ ???

2. Bác có thể nói sơ qua cái được biểu diễn dưới dạng Variant là như thế nào ???

Phải chăng cái (vlax-invoke) là để biến dạng Variant thành các thành phần x1, y1, z1,x2, y2, z2,x3, y3, z3... nó xếp liền nhau (mình đọc help mà thấy ghi ko rõ lắm) ?

3. Còn em (reverse)  là gì nữa ... ??? :(

1). Dấu phẩy (') chẳng có nghĩa gì về mặt kết hợp mà nó để định giá 1 symbol. Chẳng hạn bạn có thể viết (setvar "osmode" 0) hoặc (setvar 'osmode 0).

2). Variant thì chắc từ từ bạn sẽ hiểu. Tôi có hiểu nhưng giải thích khó quá. Hy vọng có bạn khác giải thích rõ hơn.

3). Hàm tìm giao của bạn trả về list dưới dạng variant, còn hàm vlax-invoke trả về list kiểu này: (x1 y1 z1 x2 y2 z2... xn yn zn) >> Điều này quan trọng nè: trong visual lisp có rất nhiều hàm có chức năng gần như nhau (nhìn bề ngoài) nhưng bản chất có thể khác nhau >> cần lựa chọn hàm phù hợp để dùng.

4). Revese là hàm đảo ngược thứ tự 1 list.

@all: do bạn hiepttr đang theo lớp của KX nên tôi mạo muội giải thích vậy, các bác thâm niên đừng cười nhé.


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#144 hiepttr

hiepttr

    Edu level: li10

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

Đã gửi 20 July 2013 - 02:41 PM

4). Revese là hàm đảo ngược thứ tự 1 list.

Như vậy, dùng hàm đảo ngược Revese trong đoạn code trên có dụng ý gì bác nhỉ ?!

Và nữa...

hàm vlax-invoke còn dùng để làm gì nữa

(mình nghĩ thay cái "giống khác" vào chổ intersecwith thì cho kết quả về vấn đề khác :D )

hay nói cách khác, ngoài tham số intersecwith hàm vlax-invoke còn có tham số nào khác chăng ???


  • 0

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#145 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 20 July 2013 - 03:21 PM

Như vậy, dùng hàm đảo ngược Revese trong đoạn code trên có dụng ý gì bác nhỉ ?!

Và nữa...

hàm vlax-invoke còn dùng để làm gì nữa

(mình nghĩ thay cái "giống khác" vào chổ intersecwith thì cho kết quả về vấn đề khác :D )

hay nói cách khác, ngoài tham số intersecwith hàm vlax-invoke còn có tham số nào khác chăng ???

1). Reverse để đảo list lại theo thứ tự các điểm giao, bởi các điểm trên curve cũng được sắp xếp từ startpoint đến endpoint. Nếu không quan tâm đến thứ tự thì bạn thay (reverse r)) bởi r).

2). hàm vlax-invove nói chung là để lấy property của 1 hoặc các đối tượng. Ngoài property là intersecwith thì thêm hàng trăm property khác nữa, ví dụ: color, layer, linetype,... Bạn tham khảo help nhé, tầm khoảng gần 800 lận!


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#146 hiepttr

hiepttr

    Edu level: li10

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

Đã gửi 20 July 2013 - 04:10 PM

Thanks alot !

Chúc bác có 1 kỳ nghỉ cuối tuần vui vẻ !!!


  • 0

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#147 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 24 July 2013 - 10:14 AM

1. Dấu (') tương đương hàm quote: Returns an expression without evaluating it
2. vlax là các hàm activeX để Lisp giao tiếp với các ứng dụng khác (kể cả Acad )
Trong lập trình hướng đối tượng  (gọi tắt là OOP, object-oriented programming)
 thì mỗi đối tượng đối tượng đều có các thuộc tính (Properties) và hành vi (Methods)
(xem help phần ActiveX and VBA Reference)
- Để lấy Properties của object dùng hàm vlax-get-property
VD để lấy property Center của Circle
(setq cen (vlax-get-property obj 'Center))
- Để đặt Properties cho object dùng hàm vlax-put-property
(vlax-put-property obj 'Center cen)
- Để gọi Methods của object dùng hàm vlax-invoke-method
cú pháp (vlax-invoke-method obj method arg [arg...])
obj : đối tượng VLA
method: A symbol or string naming the method to be called

          tên hàm, có thể là symbol tức là dấu nháy đơn ' hoặc dùng kiểu chuỗi
arg: các Argument truyền cho hàm.
Tên method và Các Argument có trong help

VD tìm giao điểm của 2 object, theo help phần IntersectWith Method
RetVal = object.IntersectWith(IntersectObject, ExtendOption)
hàm này có 2 arg là IntersectObject, ExtendOption, kết quả trả về là Variant (array of doubles)
=> khi gọi hàm vlax-invoke-method sẽ có 4 arg
(setq RetVal (vlax-invoke-method obj 'IntersectWith IntersectObject ExtendOption))


- Trong help không có vlax-invoke, nhưng dùng vlax-invoke sẽ tiện hơn vì có thể dùng kiểu
của lisp thay cho kiểu variant

3.Trong help chỉ thấy định nghĩa type trong variant
Search trên net nhưng không tìm thấy định nghĩa kiểu cấu trúc variant cho lisp hoặc Autodesk, chỉ có
của MSDN (vì hơi dài nên bạn tham khảo link http://msdn.microsof...7(v=vs.85).aspx)
Nếu đúng như MSDN định nghĩa thì kiểu variant là kiểu biến tổng quát (để các ứng dụng khác nhau trao  đổi dữ liệu cho nhau).

struct tagVARIANT là 1 union của struct __tagVARIANT và DECIMAL  decVal,
ở đây chỉ xét struct __tagVARIANT gồm:
VARTYPE vt : kiểu biến
3 WORD chưa dùng, mục đích để size của struct tagVARIANT = 16 bytes
1 union là giá trị do VARTYPE định nghĩa, có thể là biến trực tiếp hoặc biến con trỏ (pointer) nếu có dấu * đằng trước
VD theo bài của bạn
(setq p (vla-IntersectWith a1 b1 acExtendNone))
Kết quả trả về: #<variant 8197 ...>
8197 = 8192 (vlax-vbArray ) + 5 (vlax-vbDouble )
=> giao của a1 và b1 là 1 variant kiểu (array of doubles)
hàm vlax-variant-value đọc giá trị VARTYPE là SAFEARRAY*
và ép kiểu trả về giá trị trong union là SAFEARRAY
 


  • 2

#148 truongthon304

truongthon304

    biết vẽ circle

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

Đã gửi 02 October 2013 - 04:14 PM

Ngày trước em học pascal có cách gán n giá trị cho n biến bằng vòng lặp, kiểu như thế này:

 

from i = 1 to n ; (giá trị n nguyên cho trước hoặc nhập từ chương trình)

    setq p[i] = i ; (hoặc 1 biểu thức khác)

   end;

 

Như vậy ta có n biến là biến: p1 = 1; p2 = 2; p3=3....

 

Trong Autolisp thì phải viết như thế nào ạ?

 

Em đang tập viết lisp lấy thông tin các đầu mút của 1 đường PLINE.

Em cảm ơn!


  • 0

#149 Namvanvo

Namvanvo

    Edu level: li5

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

Đã gửi 14 November 2013 - 08:03 AM

Các bác cho em hỏi trong autolisp, lệnh tạo bản vẽ mới tương ứng với lệnh new trong cad thì cú pháp thế nào ? mình viết (command ".new") nhưng cad không hiểu  :)


  • 0

#150 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 14 November 2013 - 09:23 AM

Ví dụ hàm này tạo 1 drawing mới:

(vla-add (vla-get-documents (vlax-get-acad-object)) "acad.dwt")


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#151 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 14 November 2013 - 10:38 AM

Thanks alot !

Chúc bác có 1 kỳ nghỉ cuối tuần vui vẻ !!!

Hề hề hề

Ở ví dụ của bác, nếu dùng:

(setq l (vlax-safearray->list (vlax-variant-value (vla-intersectwith a1 b1 acextendnone))))

sẽ tương đương với:

(setq l (vlax-invoke a1 'intersectwith b1 0))

Từ đó có thể hiểu nôm na như sau:

Hàm (vla-intersectwith ......) trả về một giá trị được định nghĩa là Variant . Giá trị này được sắp xếp theo một safearray. (theo mình hiểu nôm na tức là một ma trận dạng chữ nhật chứa các tọa độ của các giao điểm). Và để có ma trận này phải sử dụng hàm (vlax-variant-value ....). Từ ma trận này có thể chuyển nó thành một list các tọa độ này theo một trật tự định trước bởi hàm (vlax-safearaay->list ...)

Trong khi hàm (vlax-invoke ......) có khả năng trả trực tiếp về một list các tọa độ này.

Sau khi đã có cái list các tọa độ này thì việc chuyển nó thành list các point sẽ không qua khó nửa và bác DoanVanHa đã chỉ ra một cách rồi đó.

Có nhiều nguyên nhân để người ta tạo ra các hàm trung gian như vậy, nhưng theo mình hiểu thì tác dụng chính của nó là để có thể giao tiếp được với các phần mềm khác.

Với cái ngữ học mót như mình thì chả khoái mấy thằng cò như vầy, cứ chơi kiểu (vlax-invoke ..... ) là hay hơn . Mặc dù muốn vậy nhưng bản thân cái thằng (vlax-invoke .... ) này cũng chả hề đơn giản bởi nó yêu cầu các argument khác nhau đối với mỗi một method. Để thuộc và nhớ hết những thằng này đối với mình cũng là quá sức rồi.

Tìm hiểu về nó thì trong Help của CAD cũng có đề cập đấy. nhưng cái vốn tiếng Anh của mình còn hơi lùn nên cũng chửa thấm được bao nhiêu nên lại càng khó nhớ. nếu bác quan tâm thì cứ chịu khó mở Help ra cày, ắt sẽ có ngày vỡ thôi.

Hề hề hề, mạn phép các bác, múa may mấy đường mèo quào, mong các bác không chấp trách.


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

#152 Namvanvo

Namvanvo

    Edu level: li5

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

Đã gửi 14 November 2013 - 01:46 PM

Ví dụ hàm này tạo 1 drawing mới:

(vla-add (vla-get-documents (vlax-get-acad-object)) "acad.dwt")

Thanks, giờ em muốn tạo ra và có thể thao tác luôn trên bản vẽ mới này thì sao bác, vì hàm trên tạo ra bản mới nhưng nó vẫn thao tác trên bản vẽ hiện hành  :)

sao hàm vla-addvla-get-documents em tìm trong help của autocad 2007 không thấy bác nhỉ?


  • 0

#153 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 14 November 2013 - 03:54 PM

(vlax-put  (vlax-get-acad-object) 'Activedocument (vla-add (vla-get-documents (vlax-get-acad-object)) "acad.dwt"))


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#154 Namvanvo

Namvanvo

    Edu level: li5

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

Đã gửi 14 November 2013 - 04:00 PM

:wub: đã làm được tuy nhiên không hiểu mô tê răng rứa chi cả  :D  :D  :D


  • 0

#155 phamthe

phamthe

    biết vẽ polygon

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

Đã gửi 15 January 2014 - 11:12 AM

các anh ơi cho em hỏi, nếu em muốn xuất Text ra màn hình là chữ nghiêng thì phải sửa chỗ nào trong đoạn code dưới đây? cảm ơn các anh!

(command "text" "j" "tl" A "" (strcat "(" (rtos (/ (* (GETVAR "AREA") 10) 10) 2 1) ")"))


  • 0

#156 hiepttr

hiepttr

    Edu level: li10

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

Đã gửi 15 January 2014 - 11:45 AM

Trong đoạn này thì tạm thời mình chịu :D

Song, bạn có thể thay đổi góc nghiêng text (so với phương đứng, tính bằng radian) trong mã dfx 50 của textstyle

p/s: hoặc chọn tuỳ chọn italic trong hộp thoại textstyle (nếu có)

 

VD: chữ nghiêng 75 độ theo phương ngang

(setq e_lst (entget (tblobjname "style" (getvar 'textstyle))))

(entmod (subst (cons 50 0.261799) (setq old (assoc 50 e_lst)) e_lst))

(command "text" "j" "tl" A "" (strcat "(" (rtos (/ (* (GETVAR "AREA") 10) 10) 2 1) ")"))

;;tra lai:

(entmod (subst old (assoc 50 e_lst) e_lst))

(setq e_lst (entget (tblobjname "style" (getvar 'textstyle))))
(entmod (subst (cons 50 0.261799) (setq old (assoc 50 e_lst)) e_lst))
(command "text" "j" "tl" A "" (strcat "(" (rtos (/ (* (GETVAR "AREA") 10) 10) 2 1) ")"))
;;tra lai:
(entmod (subst old (assoc 50 e_lst) e_lst))
(setq e_lst (entget (tblobjname "style" (getvar 'textstyle))))
(entmod (subst (cons 50 0.261799) (setq old (assoc 50 e_lst)) e_lst))
(command "text" "j" "tl" A "" (strcat "(" (rtos (/ (* (GETVAR "AREA") 10) 10) 2 1) ")"))
;;tra lai:
(entmod (subst old (assoc 50 e_lst) e_lst))

  • 1

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#157 phamthe

phamthe

    biết vẽ polygon

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

Đã gửi 16 January 2014 - 04:54 AM

cảm ơn hiepttr nhiều nhé, nhờ bạn mình đã làm được rồi! 


  • 0

#158 Namvanvo

Namvanvo

    Edu level: li5

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

Đã gửi 16 January 2014 - 09:42 AM

các anh cho em hỏi là khi viết code cho lệnh qleader thì làm sao để mình lựa chọn được các lựa chọn khác nhau trong hộp thoại settings nhỉ. 121048_20140116_094013.jpg


  • 0

#159 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 16 January 2014 - 11:03 AM

các anh cho em hỏi là khi viết code cho lệnh qleader thì làm sao để mình lựa chọn được các lựa chọn khác nhau trong hộp thoại settings nhỉ. 

Namvanvo tham khảo link dưới đây để thấy rằng Qleader settings by lisp là tương đối phức tạp:

http://forums.autode...p/844428#M70086


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#160 Namvanvo

Namvanvo

    Edu level: li5

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

Đã gửi 16 January 2014 - 01:33 PM

Namvanvo tham khảo link dưới đây để thấy rằng Qleader settings by lisp là tương đối phức tạp:

http://forums.autode...p/844428#M70086

Đúng là khá phức tạp, k dễ ăn cơm với thịt  :D , chỗ này có biến hệ thống thì ngon, nhưng lại không tìm ra.


  • 0