Chuyển đến nội dung
Diễn đàn CADViet
anhcos

Hướng dẫn lập trình với AutoCAD bằng VB.NET

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

Tôi có một chương trình khi chạy sẽ list các file bản vẽ đang mở trong CAD. Nếu người dùng đóng một file bất kì hoặc tắt AutoCAD đi thì làm sao để hiển thị thông báo sang phần mềm được? Bác nào biết chỉ giùm cách với. 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
Vào lúc 14/12/2018 tại 22:55, KangKung đã nói:

Tôi có một chương trình khi chạy sẽ list các file bản vẽ đang mở trong CAD. Nếu người dùng đóng một file bất kì hoặc tắt AutoCAD đi thì làm sao để hiển thị thông báo sang phần mềm được? Bác nào biết chỉ giùm cách với. Thanks.

thông qua thuộc tính IsReadOnly của document bạn có thể biết bản vẽ có được mở hay không mà

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
8 giờ trước, hung37cespk đã nói:

thông qua thuộc tính IsReadOnly của document bạn có thể biết bản vẽ có được mở hay không mà

Vấn đề là như này bác ơi:

1. Chạy một App được viết bằng VB.net ( .exe )

2. Link App với AutoCAD (CAD đã mở từ trước) thì toàn bộ bản vẽ đang mở trong AutoCAD sẽ được list trong combobox như hình dưới:

 

Untitled.png.37e0c792f2eca7aeef4d48b2f1433347.png

3. Nếu người dùng đóng 1 file bất kì trong CAD (ví dụ đóng file "Drawing5.dwg" bằng phần mềm AutoCAD) thì làm sao để combobox tự động update như hình dưới. (App tự động update ngay khi có sự kiện nào ở AutoCAD như đóng file hoặc đóng phần mềm AutoCAD)

 222.png.c058c8895e526a88e1f2f29537fd694b.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
1 giờ trước, KangKung đã nói:

Vấn đề là như này bác ơi:

1. Chạy một App được viết bằng VB.net ( .exe )

2. Link App với AutoCAD (CAD đã mở từ trước) thì toàn bộ bản vẽ đang mở trong AutoCAD sẽ được list trong combobox như hình dưới:

 

Untitled.png.37e0c792f2eca7aeef4d48b2f1433347.png

3. Nếu người dùng đóng 1 file bất kì trong CAD (ví dụ đóng file "Drawing5.dwg" bằng phần mềm AutoCAD) thì làm sao để combobox tự động update như hình dưới. (App tự động update ngay khi có sự kiện nào ở AutoCAD như đóng file hoặc đóng phần mềm AutoCAD)

 222.png.c058c8895e526a88e1f2f29537fd694b.png

https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2017/ENU/AutoCAD-NET/files/GUID-F432E285-8B94-4ACD-A186-89E1218DEC07-htm.html

 

Bạn thực hiện bắt event BeginDocumentClose. Khi event này được trigger thì loại bỏ tên file đó trong dropdownlist của bạ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
13 giờ trước, nguyenanh93 đã nói:

https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2017/ENU/AutoCAD-NET/files/GUID-F432E285-8B94-4ACD-A186-89E1218DEC07-htm.html

 

Bạn thực hiện bắt event BeginDocumentClose. Khi event này được trigger thì loại bỏ tên file đó trong dropdownlist của bạn.

Theo như mình hiểu thì chương trình bác ấy viết là chương trình ngoài AutoCAD, kết nối với CAD thông qua COM API.
Như vậy có thể bắt được sự kiện của bản vẽ không?

  • 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

Hiện tại thì tôi đang dùng Me.Acticvated ( thêm Me.MouseEnter nữa) để update cái List bản vẽ trong App. Hơi thủ công tí nhưng dùng tốt khi chưa biết cách bắt sự kiện trên bản vẽ.

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
8 giờ trước, ksxdTVC đã nói:

Theo như mình hiểu thì chương trình bác ấy viết là chương trình ngoài AutoCAD, kết nối với CAD thông qua COM API.
Như vậy có thể bắt được sự kiện của bản vẽ không?

Sorry vì đọc ko kĩ :D

