Đến nội dung


Hình ảnh
- - - - -

Thay đổi StartPoint của polyline


  • Please log in to reply
14 replies to this topic

#1 hoathuongphuoc

hoathuongphuoc

    biết lệnh erase

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

Đã gửi 25 December 2013 - 11:44 AM

Chào các bạn,

Các bạn cho mình hỏi. Làm sao mình có thể thay đổi StartPoint của 1 polyline làm sao cho StartPoint mới này ở gần trục toạ độ o nhất. Mình có hình đính kèm dưới đây:

125141_hinh1_3.png


  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 25 December 2013 - 12:01 PM

Thay đổi bằng Cad hay bằng 1 ngôn ngữ lập trình, chẳng hạn lisp?


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

hoathuongphuoc

    biết lệnh erase

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

Đã gửi 25 December 2013 - 01:07 PM

Sử dụng vb.net(autocad.net) để làm đó bạn. Không biết có cách nào không.


  • 0

#4 hoathuongphuoc

hoathuongphuoc

    biết lệnh erase

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

Đã gửi 26 December 2013 - 09:36 AM

Cảm ơn các bạn đã quan tâm. Chắc mình sử dụng cách tìm toạ độ x nhỏ nhất. để làm startpont.


  • 0

#5 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 26 December 2013 - 10:19 AM

Cảm ơn các bạn đã quan tâm. Chắc mình sử dụng cách tìm toạ độ x nhỏ nhất. để làm startpont.

Hề hề hề,

Vb,net hay va.net thì mình hổng biết mần. Nhưng về thuật toán có thể góp ý với bạn vài suy nghĩ như sau:

1/- Chọn pline rồi lấy tập hợp các điểm đỉnh của polyline. Nếu là lisp thì sử dụng hàm (acet-geom-vertex-list en)

2/- lấy điểm có khoảng cách tới gốc tọa độ là nhỏ nhất. Nếu là lisp thì sữ dụng hàm (vl-sort pointlist)

3/- Sắp xếp lại pointlist với điểm bắt đầu là điểm đã chọn được. Lưu ý rằng cần phân biệt pointlist của một polyline kín và một polyline không kín để có cách sử lý khác nhau.

OK.


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

#6 hoathuongphuoc

hoathuongphuoc

    biết lệnh erase

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

Đã gửi 26 December 2013 - 11:01 AM

Thank bạn nhiều. Nhưng mình làm cái này là hoàn toàn tự động. click vào trong polyline và chương trình tự động tìm toạ độ và lấy nó làm startPoint. Mình đang nghĩ giải thuật là tìm tọa độ x nhỏ nhất, sau đó gán startpoint cho nó. Mình nghĩ chắc cũng ok.


  • 0

#7 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 26 December 2013 - 11:49 AM

Thank bạn nhiều. Nhưng mình làm cái này là hoàn toàn tự động. click vào trong polyline và chương trình tự động tìm toạ độ và lấy nó làm startPoint. Mình đang nghĩ giải thuật là tìm tọa độ x nhỏ nhất, sau đó gán startpoint cho nó. Mình nghĩ chắc cũng ok.

Hề hề hề,

Tất nhiên là đã lập trình thì nó sẽ chạy tự động sau khi bạn chọn pine thôi. có điều vì Vb.net mình chưa hiểu gì nhiều về nó nên không làm được. Song nếu bạn muốn dùng lisp để làm việc này thì mình nghĩ có thể làm được và mình sẽ làm thử coi sao.

Với giải thuật bạn đưa ra thì coi chừng sẽ có lỗi bởi điểm có x nhỏ nhất chưa chắc đã là điểm gần gốc tọa độ nhất. Cứ xem cái hình minh họa của bạn sẽ rõ. Nó có tới hai điểm có tọa độ x nhỏ nhất đấy.


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

#8 hoathuongphuoc

hoathuongphuoc

    biết lệnh erase

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

Đã gửi 26 December 2013 - 01:12 PM

Uhm. Để mình xem lại thế nào. Thank bạn.


  • 0

#9 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 26 December 2013 - 02:59 PM

