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

#161 thaiquyenck

thaiquyenck

    biết vẽ polygon

  • Members
  • PipPip
  • 76 Bài viết
Điểm đánh giá: 14 (tàm tạm)

Đã gửi 09 November 2009 - 03:27 PM

Mấy anh ơi giải thích dòng lệnh này dùm em với:(nó nằm trong bài vẽ nhà của anh ssg đó, em về đọc nhưng chưa hiểu)
;;;Tinh toa do
p2 (polar p1 0.0 W)
p3 (polar p2 (/ pi 2) H1)
p4 (polar p3 pi W)
p5 (list (+ (car p4) (/ W 2)) (+ (cadr p4) H2))
em chỉ biết lệnh polar để tính toạ độ điểm, còn dùng nó thế nào thì chịu.Anh giải thích kĩ kĩ dùm em nha.
  • 0
...Tặng riêng những ai thật lòng


Đang còn hát yêu thương con người ...

#162 thaiquyenck

thaiquyenck

    biết vẽ polygon

  • Members
  • PipPip
  • 76 Bài viết
Điểm đánh giá: 14 (tàm tạm)

Đã gửi 09 November 2009 - 03:29 PM

Còn dòng lệnh này nữa nè :
(command "-layer" "n" "dam" "1" "continuous" "dam" "c" 7 "dam" "")
dòng này để tạo layer.còn chức năng của từng đối tượng ( kế cả từng kí tự của nó) thì em chưa bít.Mấy anh giải thích hộ em cái nha.thanhk trước.
  • 0
...Tặng riêng những ai thật lòng


Đang còn hát yêu thương con người ...

#163 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 09 November 2009 - 04:00 PM

Về cấu trúc của các hàm thì tốt nhất là bạn đọc các tài liệu về auto lisp trong thư viện của diễn đàn thì sẽ tốt hơn.
còn về các ký tự trong hàm Command: đó là những ký tự tương ứng mà bạn phải nhập vào dòng command của cad khi gõ 1 lệnh nào đó. Autolisp thực hiện toàn bộ nó qua chuỗi ký tự như trên.
như ví dụ trên thì: đầu tiên -layer là bạn gọi hộp thoại layer. -> n là new để tạo layer mới -> dam là tên layer muốn tạo -> 1 là màu của layer.... mỗi dấu cách tương đương với một lần bạn nhấn enter.
các lệnh khác cũng tương tự.
  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#164 thaiquyenck

thaiquyenck

    biết vẽ polygon

  • Members
  • PipPip
  • 76 Bài viết
Điểm đánh giá: 14 (tàm tạm)

Đã gửi 10 November 2009 - 09:19 AM

Về cấu trúc của các hàm thì tốt nhất là bạn đọc các tài liệu về auto lisp trong thư viện của diễn đàn thì sẽ tốt hơn.
còn về các ký tự trong hàm Command: đó là những ký tự tương ứng mà bạn phải nhập vào dòng command của cad khi gõ 1 lệnh nào đó. Autolisp thực hiện toàn bộ nó qua chuỗi ký tự như trên.
như ví dụ trên thì: đầu tiên -layer là bạn gọi hộp thoại layer. -> n là new để tạo layer mới -> dam là tên layer muốn tạo -> 1 là màu của layer.... mỗi dấu cách tương đương với một lần bạn nhấn enter.
các lệnh khác cũng tương tự.

Anh giải thích rõ hơn dùm em được không.Nếu tự đọc mà hiếu được thì em còn hỏi làm gì nữa.Trong lệnh tạo layer trên còn cả đoạn lệnh sau đó nữa.Chữ c nghĩa là sao ? các kí tự " có tác dụng gì ?Còn lệnh polar thì sao? hệ số pi dùng để làm gì ?
  • 0
...Tặng riêng những ai thật lòng


Đang còn hát yêu thương con người ...

#165 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 10 November 2009 - 09:47 AM

Còn dòng lệnh này nữa nè :
(command "-layer" "n" "dam" "1" "continuous" "dam" "c" 7 "dam" "")
dòng này để tạo layer.còn chức năng của từng đối tượng ( kế cả từng kí tự của nó) thì em chưa bít.Mấy anh giải thích hộ em cái nha.thanhk trước.

Dòng màu đỏ bạn viết chưa đúng. Tue_NV sửa lại :
(command "-layer" "n" "dam" "LT" "continuous" "dam" "c" 7 "dam" "")

Giải thích :
Đánh lệnh -LAYER vào dòng Command và quan sát nhé :

Command: -LAYER (1)
Current layer: "tue"
Enter an option
[?/Make/Set/New/ON/OFF/Color/Ltype/LWeight/Plot/Freeze/Thaw/LOck/Unlock/stAte]: n (2)

Enter name list for new layer(s): dam (3)
Enter an option
[?/Make/Set/New/ON/OFF/Color/Ltype /LWeight/Plot/Freeze/Thaw/LOck/Unlock/stAte]: Lt (4)

Enter loaded linetype name or [?] : continuous (5)

Enter name list of layer(s) for linetype "continuous" : dam (6)
Enter an option
[?/Make/Set/New/ON/OFF/Color/Ltype/LWeight/Plot/Freeze/Thaw/LOck/Unlock/stAte]:
C (7)

New color [Truecolor/COlorbook] <7 (white)>: 7 (8)

Enter name list of layer(s) for color 7 (white) : dam (9)
Enter an option
[?/Make/Set/New/ON/OFF/Color/Ltype/LWeight/Plot/Freeze/Thaw/LOck/Unlock/stAte]: (10)

