Đến nội dung


Hình ảnh
* * * - - 3 Bình chọn

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


  • Please log in to reply
497 replies to this topic

#381 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

#382 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5453 Bài viết
Điểm đánh giá: 2625 (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ờ. Đừ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.


#383 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

#384 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5453 Bài viết
Điểm đánh giá: 2625 (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ờ. Đừ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.


#385 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (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

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


#386 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

#387 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

#388 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (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

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


#389 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

  • Advance Member
  • PipPipPipPip
  • 213 Bài viết
Điểm đánh giá: 124 (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


#390 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5453 Bài viết
Điểm đánh giá: 2625 (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ờ. Đừ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.


#391 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

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

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

He he, cảm ơn bạn DoanVanHa, Lisp chạy rất tốt bạn ạ :D
  • 0

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


#392 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 - 04:51 PM

(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??
  • 0

#393 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 - 04:56 PM

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 ??
  • 0

#394 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 11 April 2012 - 05:01 PM

(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ề...
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#395 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

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

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


#396 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 - 05:12 PM

Mình nhớ hàm getstring là getstr fai ko nhỉ, còn S là user nhập vào để chuyển qua nhánh 2, thiếu ngoặc nào nhỉ ?? T_T
  • 0

#397 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 - 07:50 PM

(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
  • 0

#398 ketxu

ketxu

    Copier - Paster - Editor

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

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

Nhắc nhở bạn hienngocloveyou cho code vào thẻ code
  • 0

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


#399 hienngocloveyou

hienngocloveyou

    biết vẽ line

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

Đã gửi 12 April 2012 - 08:11 AM

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

#400 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 12 April 2012 - 09:03 AM

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