Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
mauthanh

[Yêu Cầu] viết lisp di chuyển rectang về spline.

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

mauthanh    1

Mình mới bắt đầu tìm hiểu về lisp.Cũng chẳng biết đâu là Gốc đâu là ngọn chỉ học qua các ví dụ ứng dụng từ đơn giản đến phức tạp sau đó quay lại tìm hiểu các hàm.

Trong quá trìng làm việc mình có bài toán muốn nhờ các bác giải quyết.

Có một spline(mặt đường) và các rectang( các cọc tiêu) nằm trên không mặt đường. Mình muốn viết một lisp chọn rectang sau đó chọn spline để move rectang sao cho điểm góc của rectang nằm trên spline (move theo phương trục y).

(Tức là nói đơn giản bài toán là tìm điểm trên spline tương ứng với điểm góc của rectang , 2 diểm này có cùng toạ độ x).

Mong các bác chỉ mình hướng làm cũng dc, hoặc bác nào có thời gian viết trực tiếp hộ mình thì tốt quá. (Mình chỉ biết đọc qua một vài ví dụ thì thấy sử dụng các hàm vl,vla...Nhưng không biết hàm gì và thuật toán như thế nào).Xin các bác giúp đỡ.Mình xin được cảm ơn trước .Thạnks

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
Doan Van Ha    2.678

Mình mới bắt đầu tìm hiểu về lisp.Cũng chẳng biết đâu là Gốc đâu là ngọn chỉ học qua các ví dụ ứng dụng từ đơn giản đến phức tạp sau đó quay lại tìm hiểu các hàm.

Trong quá trìng làm việc mình có bài toán muốn nhờ các bác giải quyết.

Có một spline(mặt đường) và các rectang( các cọc tiêu) nằm trên không mặt đường. Mình muốn viết một lisp chọn rectang sau đó chọn spline để move rectang sao cho điểm góc của rectang nằm trên spline (move theo phương trục y).

(Tức là nói đơn giản bài toán là tìm điểm trên spline tương ứng với điểm góc của rectang , 2 diểm này có cùng toạ độ x).

Mong các bác chỉ mình hướng làm cũng dc, hoặc bác nào có thời gian viết trực tiếp hộ mình thì tốt quá. (Mình chỉ biết đọc qua một vài ví dụ thì thấy sử dụng các hàm vl,vla...Nhưng không biết hàm gì và thuật toán như thế nào).Xin các bác giúp đỡ.Mình xin được cảm ơn trước .Thạnks

Thuật toán thì không khó, nhưng giả thiết còn thiếu: lấy điểm nào trong 4 điểm của mỗi rectang để làm gốc mà move?

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
mauthanh    1

Thuật toán thì không khó, nhưng giả thiết còn thiếu: lấy điểm nào trong 4 điểm của mỗi rectang để làm gốc mà move?

 

Điểm góc dưới bên phải của rectang, Bác giúp em với.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
phamthanhbinh    3.123

Mình mới bắt đầu tìm hiểu về lisp.Cũng chẳng biết đâu là Gốc đâu là ngọn chỉ học qua các ví dụ ứng dụng từ đơn giản đến phức tạp sau đó quay lại tìm hiểu các hàm.

Trong quá trìng làm việc mình có bài toán muốn nhờ các bác giải quyết.

Có một spline(mặt đường) và các rectang( các cọc tiêu) nằm trên không mặt đường. Mình muốn viết một lisp chọn rectang sau đó chọn spline để move rectang sao cho điểm góc của rectang nằm trên spline (move theo phương trục y).

(Tức là nói đơn giản bài toán là tìm điểm trên spline tương ứng với điểm góc của rectang , 2 diểm này có cùng toạ độ x).

Mong các bác chỉ mình hướng làm cũng dc, hoặc bác nào có thời gian viết trực tiếp hộ mình thì tốt quá. (Mình chỉ biết đọc qua một vài ví dụ thì thấy sử dụng các hàm vl,vla...Nhưng không biết hàm gì và thuật toán như thế nào).Xin các bác giúp đỡ.Mình xin được cảm ơn trước .Thạnks

 

