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

#161 nataca

nataca

    biết lệnh adcenter

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

Đã gửi 18 November 2009 - 08:35 PM

còn việc loại bỏ các điểm có tọa độ trùng nhau em cũng đang thắc mắc.

Thử dùng cái hàm này của bác SSG xem sao:
(defun DelSame(L / Ln x) ;;;Delete Same items in List
(foreach x L (if (not (member x Ln)) (setq Ln (append Ln (list x)))))
Ln
)

  • 2

#162 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 18 November 2009 - 09:13 PM

hihi, em cũng đang thắc mắc vấn đề này.
về việc sắp xếp lại các điểm tọa độ đó bác thử nghiêm cứu lisp sắp xếp text của bác Hoành xem có mót được gì không. trong lisp này có đoạn code sắp xếp lại các đối tượng được chọn theo tọa độ Y.

(defun c:stext ( / sst lstent egoc pgoc xgoc yht zgoc linespc ee tt)
(princ "\nSap xep text © CADViet.com")
(setq sst (ssget '((0 . "TEXT")))
lstent (ss2ent sst)
lstent (vl-sort lstent
'(lambda (e1 e2)
(> (cadr (cdr (assoc 10 (entget e1))))
(cadr (cdr (assoc 10 (entget e2))))
)
)
)
egoc (car lstent)
lstent (cdr lstent)
pgoc (cdr (assoc 10 (entget egoc)))
xgoc (car pgoc)
yht (cadr pgoc)
zgoc (caddr pgoc)
hgoc (cdr (assoc 40 (entget egoc)))
linespc (* hgoc 2.5)

)
(foreach ee lstent
(setq tt (entget ee)
tt (subst (list 10
xgoc
(setq yht (- yht linespc))
zgoc
)
(assoc 10 tt)
tt
)
)
(entmod tt)
(entupd ee)
)
)
(defun ss2ent (ss / sodt index lstent)
(setq
sodt (cond
(ss (sslength ss))
(t 0)
)
index 0
)
(repeat sodt
(setq ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
)
)
(reverse lstent)
)
(princ
"\nSTEXT - Sap xep text - free lisp from www.cadviet.com"
)
(vl-load-com)

còn việc loại bỏ các điểm có tọa độ trùng nhau em cũng đang thắc mắc.

Ps: em đoán hình như bác cũng đang nghiên cứu lisp nội suy mặt cắt ngang fải không ạ :cheers:

Hề hề,
Chí phải , chí phải.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#163 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 19 November 2009 - 11:20 AM

...........
Sau một hồi chạy lisp, mình thu được một danh sách các điểm như sau:
((4961.95 -769.073 0.0) (4976.57 -789.556 0.0) (5049.43 -798.094 0.0) (5089.43 -809.011 0.0) (5124.78 -826.238 0.0) (4961.95 -769.073 0.0) (4993.43 -792.746 0.0) (5021.43 -794.222 0.0) (5049.43 -798.094 0.0) (5124.78 -826.238 0.0))

Bây giờ mình muốn lọc lại cái danh sách này để bỏ bớt các điểm trùng nhau đồng thời sắp xếp lại cái danh sách điểm theo trật tự tăng dần hay giảm dần của tọa độ x.
Cụ thể là mình muốn danh sách trên trở thành:
((4961.95 -769.073 0.0) (4976.57 -789.556 0.0) (4993.43 -792.746 0.0) (5021.43 -794.222 0.0) (5049.43 -798.094 0.0) (5089.43 -809.011 0.0) (5124.78 -826.238 0.0))
hoặc theo trật tự ngược lại
...........

PS: Mình cũng đã lục tung cả chuyên mục về autolisp mà chưa thấy có lisp nào tương tự. Vấn đề này có vẻ hơi hóc thì phải.

Gửi bác Lisp sắp xếp lại cái danh sách điểm theo trật tự tăng dần.
T/hợp bác muốn giảm dần thì thay dấu "<" bằng dấu ">" hoặc dùng hàm (reverse lst).
(defun SapXep (lst_Pt)
(vl-sort lst_Pt
'(lambda (x y)
(or
(< (car x) (car y));Check X
(and (< (cadr x) (cadr y));Check Y
(= (car x) (car y));Equal X
)
(and (< (caddr x) (caddr y));Check Z
(= (car x) (car y));Equal X
(= (cadr x) (cadr y));Equal Y
)
)
)
)
)

kết hợp với hàm DelSame của bác SSG:
(sapXep (DelSame lst)) -> danh sách điểm theo trật tự tăng dần.
(reverse(sapXep (DelSame lst))) -> danh sách điểm theo trật tự giảm dần.
  • 2

#164 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 07 December 2009 - 02:46 PM

Chào các bác,
Hiện tại mình có một vấn đề muốn hỏi các bác như sau:
Khi ta chọn vào một đối tượng trên bản vẽ mà chưa chọn bất cứ lệnh nào, mỗi đối tượng đều bị highlight kèm theo các điểm Grips của nó. Ví dụ nếu chọn một line ta sẽ thấy có 3 điểm grips là điểm đầu, điểm cuối và điểm chính giữa, chọn một circle sẹ thấy có 5 điểm grips là tâm và 4 điểm chia đều vòng tròn, chọn arc sẽ thấy có 3 điểm grips giống như với line, chọn lwpolyline sẽ thấy các điểm grips chình là các vertex của nó,.....
Trong thực tế có thể sử dụng các điểm grips này để modify các đối tượng theo ý người sử dụng.
Tuy nhiên nếu dùng lisp để sử lý các điểm grips này thì mình chưa hiểu rõ về nó, Mong các bác giải đáp giùm các câu hỏi sau:
a/- Có thể dùng lisp để điều khiển các grips này hay không?(Ví dụ như thay đổi vị trí của nó để modify đối tượng)
b/- Các điểm grips này có các mã DXF riêng cho nó hay không?
c/- Các điểm grips này có đặc tính chung là gì???

