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

#101 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 27 September 2009 - 01:44 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)
)


Đoạn lisp dưới đây hoàn tất chương trình theo ý tưởng của bạn. Phần màu xanh là phần viết thêm.

(defun c:giaohoi ()
(setq pt1 (getpoint "\nPick diem 1 tren man hinh ")
r1 (getdist pt1 "\nNhap ban kinh duong tron: ")
)
(command ".circle" pt1 r1)
(setq c1 (entlast))
(setq pt2 (getpoint "\nPick diem 2 tren man hinh ")
r2 (getdist pt2 "\nNhap ban kinh duong tron: ")
)
(command ".circle" pt2 r2)
(setq c2 (entlast)
pt3 (getpoint "\nVao phia: ")
giaodiem (giaodt c1 c2)
)
(command ".erase" c1 c2 "")
(if (cungphia pt1 pt2 pt3 (car giaodiem))
(command ".circle" (car giaodiem) (/ r2 5.0))
(command ".circle" (cadr giaodiem) (/ r2 5.0))
)

(princ)
)

;-------------------------------
(defun cungphia(p1 p2 p3 ptest)
(setq
giao (inters p1 p2 p3 ptest nil)
)
(not (equal (distance p3 ptest) (+ (distance p3 giao)(distance ptest giao)) 0.0001) )
)

(defun GiaoDT (ent1 ent2)
(setq ob1 (vlax-ename->vla-object ent1)
ob2 (vlax-ename->vla-object ent2)
)
(setq g (vlax-variant-value
(vla-IntersectWith ob1 ob2 acExtendNone)
)
)
(if (/= (vlax-safearray-get-u-bound g 1) -1)
(setq g (vlax-safearray->list g))
(setq g nil)
)
(if g
(progn
(setq kq nil
sd (fix (/ (length g) 3))
)
(repeat sd
(setq kq (append kq (list (list (car g) (cadr g) (caddr g))))
g (cdddr g)
)
)
kq
)
nil
)
)

  • -1

#102 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 - 02:34 PM

Công nhận Bác Hoành là chuyên gia về Lisp. Khâm phục, khâm phục, khâm phục.

Nhờ Bác giúp em về giao hội tiếp nha:
Ví dụ Em có một đoạn thẳng A-B là 50 m muốn tìm điểm giao hội vuông góc với 1 điểm nằm trên cạnh A-B với chiều dài cho trước, như sau :
A-1 là 27 m ( hỏi khoảng cách ), Hỏi giao hội vuông góc ra 2 ( điểm cần xác định ) ( hỏi khoảng cách ),
từ đó xác định điểm 2 vẽ kí hiệu.
Lisp hỏi :
- Chọn cạnh:
- Điểm gốc đâu
- Chiều dài bao nhiêu
- Vuông góc ra bao nhiêu:
- Về phía nào;
- Ghi chú là số nào : ( Ví dụ GH-01)
Thể hiện điểm point và ghi chú
Rất mong được Bác giúp
  • 0

#103 ngdanghuy

ngdanghuy

    biết pan

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

Đã gửi 30 January 2010 - 07:59 AM

bác nào làm ơn chỉ cho mình công dụng và cách sử dụng chi tiết lệnh filter, xref với nhé. nếu gửi vào mail giùm mình thì càng tốt. mail của mình là
ngdanghuy.07k@gmail.com. thanks mọi người nhìu nha
  • 0

#104 conlaiday

conlaiday

    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 March 2010 - 02:16 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ạn tạo phần diễn đàn học lisp hay đấy. nhưng vẫn là khó khăn đôi với những người mới nghe qua như mình. bạn có thể nói rõ hơn về chương trình tạo lisp này dc không
  • 0

#105 nguyentranthang

nguyentranthang

    biết pan

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

Đã gửi 27 July 2010 - 06:03 PM

xin các bác sửa lisp xác định chiều dài đối tượng

(defun c:tcd( / sel ent chieudai)
(setq sel (entsel "\nHay chon doi tuong: "))
(setq ent (car sel))
(command "lengthen" ent)
(setq chieudai (getvar "lengthen"))
(princ "\nChieu dai doi tuong vua roi la: ")
(princ chieudai)
(princ "\nm")

(princ)
)
  • 0