Mình mới bắt đầu tìm hiểu về lisp.Cũng chẳng biết đâu là Gốc đâu là ngọn chỉ học qua các ví dụ ứng dụng từ đơn giản đến phức tạp sau đó quay lại tìm hiểu các hàm.

Trong quá trìng làm việc mình có bài toán muốn nhờ các bác giải quyết.

Có một spline(mặt đường) và các rectang( các cọc tiêu) nằm trên không mặt đường. Mình muốn viết một lisp chọn rectang sau đó chọn spline để move rectang sao cho điểm góc của rectang nằm trên spline (move theo phương trục y).

(Tức là nói đơn giản bài toán là tìm điểm trên spline tương ứng với điểm góc của rectang , 2 diểm này có cùng toạ độ x).

Mong các bác chỉ mình hướng làm cũng dc, hoặc bác nào có thời gian viết trực tiếp hộ mình thì tốt quá. (Mình chỉ biết đọc qua một vài ví dụ thì thấy sử dụng các hàm vl,vla...Nhưng không biết hàm gì và thuật toán như thế nào).Xin các bác giúp đỡ.Mình xin được cảm ơn trước .Thạnks

Hề hề hề,

Yêu cầu của bạn không khó nhưng bạn phải gửi bản vẽ minh họa lên thì mới có thể làm đúng ý bạn được. Tỷ như các rectangle này nằm song song với hệ trục tọa độ hay nằm xiên xiên xeo xéo???. Các rectangle này nẳm trong mặt phẳng nào ????

Túm lại là cần có bản vẽ mô tả cái đầu vào bạn có và cái đầu ra bạn cần.

Nếu có đủ các yêu tố này thì việc bạn hay ai làm cái lisp này mới có thể đúng yêu cầu được.

Trong help develpoer của CAd có một số hàm vl-, vlax- thường dùng, bạn có thể tham khảo tại đó.

Để tìm điểm gần nhất trên một curve với một điểm cho trước thì có hàm (vlax-curve-getclosestpointto .......)

Để tìm điểm gần nhất trên một curve với một điểm cho trước theo một phương chiếu cho trước thì có hàm (vlax-curve-getclosestpointtoprojection .......)

Bạn có thể đọc về các hàm này trong help developer để hiểu cách sử dụng chúng và dùng thử coi sao. Theo thiển ý của mình thì chúng có thể đáp ứng yêu cầu bạn đặt ra.

Chúc bạn vui.

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
Doan Van Ha    2.678

Điểm góc dưới bên phải của rectang, Bác giúp em với.Thanks

Thử cái này coi đúng y/c của bạn không nhé? Còn không thì đọc ý kiến của bác Phamthanhbinh