Rất mong được các bác giải đáp sớm.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#165 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 10 December 2009 - 04:11 PM

Chào các bác. Tue_NV có một chổ mà chưa làm được. Mong các bác trên diễn đàn hướng dẫn giúp
Mình có toạ độ 2 điểm p1; p2. Mình dùng hàm ssget với tham số "f" để chọn các đối tượng thuộc đoạn p1p2

(setq p1 (getpoint))
(setq p2 (getpoint p1))
(setq ss (ssget "f" (list p1 p2)))

Trong số tập ss có rất nhiều đối tượng khác nhau, trong đó có Block
Tue_NV cũng đã biết cách lọc ra trong số tập chọn ss các đối tượng là Block và cho vào 1 tập hợp chọn khác ss2.

Ý của Tue_NV muốn hỏi rằng : Trong dòng lệnh màu xanh, mình có thể nào bằng hàm ssget vừa chọn đối tượng theo đoạn thẳng, vừa lọc ra đối tượng là Block luôn có được không?

Mong nhận được sự hồi âm.
Tue_NV xin cảm ơn.
  • 0

#166 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 10 December 2009 - 04:28 PM

................................
Ý của Tue_NV muốn hỏi rằng : Trong dòng lệnh màu xanh, mình có thể nào bằng hàm ssget vừa chọn đối tượng theo đoạn thẳng, vừa lọc ra đối tượng là Block luôn có được không?

Chọn các đối tuợng (Arc, Line, Pline, SPline) thuộc Layer "lay" qua các điểm "lst_Pt "
(ssget "f" lst_Pt (list (cons 0 "ARC,*LINE")(cons 8 lay)))
lst_Pt : danh sách điểm
lay : tên layer
  • 2

#167 thiep

thiep

    biết dimcontinue

  • Members
  • PipPipPipPipPip
  • 377 Bài viết
Điểm đánh giá: 263 (khá)

Đã gửi 11 December 2009 - 12:44 PM

Chào các bác,
Hiện tại mình có một vấn đề muốn hỏi các bác như sau:
Khi ta chọn vào một đối tượng trên bản vẽ mà chưa chọn bất cứ lệnh nào, mỗi đối tượng đều bị highlight kèm theo các điểm Grips của nó. Ví dụ nếu chọn một line ta sẽ thấy có 3 điểm grips là điểm đầu, điểm cuối và điểm chính giữa, chọn một circle sẹ thấy có 5 điểm grips là tâm và 4 điểm chia đều vòng tròn, chọn arc sẽ thấy có 3 điểm grips giống như với line, chọn lwpolyline sẽ thấy các điểm grips chình là các vertex của nó,.....
Trong thực tế có thể sử dụng các điểm grips này để modify các đối tượng theo ý người sử dụng.
Tuy nhiên nếu dùng lisp để sử lý các điểm grips này thì mình chưa hiểu rõ về nó, Mong các bác giải đáp giùm các câu hỏi sau:
a/- Có thể dùng lisp để điều khiển các grips này hay không?(Ví dụ như thay đổi vị trí của nó để modify đối tượng)
b/- Các điểm grips này có các mã DXF riêng cho nó hay không?
c/- Các điểm grips này có đặc tính chung là gì???

Rất mong được các bác giải đáp sớm.

