Đến nội dung


Hình ảnh
5 stars - based on 24598 reviews
* * * - - 3 Bình chọn

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


  • Please log in to reply
493 replies to this topic

#361 caibutchi

caibutchi

    biết pan

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

Đã gửi 15 August 2011 - 05:47 PM

hi.em nhầm.1 đường thui.cảm ơn bác nhìu.
-Nhân đây e muốn hỏi e có 3 đường thẳng d1,d2,d3 cắt nhau.Em muốn trim đường d1 đoạn nằm trong 2 đường kia.Nhưng em không biết định hướng sao để nó biết trim bên trong hay bên ngoài.cảm ơn các bác
-Thứ 2 nữa là e muốn ghi một text dọc theo 2 đường d1,d2 với khoang cách nhất định thì thường làm theo cách nào hả các bác.Với lại cái text này dc ghi theo một số nhập vào từ trước nên nó ra hàng thập phân lên đến 14 chữ số 0.Phài làm sao nhỉ??
-Cuối cùng e muốn hỏi là em muốn ghi kích thước theo ý muốn của mình (chứ không phải số đo thực)thì dùng lệnh gì nhỉ
Cảm ơn các bác
  • 0

#362 hocphi

hocphi

    Chưa sử dụng CAD

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

Đã gửi 03 September 2011 - 09:11 AM

cho em hỏi cách thực hiện các lệnh cad trong lisp,vd: ( command "lệnhcad" các thông số) ,các thông số của lệnh rất đa dạng,em có thể tìm ở đâu ạ
  • 0

#363 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 03 September 2011 - 09:37 AM

cho em hỏi cách thực hiện các lệnh cad trong lisp,vd: ( command "lệnhcad" các thông số) ,các thông số của lệnh rất đa dạng,em có thể tìm ở đâu ạ