Về vấn đề này thì phải xây dựng một Inter-process Communication giữa 2 chương trình. Cái này khá khó và không biết VB.NET có hỗ trợ không. Một cách đơn giản hơn thì xây dựng chương trình đọc dữ liệu từ port. Khi AutoCAD trigger sự kiện đóng bản vẽ hoặc đóng AutoCAD thì send 1 tín hiệu đến cổng bất kì (1002 chẳng hạn). Chương trình .exe lấy thông tin từ cổng đó để xử lý. Về cơ bản thì cả 2 cách đều tốn công cả. C# hoặc C++ hỗ trợ tốt hơn VB.NET

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ách này cũng được rồi nè, không thì cứ thêm 1 nút refresh, mỗi lần qua form thì nhấn nút cho nó load lại danh sách. :D

18 giờ trước, KangKung đã nói:

Hiện tại thì tôi đang dùng Me.Acticvated ( thêm Me.MouseEnter nữa) để update cái List bản vẽ trong App. Hơi thủ công tí nhưng dùng tốt khi chưa biết cách bắt sự kiện trên bản vẽ.

 

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
Vào lúc 16/12/2018 tại 20:05, KangKung đã nói:

Vấn đề là như này bác ơi:

1. Chạy một App được viết bằng VB.net ( .exe )

2. Link App với AutoCAD (CAD đã mở từ trước) thì toàn bộ bản vẽ đang mở trong AutoCAD sẽ được list trong combobox như hình dưới:

 

Untitled.png.37e0c792f2eca7aeef4d48b2f1433347.png

3. Nếu người dùng đóng 1 file bất kì trong CAD (ví dụ đóng file "Drawing5.dwg" bằng phần mềm AutoCAD) thì làm sao để combobox tự động update như hình dưới. (App tự động update ngay khi có sự kiện nào ở AutoCAD như đóng file hoặc đóng phần mềm AutoCAD)

 222.png.c058c8895e526a88e1f2f29537fd694b.png

 

Cái này thì dễ, bác cứ theo sự kiện DropDown của ComboBox mà lấy lại danh sách bản vẽ đang mở từ AutoCAD thôi.

 

Chào các bác, dạo này mình chuyển sang lập trình phần mềm CAM và dùng sử dụng giao diện cad riêng nên ít dùng vb với AutoCAD nữa.

AutoCAD mình giờ chỉ dùng vẽ các bản vẽ đơn giản.

 

VD như phần mềm CAM dùng cho máy tiện gỗ 2 dao:

 

  • Like 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
8 giờ trước, anhcos đã nói:

 

Cái này thì dễ, bác cứ theo sự kiện DropDown của ComboBox mà lấy lại danh sách bản vẽ đang mở từ AutoCAD thôi.

 

Vấn đề là tôi muốn App cập nhật ngay khi người dùng đóng bản vẽ. Nếu dùng sự kiện DropDown của ComboBox thì App chỉ update khi người dùng di chuột vào ComboBox và nó còn xảy ra chậm hơn sự kiện Me.Activated và Me.MouseEnter mà tôi đang dùng.

 

19 giờ trước, ksxdTVC đã nói:

Cách này cũng được rồi nè, không thì cứ thêm 1 nút refresh, mỗi lần qua form thì nhấn nút cho nó load lại danh sách. :D

 

Cách này thì còn thủ công hơn nữa.

 

Cảm ơn các bác đã góp ý.

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
Vào lúc 13/12/2018 tại 15:47, Danh Cong đã nói:

Giờ mới biết bác là chủ trì khảo sát  công trình này   :))))

" Em chỉ là nhân viên thiết kế cầu  mà thôi :(   "

 

 

PTH.jpg

 

Hắn làm thì ít, bịa là chính :)

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
Vào lúc 18/12/2018 tại 21:18, anhcos đã nói:

 

Cái này thì dễ, bác cứ theo sự kiện DropDown của ComboBox mà lấy lại danh sách bản vẽ đang mở từ AutoCAD thôi.

 

Chào các bác, dạo này mình chuyển sang lập trình phần mềm CAM và dùng sử dụng giao diện cad riêng nên ít dùng vb với AutoCAD nữa.

AutoCAD mình giờ chỉ dùng vẽ các bản vẽ đơn giản.

 

VD như phần mềm CAM dùng cho máy tiện gỗ 2 dao:

 

