Đến nội dung


Hình ảnh
- - - - -

[Hỏi] Truy tìm điểm giao cắt với Spline


  • Please log in to reply
14 replies to this topic

#1 LoveLisp

LoveLisp

    biết lệnh extend

  • Members
  • PipPipPip
  • 195 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 23 June 2012 - 11:31 AM

Tôi có một spline, một điểm A bên ngoài spline, một hướng h (vui lòng xem hình vẽ).

<a href="http://s1189.photobu...ntatSpline.png" target="_blank"><img src="http://i1189.photobu...ntatSpline.png" border="0" alt="Photobucket"></a>

Từ điểm A, vẽ theo hướng h sẽ cắt spline tại điểm B. Làm thế nào để truy tìm điểm B (bằng Autolisp)?
(Hoan nghênh bạn nghiên cứu mở rộng cho các đối tượng dạng đường khác không phải là spline như arc, elip, pline...)

Nếu không xem được hình vẽ, vui lòng dùng một trong các link sau:
http://www.mediafire...irl72t1t05zqq2d
http://i1189.photobu...intatSpline.png
  • 0

#2 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 June 2012 - 11:57 AM


(Hoan nghênh bạn nghiên cứu mở rộng cho các đối tượng dạng đường khác không phải là spline như arc, elip, pline...)

Điều này cực dễ, có thể tìm giao với nhiều nhiều nhiều loại đối tượng với việc tạo Xline và method Intersectwith của VL.
Góp ý riêng : cách đặt câu hỏi của bạn k khác chi truy bà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


#3 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 23 June 2012 - 12:02 PM

Nộp bài cho bạn đây!

;Doan Van Ha - CADViet.com - Ngay 23/6/2012
;Muc dich: Ve cac diem B tren Curve theo diem A va Line chi phuong.
(defun C:HA( / obj1 obj2 ent2 p1 p2 lst)
(vl-load-com)
(command "undo" "be")
(setq obj1 (vlax-ename->vla-object (car (entsel "\nChon Curve: "))))
(setq obj2 (vlax-ename->vla-object (setq ent2 (car (entsel "\nChon Line chi phuong: ")))))
(setq p2 (getpoint "\nPick diem A: "))
(setq osm (getvar "osmode") cmd (getvar "cmdecho"))
(mapcar 'setvar '("osmode" "cmdecho") '(0 0))
(setq p1 (cdr (assoc 10 (entget ent2))))
(command "move" ent2 "" p1 p2)
(setq lst (NHOM3 (vlax-invoke obj1 'IntersectWith obj2 acExtendOtherEntity)))
(command "move" ent2 "" p2 p1)
(foreach p lst
(entmake (list (cons 0 "POINT") (cons 10 p))))
(mapcar 'setvar '("osmode" "cmdecho") (list osm cmd))
(command "undo" "end")
(princ))
(defun NHOM3 (lst / a B)
(while lst
(repeat 3
(setq a (cons (car lst) a) lst (cdr lst)))
(setq b (cons (reverse a) B) a nil)) (reverse B))

  • 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ờ. Đừ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.


#4 LoveLisp

LoveLisp

    biết lệnh extend

  • Members
  • PipPipPip
  • 195 Bài viết
Điểm đánh giá: 20 (tàm tạm)

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

hihi.. mình đặt câu hỏi như vậy cho rõ ràng và rành mạch thôi, nhưng nhìn lại thì cũng đúng như là bạn nói thật!! :)

Bạn nói dùng Intersectwith thì nó là VB rồi, đâu còn là AutoLisp nữa, mình không biết dùng món đó bạn ạ!
  • 0

#5 LoveLisp

LoveLisp

    biết lệnh extend

  • Members
  • PipPipPip
  • 195 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 23 June 2012 - 12:13 PM

uizzzz... da...., trong vòng 20' sau khi viết bài thì đã nhận được code của bác Hà. Đúng là tốc độ viết lisp của bác thuộc loại ... siêu tưởng!! Cám ơn bác nhiều nhé, mình sẽ nghiên cứu và phản hồi lại ngay!
  • 0

#6 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 June 2012 - 12:39 PM

Thuần lisp bạn vẫn có thể dùng command extend để lấy giao, cũng vẫn không có gì khó ở đây cả
  • 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


#7 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 23 June 2012 - 12:55 PM

Thực ra bài toán này không cần dùng lisp. Với cad vẫn vẽ được điểm B chính xác.
  • 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.


#8 LoveLisp

LoveLisp

    biết lệnh extend

  • Members
  • PipPipPip
  • 195 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 23 June 2012 - 05:30 PM

@ketxu, Doan Van Ha: Cám ơn hai bạn đã quan tâm. Dùng CAD thì mình biết, thật ra, mình đang viết một lisp để đánh taluy từ đỉnh xuống chân của 2 đối tượng chọn trước, nhưng viết đến đây thì "bí" về thuật toán. Với sự giải đáp của các bạn, mình sẽ make nó thành một hàm con rồi truyền thông số cho nó để lấy ra điểm B. Bây giờ chắc là bạn đã hiểu ý mình.
Rất cám ơn sự giúp đỡ của bạn! (chiều nay đang bận nên chưa biết tác dụng các code trên như thế nào, mình sẽ nghiên cứu và học hỏi)
  • 0

#9 LoveLisp

LoveLisp

    biết lệnh extend

  • Members
  • PipPipPip
  • 195 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 26 June 2012 - 09:54 AM

À, bạn cho mình hỏi:
- Nếu 2 đối tượng cắt nhau nhiều hơn 1 lần thì nó sẽ lấy điểm giao như thế nào?
- Hàm (vlax-invoke obj1 'IntersecWith obj2 acExtendOtherEntity)
+ Tham số cuối cùng của nó là gì?
+ Nếu 2 đối tượng không cắt nhau, hoặc có 1 đối tượng phức (Dim, Hatch, Block...) thì nó sẽ trả về nil hay báo lỗi?
Cám ơn nhiều!! :)
  • 0

#10 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 26 June 2012 - 11:00 AM

1). Hai đối tượng cắt nhau tại bao nhiêu điểm thì nó trả về bấy nhiêu.
2). Kiểu tham số trả về là 1 list có 3*n số thực, và cứ 1 bộ 3 số kề nhau tạo thành 1 điểm. VD: (1.0 2.0 0.0 3.0 4.0 0.0)
3). Nếu không cắt nhau thì trả về nil.
4). Khi gặp đối tượng phức thì khá rắc rối, VD 2 hatch có thể giao tại rất nhiều điểm => có lẽ chỉ nên dùng để xét cho 2 curve (?).
  • 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.


