Chuyển đến nội dung
Diễn đàn CADViet
ssg

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

Các bài được khuyến nghị

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

 

7377_cadviet.jpg

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 

Ý 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 đó.

 

7377_cadviet.jpg

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

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

(defun c:sth()

(setq p1 (getpoint "\n chon diem bat dau"))

(setq L (getint "\n nhap chieu dai nha: "))

(setq B (getint "\n nhap chieu rong nha: "))

(command "line" (list (- (Car p1) 185) (cadr p1)) (list (+ (car p1) L) (cadr p1)) "")

(setq A (entlast))

(command "line" (list (Car p1) (+ (cadr p1) 195)) (list (car p1) (- (+ (cadr p1) B)) "")

(setq B (entlast))

 

 

(while

(setq kc (getstr "\n Khoang cach/Span :"))

(if(= "S" kc)

 

(while

(setq kc (getint "\n Khoang cach/Span :"))

(setq A (vlax-ename->vla-object (entlast)))

(vla-offset A kc))

)

 

(while

(setq kc (getint "\n Khoang cach :"))

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

(vla-offset B kc))

)

)

 

Xem giúp dùm mình cái này, ý mình là ban đầu vẽ 2 line A va B, sau đó rẽ nhánh offset cho 2 line A B này, mình dùng if chương trình nó ko hiểu T_T

Mục đích là chia nhánh Span/Bay, khi chọn Span và nhập xong, thì làm sao để nó quay lại menu Span/Bay để mà rẽ nhánh 2??

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cho mình hỏi thêm là dùng giá trị tuyệt đối như thế nào. Như đoạn code trên mình vẽ 2 line chuẩn theo tọa độ nhưng fai click điểm đầu là 2 tọa độ dương thì 2 line mới đi đúng hướng mà mình canh tọa độ, nếu click điểm có y âm là code sai ngay, chỉnh như thế nào để 2 line đi đúng hướng mà ko fuj thuộc tọa độ điểm đầu âm hay dương ??

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

(defun c:sth()

(setq p1 (getpoint "\n chon diem bat dau"))

(setq L (getint "\n nhap chieu dai nha: "))

(setq B (getint "\n nhap chieu rong nha: "))

(command "line" (list (- (Car p1) 185) (cadr p1)) (list (+ (car p1) L) (cadr p1)) "")

(setq A (entlast))

(command "line" (list (Car p1) (+ (cadr p1) 195)) (list (car p1) (- (+ (cadr p1) B)) "")

(setq B (entlast))

 

 

(while

(setq kc (getstr "\n Khoang cach/Span :"))

(if(= "S" kc)

 

(while

(setq kc (getint "\n Khoang cach/Span :"))

(setq A (vlax-ename->vla-object (entlast)))

(vla-offset A kc))

)

 

(while

(setq kc (getint "\n Khoang cach :"))

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

(vla-offset B kc))

)

)

 

Xem giúp dùm mình cái này, ý mình là ban đầu vẽ 2 line A va B, sau đó rẽ nhánh offset cho 2 line A B này, mình dùng if chương trình nó ko hiểu T_T

Mục đích là chia nhánh Span/Bay, khi chọn Span và nhập xong, thì làm sao để nó quay lại menu Span/Bay để mà rẽ nhánh 2??

Hề hề hề,

T_T là cái chi chi. Người còn chả hiểu thì máy hiểu làm sao???

Chương trình viết thiếu dấu ngoặc đóng chứ chửa thấy sai cái chi. Hãy thêm nó vào và ch5y thử coi.

hề hề hề...

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Hề hề hề,

T_T là cái chi chi. Người còn chả hiểu thì máy hiểu làm sao???

Chương trình viết thiếu dấu ngoặc đóng chứ chửa thấy sai cái chi. Hãy thêm nó vào và ch5y thử coi.

hề hề hề...

Nói chung là còn nhiều thứ nữa:

1). hàm getstr ở đâu ra?

2). "S" là cái chi chi?

3). v.v...

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

(defun c:sth()

(setq p1 (getpoint "\n chon diem bat dau"))

(setq L (getint "\n nhap chieu dai nha: "))

(setq B (getint "\n nhap chieu rong nha: "))

 

(while

(or

(initget 1 "Bay Span Exit")

(/= "Exit"

(setq ANS

(getkword "\n Bay/Span/Exit: ")

)

)

)

(cond

 

((="Bay" ANS)

(command "line" (list (Car p1) (+ (cadr p1) 195)) (list (car p1) (- (+ (cadr p1) B))) "")

(while

(setq kc (getint "\n Khoang cach: "))

(setq L1 (vlax-ename->vla-object (entlast)))

(vla-offset L1 kc)

))

 

((="Span" ANS)

(command "line" (list (- (Car p1) 185) (cadr p1)) (list (+ (car p1) L) (cadr p1)) "")

(while

(setq kc (getint "\n Khoang cach :"))

(setq L2 (vlax-ename->vla-object (entlast)))

(vla-offset L2 kc))

)

)

)

)