Cái "giao diện cad riêng" là thế nào vậy bác?

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
Vào lúc 11/2/2017 tại 00:31, anhcos đã nói:
Giới thiệu các bác phần mềm sắp lỗ khuôn ép đùn mình viết bằng VB+C# nhé.

 

Trong đó cốt lõi vẫn là giao diện cad của riêng mình, thực hiện được các lệnh cơ bản như acad, hỗ trợ nhập liệu từ bàn phím...

 

 

 

 

 

 

Bác Pro quá, hình như bác dùng CAD .NET?

Cái đó có đầy đủ bộ lệnh như AutoCAD không bác?

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
Vào lúc 9/3/2015 tại 21:34, hotrung đã nói:

 Các bác chỉ với em với, trong đoạn code dưới đây của bác anhcos là select các đối tượng trên màn hình, nhưng em chỉ muốn select các đối tượng là Line hoặc Polyline thôi  thì phải làm thế nào ạ? Và sau khi select xong, em muốn lấy các thông số Startpoint, Endpoint, vector pháp tuyến của từng Line thì phải làm thế nào ạ? Cái này em mới tìm hiểu mà tìm mãi chẳng thấy chỗ nào các bác nói đến cả, mong các bác giúp đỡ.

 

 Private Sub cmdSelectObject_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSelectObject.Click

 

        If ACADLink() Then

            Try

                Dim dwg As Object = Acad.ActiveDocument

 

                Try

                    SelSet = dwg.SelectionSets.Add("anhcos")

                Catch

                    SelSet = dwg.SelectionSets.Item("anhcos")

                End Try

                SelSet.Clear()

 

                AppActivate(Acad.Caption)

 

                SelSet.SelectOnScreen()

 

                ObjIndex = 0

                Vịtríđốitượngtrongtậpchọn()

 

                AppActivate(Me.Text)

                pgObject.SelectedObject = SelSet.Item(ObjIndex)

 

 

            Catch

                ObjIndex = -1

            End Try

        End If

    End Sub

Mình hướng dẫn bạn một chút về cách lấy thông tin của 1 đối tượng hình học trong cad nhé. Các đối tượng khác thì bạn tự suy nghĩ thêm, cũng tương tự thôi.

Sau khi bạn dùng phương thức selectionOnscreen. Bạn dùng vòng lặp để xét đến đối tượng cần lấy thông tin:

For each object_cad in Object_Select

if Object_cad.ObjectName = "AcdbLine" then ' Lấy thông số đối tượng Line

Dim ToadoDau( 0 to 2) as double

Dim Toadocuoi( 0 to 2) as double

Dim Layer_line as layer

toadodau(0) =Object_cad.startPoint.Coordinates(0)

toadodau(1) =Object_cad.startPoint.Coordinates(1)

toadocuoi(0) =Object_cad.EndPoint.Coordinates(0)

toadocuoi(1) =Object_cad.EndPoint.Coordinates(1)

Layer_line= Object_cad.layer

end if

Next

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

Duyệt qua từng đối tượng là cách cơ bản, rồi, tuy nhiên tốc độ rất chậm, nếu cỡ 200 đối tượng trở lên thì còn chậm nữa.

Nên giải pháp là phải dùng filter cùng với SelectionSet trước khi chọn đối tượng để lọc bớt số lượng ngay từ đầu.

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

Mới nghiên cứu vb.net nên rất gà mờ trong việc tạo 1 hàm để vẽ 1 spline 3D đi qua 1 list points đã biết.

Bài toán như sau: cho 1 list points đã biết, hãy tạo hàm vẽ spline 3d đi qua các điểm của list points đó. Hoặc 3dpolyline cũng được.

Bác nào biết giúp cho vài dòng code để ngâm cứu. 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
38 phút trước, Doan Van Ha đã nói:

Mới nghiên cứu vb.net nên rất gà mờ trong việc tạo 1 hàm để vẽ 1 spline 3D đi qua 1 list points đã biết.

Bài toán như sau: cho 1 list points đã biết, hãy tạo hàm vẽ spline 3d đi qua các điểm của list points đó. Hoặc 3dpolyline cũng được.

Bác nào biết giúp cho vài dòng code để ngâm cứu. Thanks!

 