(command "-layer" "n" "dam" "LT" "continuous" "dam" "c" 7 "dam" "")
chữ "-layer" : tương ứng dòng (1)
chữ "n" : : tương ứng dòng (2) (New)
chữ "dam" : tương ứng dòng (3)
chữ "Lt" : tương ứng dòng (4)
chữ "continuous" tương ứng dòng (5)
chữ "dam" : tương ứng dòng (6)
chữ "c" (color) : tương ứng dòng (7)
chữ "7" (màu của color) : tương ứng dòng (8)
chữ "dam" : tương ứng dòng (9)
chữ "" : tương ứng dòng (10) : tương ứng với phím Enter

Vài dòng giải thích. Hy vọng bạn hiểu.
  • 3

#166 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 10 November 2009 - 04:05 PM

Còn lệnh polar thì sao? hệ số pi dùng để làm gì ?

-Hàm Polar cú pháp như sau:
(setq c (polar a goc dodai))
xác định điểm c từ điểm a với goc và dodai.
-pi là giá trị góc tương đương 180 độ trong trường hợp này dùng để xào nấu cái giá trị góc.
+Ví dụ bạn có giá trị gocab
(setq gocab (angle a b))
là góc mà đoạn ab tạo với trục x
+Thì
(setq gocp (- gocab (/ pi 2)))
là góc vuông với góc ab
setq gocp (- gocab pi 2))
là góc ngược lại với góc ab
  • 3

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#167 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 11 November 2009 - 12:01 PM

Mấy anh ơi giải thích dòng lệnh này dùm em với:(nó nằm trong bài vẽ nhà của anh ssg đó, em về đọc nhưng chưa hiểu)
;;;Tinh toa do
p2 (polar p1 0.0 W)
p3 (polar p2 (/ pi 2) H1)
p4 (polar p3 pi W)
p5 (list (+ (car p4) (/ W 2)) (+ (cadr p4) H2))
em chỉ biết lệnh polar để tính toạ độ điểm, còn dùng nó thế nào thì chịu.Anh giải thích kĩ kĩ dùm em nha.

Chào bạn Thaiquyenck,
Bác Duy đã giải thích khá rõ về hàm polar rồi. Mình chỉ bổ xung thêm một chút để bạn rõ hơn về cách xài hàm này.
Hàm polar được dùng để xác định một điểm theo tọa độ cực tương đối đối với một điểm đã biết.
Cú pháp thì như bạn đã thấy. (setq p2 (polar p1 0.0 W))
Ý nghĩa của từng tham số có thể giải thích như sau:
(setq ....) là hàm xác định biến. Ở đây đặt biến p2 là một điểm được xác định theo tọa độ độc cực tương đối đối với điểm cho trước là p1 :(polar p1 0.0 W)
Trong đó p1 là điểm đã xác định, 0.0 là góc của đoạng thẳng p1p2 so với trục hoành x được xác định theo radian., còn W là khoảng cách hay độ dài của đoạn p1p2.
Tương tự với hàm (setq p3 (polar p2 (/ pi 2) H1)), điểm p3 được xác định là điểm sao cho đoạn p2p3 tạo với trục x một góc là (/pi 2) tức là vuông góc với trục x và véc tơ p2p3 trùng phương chiều với trục y, đồng thời khoảng cách giữa p2 và p3 hay độ dài đoạn p2p3 là bằng H1.

Với hàm (setq p5 (list (+ (car p4) (/ W 2)) (+ (cadr p4) H2))) thì hơi khác. Đây là hàm xác định một điểm p5 theo tọa độ Đề các tương đối đối với một điểm p4 đã xác định trước.
Cụ thể điểm p5 ở đây được xác định là sẽ cách điểm p4 theo phương x một khoảng là (/ W 2) 1/2 chiều rộng W và theo phương y là chiều cao H2.

Để hiểu rõ về các hàm này bạn nên đọc tài liệu hướng dẫn hay đọc trong Help Developer của Cad sẽ rõ. Tất nhiên bước đầu sẽ có khó khăn một chút nhưng sau đó bạn sẽ quen dần và sẽ hiểu nhanh hơn rất nhiều. Dục tốc bất đạt, bạn hãy bình tĩnh tham khảo dần dần từng chút một và cố gắng học tới đâu thực hành tới đó. Khi ấy bạn sẽ thấy Lisp không quá khó chịu đâu bạn ạ.

Chúc bạn thành công.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#168 thaiquyenck

thaiquyenck

    biết vẽ polygon

  • Members
  • PipPip
  • 76 Bài viết
Điểm đánh giá: 14 (tàm tạm)

Đã gửi 11 November 2009 - 02:44 PM

Cám ơn mấy anh heng,để về nhà đọc coi có hiểu ko rồi ... có gì bữa sau hỏi tiếp. :tongue2: .Chứ lên mạng thế này nếu đọc thì mất thời gian ( đúng hơn là tốn tiền ) lại đau mắt nữa.
  • 0
...Tặng riêng những ai thật lòng


Đang còn hát yêu thương con người ...

#169 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 18 November 2009 - 06:45 PM

Chào các bác,
Hiện tại mình đang mắc một chút như sau:
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

Mình đã cố gắng thử nhiều biện pháp nhưng chưa thành công. Rất mong các bác có nhiều kinh nghiệm về lisp hơn mình giúp đỡ.

Thanks các bác trước.

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

#170 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 18 November 2009 - 07:49 PM

Chào các bác,
Hiện tại mình đang mắc một chút như sau:
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

Mình đã cố gắng thử nhiều biện pháp nhưng chưa thành công. Rất mong các bác có nhiều kinh nghiệm về lisp hơn mình giúp đỡ.

Thanks các bác trước.

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.

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


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

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

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

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

#175 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

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

#177 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (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

#178 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (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

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

#180 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (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