;Doan Van Ha - CADViet.com - ngay 24/3/2012
;Muc dich: move cac rectang de goc phai duoi ve nam tren spline.
(defun C:HA( / cmd ent1 lstent lst ent3 p)
(vl-load-com)
(command "undo" "be")
(setq cmd (getvar "cmdecho"))
(setq ent1 (car (entsel "\nChon Spline: ")))
(princ "\nChon cac doi tuong Rectang: ")
(setq lstent (acet-ss-to-list (ssget '((-4 . "<AND") (0 . "LWPOLYLINE") (-4 . "<OR") (90 . 4) (90 . 5) (-4 . "OR>") (-4 . "AND>")))))
(setvar "cmdecho" 0)
(foreach ent2 lstent
 (setq lst (acet-geom-vertex-list ent2))
 (setq lst (vl-sort lst '(lambda (e1 e2) (> (car e1) (car e2)))))
 (setq ent3 (entmakex (list (cons 0 "LINE") (cons 10 (nth 0 lst)) (cons 11 (nth 1 lst)))))
 (setq p (car (acet-geom-intersectwith ent1 ent3 2)))
 (entdel ent3)
 (if p
  (command "move" ent2 "" "non" (if (> (cadr (nth 0 lst)) (cadr (nth 1 lst))) (nth 1 lst) (nth 0 lst)) "non" p)))
(command "undo" "end")
(setvar "cmdecho" cmd)
(princ))

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
phamthanhbinh    3.123

 

Thử cái này coi đúng y/c của bạn không nhé? Còn không thì đọc ý kiến của bác Phamthanhbinh

Hề hề hề,

Bác DoanVanHa ơi, cái này mà nhỡ HCN nằm xiên xiên thì cái điểm cắt p nó lung tung lắm, khó mà lường. Vả lại nếu cái đường ent3 cắt ent1 tại nhiều điểm thì không biết bác chọn điểm đầu (car.....) có trúng ý chủ thớt không??? Nếu cái Rectang của chủ thớt tạo bằng line thì cũng gay???

Vậy nên tốt nhất là phải chờ chủ thớt gửi bản vẽ lên bác nhể....

  • 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
Doan Van Ha    2.678

Hề hề hề,

Bác DoanVanHa ơi, cái này mà nhỡ HCN nằm xiên xiên thì cái điểm cắt p nó lung tung lắm, khó mà lường. Vả lại nếu cái đường ent3 cắt ent1 tại nhiều điểm thì không biết bác chọn điểm đầu (car.....) có trúng ý chủ thớt không??? Nếu cái Rectang của chủ thớt tạo bằng line thì cũng gay???

Vậy nên tốt nhất là phải chờ chủ thớt gửi bản vẽ lên bác nhể....

Hề hề hề!

1). Viết lisp theo y/c nhiều khi phải đoán mò, và chấp nhận thương đau, nên mới có câu thòng: nếu không đạt thì đọc lại ý kiến của bác PTB.

2). Đoán mò là: rectang cọc tiêu phải nằm ngang, spline lề đường thì không thể cắt đường thẳng x=a tại nhiều hơn 1 điểm. 2 điều đoán này chắc đúng 99%. Viết xong theo cái đoán mò thì thấy ý kiến bác nên cứ up lên vậy.

3). Còn chấp nhận thương đau là sao? Chẳng hạn như lisp này, nếu rec vẽ bằng line... Hoặc như lisp của bác về nối text và xuất file cũng phải chấp nhận thương đau nếu xui xẻo có vài ba text cùng cách point 0.4 vậy. Bữa trước tôi cũng nối text giùm kiểu gần như vậy đấy, hơi nguy hiểm nên đã cảnh giác chủ topic.

Tóm lại, chắc lần sau không mần nữa bác ạ!

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
phamthanhbinh    3.123

 

Hề hề hề!

1). Viết lisp theo y/c nhiều khi phải đoán mò, và chấp nhận thương đau, nên mới có câu thòng: nếu không đạt thì đọc lại ý kiến của bác PTB.

2). Đoán mò là: rectang cọc tiêu phải nằm ngang, spline lề đường thì không thể cắt đường thẳng x=a tại nhiều hơn 1 điểm. 2 điều đoán này chắc đúng 99%. Viết xong theo cái đoán mò thì thấy ý kiến bác nên cứ up lên vậy.

3). Còn chấp nhận thương đau là sao? Chẳng hạn như lisp này, nếu rec vẽ bằng line... Hoặc như lisp của bác về nối text và xuất file cũng phải chấp nhận thương đau nếu xui xẻo có vài ba text cùng cách point 0.4 vậy. Bữa trước tôi cũng nối text giùm kiểu gần như vậy đấy, hơi nguy hiểm nên đã cảnh giác chủ topic.

Tóm lại, chắc lần sau không mần nữa bác ạ!

Hề hề hề,

Rút một cái cục lại là cứ nên yêu cầu chủ thớt post kèm bản vẽ mô tả rồi theo đó mà mần là đỡ phải xem bói bác nhể.....

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
mauthanh    1

trước hết em xin cảm ơn 2 bác đã quan tâm đến topic của em. Thời gian vừa rồi vì lí do công việc khá bận lên không lên diễn đàn để theo dõi.Em sẽ theo hướng của 2 bác để xem có vỡ ra được vấn đề không? 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
mauthanh    1

Hề hề hề!

1). Viết lisp theo y/c nhiều khi phải đoán mò, và chấp nhận thương đau, nên mới có câu thòng: nếu không đạt thì đọc lại ý kiến của bác PTB.

2). Đoán mò là: rectang cọc tiêu phải nằm ngang, spline lề đường thì không thể cắt đường thẳng x=a tại nhiều hơn 1 điểm. 2 điều đoán này chắc đúng 99%. Viết xong theo cái đoán mò thì thấy ý kiến bác nên cứ up lên vậy.