hàm MakeSplineCV(Point3d[] pts) nhé bác, pts là array, nếu bác dùng list để add pts thì đổi sang bằng pts.ToArray()

 

/// <summary>
        /// Creates a spline by control points.
        /// </summary>
        /// <param name="points">The control points.</param>
        /// <param name="closed">Whether to close the spline.</param>
        /// <returns>The result.</returns>
        public static Spline SplineCV(Point3d[] points, bool closed = false)
        {
            var controlPoints = new Point3dCollection(points);
            DoubleCollection knots;
            DoubleCollection weights;
            if (!closed)
            {
                knots = new DoubleCollection(Enumerable.Range(0, points.Length - 2).Select(index => (double)index).ToArray());
                knots.Insert(0, 0);
                knots.Insert(0, 0);
                knots.Insert(0, 0);
                knots.Add(points.Length - 3);
                knots.Add(points.Length - 3);
                knots.Add(points.Length - 3);
                weights = new DoubleCollection(Enumerable.Repeat(1, points.Length).Select(index => (double)index).ToArray());
            }
            else
            {
                controlPoints.Add(points[0]);
                controlPoints.Add(points[1]);
                controlPoints.Add(points[2]);
                knots = new DoubleCollection(Enumerable.Range(0, points.Length + 7).Select(index => (double)index).ToArray());
                weights = new DoubleCollection(Enumerable.Repeat(1, points.Length + 3).Select(index => (double)index).ToArray());
            }

            return new Spline(
                degree: 3,
                rational: true,
                closed: closed,
                periodic: closed,
                controlPoints: controlPoints,
                knots: knots,
                weights: weights,
                controlPointTolerance: 0,
                knotTolerance: 0);
        }

/// <summary>
        /// Adds an entity to current space.
        /// </summary>
        /// <param name="entity">The entity to add.</param>
        /// <param name="db">The database.</param>
        /// <returns>The objected IDs.</returns>
        public static ObjectId AddToCurrentSpace(this Entity entity, Database db = null)
        {
            db = db ?? HostApplicationServices.WorkingDatabase;
            using (var trans = db.TransactionManager.StartTransaction())
            {
                 var currentSpace = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, false);
                var id = currentSpace.AppendEntity(entity);
                trans.AddNewlyCreatedDBObject(entity, true);
                trans.Commit();
                return id;
            }
        }

        /// <summary>
        /// Draws a spline by control points.
        /// </summary>
        /// <param name="points">The control points.</param>
        /// <param name="closed">Whether to close the spline.</param>
        /// <returns>The object ID.</returns>
        public static ObjectId MakeSplineCV(Point3d[] points, bool closed = false)
        {
            return SplineCV(points, closed).AddToCurrentSpace();
        }

  • 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
6 phút trước, cuongtk2 đã nói:

 

Ui, thanks. Nhưng tui cần kiểu như này bạn ơi
'' This example creates a circle in Model space using three points (0, 0, 0), (5, 5, 0), and (10, 0, 0). The spline has start and end tangents of (0.5, 0.5, 0.0).
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
<CommandMethod("AddSpline")> _
Public Sub AddSpline()
  '' Get the current document and database
  Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  Dim acCurDb As Database = acDoc.Database
  '' Start a transaction
  Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
      '' Open the Block table for read
      Dim acBlkTbl As BlockTable
      acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
      '' Open the Block table record Model space for write
      Dim acBlkTblRec As BlockTableRecord
      acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
                                      OpenMode.ForWrite)
      '' Define the fit points for the spline
      Dim ptColl As Point3dCollection = New Point3dCollection()
      ptColl.Add(New Point3d(0, 0, 0))
      ptColl.Add(New Point3d(5, 5, 0))
      ptColl.Add(New Point3d(10, 0, 0))
      '' Get a 3D vector from the point (0.5,0.5,0)
      Dim vecTan As Vector3d = New Point3d(0.5, 0.5, 0).GetAsVector
      '' Create a spline through (0, 0, 0), (5, 5, 0), and (10, 0, 0) with a start and end tangency of (0.5, 0.5, 0.0)
      Dim acSpline As Spline = New Spline(ptColl, vecTan, vecTan, 4, 0.0)
      acSpline.SetDatabaseDefaults()
      '' Add the new object to the block table record and the transaction
      acBlkTblRec.AppendEntity(acSpline)
      acTrans.AddNewlyCreatedDBObject(acSpline, True)
      '' Save the new object to the database
      acTrans.Commit()
  End Using