Bạn thực hiện thao tác thủ công lệnh đó. Các thông số chính là các bước bạn nhập vào :)
Ví dụ lệnh Circle đơn giản, CAD yêu cầu bạn nhập vào tâm, rồi đến bán kính
=> (command "CIRCLE" Tâm Bán_Kính)
- Ở đây Tâm là 1 điểm trên màn hình CAD. Vậy bạn có thể lấy điểm này bằng cách chỉ định Point cho tâm bằng hàm getpoint
=> Tâm = (getpoint "\nTam")
- Bán kính là 1 số thực, bạn có thể nhập trực tiếp vào hoặc lấy bằng hàm getreal, getdist
=> Bán kính = (getreal "\nBan kinh :")
Cuối cùng cái bạn cần là :
(command "circle" (getpoint "\nTam") (getdist "\nBan kinh :"))
Hoặc đơn giản là chỉ định luôn giá trị của 2 thông số :
(command "circle" '(0 0 0) 10) ; Tạo đường tròn bán kính 10 tại tâm 0,0,0
Gluck :wub:
  • 0

#364 cuongga

cuongga

    biết vẽ line

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

Đã gửi 06 October 2011 - 12:03 AM

Tự tay mình lập một chương trình Lisp có gì khác so với nhờ ai đó làm? Chưa cần xét kết quả, điểm khác nhau rất cơ bản là bạn sẽ có được cái cảm giác rất là khoái chí (không thể diễn tả) khi chạy thử chương trình.
Ssg lập topic này không ngoài mục đích tạo điều kiện cho các bạn tự mình tìm hiểu và khám phá cái cảm giác "khoái chí không thể diễn tả" nói trên.
Với tinh thần "Share is Receive", ssg cũng mong các bạn đã thành thạo Lisp quan tâm giúp đỡ các bạn mới để cộng đồng Lisp của CadViet ngày càng đông vui và tạo được nhiều chương trình hữu ích.
Để bắt đầu, ssg post lại một bài viết cũ, nhưng có lẽ vẫn còn mới đối với một số bạn. Hy vọng sẽ giúp được chút gì đó cho các bạn mới tiếp cận với Lisp:

http://www.cadviet.c...les/Relax_1.zip

Download, giải nén rồi đọc file *.doc

cám ơn anh ssg rất nhiều!
  • 0

#365 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

  • Advance Member
  • PipPipPipPip
  • 213 Bài viết
Điểm đánh giá: 127 (tàm tạm)

Đã gửi 11 April 2012 - 11:59 AM

Mình có được đoạn code này ở trang 10.


(defun gocmin (p lst / goc gmin pluu)
(foreach p1 lst
(setq goc (angle p p1))
(if (or (not gmin) (> gmin goc))
(setq gmin goc
pluu p1
)
)
)
pluu
)
;;;-------------------------------------------
(defun SS-aobjlst (ss / c L)
(setq c -1)
(repeat (sslength ss)
(setq L (cons (vlax-ename->vla-object (ssname ss (setq c (1+ c))))
L
)
)
)
(reverse L)
)
;;;-------------------------------------------
(defun entmkLine (p1 p2)
(entmake (list '(0 . "line")
(cons 10 p1)
(cons 11 p2)
)
)
)
;;;-------------------------------------------
(defun c:dglo (/ ss objlst tap_ins pd pc pt pchk1 Lst)
(command "undo" "be")
(command "ucs" "")
(setq ss (ssget '((0 . "POINT")))
tap_ins (list)
)
(setq objlst (SS-aobjlst ss))
(setq tap_ins (mapcar '(lambda (x) (vlax-get x 'Coordinates)) objlst))
(setq tap_ins (mapcar '(lambda (x) (trans x 0 1)) tap_ins))
(setq tap_ins (vl-sort tap_ins
'(lambda (x y)
(if (= (cadr x) (cadr y))
(< (car x) (car y))
(< (cadr x) (cadr y))
)
)
)
)
(setq pd (car tap_ins)
pc (last tap_ins)
pt pd
pchk1 nil
)
(while (not (eq pchk1 pc))
(setq lst (vl-remove pt tap_ins))
(setq pchk1 (gocmin pt lst))
(entmkLine pt pchk1)
(setq pt pchk1)
)
(while (not (eq pchk1 pd))
(setq lst (vl-remove pt tap_ins))
(setq pchk1 (gocmin pt lst))
(entmkLine pt pchk1)
(setq pt pchk1)
(foreach p tap_ins
(if (<= (cadr pt) (cadr p))
(setq tap_ins (vl-remove p tap_ins))
)
)
)
(command "undo" "en")
(princ)
)

Các bạn giúp mình tạo 1 hàm con vẽ đa giác lồiLWPOLYLINE, kết quả trả về là entname của đa giác lồi vẽ bằng LWPOLYLINE
cách gọi lệnh: (dglo lst)
trong đó: dglo là tên hàm con. lst là list các tập hợp điểm.
Thanks!
  • 0

Lisp In bản vẽ hàng loạt:
http://www.cadviet.c...ndpost&p=139860


#366 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 11 April 2012 - 12:23 PM

Mình có được đoạn code này ở trang 10.
...
Các bạn giúp mình tạo 1 hàm con vẽ đa giác lồiLWPOLYLINE, kết quả trả về là entname của đa giác lồi vẽ bằng LWPOLYLINE
cách gọi lệnh: (dglo lst)
trong đó: dglo là tên hàm con. lst là list các tập hợp điểm.
Thanks!

Đây bạn:

(defun dglo (lst)
(entmakex (append (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 (length lst)) (cons 70 1))
(mapcar (function (lambda (p) (cons 10 p))) lst))))

  • 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ờ. Và đừng làm điều ngược lại.

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


#367 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

  • Advance Member
  • PipPipPipPip
  • 213 Bài viết
Điểm đánh giá: 127 (tàm tạm)

Đã gửi 11 April 2012 - 12:59 PM

Đây bạn:
......


Hehe. sorry vì mình ko nói rõ ra về cái list.
Khi gọi hàm con này với đối số là 1 list tập hợp các điểm thì sẽ cho ra 1 LWPOLYLINE là đa giác lồi có diện tích lớn nhất, Bạn có thể chạy thử lisp trên mình post để hiểu rõ hơn. Thank bạn.

Mình chưa có Cad để thử lisp của bạn nhưng đọc nó thì mình thấy nếu trong lst mà các điểm xếp lộn xộn thì có thể kết quả ko đúng.
  • 0

Lisp In bản vẽ hàng loạt:
http://www.cadviet.c...ndpost&p=139860


#368 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 11 April 2012 - 02:11 PM

Hehe. sorry vì mình ko nói rõ ra về cái list.
Khi gọi hàm con này với đối số là 1 list tập hợp các điểm thì sẽ cho ra 1 LWPOLYLINE là đa giác lồi có diện tích lớn nhất, Bạn có thể chạy thử lisp trên mình post để hiểu rõ hơn. Thank bạn.
Mình chưa có Cad để thử lisp của bạn nhưng đọc nó thì mình thấy nếu trong lst mà các điểm xếp lộn xộn thì có thể kết quả ko đúng.