#11 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 26 June 2012 - 12:32 PM

1). Hai đối tượng cắt nhau tại bao nhiêu điểm thì nó trả về bấy nhiêu.
2). Kiểu tham số trả về là 1 list có 3*n số thực, và cứ 1 bộ 3 số kề nhau tạo thành 1 điểm. VD: (1.0 2.0 0.0 3.0 4.0 0.0)
3). Nếu không cắt nhau thì trả về nil.
4). Khi gặp đối tượng phức thì khá rắc rối, VD 2 hatch có thể giao tại rất nhiều điểm => có lẽ chỉ nên dùng để xét cho 2 curve (?).

Hề hề hề,
Mình xin hỏi thêm chút về sự khác nhau giữa (vlax-invoke obj1 'IntersecWith obj2 acExtendOtherEntity) và (acet-geom-intersectwith en1 en2 flag)??.
1/- Nếu theo như bác nói thì hàm (acet-geom-intersectwith en1 en2 flag) có vẻ tốt hơn vì nó sẽ trả về một list của các point giao cắt chứ không phải một list của các số như hàm (vlax-invoke obj1 'IntersecWith obj2 acExtendOtherEntity). Do vậy khi sử dụng list này sẽ dễ dàng hơn vì không phải làm thêm bước tách list số thành list point nữa.
2/- Với các đối tượng phức như block, hatch thì hàm (acet-geom-intersectwith en1 en2 flag) cũng như hàm (vlax-invoke obj1 'IntersecWith obj2 acExtendOtherEntity) liệu có sử dụng được không???
3/- Biến acExtendOtherEntity theo mình hiểu là biến để tìm điểm giao cắt khi cho phép kéo dài đối tượng thứ hai, vậy còn các trường hợp khác thì biến đó ra sao??? Tỷ như không cho phép kéo dài các đối tượng chẳng hạn (Nó tương tự khi xét các trường hợp của biến flag trong hàm (acet-geom-intersectwith en1 en2 flag) khi biến này lấy các giá trị 0, 1,3)
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#12 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 26 June 2012 - 01:42 PM

1). Tất nhiên là acet nó trả về list points nên thuận tiện khi sử dụng các points của chúng. Còn vlax thì phải cần biến tấu nữa mới có list points. Tôi không dám khẳng định cái nào tốt hơn, vì nó còn phụ thuộc nhu cầu người dùng: tốc độ, thông số cần lấy khi trả về (chẳng hạn để lấy các hoành độ...), và cả phụ thuộc sở thích là có thích dùng acet hay không nữa.
2). Tôi có test thử trên block và hatch thì thấy nó vẫn cho kết quả nhưng chưa hiểu hết bản chất list trả về. Và liệu có dùng để làm gì được không. Cái này tôi chỉ biết tới đó. Nhờ các cao thủ giải thích thêm.
3). Có 4 tuỳ chọn của vlax là:
acExtendNone : Does not extend either object.
acExtendThisEntity : Extends the Fst object.
acExtendOtherEntity : Extends the Nxt object.
acExtendBoth : Extends both objects.
  • 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ờ. Đừ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.


#13 LoveLisp

LoveLisp

    biết lệnh extend

  • Members
  • PipPipPip
  • 195 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 26 June 2012 - 03:02 PM

Đúng là mình không mấy khi sử dụng các hàm acet, vì đôi khi thao tác trên máy chưa được cài express thì ... nó không hiểu mình ra lệnh gì cho nó!! Rất bất tiện khi làm việc di động, làm việc trên một máy tính khác.
  • 0

#14 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 26 June 2012 - 09:26 PM

Ketxu nhớ không nhầm thì intersectwith với một đối tượng phức = intersectwith với tất cả nested entity
  • 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


#15 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 26 June 2012 - 09:38 PM

Có test thử 2 bolck mà nó không ra kết quả như Ket nó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ờ. Đừ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.