Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
12 replies to this topic

#1 mauthanh

mauthanh

    biết zoom

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

Đã gửi 23 March 2012 - 03:15 PM

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

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 23 March 2012 - 03:31 PM

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


#3 mauthanh

mauthanh

    biết zoom

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

Đã gửi 24 March 2012 - 09:16 AM

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

#4 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 24 March 2012 - 10:16 AM

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

#5 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 24 March 2012 - 11:08 AM

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

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


#6 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 24 March 2012 - 01:53 PM


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

#7 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 24 March 2012 - 03:28 PM

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 ạ!
  • 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 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 24 March 2012 - 04:23 PM


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

#9 mauthanh

mauthanh

    biết zoom

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

Đã gửi 12 April 2012 - 09:44 PM

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

#10 mauthanh

mauthanh

    biết zoom

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

Đã gửi 19 April 2012 - 02:22 PM

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

#11 mauthanh

mauthanh

    biết zoom

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

Đã gửi 19 April 2012 - 02:32 PM

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")
)
  • 0

#12 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 19 April 2012 - 04:21 PM

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

#13 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 19 April 2012 - 04:23 PM

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