Có phải ý bạn là: tạo đa giác lồi, có diện tích nhỏ nhất, chứa tất cả các điểm của lst (các điểm của lst có thể nằm ở đỉnh, nằm trên cạnh, hoặc nằm bên trong đa giác lồi, nhưng không được nằm ngoài)?
  • 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ờ. Và đừng làm điều ngược lại.

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


#369 hienngocloveyou

hienngocloveyou

    biết vẽ line

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

Đã gửi 11 April 2012 - 02:49 PM

Em hỏi tý, em muốn viết vòng lặp để offset 1 đường với các đoạn cho trc
vd: offset line A ra các đoạn 2000,3000,4000. Dùng vòng lặp nhưng khai báo như thế để nó hiểu là offset từ Line A thành các đoạn 2000 5000 6000 ạ
  • 0

#370 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 11 April 2012 - 03:00 PM

Em hỏi tý, em muốn viết vòng lặp để offset 1 đường với các đoạn cho trc
vd: offset line A ra các đoạn 2000,3000,4000. Dùng vòng lặp nhưng khai báo như thế để nó hiểu là offset từ Line A thành các đoạn 2000 5000 6000 ạ

Với số lần lặp biết trước, bạn sử dụng vòng lặp Repeat hoặc Foreach
Bạn có thể làm như sau:
1. Khởi tạo biến (setq lst '(2000 3000 4000) i 0 kc 0)
2. Vào vòng Repeat (length lst)
- offset line A ra 1 đoạn bằng (setq kc (+ kc (nth i lst)))
- Tăng biến đếm lên 1 đơn vị (setq i (1+ i))

Mình viết gợi ý vậy. Bạn thử làm xem
  • 0

#371 hienngocloveyou

hienngocloveyou

    biết vẽ line

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

Đã gửi 11 April 2012 - 03:05 PM

Như vậy ko có tối ưu thuât toán bạn ơi, với số khoảng cách chua biết và số đoạn cũng chưa biết thì hàm list ko đc, ý mình là dùng while với mỗi lần nhập khoảng cách thì sẽ tự offset 1 đoạn = kc trc đó + kc mới nhập, mình đang rối chỗ khai báo biến T_T
  • 0

#372 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 11 April 2012 - 03:08 PM

Em hỏi tý, em muốn viết vòng lặp để offset 1 đường với các đoạn cho trc
vd: offset line A ra các đoạn 2000,3000,4000. Dùng vòng lặp nhưng khai báo như thế để nó hiểu là offset từ Line A thành các đoạn 2000 5000 6000 ạ

1 ví dụ để bạn dễ hình dung:

(defun C:HA ()
(setq lst '(1000 2000 3000)) ;list cac khoang cach can offset.
(setq obj (vlax-ename->vla-object (car (entsel "\nChon Line de offset: "))))
(foreach n lst
(vla-offset obj n))
(princ))

  • 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ờ. Và đừng làm điều ngược lại.

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


#373 hienngocloveyou

hienngocloveyou

    biết vẽ line

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

Đã gửi 11 April 2012 - 03:10 PM

1 ví dụ để bạn dễ hình dung:


(defun C:HA ()
(setq lst '(1000 2000 3000)) ;list cac khoang cach can offset.
(setq obj (vlax-ename->vla-object (car (entsel "\nChon Line de offset: "))))
(foreach n lst
(vla-offset obj n))
(princ))

Cám ơn bạn đã trả lời, như vậy là các kc đã biết trc và số lần cũng vậy, ý mình là dùng while để mỗi lần nhập khoảng cách là no hiểu offset 1 đoạn = đoạn mới nhập + đoạn trc đó, Thân
  • 0

#374 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 11 April 2012 - 03:22 PM

While đây:

(defun C:HA2 ( / obj kc1 kc2)
(setq obj (vlax-ename->vla-object (car (entsel "\nChon Line de offset: "))))
(setq kc1 0)
(while (setq kc2 (getreal "\nKhoang cach offset: "))
(vla-offset obj (setq kc1 (+ kc1 kc2))))
(princ))

  • 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ờ. Và đừng làm điều ngược lại.

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


#375 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 11 April 2012 - 03:26 PM

Nhập đến đâu offset đến đấy thì bạn chỉ cần thay đổi đối tượng cần offset sau mỗi vòng lặp while,, tức là đối tượng entlast, hoặc thay đổi khoảng cách. Có rất nhiều cách

;(defun c:sth()
(setq en (vlax-ename->vla-object (car (entsel "\nDoi tuong :"))))
(while (setq kc (getreal "\nKhoang cach :"))
(vla-offset en kc)
(setq en (vlax-ename->vla-object (entlast)))
)
;)end defun

  • 1

#376 hienngocloveyou

hienngocloveyou

    biết vẽ line

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

Đã gửi 11 April 2012 - 03:28 PM

Cái hàm của bạn, sao mình vo cad no ko chạy vậy bạn với lại vlax-ename->vla-object là sao mình ko hiểu, bạn viết tường minh cho mình hiểu chút đc ko T_T
  • 0

#377 hienngocloveyou

hienngocloveyou

    biết vẽ line

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

Đã gửi 11 April 2012 - 03:52 PM

Ah được rồi, chưa load vla load, cho mình hỏi thêm vla-offset là thực hiện lệnh offset đúng ko, nhưng về phần chọn bên thì khai báo như thế nào.
Có thể dùng như vậy (vla-offset en kc '(20 20)), thì nó ko hiểu pick điểm 20, có cách nào khắc phuc ko bạn
  • 0

#378 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 11 April 2012 - 04:01 PM

Dùng command offset bạn nhé. Lúc đó sẽ k cần vlax-ename->vla-object nữa. Method Offset dùng trên đây k dùng với đối số Point. Mới bắt đầu thì dùng command thôi :)
  • 0

#379 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

  • Advance Member
  • PipPipPipPip
  • 213 Bài viết
Điểm đánh giá: 127 (tàm tạm)

Đã gửi 11 April 2012 - 04:04 PM

Có phải ý bạn là: tạo đa giác lồi, có diện tích nhỏ nhất, chứa tất cả các điểm của lst (các điểm của lst có thể nằm ở đỉnh, nằm trên cạnh, hoặc nằm bên trong đa giác lồi, nhưng không được nằm ngoài)?


Ý của mình giống hệt cái lisp mình post trên kia nhưng thay vì vẽ line lisp sẽ vẽ = lwpolyline. và khi gọi chỉ cần gọi: (dglo lst).
lst: là list các tập hợp điểm.
Các điểm trong list ko được nằm ngoài polyline này. Các đỉnh của Polyline này là điểm trong list đó.

Hình đã gửi
  • 0

Lisp In bản vẽ hàng loạt:
http://www.cadviet.c...ndpost&p=139860


#380 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 11 April 2012 - 04:07 PM


Ý của mình giống hệt cái lisp mình post trên kia nhưng thay vì vẽ line lisp sẽ vẽ = lwpolyline. và khi gọi chỉ cần gọi: (dglo lst).
lst: là list các tập hợp điểm.
Các điểm trong list ko được nằm ngoài polyline này. Các đỉnh của Polyline này là điểm trong list đó.

Hình đã gửi

Lỗi ở bạn nói không rõ. Dùng cái này của Lee Mac chắc đúng 100%

(defun c:test ( / i l s )
(if (setq s (ssget '((0 . "POINT"))))
(progn
(repeat (setq i (sslength s))
(setq l (cons (cdr (assoc 10 (entget (ssname s (setq i (1- i)))))) l)))
(setq l (LM:ConvexHull l))
(entmakex
(append
(list
'(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
(cons 90 (length l))
'(70 . 1))
(mapcar '(lambda ( x ) (cons 10 x)) l)))))
(princ))
(defun LM:ConvexHull ( lst / hul p0 )
(cond
((< (length lst) 4)
lst)
(t
(setq p0 (car lst))
(foreach p1 (cdr lst)
(if (or (< (cadr p1) (cadr p0))
(and (equal (cadr p1) (cadr p0) 1e-8) (< (car p1) (car p0))))
(setq p0 p1)))
(setq lst
(vl-sort lst
(function
(lambda ( a b / c d )
(if (equal (setq c (angle p0 a)) (setq d (angle p0 B)) 1e-8)
(< (distance p0 a) (distance p0 B))
(< c d))))))
(setq hul (list (caddr lst) (cadr lst) (car lst)))
(foreach pt (cdddr lst)
(setq hul (cons pt hul))
(while (and (caddr hul) (LM:Clockwise-p (caddr hul) (cadr hul) pt))
(setq hul (cons pt (cddr hul)))))
hul)))
(defun LM:Clockwise-p ( p1 p2 p3 )
(< (- (* (- (car p2) (car p1)) (- (cadr p3) (cadr p1)))
(* (- (cadr p2) (cadr p1)) (- (car p3) (car p1))))
1e-8))

  • 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ờ. Và đừng làm điều ngược lại.

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