Chào các bạn,

Các bạn cho mình hỏi. Làm sao mình có thể thay đổi StartPoint của 1 polyline làm sao cho StartPoint mới này ở gần trục toạ độ o nhất. Mình có hình đính kèm dưới đây:

125141_hinh1_3.png

Code VB đổi Start Point của Pline, sử dụng thuật toán của bác Bình #5 và tham khảo code của Hallex http://forums.autode...ne/td-p/4714339

Chống chỉ định :  Pline có cung tròn, Pline hở, Pline có chiều rộng thay đổi.

 

    <CommandMethod("chPlStPt")> _
    Public Shared Sub ChangePolyStartPoint()
        Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
        Dim ed As Editor = doc.Editor
        Dim db As Database = doc.Database

        Dim peo As New PromptEntityOptions(vbLf & "Select a  polyline : ")
        peo.SetRejectMessage(vbLf & "You have to select polyline only!")
        peo.AddAllowedClass(GetType(Polyline), False)
        Dim res As PromptEntityResult = ed.GetEntity(peo)
        If res.Status <> PromptStatus.OK Then
            Return
        End If

        Using tr As Transaction = db.TransactionManager.StartTransaction()
            Dim origin As Point2d = Point2d.Origin
            Dim poly As Polyline = DirectCast(tr.GetObject(res.ObjectId, OpenMode.ForRead), Polyline)
            Dim c As Integer = 0
            Dim points As New List(Of Point2d)()
            For c = 0 To poly.NumberOfVertices - 1
                points.Add(poly.GetPoint2dAt©)
            Next

            Dim sortedPts As New List(Of Point2d)
            sortedPts = (From pt In points Order By pt.GetDistanceTo(origin) Select pt).ToList

            Dim pos As Integer = points.IndexOf(sortedPts(0))
            Dim tail As IEnumerable(Of Point2d) = points.Take(pos)
            Dim head As IEnumerable(Of Point2d) = points.Except(tail)
            Dim newpoints As IEnumerable(Of Point2d) = head.Concat(tail)
            Dim pts As List(Of Point2d) = newpoints.ToList()

            Dim btr As BlockTableRecord = DirectCast(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
            poly.UpgradeOpen()
            For c = 0 To pts.Count - 1
                poly.SetPointAt(c, CType(pts©, Point2d))
            Next
            tr.Commit()
            ed.Regen()
        End Using
    End Sub

  • 1

#10 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 26 December 2013 - 03:21 PM

Uhm. Để mình xem lại thế nào. Thank bạn.

Hề hề hề,

Đây là cái lisp mình viết nháp, chưa hiệu chỉnh kỹ. Bạn có thể tham khảo cách đổi startpoint trong lisp để chuyển sang vb.net cho phù hợp. Lisp này chỉ làm việc với polyline kín vì nều polyline hở thì việc đổi điểm startpoint chỉ là đổi chiều pline và nó không đúng với ý bạn là điểm startpoint phải gần gốc tọa độ nhất được.

http://www.cadviet.c...ointofpline.lsp

 

(Defun c:csp (/ oldos oldcol ent plst plst1 plst2 n i lst1 lst2)

(vl-load-com)

(setq oldos (getvar "osmode"))

(setvar "osmode" 0)

(setq oldcol (getvar "cecolor"))

(setvar "cecolor" "1")

(command "undo" "be")

(setq ent (car (entsel "\n Chon Polyline can doi")))

(if (= (cdr (assoc 70 (entget ent))) 1)

    (setq plst (cdr (acet-geom-vertex-list ent)))

)

(setq  plst1 (vl-sort plst '(lambda (x y) (< (distance '(0 0 0) x) (distance '(0 0 0) y)))))

(setq n (vl-position (car plst1) plst))

(setq lst1 (member (car plst1) plst))

(setq i 0 lst2 (list))

(while (< i n)

        (setq  lst2 (append lst2 (list (nth i plst)))

                  i (1+ i) )

)

(setq plst2 (append lst1 lst2))

(command "pline")

(foreach p plst2

       (command p)

)

(command "c" "")

(command "erase" ent "")

(command "undo" "e")

(setvar "cecolor" oldcol)

(setvar "osmode" oldos)

(princ)

)

(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq oldcol (getvar "cecolor"))
(setvar "cecolor" "1")
(command "undo" "be")
(setq ent (car (entsel "\n Chon Polyline can doi")))
(if (= (cdr (assoc 70 (entget ent))) 1)
    (setq plst (cdr (acet-geom-vertex-list ent)))
)

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

#11 hoathuongphuoc

hoathuongphuoc

    biết lệnh erase

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

Đã gửi 26 December 2013 - 03:56 PM

Thank các bạn nhiều.


  • 0

#12 lion1310

lion1310

    Chưa sử dụng CAD

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

Đã gửi 18 January 2014 - 12:50 AM

@phamthanhbinh

 

Bác chỉnh giúp e lisp chọn điểm start point của polyline bằng cách pick điểm nhé

E đang cần lấy toạ độ đỉnh của polyline mà thứ tự kết quả ko được như ý muốn, thanks


  • 0

#13 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 January 2014 - 01:02 PM

@phamthanhbinh

 

Bác chỉnh giúp e lisp chọn điểm start point của polyline bằng cách pick điểm nhé

E đang cần lấy toạ độ đỉnh của polyline mà thứ tự kết quả ko được như ý muốn, thanks

Hề hề hề,

Bạn hãy lưu ý rằng việc chọn thứ tự các đỉnh không chỉ phụ thuộc vào startpoint của lwpolyline mà cò phụ thuộc vào chiều của lwpolyline nữa đấy.


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

#14 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 January 2014 - 02:16 PM

@phamthanhbinh

 

Bác chỉnh giúp e lisp chọn điểm start point của polyline bằng cách pick điểm nhé

E đang cần lấy toạ độ đỉnh của polyline mà thứ tự kết quả ko được như ý muốn, thanks

Hề hề hề,

Hãy dùng thủ cái ni coi đã ưng ý chưa nghen.

http://www.cadviet.c...onstlwpline.lsp

 

 

(Defun c:csp (/ oldos oldcol ent plst plst1 plst2 n i k p1 p2 lst1 lst2)

(vl-load-com)

(setq oldos (getvar "osmode"))

(setvar "osmode" 0)

(setq oldcol (getvar "cecolor"))

(setvar "cecolor" "1")

(command "undo" "be")

(setq ent (car (entsel "\n Chon Polyline can doi")))

(if (= (cdr (assoc 70 (entget ent))) 1)

    (setq plst  (acet-geom-vertex-list ent))

    (progn

           (alert "\n doi tuong khong phai Lwpolyline kin")

           (exit)

    )

)

(setvar "osmode" 1)

(setq p1 (getpoint "\n Chon diem startpoint moi")

          p2 (getpoint p1 "\n Chon diem thu hai cua lwpolyline ")

)

(setq i (vl-position p1 plst)

          k (vl-position p2 plst)

)

(if (/= i (1- k))

    (setq plst (reverse plst))

)

(setq plst (reverse (cdr (reverse plst))))

(setq n (vl-position p1 plst))

(setq lst1 (member p1 plst))

(setq i 0 lst2 (list))

(while (< i n)

        (setq  lst2 (append lst2 (list (nth i plst)))

                  i (1+ i) )

)

(setq plst2 (append lst1 lst2))

(setvar "osmode" 0)

(command "pline")

(foreach p plst2

       (command p)

)

(command "c" "")

(command "erase" ent "")

(command "undo" "e")

(setvar "cecolor" oldcol)

(setvar "osmode" oldos)

(princ)

)

 


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

#15 lion1310

lion1310

    Chưa sử dụng CAD

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

Đã gửi 19 January 2014 - 04:21 PM

Hề hề hề,

Hãy dùng thủ cái ni coi đã ưng ý chưa nghen.

http://www.cadviet.c...onstlwpline.lsp

 

Cảm ơn bác nhé, đang dùng và vẫn chưa thấy lỗi j :D.

Kết nhất quả đổi màu pline đỡ lo bị lẫn.


  • 0