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

#121 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 02 March 2012 - 11:07 AM

Nhờ bác Nguyen Hoanh mà Chiron đã mót được 1 ít code lisp. Topic này và cách trình bay của bác Nguyen Hoanh quá hay, nhưng phần sau bị loãng quá và kết thúc thật đáng tiếc. Rất mong các bác tiếp tục topic này để mọi người có thêm nhiều thứ để "mót".
Chiron muốn hoàn thiện đoạn code này nhưng loay hoay mãi, không biết giải quyết ra sao. Đành nhờ các bác giúp vậy.
Lệnh Area của CAD trong vòng lặp: Nếu click chọn không có đối tượng nào CAD sẽ thông báo "Select Object:" cho đến khi nào bạn chọn 1 đối tượng.
Khi chọn được 1 đối tượng rồi, CAD sẽ phân loại tiếp. Nếu đối tượng có diện tích thì hiện kết quả lên màn hình, nếu đối tượng không có diện tích thì sẽ thông báo "Selected object does not have an area"
Tuy nhiên, Chiron gặp khó khăn ở chỗ không kết hợp 2 vòng lặp này giống lệnh gốc của autoCAD. Mong mọi người chỉ giúp. Cảm ơn.

Hoặc cái này:

(defun C:HA()
(while (not (progn (princ "\rSelect object...") (setq ss (ssget ":S")))))
(if
(vlax-property-available-p (vlax-ename->vla-object (ssname ss 0)) 'area)
(princ (strcat "\nArea = " (rtos (vlax-get (vlax-ename->vla-object (ssname ss 0)) 'Area) 2 2)))
(princ "\nSelected object does not have an area."))
(princ))

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


#122 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 02 March 2012 - 12:20 PM

Bác Hà hơi thiếu 1 chút vòng lặp nữa là nếu k có diện tích thì vẫn phải chọn tiếp ^^
Bài trên ketxu viết theo mạch của Chiron, ngoài ra còn có nhiều cách viết khác như :
Ketxu hay viết :


(while (not (and (setq sel (entsel "\nSelect object: "))
(vl-position (cdr (assoc 0 (entget (car sel)))) '("POLYLINE" "LWPOLYLINE" "SPLINE" "CIRCLE" "HATCH"))
)
)
(princ "\nNot select or Object not have area")
(setq sel (entsel "\nSelect object: "))
)


hay như LeeMac hay viết :

 (while
(progn (setvar 'ERRNO 0)(setq sel (entsel "\nSelect object :"))
(cond
( (= 7 (getvar 'ERRNO))
(princ "\nMissed, Try again.")
)
( (eq 'STR (type sel))
nil
)
( (vl-consp sel)
(if (not (member (cdr (assoc 0 (entget (car sel)))) '("POLYLINE" "LWPOLYLINE" "SPLINE" "CIRCLE" "HATCH")))
(princ "\nInvalid Object Selected. It hasn't area !")
)
)
)
)
)

Hoặc code của bác ĐVH bên trên nhưng thêm (ssget ":S") thành (ssget ":S" (list (cons 0 "POLYLINE,LWPOLYLINE,SPLINE,CIRCLE,HATCH")))

Nói chung tùy cách thức mình muốn thể hiện với người dùng, Chiron có thể tìm cách nào dễ nhớ và thích
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#123 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 02 March 2012 - 01:42 PM

Bác Hà hơi thiếu 1 chút vòng lặp nữa là nếu k có diện tích thì vẫn phải chọn tiếp ^^
Bài trên ketxu viết theo mạch của Chiron, ngoài ra còn có nhiều cách viết khác như :
Ketxu hay viết :
...
hay như LeeMac hay viết :
...
Hoặc code của bác ĐVH bên trên nhưng thêm (ssget ":S") thành (ssget ":S" (list (cons 0 "POLYLINE,LWPOLYLINE,SPLINE,CIRCLE,HATCH")))
Nói chung tùy cách thức mình muốn thể hiện với người dùng, Chiron có thể tìm cách nào dễ nhớ và thích

1). Nói chung là OK. Đọc 2 dòng trên của Chiron thì thấy chỉ lặp khi chưa chọn được obj, còn khi có obj rồi thì in area hoặc báo not area. Tuy nhiên lại còn thêm 1 dòng cuối nữa là kết hợp 2 lặp, thành ra sót. Đáng lẽ Chiron có thể y/c ngắn hơn nhưng vẫn dễ hiểu: chọn obj chừng nào có area thì in ra.
2). Bổ sung elip và region nữa chứ hè!
  • 0

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


#124 Chiron

Chiron

    biết dimradius

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

Đã gửi 02 March 2012 - 01:42 PM

Hoặc cái này:


Bác Hà hơi thiếu 1 chút vòng lặp nữa là nếu k có diện tích thì vẫn phải chọn tiếp ^^
Bài trên ketxu viết theo mạch của Chiron, ngoài ra còn có nhiều cách viết khác như :
Ketxu hay viết :
...
hay như LeeMac hay viết :
...
Hoặc code của bác ĐVH bên trên nhưng thêm (ssget ":S") thành (ssget ":S" (list (cons 0 "POLYLINE,LWPOLYLINE,SPLINE,CIRCLE,HATCH")))

Nói chung tùy cách thức mình muốn thể hiện với người dùng, Chiron có thể tìm cách nào dễ nhớ và thích

Cám ơn các bác, Chiron đang chập chững bước đi nên vẫn đang "gặm nhấm" từng dòng code.
  • 0

#125 Chiron

Chiron

    biết dimradius

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

Đã gửi 02 March 2012 - 01:49 PM

1). Nói chung là OK. Đọc 2 dòng trên của Chiron thì thấy chỉ lặp khi chưa chọn được obj, còn khi có obj rồi thì in area hoặc báo not area. Tuy nhiên lại còn thêm 1 dòng cuối nữa là kết hợp 2 lặp, thành ra sót. Đáng lẽ Chiron có thể y/c ngắn hơn nhưng vẫn dễ hiểu: chọn obj chừng nào có area thì in ra.
2). Bổ sung elip và region nữa chứ hè!

Thực ra Chiron đã viết và chạy ngon lành rồi, chữa cháy bằng đoạn code thứ 2 (không cần biết chọn trúng đối tượng hay không hoặc đối tượng không có diện tích là ra cùng thông báo cả), nhưng vì muốn hoàn thiện hơn và muốn học hỏi nên tiếp tục... mò :). Đây là lisp Chiron đã viết:

;;;Error Trapping Function
(defun ErrTrap (errmsg) ; If an error (such as ESC) occurs while this command is active...
(cond
((= errmsg "Quit / Exit abort") (princ))
((/= errmsg "Function cancelled")
(princ (strcat "\nError: " errmsg))
)
)
(setvar "cmdecho" oldecho) ; Restore saved modes
(setq *error* OldErr) ; Restore old *error* handler
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:tdt (/ oldecho ent txtpnt txtht dientich)
(setq OldErr *error*) ;store *error*
(setq *error* ErrTrap) ;re-assign *error*
(setq oldecho (getvar "cmdecho")) ;store variables
(setvar "cmdecho" 0) ;set variables
(setq ent (car (nentsel)))
(while
(or
(= ent nul)
(not
(member (cdr (assoc 0 (entget ent)))
'("POLYLINE" "LWPOLYLINE" "SPLINE" "CIRCLE" "HATCH")
)
)
)
(prompt "\nSelected object does not have an area")
(setq ent (car (nentsel)))
)
(command ".area" "o" ent)
(setq dientich (getvar "area"))
(if (= dientich nil) (exit))
(setq txtpnt (getpoint "\nSpecify middle point of text:"))
(setq txtht
(getdist (strcat "\nSpecify height <" (rtos (getvar "textsize") 2 2) ">: "))
)
(if (null txtht) (setq txtht (getvar "textsize")) )
(command "text" "m" txtpnt txtht 0 (strcat (rtos(/ dientich 1000000) 2 2) "m2")) ;end code
(setvar "cmdecho" oldecho) ;reset variables
(setq *error* OldErr) ;restore *error*
(princ)
)

  • 0

#126 Chiron

Chiron

    biết dimradius

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

Đã gửi 02 March 2012 - 03:36 PM

Sau một hồi nghiền ngẫm, đọc tới đọc lui, copy vô chạy thử và... báo lỗi:
Select objects: ; error: bad argument value: AutoCAD command: T
Ket xem giúp mình bị sai cái gì vậy?
Đây là code Chiron đã sửa:

(defun c:tdt (/ oldecho sel ent txtpnt txtht dientich)
(while (not ent)
(while (not sel) (setq sel (entsel "\nSelect object: ")))
(if (member (cdr (assoc 0 (entget (car sel)))) '("POLYLINE" "LWPOLYLINE" "SPLINE" "CIRCLE" "HATCH"))
(setq ent T)
(progn
(princ "\nSelected object does not have an area")
(setq sel nil)
)
) ;End if
) ;End while
(command ".area" "o" ent)
(setq dientich (getvar "area"))
(if (= dientich nil) (exit))
(setq txtpnt (getpoint "\nSpecify middle point of text:"))
(setq txtht
(getdist (strcat "\nSpecify height <" (rtos (getvar "textsize") 2 2) ">: "))
)
(if (null txtht) (setq txtht (getvar "textsize")) )
(command "text" "m" txtpnt txtht 0 (strcat (rtos(/ dientich 1000000) 2 2) "m2"))
(princ)
)

  • 0

#127 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 02 March 2012 - 03:49 PM

Sau một hồi nghiền ngẫm, đọc tới đọc lui, copy vô chạy thử và... báo lỗi:
Select objects: ; error: bad argument value: AutoCAD command: T
Ket xem giúp mình bị sai cái gì vậy?
Đây là code Chiron đã sửa:
(setq ent T)
(command ".area" "o" ent)

Sao lại dùng ent trong (command "area"...) được, nó bằng T cơ mà, phải (car sel) chứ!
  • 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.


#128 Chiron

Chiron

    biết dimradius

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

Đã gửi 02 March 2012 - 03:54 PM

Sao lại dùng ent trong (command "area"...) được, nó bằng T cơ mà, phải (car sel) chứ!

A A A... Cảm ơn bác. Lo xem cái lọc mà không xem lại đoạn code ban đầu. Lisp đã chạy ngon lành. :D
  • 0

#129 votrantrung

votrantrung

    Chưa sử dụng CAD

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

Đã gửi 09 March 2012 - 10:34 AM

bác ơi em thấy lệnh tính diện tích mà bác lập khi tính với đối tương line mà ko liền mạch thì ko tính được.em toàn phải cắt các đương rồi nối nó lại mới tính được.Liệu có trương trình nào tự nhận diện tích như lệnh hatch ko bác
  • 0

#130 Chiron

Chiron

    biết dimradius

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

Đã gửi 09 March 2012 - 01:59 PM

bác ơi em thấy lệnh tính diện tích mà bác lập khi tính với đối tương line mà ko liền mạch thì ko tính được.em toàn phải cắt các đương rồi nối nó lại mới tính được.Liệu có trương trình nào tự nhận diện tích như lệnh hatch ko bác

Lisp của Chiron viết chỉ áp dụng cho các đối tượng có diện tích thôi (polyline kín, circle...). Yêu cầu của bạn có nhiều trên diễn đàn rồi, bạn chịu khó tìm cái nào tính diện tích có hatch là được.
  • 0

#131 tranhuuanh_kt89

tranhuuanh_kt89

    biết zoom

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

Đã gửi 30 September 2012 - 06:46 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.


thanks anh Hoanh, em đang muốn học cach viết lisp. trước đây em có học về lập trình ( Pascal thôi, vì cấp 3 e học chuyên Tin,còn ĐH thì k tìm hiểu nữa), nay em k biết nên học theo giáo trình VBA nào là dễ hiểu nhất và có thể vận dụng nhanh nhất. mong anh chỉ giúp em với..
  • 0
Sống trong đời sống, cần có một tấm lòng...

#132 ainhandilac

ainhandilac

    biết vẽ pline

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

Đã gửi 05 October 2012 - 09:06 AM

sao không bác nào tiếp tục post bài giảng nữa nhỉ, đang hay mà
  • 0
SỐNG TRÊN ĐỜI CẦN CÓ NIỀM TIN

#133 loprjnce

loprjnce

    biết vẽ line

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

Đã gửi 12 June 2013 - 04:46 PM

THnaks anh Hoành nhiều lắm, tài liệu rất hay.


  • 0

#134 vubk10

vubk10

    biết pan

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

Đã gửi 02 July 2013 - 10:02 AM

em chạy cái lisp này vào sao khi pick vào 1 hình sao nó báo diện tich là 0.0 nhỉ :(
 

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


  • 0

#135 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 02 July 2013 - 11:51 AM

em chạy cái lisp này vào sao khi pick vào 1 hình sao nó báo diện tich là 0.0 nhỉ :(
 

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

Hề hề hề,

Đối tượng chọn phải là một pline kí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.

#136 vubk10

vubk10

    biết pan

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

Đã gửi 02 July 2013 - 11:03 PM

thanks mod em quên mất cái lệnh area là phải pl kin. mình có thể tói ưu nó tính 1 hình bất kì ko nhỉ..tức là không cần phải pl mà chỉ cần các đường line nối nhau cũng co thể tính được


  • 0

#137 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 02 July 2013 - 11:09 PM

Lệnh AREA không cần kín.


  • 0

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


#138 hiepttr

hiepttr

    Edu level: li10

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

Đã gửi 05 July 2013 - 08:55 AM

Các bác cho mình hỏi tí !

Trong lisp, mình có 2 đoạn thẳng mà mình đã đặt tên cho nó là a; b.

Mình viết thế nào để một lệnh (VD: move) tham chiếu tới 2 thằng đó cùng lúc nhỉ ??? :D


  • 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


#139 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 05 July 2013 - 09:03 AM

VD:

(command "move" a b "" '(0 0) '(100 100))


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


#140 hiepttr

hiepttr

    Edu level: li10

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

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

Các bác giúp mình với !

Mình đang đọc topic này http://www.cadviet.c...so-ham-vl-vlax/

đoạn #5-#6 mình có vướng 1 chổ này mà chưa biết thế nào:

- Như đoạn bác Hoành trích thì hàm (vla-IntersectWith ob1 ob2 acExtendNone) trả về giao điểm của 2 đt ob1, ob2 (ko kéo dài)

- Mình làm VD như sau:

 + vẽ lên cad 1line & 1 pline cắt nhau (hình)

 + Command: (setq a (car (entsel)))--------- chọn a

   Command: (setq b (car (entsel)))--------- chọn b

 + Tiếp:

(setq a1 (vlax-ename->vla-object a))

(setq b1 (vlax-ename->vla-object B))

(setq p (vla-IntersectWith a1 b1 acExtendNone))

Giờ mình nhập lệnh line: (để vẽ từ p -----> thì ra thế này ???)

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

Nhờ các bác chỉ dùm, lỗi chổ nào ạh !

80156_vd1_1.jpg

 


  • 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