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

Lấy bán kính và tâm của hình cung bằng vb.net

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

Chào các bạn,

Các bạn cho mình hỏi có cách nào lấy bán kính và tâm của hình cung 2 đầu của hình này không. Ý  của mình là click vào 3 điểm trên hình cung đó(điểm đầu, điểm giữa, điểm cuối). sau đó xuất ra bán kính và tâm. Mình xin cảm ơn.

  • 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

Gửi bạn hàm đọc 1 số property của Curve (line, Arc, circle, polyline ) trong Cad.

 

Do bạn đưa hình dạng image nên đôi khi gây nhầm lẫn cho người đọc. vì hình trên có thể hiểu là :

 -1. đối tượng là 2 đường thẳng và 2 cung tròn rời rac.

 -2. đối tượng là 1 đường polyline kín.

Nhưng qua theo dõi bài viết của bạn(file Cad) hình như đó lại là đối tượng Block Attribute. (do đó cần phải explode trước khi chạy lệnh)

Code c#:

        [CommandMethod("CurveInfo")]
        public void CurveInfo()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                PromptEntityOptions peo = new PromptEntityOptions("\nSelect an Curve >>");
                peo.SetRejectMessage("\nPlease select Curve only >>");
                peo.AddAllowedClass(typeof(Curve), false);

                PromptEntityResult res = ed.GetEntity(peo);
                if (res.Status != PromptStatus.OK)
                    return;

                Curve curve = (Curve)tr.GetObject(res.ObjectId, OpenMode.ForRead);
                string report = "";

                if (curve is Line)
                {
                    Line ln = curve as Line;
                    report = "Line"
                        + "\n-Điểm đầu : " + ln.StartPoint
                        + "\n-Điểm cuối : " + ln.EndPoint
                        + "\n-Chiều dài : " + ln.Length;
                }
                else if (curve is Circle)
                {
                    Circle cir = curve as Circle;
                    report = "Circle"
                        + "\n-Tâm : " + cir.Center
                        + "\n-Bán kính : " + cir.Radius
                        + "\n-Chu vi : " + cir.Circumference;
                }
                else if (curve is Arc)
                {
                    Arc arc = curve as Arc;
                    report = "Arc"
                        + "\n-Điểm đầu : " + arc.StartPoint
                        + "\n-Điểm cuối : " + arc.EndPoint                        
                        + "\n-Tâm : " + arc.Center
                        + "\n-Bán kính cung : " + arc.Radius
                        + "\n-Góc chắn cung : " + arc.TotalAngle
                        + "\n-Chiều dài cung : " + arc.Length;
                }
                else if (curve is Polyline)
                {
                    Polyline poly = curve as Polyline;
                    report = "Polyline" + "\n-Cao độ : " + poly.Elevation;
                    string coor = "\nDanh sách tọa độ : ";
                    for (int i = 0; i < poly.NumberOfVertices; i++)
                    {
                        Point2d pt = poly.GetPoint2dAt(i);
                        coor += poly.GetPoint2dAt(i);

                        SegmentType type = poly.GetSegmentType(i);
                        switch (type)
                        {
                            case SegmentType.Arc:
                                CircularArc2d arc2d = poly.GetArcSegment2dAt(i);
                                report += "\nArc segment : " + "\n\t-Tâm : " + arc2d.Center + "\n\t-Bán kính : " + arc2d.Radius;
                                break;

                            case SegmentType.Line:
                                LineSegment2d line2d = poly.GetLineSegment2dAt(i);
                                report += "\nLine segment : " + "\n\t-Chiều  dài : " + line2d.Length;
                                break;

                            default :
                                break;
                        }
                    }
                    report += coor;
                }
                //else if (curve is Polyline2d)
                //{
                //    Polyline2d pl2d = curve as Polyline2d;
                //}
                //else if (curve is Polyline3d)
                //{
                //    Polyline3d pl3d = curve as Polyline3d;
                //}
                //else if (curve is Spline)
                //{
                //    Spline spline = curve as Spline;
                //}
                //else if (curve is Ellipse)
                //{
                //    Ellipse pl = curve as Ellipse;
                //}
                Application.ShowAlertDialog(report );
                tr.Commit();
            }
        }