Chào bác thanhbinh,
Khi kéo rê 1 grip nào đó trên curve (LWPOLYLINE, POLYLINE, SPLINE, LINE, ARC, …), chẳng qua là để tái tạo lại 1 curve đó (tạo mới xóa cũ):
• Đối tượng LINE có 3 grip, điểm đầu, điểm cuối dxf là 10 và 11. Riêng điểm giữa thì Thiep gợi ý dùng hàm trong Express (acet-geom-midpoint ent) để xác định, (ent là ename của LINE). CAD hiểu rằng, nếu midpoint thay đổi có nghĩa rằng copy LINE từ midpoint cũ sang midpoint mới
• Đối tượng LWPOLYLINE, POLYLINE các grip là các vextex của nó. Thiep gợi ý dùng hàm sau để tạo:
o Tạo LWPOLYLINE: (acet-lwpolyline-make (list lstp)) trong đó, lstp là list point của các vextex.
o Tạo POLYLINE: (acet-polyline-make (list lstp)), lstp như trên
• Đối tượng SPLINE các grip là các controlpoint của nó. Để tạo 1 SPLINE có thể dùng hàm
(vla-addSpline Model PointsArray StartTangent EndTangent) trong đó:
- Model là (setq Model (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
- PointsArray là safearray các controlpoint, bác có thể tham khảo đoạn mã sau:
(setq PointsArray (vlax-make-safearray
vlax-vbDouble
(cons 0 (1- (length Lpoint)))
)
)
(vlax-safearray-fill PointsArray Lpoint)
Trong đó Lpoint là list các thành phần X Y của các điểm, có dạng sau: (X1 Y1 X2 Y2 X3 Y3 . . . Xn Yn)
- StartTangent là điểm xác định vexter hướng tiếp tuyến của SPLINE tại điểm đầu của SPLINE, có mã dxf là 12.
- EndTangent là điểm xác định vexter hướng tiếp tuyến của SPLINE tại điểm cuối của SPLINE, có mã dxf là 13.
Hai điểm StartTangent và EndTangent phải nằm trong safearray, nghĩa là nằm trong hàm (vlax-3d-point )
Hoặc củ chuối hơn thì có thể tạo SPLINE: (command “_spline” p1 p2 pn “” “” “”)
• Đối tượng ARC có 4 grip, thì khó hơn 1 chút. Nếu rê 1 trong 3 grip trên ARC thì Cad tạo 1 ARC mới với tâm và bán kính khác. Thiep gợi ý dùng hàm sau để xác định tâm của ARC khi biết 3 tọa độ của 3 grip trên ARC (setq cen (acet-geom-arc-center p1 p2 p3), như vậy bán kính là (distance cen p1) trong đó p1 là grip không bị thay đổi. Riêng khi rê thay đổi điểm center, Cad hiểu rằng move ARC từ điểm này sang điểm khác (CIRCLE cũng vậy)
Như vậy, khi người dùng cho 1 bảng tọa độ các nút grip trong *.csv, thì ta có thể tạo lại các CURVE.
Một vài lời trao đổi ngắn gọn, Chúc bác hoàn thành công việc tốt.
  • 1

#168 thiep

thiep

    biết dimcontinue

  • Members
  • PipPipPipPipPip
  • 377 Bài viết
Điểm đánh giá: 263 (khá)

Đã gửi 11 December 2009 - 12:44 PM

Chào các bác. Tue_NV có một chổ mà chưa làm được. Mong các bác trên diễn đàn hướng dẫn giúp
Mình có toạ độ 2 điểm p1; p2. Mình dùng hàm ssget với tham số "f" để chọn các đối tượng thuộc đoạn p1p2

(setq p1 (getpoint))
(setq p2 (getpoint p1))
(setq ss (ssget "f" (list p1 p2)))

Trong số tập ss có rất nhiều đối tượng khác nhau, trong đó có Block
Tue_NV cũng đã biết cách lọc ra trong số tập chọn ss các đối tượng là Block và cho vào 1 tập hợp chọn khác ss2.

Ý của Tue_NV muốn hỏi rằng : Trong dòng lệnh màu xanh, mình có thể nào bằng hàm ssget vừa chọn đối tượng theo đoạn thẳng, vừa lọc ra đối tượng là Block luôn có được không?

Mong nhận được sự hồi âm.
Tue_NV xin cảm ơn.

Chào Tue_NV xin gởi bạn 1 hàm xác định các điểm fence (acet-ui-fence-select), bạn sẽ thấy 1 hình ảnh động là các dây thun trên màn hình rất trực quan, hàm sẽ trả về các listpoint
ví dụ: (setq lst_Pt (acet-ui-fence-select))
(ssget "f" lst_Pt (list (cons 0 "INSERT")(cons 8 lay)))
  • 1

#169 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 12 December 2009 - 05:48 AM

Chào Tue_NV xin gởi bạn 1 hàm xác định các điểm fence (acet-ui-fence-select), bạn sẽ thấy 1 hình ảnh động là các dây thun trên màn hình rất trực quan, hàm sẽ trả về các listpoint
ví dụ: (setq lst_Pt (acet-ui-fence-select))
(ssget "f" lst_Pt (list (cons 0 "INSERT")(cons 8 lay)))

Cảm ơn anh giabach Thiep nhiều lắm. Hàm (acet-ui-fence-select) rất sinh động và trực quan. Và hàm này nằm trong phụ trợ Express

Cho Tue_NV hỏi thêm một chút nữa là mình có thể sử dụng Lisp để xác định hàm (acet-ui-fence-select) đã được Load hay chưa? Mục đích là mình muốn xác định là bạn đã cài phụ trợ Express chưa đó mà. Tương tự như các hàm còn lại cũng như những hàm do User định nghĩa. Làm cách nào để biết rằng chúng đã được Load? . Thật sự là mình chưa nghĩ được giải pháp cho vấn đề này

Tue_NV muốn hỏi thêm 1 ý là : Khi mình sử dụng tham số "f" trong hàm ssget để chọn đối tượng theo đường thẳng như cách của anh giabach và thiệp đã hướng dẫn. Với đa tuyến PLINE thì listpoint sẽ là tập hợp list toạ độ các đỉnh Vextex. Nhưng nếu đối tượng là Spline, Circle, Arc thì muốn chọn đối tượng giao với nó mình chỉ nghĩ ra phương án là :
-Chia các Spline, Circle, Arc thành những phân đoạn Segment tương đối đủ nhỏ
- Xác định listpoint là các đỉnh trên các phân đoạn Segment này
- Dùng hàm ssget với tham số "f" và chọn đối tượng giao với Spline, Circle, Arc

Tuy nhiên, nếu như thế thì số điểm trong Listpoint rất lớn và Tue_NV nghĩ rằng Lisp sẽ chạy chậm trong trường hợp này vì nó sẽ duyệt qua rất nhiều đoạn Segment để chọn đối tượng

Làm sao để chọn đối tượng giao với Spline, Circle, Arc . Một vấn đề mà Tue_NV chưa nghĩ ra đuợc Phương án tối ưu.

Rất mong nhận được sự giúp đỡ của mọi người.
Tue_NV xin chân thành cảm ơn.
  • 0

#170 thiep

thiep

    biết dimcontinue

  • Members
  • PipPipPipPipPip
  • 377 Bài viết
Điểm đánh giá: 263 (khá)

Đã gửi 12 December 2009 - 08:34 AM

Cảm ơn anh giabach Thiep nhiều lắm. Hàm (acet-ui-fence-select) rất sinh động và trực quan. Và hàm này nằm trong phụ trợ Express

Cho Tue_NV hỏi thêm một chút nữa là mình có thể sử dụng Lisp để xác định hàm (acet-ui-fence-select) đã được Load hay chưa? Mục đích là mình muốn xác định là bạn đã cài phụ trợ Express chưa đó mà. Tương tự như các hàm còn lại cũng như những hàm do User định nghĩa. Làm cách nào để biết rằng chúng đã được Load? . Thật sự là mình chưa nghĩ được giải pháp cho vấn đề này

Tue_NV muốn hỏi thêm 1 ý là : Khi mình sử dụng tham số "f" trong hàm ssget để chọn đối tượng theo đường thẳng như cách của anh giabach và thiệp đã hướng dẫn. Với đa tuyến PLINE thì listpoint sẽ là tập hợp list toạ độ các đỉnh Vextex. Nhưng nếu đối tượng là Spline, Circle, Arc thì muốn chọn đối tượng giao với nó mình chỉ nghĩ ra phương án là :
-Chia các Spline, Circle, Arc thành những phân đoạn Segment tương đối đủ nhỏ
- Xác định listpoint là các đỉnh trên các phân đoạn Segment này
- Dùng hàm ssget với tham số "f" và chọn đối tượng giao với Spline, Circle, Arc

Tuy nhiên, nếu như thế thì số điểm trong Listpoint rất lớn và Tue_NV nghĩ rằng Lisp sẽ chạy chậm trong trường hợp này vì nó sẽ duyệt qua rất nhiều đoạn Segment để chọn đối tượng

Làm sao để chọn đối tượng giao với Spline, Circle, Arc . Một vấn đề mà Tue_NV chưa nghĩ ra đuợc Phương án tối ưu.

Rất mong nhận được sự giúp đỡ của mọi người.
Tue_NV xin chân thành cảm ơn.

Chào bạn Tue-NV
1. Để biết Cad có load express tools hay không, khi khởi động cad xong, nhấn F2, ta thấy cad thông báo:
Customization file loaded successfully. Customization Group: ACAD
Customization file loaded successfully. Customization Group: CUSTOM
Customization file loaded successfully. Customization Group: EXPRESS
Regenerating model.

AutoCAD Express Tools Copyright © 2002-2004 Autodesk, Inc.

AutoCAD menu utilities loaded.
Command: COMMANDLINE

Tại dòng màu đỏ ở trên, ta sẽ biết cad đã load Express tools thành công! Cad còn cho biết luôn là Express Tools có bản quyền năm nào. Ngoài ra, các công cụ nào người dùng muốn cad load khi khởi động, thì cad cũng thông báo luôn những câu "mở đầu câu chuyện" có thành công hay không.
2. Muốn lấy lstpoint làm "fen" dọc theo 1 đướng cong trơn, thì trước đây Thiep tạo đoạn mã sau:
(defun lstfen (enc / sc d l1 p0 L)
(setq sc 2009)
(command ".lengthen" enc "")
(setq d (/ (getvar "perimeter") sc)
l1 0.0
p0 (vlax-curve-getStartPoint enc)
L (list p0)
)
(repeat sc
(setq
l1 (+ l1 d)
p1 (vlax-curve-getPointAtDist enc l1)

)
(setq L (append L (List p1)))
)
L
)
Hàm này sẽ tìm chu vi của đường cong rồi chia ra thành 2009 đoạn, ứng với mỗi chiều dài đoạn cộng lũy tiến, sẽ tìm 1 point và cho vào listpoint. Tuy là số point lớn, nhưng thiep thấy nó chạy cùng rất nhanh. Thiep tính đưa (getvar "viewsize") vào trong biến sc, tuy nhiên đối với bản vẽ có kích thước nhỏ, đơn vị tính là mét, zoom màn hình càng lớn thì số (getvar "viewsize") càng rất nhỏ, nên thôi không đưa vào.
Chúc Tue_NV thành công! :(
  • 1

#171 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 12 December 2009 - 10:48 AM

Chào bạn Tue-NV
1. Để biết Cad có load express tools hay không, khi khởi động cad xong, nhấn F2, ta thấy cad thông báo:
.................................

2. Muốn lấy lstpoint làm "fen" dọc theo 1 đướng cong trơn, thì trước đây Thiep tạo đoạn mã sau:
................................
Hàm này sẽ tìm chu vi của đường cong rồi chia ra thành 2009 đoạn, ứng với mỗi chiều dài đoạn cộng lũy tiến, sẽ tìm 1 point và cho vào listpoint. Tuy là số point lớn, nhưng thiep thấy nó chạy cùng rất nhanh. Thiep tính đưa (getvar "viewsize") vào trong biến sc, tuy nhiên đối với bản vẽ có kích thước nhỏ, đơn vị tính là mét, zoom màn hình càng lớn thì số (getvar "viewsize") càng rất nhỏ, nên thôi không đưa vào.
Chúc Tue_NV thành công! :(

Chào thiep
1. Có sự hiểu nhầm về vấn đề Tue_NV nêu ra : có thể sử dụng Lisp để xác định hàm (acet-ui-fence-select) đã được Load hay chưa?
Tiếc là LISP không có "mắt" nên hắn ta (hay cô ả) không thấy được thông báo của CAD.

Có thể xác định 1 hàm do User định nghĩa đã được Load hay chưa bằng cách kiểm tra xem hàm-lệnh đó có tồn tại hay không ?
VD trong Express Tools : bạn kiểm tra hàm (acet-util-ver)
(if (acet-util-ver)
(alert "Da Load Express Tools")
(alert "Chua Load Express Tools")
)

Tham khảo : http://www.cadviet.c...o...ost&p=81516

2. Về việc lấy danh sách điểm dọc theo 1 cung tròn :
thiep đề xuất chia cung tròn thành 2009 đoạn : cơ sở nào để chọn 2009, sao không phải là 1509, 1609, 1009, ....

Chúng ta đã biết rằng : Đường tròn có thể được xem là 1 đa giác đều với số cạnh (góc) vô cùng lớn. Khi đó chiều dài cạnh của đa giác có thể xem như bằng (hay sấp xỉ bằng) chiều dài cung tròn chắn góc tương ứng.
Trong CAD chúng ta cũng thấy hiện tượng này khi Set biến hệ thống VIEWRES có giá trị nhỏ vd: 10
Vấn đề là : bao nhiêu cạnh (góc) thì được xem là đủ lớn ?
Phụ thuộc vào yêu cầu về độ chính xác và tốc độ của bài toán mà bạn sẽ chọn ra trị số thích hợp, không có 1 trị số chung cho tất cả các lời giải.
Và cơ sở để chọn là số cạnh hay góc chắn chứ không phải chiều dài cung tròn.

Trị số đề nghị : với góc chắn 01 độ thì có thể xem chiều dài cạnh bằng cung tròn.
(Bạn có thể kiểm tra bằng CAD, tỉ số của 2 giá trị này (chiều dài cạnh / chiều dài cung tròn) không phụ thuộc vào độ ZOOM.

Tham khảo :
http://www.cadviet.c...o...ost&p=69821
http://www.cadviet.c...o...ost&p=66489
  • 1

#172 NGUYENQUANGMANH

NGUYENQUANGMANH

    Chưa sử dụng CAD

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

Đã gửi 12 December 2009 - 11:29 AM

Em là thành viên mới của hội. Các anh cho em hỏi "em muốn tạo một lệnh mới cho cad thì phải làm những thao tác nào?( em dang cad 2007-2009). Hôm trước a.Hoàng có hướng dẫn nhưng em không hiểu. mong các anh giúp đỡ.
Em cảm ơn các anh nhiều.
  • 0

#173 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 16 January 2010 - 10:31 AM

......
Để tạo 1 SPLINE có thể dùng hàm
(vla-addSpline Model PointsArray StartTangent EndTangent) trong đó:
- Model là (setq Model (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
- PointsArray là safearray các controlpoint, bác có thể tham khảo đoạn mã sau:
(setq PointsArray (vlax-make-safearray
vlax-vbDouble
(cons 0 (1- (length Lpoint)))
)
)
(vlax-safearray-fill PointsArray Lpoint)
Trong đó Lpoint là list các thành phần X Y của các điểm, có dạng sau: (X1 Y1 X2 Y2 X3 Y3 . . . Xn Yn)
- StartTangent là điểm xác định vexter hướng tiếp tuyến của SPLINE tại điểm đầu của SPLINE, có mã dxf là 12.
- EndTangent là điểm xác định vexter hướng tiếp tuyến của SPLINE tại điểm cuối của SPLINE, có mã dxf là 13.
Hai điểm StartTangent và EndTangent phải nằm trong safearray, nghĩa là nằm trong hàm (vlax-3d-point )
.....

Chào bác Thiep cùng các bác trên diễn đàn.
Dựa vào ý của bác Thiep, Tue_NV đã thử tạo 1 Spline nhưng kết quả không như ý muốn
Nhập 3 điểm nhưng chỉ có 2 segments

(defun c:vespl(/ Lpoint p p2 PointsArray)
(setq doc (vla-get-activeDocument (vlax-get-acad-object))
MS (vla-get-ModelSpace doc))
(setq Lpoint (list))
(setq p (getpoint "\n Nhap diem :"))
(setq p1 p)
(while (setq p2 (getpoint p "\n Nhap diem tiep theo :"))
(setq Lpoint (append Lpoint
(list (nth 0 p2) (nth 1 p2) (nth 2 p2))
)
p p2
)
)
(setq PointsArray (vlax-make-safearray vlax-vbDouble (cons 0 (1- (length Lpoint)))
)
)
(vlax-safearray-fill PointsArray Lpoint)
(vla-addSpline MS PointsArray
(vlax-3d-point (getpoint p1 "\n StartTangent :"))
(vlax-3d-point (getpoint p "\n EndTangent :"))
)
(princ)
)

Tue_NV có vài chổ không hiểu trong ý của bác Thiep. Mong các bác chỉ giúp :
- PointsArray là safearray các controlpoint, bác có thể tham khảo đoạn mã sau:
(setq PointsArray (vlax-make-safearray
vlax-vbDouble
(cons 0 (1- (length Lpoint)))
)
)
(vlax-safearray-fill PointsArray Lpoint)

Khi mình chọn 3 điểm và chuyển PointsArray sang list thì được 1 list gồm 6 phần tử 0.0
-> (0.0 0.0 0.0 0.0 0.0 0.0) -> Như vậy là sao ạ? Tue_NV không hiểu?
(cons 0 (1- (length Lpoint))) -> Cái này được giải thích như thế nào ạ?
Có phải (1- (length Lpoint)) là số phần tử Lpoint trừ đi 1 còn lại 2 phần tử không?
Tại sao mhư thế nhỉ? Các bác có thể sửa giúp code trên và giải thích dùm Tue_NV 1 tí được không?

Cảm ơn các bác thật nhiều
  • 0

#174 thiep

thiep

    biết dimcontinue

  • Members
  • PipPipPipPipPip
  • 377 Bài viết
Điểm đánh giá: 263 (khá)

Đã gửi 16 January 2010 - 04:36 PM

Chào bác Thiep cùng các bác trên diễn đàn.
Dựa vào ý của bác Thiep, Tue_NV đã thử tạo 1 Spline nhưng kết quả không như ý muốn
Nhập 3 điểm nhưng chỉ có 2 segments


(defun c:vespl(/ Lpoint p p2 PointsArray)
(setq doc (vla-get-activeDocument (vlax-get-acad-object))
MS (vla-get-ModelSpace doc))
(setq Lpoint (list))
(setq p (getpoint "\n Nhap diem :"))
(setq p1 p)
(while (setq p2 (getpoint p "\n Nhap diem tiep theo :"))
(setq Lpoint (append Lpoint
(list (nth 0 p2) (nth 1 p2) (nth 2 p2))
)
p p2
)
)
(setq PointsArray (vlax-make-safearray vlax-vbDouble (cons 0 (1- (length Lpoint)))
)
)
(vlax-safearray-fill PointsArray Lpoint)
(vla-addSpline MS PointsArray
(vlax-3d-point (getpoint p1 "\n StartTangent :"))
(vlax-3d-point (getpoint p "\n EndTangent :"))
)
(princ)
)

Tue_NV có vài chổ không hiểu trong ý của bác Thiep. Mong các bác chỉ giúp :
- PointsArray là safearray các controlpoint, bác có thể tham khảo đoạn mã sau:
(setq PointsArray (vlax-make-safearray
vlax-vbDouble
(cons 0 (1- (length Lpoint)))
)
)
(vlax-safearray-fill PointsArray Lpoint)

Khi mình chọn 3 điểm và chuyển PointsArray sang list thì được 1 list gồm 6 phần tử 0.0
-> (0.0 0.0 0.0 0.0 0.0 0.0) -> Như vậy là sao ạ? Tue_NV không hiểu?
(cons 0 (1- (length Lpoint))) -> Cái này được giải thích như thế nào ạ?
Có phải (1- (length Lpoint)) là số phần tử Lpoint trừ đi 1 còn lại 2 phần tử không?
Tại sao mhư thế nhỉ? Các bác có thể sửa giúp code trên và giải thích dùm Tue_NV 1 tí được không?

Cảm ơn các bác thật nhiều

Chào Tue_nv,
Cái thằng Safearray, nhìn qua thì rất khó hiểu, nhưng xem kỹ thì VL sắp xếp chúng với 1 trật tự rất khoa học. Đầu tiên khi khai báo bằng hàm vlax-make-safearray thì mọi phần tử trong “xã hội mảng” đều có giá trị “tài khoản” là như nhau, đều bằng 0. Đến khi mỗi phần tử này có rủng rỉnh đồng tiền khác nhau được thống kê trong 1 list, khi nạp vào ngân hàng bằng hàm vlax-safearray-fill, nếu nhìn vào các tài khoản bằng mã hàm (vlax-safearray->list (vlax-variant-value ….)) thì thấy giá trị tài khoản mỗi phần tử sẽ khác nhau ngay.
Còn đoạn mã (cons 0 (1- (length Lpoint))) có nghĩa là dùng để khai báo tên “tài khoản” của các phần tử trong “xã hội mảng”.
Nếu 1 mảng có 1 chiều (1 kích thước) có n phần tử thì khai báo tên “tài khoản” như sau ‘(0 . (- n 1)): phần tử thứ nhất có tên tài khoản là (0 . 0) (có dấu dotted pair), …, phần tử thứ n có tên tài khoản là (0 . (- n 1)).
Nếu 1 mảng có 2 kích thước, kích thước thứ 1 có n phần tử, kích thước thứ 2 có m phần tử, thì khai báo tên “tài khoản” như sau ‘(0 . (- n 1)) ‘(1 . (- m 1)): phần tử thứ nhất của kích thước thứ 1 có tên tài khoản là (0 . 0),…, phần tử thứ n của kích thước thứ 1 có tên tài khoản là (0 . (- n 1)). Tương tự, phần tử thứ nhất của kích thước thứ 2 có tên tài khoản là (1 . 0), …, phần tử thứ m của kích thước thứ 2 có tên tài khoản là (1 . (- m 1)). Như vậy “tên vị trí” của các phần tử trong “xã hội mảng” được sắp xếp với 1 trật tự khoa học.
Một ít kiến thức về mảng của Thiep là như dậy đó, có thể còn khiếm khuyết, mong các anh em trong cadviet bổ sung thêm kiến thức.
Lisp trên của Tue còn nhược điểm: khi pick xong các controlpoint, đến khi Cad hỏi tiếp các point để định hướng StartTangent và EndTangent thì không thấy mặt mũi “khung xương hình hài” của spline đâu cả.
Thiep gợi dùng hàm (GRDRAW p p1) để giữ lại “khung xương” này. Sau khi tạo xong spline, để biến “khung xương” này thì dùng hàm (redraw)
Chúc các bạn 1 ngày cuối tuần vui vẻ.
  • 1

#175 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 18 January 2010 - 11:21 AM

Chào bác Thiep cùng các bác trên diễn đàn.
Dựa vào ý của bác Thiep, Tue_NV đã thử tạo 1 Spline nhưng kết quả không như ý muốn
Nhập 3 điểm nhưng chỉ có 2 segments


(defun c:vespl(/ Lpoint p p2 PointsArray)
(setq doc (vla-get-activeDocument (vlax-get-acad-object))
MS (vla-get-ModelSpace doc))
(setq Lpoint (list))
(setq p (getpoint "\n Nhap diem :"))
(setq p1 p)
(while (setq p2 (getpoint p "\n Nhap diem tiep theo :"))
(setq Lpoint (append Lpoint
(list (nth 0 p2) (nth 1 p2) (nth 2 p2))
)
p p2
)
)
(setq PointsArray (vlax-make-safearray vlax-vbDouble (cons 0 (1- (length Lpoint)))
)
)
(vlax-safearray-fill PointsArray Lpoint)
(vla-addSpline MS PointsArray
(vlax-3d-point (getpoint p1 "\n StartTangent :"))
(vlax-3d-point (getpoint p "\n EndTangent :"))
)
(princ)
)

Tue_NV có vài chổ không hiểu trong ý của bác Thiep. Mong các bác chỉ giúp :
- PointsArray là safearray các controlpoint, bác có thể tham khảo đoạn mã sau:
(setq PointsArray (vlax-make-safearray
vlax-vbDouble
(cons 0 (1- (length Lpoint)))
)
)
(vlax-safearray-fill PointsArray Lpoint)

Khi mình chọn 3 điểm và chuyển PointsArray sang list thì được 1 list gồm 6 phần tử 0.0
-> (0.0 0.0 0.0 0.0 0.0 0.0) -> Như vậy là sao ạ? Tue_NV không hiểu?
(cons 0 (1- (length Lpoint))) -> Cái này được giải thích như thế nào ạ?
Có phải (1- (length Lpoint)) là số phần tử Lpoint trừ đi 1 còn lại 2 phần tử không?
Tại sao mhư thế nhỉ? Các bác có thể sửa giúp code trên và giải thích dùm Tue_NV 1 tí được không?

Cảm ơn các bác thật nhiều

Hàm tạo mảng
(vlax-make-safearray type '(l-bound . u-bound) ['(lbound . u-bound)...)]
với '(l-bound . ubound) :là chỉ số dưới và trên của 1 chiều.
- Chỉ số (Index) có thể bắt đầu bằng 0, 1 hay 1 số nguyên nào đó.

Vd: để tạo mảng 1 chiều có 3 ptử kiểu vlax-vbDouble, 2 dòng lệnh sau cho kết quả như nhau :
(vlax-make-safearray vlax-VBDouble (cons 0 2)) -> chỉ số dưới là 0, chỉ số trên là 2
(vlax-make-safearray vlax-VBDouble (cons 1 3)) -> chỉ số dưới là 1, chỉ số trên là 3

Như vậy :
(vlax-make-safearray vlax-vbDouble (cons 0 (1- (length Lpoint)))
sẽ tạo mảng 1 chiều có (length Lpoint) ptử kiểu vlax-vbDouble, với chỉ số dưới là 0, chỉ số trên là (1- (length Lpoint))

dĩ nhiên bạn vẫn có thể khai báo như sau :
(vlax-make-safearray vlax-vbDouble (cons 1 (length Lpoint))
sẽ tạo mảng 1 chiều có (length Lpoint) ptử kiểu vlax-vbDouble, với chỉ số dưới là 1, chỉ số trên là (length Lpoint)

Vấn đề Nhập 3 điểm nhưng chỉ có 2 segments là do bạn chưa ADD điểm p vào Lpoint
(setq Lpoint (list p))
nên trong Lpoint chỉ có các điểm p2.

Gửi bạn Lisp sửa đổi và vẽ “khung xương hình hài” của spline như ý của thiep
(defun c:vespl (/ end lpoint ms p p1 p2 start)
(defun mkSpline (spc lst t1 t2 / lst)
(setq lst (apply 'append lst))
(vla-AddSpline spc
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray
vlax-VBDouble (cons 0 (1- (length lst)))) lst))
(vlax-3D-point t1)
(vlax-3D-point t2)))

(setq MS (vla-get-ModelSpace (vla-get-activeDocument (vlax-get-acad-object)) )
p (getpoint "\n Nhap diem :")
p1 p
Lpoint (list p))
(while (setq p2 (getpoint p "\n Nhap diem tiep theo :"))
(grdraw p p2 8)
(setq Lpoint (cons p2 Lpoint)
p p2 ) )
(setq start (getpoint p1 "\n StartTangent :")
end (getpoint p "\n EndTangent :"))

(or start (setq start '(0 0 0)))
(or end (setq end '(0 0 0)))
(redraw)
(mkSpline ms Lpoint start end)
(princ)
)

  • 1

#176 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 18 January 2010 - 11:48 AM

Hàm tạo mảng
(vlax-make-safearray type '(l-bound . u-bound) ['(lbound . u-bound)...)]
với '(l-bound . ubound) :là chỉ số dưới và trên của 1 chiều.
- Chỉ số (Index) có thể bắt đầu bằng 0, 1 hay 1 số nguyên nào đó.

Vd: để tạo mảng 1 chiều có 3 ptử kiểu vlax-vbDouble, 2 dòng lệnh sau cho kết quả như nhau :
(vlax-make-safearray vlax-VBDouble (cons 0 2)) -> chỉ số dưới là 0, chỉ số trên là 2
(vlax-make-safearray vlax-VBDouble (cons 1 3)) -> chỉ số dưới là 1, chỉ số trên là 3

Như vậy :
(vlax-make-safearray vlax-vbDouble (cons 0 (1- (length Lpoint)))
sẽ tạo mảng 1 chiều có (length Lpoint) ptử kiểu vlax-vbDouble, với chỉ số dưới là 0, chỉ số trên là (1- (length Lpoint))

dĩ nhiên bạn vẫn có thể khai báo như sau :
(vlax-make-safearray vlax-vbDouble (cons 1 (length Lpoint))
sẽ tạo mảng 1 chiều có (length Lpoint) ptử kiểu vlax-vbDouble, với chỉ số dưới là 1, chỉ số trên là (length Lpoint)

Vấn đề Nhập 3 điểm nhưng chỉ có 2 segments là do bạn chưa ADD điểm p vào Lpoint
(setq Lpoint (list p))
nên trong Lpoint chỉ có các điểm p2.

Gửi bạn Lisp sửa đổi và vẽ “khung xương hình hài” của spline như ý của thiep

(defun c:vespl (/ end lpoint ms p p1 p2 start)
(defun mkSpline (spc lst t1 t2 / lst)
(setq lst (apply 'append lst))
(vla-AddSpline spc
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray
vlax-VBDouble (cons 0 (1- (length lst)))) lst))
(vlax-3D-point t1)
(vlax-3D-point t2)))

(setq MS (vla-get-ModelSpace (vla-get-activeDocument (vlax-get-acad-object)) )
p (getpoint "\n Nhap diem :")
p1 p
Lpoint (list p))
(while (setq p2 (getpoint p "\n Nhap diem tiep theo :"))
(grdraw p p2 8)
(setq Lpoint (cons p2 Lpoint)
p p2 ) )
(setq start (getpoint p1 "\n StartTangent :")
end (getpoint p "\n EndTangent :"))

(or start (setq start '(0 0 0)))
(or end (setq end '(0 0 0)))
(redraw)
(mkSpline ms Lpoint start end)
(princ)
)

Cảm ơn anh gia_bach nhiều lắm. Tue_NV hiểu ra vấn đề. Nhưng còn 1 chổ vướng mắc, rất mong được giải thích :

(defun mkSpline (spc lst t1 t2 / lst)
(setq lst (apply 'append lst))

(vla-AddSpline spc
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray
vlax-VBDouble (cons 0 (1- (length lst)))) lst))
(vlax-3D-point t1)
(vlax-3D-point t2)))

-> Trong hàm mkSpline có 2biến lst : một biến toàn cục, 1 biến cục bộ
(defun mkSpline (spc lst t1 t2 / lst)-> tại sao lại có 2 biến này ạ. Em nghĩ chỉ 1 biến là đủ. Có ảnh hưởng chi không anh? Em bỏ biến cục bộ lst đi thì Lisp vẫn chạy bình thường ạ. Không có vấn đề gì?

Một lần nữa. Rất cảm ơn anh gia_bach và bác Thiep đã giải thích giúp cho Tue_NV về vấn đề Mảng trong Lisp.
Thành thật biết ơn.
  • 0

#177 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 18 January 2010 - 12:34 PM

...............
(defun mkSpline (spc lst t1 t2 / lst)
(setq lst (apply 'append lst))

...............................

-> Trong hàm mkSpline có 2biến lst : một biến toàn cục, 1 biến cục bộ
(defun mkSpline (spc lst t1 t2 / lst)-> tại sao lại có 2 biến này ạ. Em nghĩ chỉ 1 biến là đủ. Có ảnh hưởng chi không anh? Em bỏ biến cục bộ lst đi thì Lisp vẫn chạy bình thường ạ. Không có vấn đề gì?
...............

Trong truờng hợp này bỏ biến cục bộ lst đi cũng không ảnh huởng đến hòa bình thế giới.
Chỉ khác ở chỗ sau khi hoàn thành lệnh vespl : có tồn tại biến lst là danh sách các số thực hay không ?
(apply 'append danh_sach_diem)) -> danh_sach_so_thuc
  • 0

#178 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 28 January 2010 - 12:04 PM

Mình có 1 lisp tạo các dạng đường và chử theo từng nội dung line và text, như lớp vẻ nhà, vẽ thủy hệ, đường, tên sông , tên chữ chủ dụng dụng.
Muốn nhờ anh hướng dẫn cho lisp chọn các lệnh, như vẽ nhà thì lớp đó là lớp hiện hành và thực hiện đúng theo các đường nét đã thiết lập trước, text cũng vậy.
Rất mong được các anh chỉ giúp
http://www.cadviet.c.../2/taolop03.lsp
  • 0

#179 tuantran79

tuantran79

    biết vẽ line

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

Đã gửi 22 February 2010 - 11:18 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


mình đang gặp fải 1 vấn đề là có 1 loại k biết fải virut k nó vào k làm hỏng cái gi ngoài cad làm hỏng lisp hỏng hết cad k vẽ đc.mở lên k tắt đc,hỏng cả lệnh H luôn.có bạn nào khắc fục đc k.gỡ cài lại cũng k đc nốt,k muôn fải cài lại máy,mình dùng laptop.thanks
  • 0
No night thì num bờ one same same thì num bờ ten

#180 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 24 February 2010 - 08:39 AM

......
Xin được đặt lại bài toán ở dạng tương đương:
Cho một tập điểm S. Hãy xác định đa giác lồi P, chứa toàn bộ các điểm thuộc S, mỗi đỉnh của P là 1 điểm thuộc S.

Xem hình dưới đây:
Hình đã gửi
Thuật giải như sau:
1- Xác định điểm có tung độ nhỏ nhất trong các điểm thuộc S -> đặt là điểm A. Chắc chắn A là 1 điểm thuộc P
2- Từ A, xác định angle đến tất cả các điểm còn lại của S. Điểm ứng với angle nhỏ nhất chính là điểm tiếp theo của đa giác P theo chiều ngược kim đồng hồ (điểm B trên hình).
3- Xoay hệ trục tọa độ như hình dưới:
Hình đã gửi
Tương tự như bước 2, điểm tiếp theo C là điểm có angle nhỏ nhất trong hệ tọa độ này
4- Tiếp tục làm tương tự cho đến khi quay về lại điểm A
Kết quả cuối cùng là một tập điểm có thứ tự, xác định đa giác lồi P, thỏa mãn điều kiện bài toán.

Tue_NV đã thử làm bài toán của bác ssg và đã hoàn thành được bước 1 và bước 2
Còn bước 3 và bước 4 thì Tue_NV đã thử nhưng không được. Cái không được chính là vòng lặp để vòng lặp cuối thì trở lại điểm A thì dừng lại. Cứ mỗi lần xoay hệ trục thì toạ độ thì toạ độ nó lại biến đổi, mình biết hàm trans, nó liên quan đến chuyện này nhưng chưa biết cách áp dụng nó cho đúng. Vì thế chưa tạo được vòng lặp. Mong các bác trên diễn đàn có thể bớt 1 chút thời gian giải thích rõ hơn về hàm trans và áp dụng vào code dưới đây như thế nào để có thể giải quyết được bài toán này một cách trọn vẹn
Dưới đây là code :

(defun c:dglo(/ ss tap_ins pd pc goc goc_base)
(setq ss (ssget '((0 . "POINT"))) tap_ins (list))
(setq ss (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))))
(setq tap_ins (mapcar '(lambda (x) (vlax-get x 'Coordinates)) ss))
(setq tap_ins (mapcar '(lambda (x) (trans x 0 1)) tap_ins))
(setq tap_ins (vl-sort tap_ins
'(lambda (x y)
(< (cadr x) (cadr y))
)
)
)

(setq pd (car tap_ins) pcheck nil)
(setq goc_min (* 2 pi))
(foreach x tap_ins
(if (not (equal pd x))
(progn
(setq goc (angle pd x))
(if (< goc goc_min) (progn
(setq goc_min goc)
(setq pcheck x)
))
)
)
);foreach
(command "LINE" pd pcheck "")
(princ)
)

Rất mong sự hướng dẫn của các bác.
Tue_NV xin chân thành cảm ơn.
  • 0