Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
hoathuongphuoc

Thay đổi StartPoint của polyline

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

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

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

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.

  • 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

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.

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

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.

  • 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

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.autodesk.com/t5/NET/set-startpoint-for-polyline/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(c))
            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(c), Point2d))
            Next
            tr.Commit()
            ed.Regen()
        End Using
    End Sub
  • 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

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.com/upfiles/3/5194_changestartpointofpline.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)))
)
  • Vote tăng 2

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

 

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

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

 

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.

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

 

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.com/upfiles/3/5194_reconstlwpline.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)

)

 

  • 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

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  

×