#106 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 28 July 2010 - 01:09 PM

xin các bác sửa lisp xác định chiều dài đối tượng
...........

Sử dụng AutoLisp :
Bạn phải tìm vị trí của điểm đầu và điểm cuối, sau đó gọi hàm DISTANCE để tính khoảng cách giữa 2 điểm.
(defun c:tcd1(/ chieudai data ent p1 p2 sel)
(setq sel (entsel "\nHay chon 1 line: "))
(setq ent (car sel))
(setq data (entget ent))
(setq p1 (cdr (assoc 10 data)))
(setq p2 (cdr (assoc 11 data)))
(setq chieudai (distance p1 p2))
(princ "\nChieu dai la: ")
(princ (rtos chieudai))
(princ)
)


Sử dụng VisualLisp :
Với VisualLisp, Cad cung cấp sẵn thuộc tính Length (chiều dài), chỉ cần gọi hàm vla-get-Length để lấy thuộc tính chiều dài của đối tuợng.
Tương tự, để lấy điểm đầu và điểm cuối, gọi hàm vla-get-StartPointvla-get-EndPoint
(defun c:tcd2(/ chieudai ent obj sel)
(vl-load-com)
(setq sel (entsel "\nHay chon 1 line : "))
(setq ent (car sel))
(setq obj (vlax-ename->vla-object ent))
(setq chieudai (vla-get-Length obj))
(princ "\nChieu dai la: ")
(princ (rtos chieudai))
(princ)
)

  • 1

#107 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 28 July 2010 - 02:38 PM

xin các bác sửa lisp xác định chiều dài đối tượng

(defun c:tcd( / sel ent chieudai)
(setq sel (entsel "\nHay chon doi tuong: "))
(setq ent (car sel))
(command "lengthen" ent)
(setq chieudai (getvar "lengthen"))
(princ "\nChieu dai doi tuong vua roi la: ")
(princ chieudai)
(princ "\nm")

(princ)
)

Sửa lại cho bạn đây :
(defun c:tcd( / sel ent chieudai)
(setq sel (entsel "\nHay chon doi tuong: "))
(setq ent (car sel))
(command "lengthen" ent "")
(setq chieudai (getvar "perimeter"))
(princ "\nChieu dai doi tuong vua roi la: ")
(princ chieudai)
(princ "\nm")

(princ)
)

  • 0

#108 nguyentranthang

nguyentranthang

    biết pan

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

Đã gửi 31 July 2010 - 08:17 AM

"perimeter" là gì hả a Tue_NV
  • 0

#109 nguyentranthang

nguyentranthang

    biết pan

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

Đã gửi 08 August 2010 - 07:13 PM

Các bác viết giúp em cái lisp với yêu cầu như sau với:
move 1 số đối tượng được chọn theo chiều thẳng đứng một khoảng cách cho trước là 0.08 đơn vị
  • 0

#110 jick

jick

    biết lệnh hatchedit

  • Members
  • PipPipPipPip
  • 264 Bài viết
Điểm đánh giá: 82 (tàm tạm)

Đã gửi 08 August 2010 - 07:47 PM

Các bác viết giúp em cái lisp với yêu cầu như sau với:
move 1 số đối tượng được chọn theo chiều thẳng đứng một khoảng cách cho trước là 0.08 đơn vị