code VB:

    <CommandMethod("CurveInfo")> Public Sub CurveInfo()
        Dim doc As Document = Application.DocumentManager.MdiActiveDocument
        Dim ed As Editor = doc.Editor
        Dim db As Database = doc.Database

        Using tr As Transaction = db.TransactionManager.StartTransaction()
            Dim peo As New PromptEntityOptions(vbLf & "Select an Curve >>")
            peo.SetRejectMessage(vbLf & "Please select Curve only >>")
            peo.AddAllowedClass(GetType(Curve), False)

            Dim res As PromptEntityResult = ed.GetEntity(peo)
            If res.Status <> PromptStatus.OK Then
                Return
            End If

            Dim curve As Curve = DirectCast(tr.GetObject(res.ObjectId, OpenMode.ForRead), Curve)
            Dim report As String = ""

            If TypeOf curve Is Line Then
                Dim ln As Line = TryCast(curve, Line)
                report = "Line" & vbLf & "-Điểm đầu : " & ln.StartPoint.ToString() & vbLf & _
                    "-Điểm cuối : " & ln.EndPoint.ToString() & vbLf & "-Chiều dài : " & ln.Length
            ElseIf TypeOf curve Is Circle Then
                Dim cir As Circle = TryCast(curve, Circle)
                report = "Circle" & vbLf & "-Tâm : " & cir.Center.ToString() & vbLf & _
                    "-Bán kính : " & cir.Radius & vbLf & "-Chu vi : " & cir.Circumference
            ElseIf TypeOf curve Is Arc Then
                Dim arc As Arc = TryCast(curve, Arc)
                report = "円弧" & vbLf & "-起点 : " & arc.StartPoint.ToString() & vbLf & _
                    "-終点 : " & arc.EndPoint.ToString() & vbLf & "-中心 : " & arc.Center.ToString() & vbLf & _
                    "-半径 : " & arc.Radius & vbLf & "-長さ : " & arc.Length & vbLf & _
                    "-角度 : " & arc.TotalAngle
            ElseIf TypeOf curve Is Polyline Then
                Dim poly As Polyline = TryCast(curve, Polyline)
                report = "Polyline" & vbLf & "-Cao độ : " & poly.Elevation
                report += vbLf & "Danh sách tọa độ : "
                Dim coor As String = vbLf & "Danh sách tọa độ : "
                Dim i As Integer = 0
                While i < poly.NumberOfVertices
                    Dim pt As Point2d = poly.GetPoint2dAt(i)
                    coor += poly.GetPoint2dAt(i).ToString()

                    Dim type As SegmentType = poly.GetSegmentType(i)
                    Select Case type
                        Case SegmentType.Arc
                            Dim arc2d As CircularArc2d = poly.GetArcSegment2dAt(i)
                            report += vbLf & "Arc segment : " & vbLf & vbTab & "-Tâm : " & arc2d.Center.ToString() _
                            & vbLf & vbTab & "-Bán kính : " & arc2d.Radius
                            Exit Select

                        Case SegmentType.Line
                            Dim line2d As LineSegment2d = poly.GetLineSegment2dAt(i)
                            report += vbLf & "Line segment : " & vbLf & vbTab & "-Chiều  dài : " & line2d.Length
                            Exit Select
                        Case Else

                            Exit Select
                    End Select
                    i += 1
                End While
            End If

            Application.ShowAlertDialog(report)
            tr.Commit()
        End Using
    End Sub
  • 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

Đoạn này quả là lợi hại:

 

SegmentType type = poly.GetSegmentType(i);
switch (type)
{
case SegmentType.Arc:
CircularArc2d arc2d = poly.GetArcSegment2dAt(i);
report += "\nArc segment : " + "\n\t-Tâm : " + arc2d.Center + "\n\t-Bán kính : " + arc2d.Radius;
break;

}

 

Dùng outprocess không có hàm nào như thế, phải lấy góc cung, 2 điểm rồi tính ra tâm và bán kính rất chán.

  • 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

...........

dùng outprocess không có hàm nào như thế, phải lấy góc cung, 2 điểm rồi tính ra tâm và bán kính rất chán.

Hơi nhọc công 1 chút nhưng vẫn tính toán được. 

 

Với t/hợp thêm hatch vô các hình lõm, hình giao cắt nhau bao gồm cung tròn ... nếu chỉ dùng hình học giải tích thì rất vất vã.

Nếu dùng in-process, từ Cad 2011, có thể sử dụng hàm Editor.TraceBoundary(point, bool) để tạo đường bao giống như lệnh Hatch của Cad.

  • 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  

×