3). Còn chấp nhận thương đau là sao? Chẳng hạn như lisp này, nếu rec vẽ bằng line... Hoặc như lisp của bác về nối text và xuất file cũng phải chấp nhận thương đau nếu xui xẻo có vài ba text cùng cách point 0.4 vậy. Bữa trước tôi cũng nối text giùm kiểu gần như vậy đấy, hơi nguy hiểm nên đã cảnh giác chủ topic.

Tóm lại, chắc lần sau không mần nữa bác ạ!

 

Chào bác Hà,

Em có về dựa trên ví dụ của bác và thử viết theo cách của mình.

Đối tượng là block, và em dùng hàm vlax-curve-getClosestPointToProjection để tìm điểm trên curve.

Em dùng hàm foreach để lặp thao tác với nhiều block mà không được, nó chỉ move có một block.(do ko được học căn bản lại học mót lên vấp đâu hỏi đó mà)

Em có gửi file em viết thử bác có thời gian check cho em với thanks bác.

Em làm bên giao thông lên làm việc với 2D thôi( mặt phẳng xoy )

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
mauthanh    1

file cua em

 

(defun c:mbl2()

(setvar "cmdecho" 0)

(vl-load-com)

(command "Undo" "BEgin")

(prompt "\n chon bolck: ")

(setq lstent (acet-ss-to-list (ssget '((-4 . "<AND") (0 . "INSERT") (2 . "ctieu") (-4 . "AND>")) )))

(foreach ent2 lstent

(setq ptm (cdr (assoc 10 (entget ent2))))

(prompt "\n chon duong cong: ")

(setq curve-obj (ssname (ssget) 0))

(setq PT11 (vlax-curve-getClosestPointToProjection curve-obj Ptm '(0 1 0)))

(command "move" ent2 "" ptm pt11 "")

 

)

(command "Undo" "End")

)

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
phamthanhbinh    3.123

file cua em

 

(defun c:mbl2()

(setvar "cmdecho" 0)

(vl-load-com)

(command "Undo" "BEgin")

(prompt "\n chon bolck: ")

(setq lstent (acet-ss-to-list (ssget '((-4 . "<AND") (0 . "INSERT") (2 . "ctieu") (-4 . "AND>")) )))

(foreach ent2 lstent

(setq ptm (cdr (assoc 10 (entget ent2))))

(prompt "\n chon duong cong: ")

(setq curve-obj (ssname (ssget) 0))

(setq PT11 (vlax-curve-getClosestPointToProjection curve-obj Ptm '(0 1 0)))

(command "move" ent2 "" ptm pt11 "")

 

)

(command "Undo" "End")

)

Hề hề hề,

Bạn thử sửa như sau:

 

(defun c:mbl2()

(setvar "cmdecho" 0)

(vl-load-com)

(command "Undo" "BEgin")

(prompt "\n chon bolck: ")

(setq lstent (acet-ss-to-list (ssget '((-4 . "<AND") (0 . "INSERT") (2 . "ctieu") (-4 . "AND>")) )))

 

 

(prompt "\n chon duong cong: ")

(setq curve-obj (vlax-ename->vla-object (car (entsel "\n Chon duong cong:"))))

 

(foreach ent2 lstent

(setq ptm (cdr (assoc 10 (entget ent2))))

 

(setq PT11 (vlax-curve-getClosestPointToProjection curve-obj Ptm '(0 1 0)))

(command "move" ent2 "" ptm pt11 "")

 

)

(command "Undo" "End")

)

 

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
Doan Van Ha    2.678

file cua em

...

1). Bạn post bài thì phải cho lisp vào thẻ code nhé!

2). Nếu bạn để 2 dòng dưới đây trong hàm foreach thì mỗi block bạn phải chọn 1 curve thì mới đúng.

3). Còn nếu chỉ dùng 1 curve thì bạn phải đưa 2 dòng dưới đây lên trên hàm foreach

(prompt "\n chon duong cong: ")

(setq curve-obj (ssname (ssget) 0))

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

Đăng nhập để thực hiện theo  

×