Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
6 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 13 November 2013 - 02:09 PM

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.


  • 1

#2 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 13 November 2013 - 09:04 PM

Đường tròn qua 3 điểm, chỉ là hình học giải tích, bạn tìm công thức mà tính, giải xong thì ra ngay bán kính với tâm.

Xem quyển này tham khảo thêm: http://www.fshare.vn/file/TVCM42DGQT


  • 1
Clear sky!

MF Rock collection.

#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 14 November 2013 - 08:54 AM

thanks bạn nhiều.


  • 0

#4 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 14 November 2013 - 09:33 AM

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

  • 2

#5 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 14 November 2013 - 10:07 AM

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


  • 1
Clear sky!

MF Rock collection.

#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 14 November 2013 - 01:13 PM

Mình cảm ơn các bạn nhiều.


  • 0

#7 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 14 November 2013 - 02:49 PM

...........

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.


  • 1