End Sub
 

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

Bác mới học thì đổi qua C# đi. Tài liệu về C# nhiều hơn VBnet, em cũng mới học được gần năm, dùng tàm tạm.

 

  • 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
7 phút trước, cuongtk2 đã nói:

Bác mới học thì đổi qua C# đi. Tài liệu về C# nhiều hơn VBnet, em cũng mới học được gần năm, dùng tàm tạm.

 

Thanks! Một góp ý tốt. Tài liệu vb.net tìm đỏ cả mắt. C# thì nhiều hơn. Suy nghĩ lại!

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

Trong VS, bác chỉ chuột vào chữ "Spline" rồi ấn F12 sẽ ra các overwrite của định nghĩa hàm này, xem qua thì có 7 cách dùng cho Spline

public Spline(Point3dCollection point, int order, double fitTolerance);
        public Spline(Point3dCollection fitPoints, KnotParameterizationEnum knotParam, int degree, double fitTolerance);
        public Spline(Point3dCollection fitPoints, bool isPeriodic, KnotParameterizationEnum knotParam, int degree, double fitTolerance);
        public Spline(Point3dCollection point, Vector3d startTangent, Vector3d endTangent, int order, double fitTolerance);
        public Spline(Point3dCollection fitPoints, Vector3d startTangent, Vector3d endTangent, KnotParameterizationEnum knotParam, int degree, double fitTolerance);
        public Spline(Point3d center, Vector3d unitNormal, Vector3d majorAxis, double radiusRatio, double startAngle, double endAngle);
        public Spline(int degree, bool rational, bool closed, bool periodic, Point3dCollection controlPoints, DoubleCollection knots, DoubleCollection weights, double controlPointTolerance, double knotTolerance);
        protected internal Spline(IntPtr unmanagedObjPtr, bool autoDelete);

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

Bác Hạ tham khảo code này:

    ' draw a spline from points
    <CommandMethod("AddSpline_HA")>
    Public Sub AddSpline_HA()
        Dim doc As Document = Application.DocumentManager.MdiActiveDocument
        Dim db As Database = doc.Database
        Dim ed As Editor = doc.Editor

        Dim tvArr(0) As TypedValue
        tvArr.SetValue(New TypedValue(DxfCode.Start, "point"), 0)

        Dim filter As SelectionFilter = New SelectionFilter(tvArr)
        Dim pso As PromptSelectionOptions = New PromptSelectionOptions()
        pso.MessageForAdding = "Select points to add a spline"

        'Get a selection
        Dim result As PromptSelectionResult = ed.GetSelection(pso, filter)
        If result.Status <> PromptStatus.OK Then
            Return
        End If

        '' Start a transaction
        Using tr As Transaction = db.TransactionManager.StartTransaction()
            Dim ptColl As Point3dCollection = New Point3dCollection()

            Dim ss As SelectionSet = result.Value
            For Each sob As SelectedObject In ss
                Dim pointObj As DBPoint = DirectCast(tr.GetObject(sob.ObjectId, OpenMode.ForRead), DBPoint)
                Dim pos As Point3d = pointObj.Position
                If Not ptColl.Contains(pos) Then
                    ptColl.Add(pos)
                End If
            Next

            '' Open the Block table for write
            Dim currentSpace As BlockTableRecord = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite)

            '' Get a 3D vector from the point (0.5,0.5,0)
            Dim vecTan As Vector3d = New Point3d(0.5, 0.5, 0).GetAsVector

            '' Create a spline with a start and end tangency of (0.5, 0.5, 0.0)
            Dim spline As Spline = New Spline(ptColl, vecTan, vecTan, 4, 0.0)
            spline.ColorIndex = 1
            '' Add the new object to the block table record and the transaction
            currentSpace.AppendEntity(spline)
            tr.AddNewlyCreatedDBObject(spline, True)


            ' other constructor
            spline = New Spline(ptColl, 4, 0.0)
            spline.ColorIndex = 4
            currentSpace.AppendEntity(spline)
            tr.AddNewlyCreatedDBObject(spline, True)

            tr.Commit()
        End Using
    End Sub

 

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

×