ủa cái này cũng cần dùng lisp hay sao???? :(
  • 0
Hình đã gửi
______________________Civil___________________________________________________

___ ^_^ ___


#111 nguyentranthang

nguyentranthang

    biết pan

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

Đã gửi 08 August 2010 - 09:40 PM

ủa cái này cũng cần dùng lisp hay sao???? :(

làm nhiều mà
mỗi lần ấn lệnh move lại phải nhập số 0.08 lâu phết
thôi không cần nữa đâu
tôi tự viết được rồi
cũng không khó lắm
  • 0

#112 minhbk07

minhbk07

    biết pan

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

Đã gửi 09 August 2010 - 08:25 AM

thank bác Hoành rất nhiều,bài viết rất hay và hữu dụng
  • 0

#113 V.I.P

V.I.P

    Chưa sử dụng CAD

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

Đã gửi 04 September 2010 - 09:19 PM

Phần 2:

Trong phần 1, chúng ta đã xây dựng được 1 chương trình lisp có thể nói là thô sơ nhất thế giới. Và nó có 1 nhược điểm: mỗi lần load thì viết ra lệnh. Muốn viết lại phải appload thêm 1 lần nữa.

Để điều khiển được thời điểm viết, và viết được nhiều lần, chúng ta phải định nghĩa một hàm AutoCAD, để mỗi khi gọi hàm này, chương trình sẽ viết ra màn hình text mà không cần phải appload lại file lisp.

Trên file hoclisp.lsp, chúng ta thêm mã lệnh để trở thành như sau:

(defun c:chao()
(princ "\nChao cadviet")
(princ)
)


Như vậy chúng ta đã định nghĩa được một lệnh của AutoCAD mang tên chao, mỗi lần gọi lệnh chao tại dòng nhắc Command, chương trình sẽ viết ra trên màn hình text dòng chữ: Chao cadviet.

Trong 2 dòng vừa thêm, hàm defun là hàm định nghĩa lệnh AutoCAD. Có cấu trúc:
(defun tenham() noidungham) trong đó:
- tenham là tên hàm cần định nghĩa, nếu muốn định nghĩa một lệnh trong AutoCAD thì thêm 'C:' vào trước tên hàm.
- noidungham là tập các lệnh mà hàm vừa định nghĩa sẽ thực thi.

Hix! Mình thấy môn học này rất hay, rất bổ ích nên cũng muốn tìm hiểu thêm. Mình làm theo các bước như trên mà khi gõ lệnh "chao" tại dòng command thì ko thấy hiện lên gì cả.Các bước mình làm như sau:
-B1: Copy đoạn code:
(defun c:chao()
(princ "\nChao cadviet")
(princ)
)
sau đó paste vào phần Notepad => Save as với tên hoclisp.lsp
-B2: Vào Cad2007 => Tool\ Load Application load file hoclisp (và mình nhìn thấy dòng chữ : "hoclisp.lsp successfully loaded" ) =>Close.
-B3: Tại dòng command gõ "chao".
Mình đã thử rất nhiều lần nhưng vẫn không hiện lên chữ "Chao cadviet".Không biết có phải mình làm sai gì ko,hay là do lỗi gì đó.Mong các bạn giúp đỡ!!
  • 0

#114 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 05 September 2010 - 06:43 AM

Hix! Mình thấy môn học này rất hay, rất bổ ích nên cũng muốn tìm hiểu thêm. Mình làm theo các bước như trên mà khi gõ lệnh "chao" tại dòng command thì ko thấy hiện lên gì cả.Các bước mình làm như sau:
-B1: Copy đoạn code:
(defun c:chao()
(princ "\nChao cadviet")
(princ)
)
sau đó paste vào phần Notepad => Save as với tên hoclisp.lsp
-B2: Vào Cad2007 => Tool\ Load Application load file hoclisp (và mình nhìn thấy dòng chữ : "hoclisp.lsp successfully loaded" ) =>Close.
-B3: Tại dòng command gõ "chao".
Mình đã thử rất nhiều lần nhưng vẫn không hiện lên chữ "Chao cadviet".Không biết có phải mình làm sai gì ko,hay là do lỗi gì đó.Mong các bạn giúp đỡ!!

Sau khi chạy xong code -> bạn bấm phím F2 lên và nhìn dòng Command để quan sát kết quả
Hoặc là bạn chạy thu code này :
(defun c:chao()
(princ "\nChao cadviet")
(textscr)
(princ)
)


-> (textscr) : là hàm trả về cửa sổ AutoCAD Text Window
-> Ngược với nó là hàm (graphscr) là hàm trả về màn hình đồ họa
Về hiển thị thông báo bạn có thể dùng hàm (alert "chuổi")
ví dụ :
(defun c:chao()
(alert "\nChao cadviet")
(princ)
)

"perimeter" là gì hả a Tue_NV

"perimeter" là chu vi của đối tượng
  • 0

#115 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 05 September 2010 - 10:10 AM

Hix! Mình thấy môn học này rất hay, rất bổ ích nên cũng muốn tìm hiểu thêm. Mình làm theo các bước như trên mà khi gõ lệnh "chao" tại dòng command thì ko thấy hiện lên gì cả.Các bước mình làm như sau:
-B1: Copy đoạn code:
(defun c:chao()
(princ "\nChao cadviet")
(princ)
)
sau đó paste vào phần Notepad => Save as với tên hoclisp.lsp
-B2: Vào Cad2007 => Tool\ Load Application load file hoclisp (và mình nhìn thấy dòng chữ : "hoclisp.lsp successfully loaded" ) =>Close.
-B3: Tại dòng command gõ "chao".
Mình đã thử rất nhiều lần nhưng vẫn không hiện lên chữ "Chao cadviet".Không biết có phải mình làm sai gì ko,hay là do lỗi gì đó.Mong các bạn giúp đỡ!!

Nó có hiện đấy, nhưng là hiện trên dòng command chứ không phải trên màn hình đồ họa và sau khi gõ chữ chào, bạn phải nhấn enter nữa. 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.

#116 nha_itst

nha_itst

    Chưa sử dụng CAD

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

Đã gửi 23 September 2010 - 06:08 PM

Kính mong A.Hoanh và mọi người có thể giải thích rõ hơn về lệnh if,While và progn và kèm theo một vài ví dụ được không?
  • 0

#117 phamhoang158

phamhoang158

    biết pan

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

Đã gửi 01 October 2010 - 10:07 PM

hi! thật tuyệt vời.
cảm ơn bác Hoành rất nhiều, em đang cần lập líp mà chưa biết lam thế nào cả.Nay đọc được bài của bác như cá gặp nước vậy.
Xin cảm ơn và mong bác Hoành cũng như các thành viên cadviet có sức khoẻ dồi dào và ngày càng có thêm bài viết hay chia sẻ cùng cộng đồng
  • 0

#118 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 - 09:30 AM

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

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.

(while (= sel nul)
(setq sel (entsel "\nSelect object: "))
)
(setq ent (car sel))

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"

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

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

#119 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 02 March 2012 - 10:18 AM

Vòng lặp while luôn kiểm tra điều kiện sau mỗi vòng chạy. Vậy việc bạn cần làm chỉ là tạo các biến tạm làm điều kiện để điều khiển quyết định có cho while chạy nữa hay không
Mình đưa ra ví dụ khung như thế này,dđã chú thích trong code, bạn hãy thử áp dụng :
(ghi chú : code trong 1 đoạn khác với code trong cả lệnh, vì lúc đó các biến dt,sel bạn có thể đặt làm biến local, luôn bị set về nil sau khi chạy lệnh => có thể bỏ dòng (1) (2) )


;Khoi dong voi gia tri dt nil, neu dat trong main thi bo di (1)
(setq dt nil)
;Vong while 1 : chay cho den khi nao bien DT khac nil
(while (not dt) ;Dieu kien 1
;Vong while 2 : Ep user chon doi tuong neu chua co bien Sel
(while (not sel) (setq sel (entsel "\nSelect object: ")))
;Sau khi co doi tuong thi lay entget cua no de kiem tra xem doi tuong co dien tich khong
(if (member (cdr (assoc 0 (entget (car sel)))) '("POLYLINE" "LWPOLYLINE" "SPLINE" "CIRCLE" "HATCH"))
;Neu doi tuong co dien tich thi in ra man hinh, dong thoi gan bien kiem tra DT = T, de dieu kien 1 khong thoa man => thoat vong while 1
(progn
(princ "Co dien tich") ;va dien tich la....
(setq dt T)
)
;Neu doi tuong khong co dien tich, in ra man hinh cau thong bao, dong thoi gan sel = Nil de vong while 2 tiep tuc chay
(progn
(princ "Doi tuong vua chon khong co dien tich")
(setq sel nil)
)
) ;End if
;Tra lai gia tri nil cho bien sel, de lan sau chay lai lenh thi vong lap 2 van chay. Neu de trong main thi bo di (2)
(setq sel nil)
) ;end while

  • 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


#120 ngxuanphu_saigon

ngxuanphu_saigon

    HVKT-12

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

Đã gửi 02 March 2012 - 10:31 AM

tks bác Hoanh nhiu., e mới bắt đầu lọ mọ thôi!
mà e load thì cad báo successfully nhưng k thấy j trên màn hình hết là sao ah?
  • 0