Các bạn xem dùm, cơ bản đã gần hoàn thành vẽ trục, nhưng còn vướng chỗ là khi vẽ 2 line cơ bản mình fu thuộc vào tọa độ click điểm, nên chỉ có thể click tọa độ dương (+x +y), nếu nhấp vào điểm có tọa độ y âm thì 2 line cơ bản ko đi chính xác, vậy có cách nào vẽ 2 line từ 1 điểm cơ bản đi theo hướng mà ko fu thuộc tọa độ âm hay dương nó ko

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

sry, chua đọc nội quy diễn đàn T_T

Vậy bạn sửa lại các bài viết phía trên của bạn. Bạn cho code vào thẻ code nhé. Vì có 1 số chữ có thể biến thành mặt cười B) không hiểu. Ví dụ như bài viết số 398 của bạn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

(defun c:dt1 ()
(setq p1 (getpoint "\n chon diem bat dau"))
(setq L (getint "\n nhap chieu dai nha: "))
(setq B (getint "\n nhap chieu rong nha: "))
(command "line" (list (Car p1) (+ (cadr p1) 195)) @B<0 "")
)

Cho mình hỏi mình vẽ line theo chiều dài và góc như trên sao ko dc nhỉ, có phải lệnh như vậy ko ?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

@B<0 : symbol => có giá trị Nil => không có ý nghĩ gì trong câu lệnh này cả

Muốn dùng thì bạn phải strcat "@" B "<0" thành 1 chuỗi khi cho vào command.

Code thừa biến L

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

(setq A1 (strcat "@" B "<0")

mình thử thì A1 kết quả trả lại là @, nó ko hiểu B đã gán ở trên.

(setq A1 (strcat "@" (itoa B) "<0"))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

B của bạn là 1 số INTEGER, bạn phải chuyển nó về chuỗi trong hàm strcat đã chứ :| Mà cũng k có trường hợp nào bạn sai đối số mà nó trả về @ cho bạn như bạn nói được ^^

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

(defun c:sth()
(vl-load-com)
(setq p1 (getpoint "\n chon diem bat dau"))
(setq L (getint "\n nhap chieu dai nha: "))
(setq B (getint "\n nhap chieu rong nha: "))
(while
(or
(initget 1 "Bay Span Exit")
(/= "Exit"
(setq ANS
(getkword "\n Bay/Span/Exit: ")
)
)
)
(cond
((="Bay" ANS)
(setq A1 (strcat "@" (itoa B) "<90"))
(command "line" p1 A1"")
(while
(setq kc (getint "\n Khoang cach: "))
(setq L1 (vlax-ename->vla-object (entlast)))
(vla-offset L1 kc)
)
)
((="Span" ANS)
(setq A2 (strcat "@" (itoa L) "<180"))
(command "line" p1 A2"")
(while
(setq kc (getint "\n Khoang cach :"))
(setq L2 (vlax-ename->vla-object (entlast)))
(vla-offset L2 kc))
)
)
)

 

Em viết cái lisp này để vẽ các đường lưới giao nhau, nhưng bị trục trặc 1 chỗ, nó offset ko tạo ra các lưới giao nhau, ban đầu em nghĩ nó offset theo trục X,Y dương, nên em vẽ 2 line theo hướng 0 với 90 độ tức là điểm p1 góc dưới bên trái lưới,nhưng đến phần offset thì 2 phương đi 2 phương khác nhau, có cách nào khắc phục ko ạ. Thanks

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Dùng command để chỉ định hướng Offset thay cho vla-offset, hoặc dùng vla-copy. Lưới đều thì nên dùng array, lưới lệch thì mới offset hoặc copy, tùy bạn chọn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cám ơn anh đã trả lời, nếu dùng lệnh offset thông thường thì điểm chọn phía phụ thuộc điểm pick của mình,trong command offset có option nào chọn phía là trục dương ko nhỉ ???

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cám ơn anh đã trả lời, nếu dùng lệnh offset thông thường thì điểm chọn phía phụ thuộc điểm pick của mình,trong command offset có option nào chọn phía là trục dương ko nhỉ ???

Không có option nào chọn phía là trục dương,

bạn có thể tự tính toán phía điểm pick của mình

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Lần đầu tiên mình cảm thấy rất thích thú đối với Cad là khi mình dùng một Lisp để đo chiều dài của một cung hoặc một đường Spline, và cũng thắc mắc rất nhiều để làm sao tạo được Lisp.hihi. bây giờ thì sẽ cố gắng thui

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×