ketxu 3004 Báo cáo bài đăng Đã đăng Tháng 12 14, 2018 @phantuhuongCũng đã lâu không thấy bác Hướng quay lại ngó diễn đàn ^^ Dạo này chắc đông học viên quá ^^ 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
KangKung 252 Báo cáo bài đăng Đã đăng Tháng 12 14, 2018 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
hung37cespk 0 Báo cáo bài đăng Đã đăng Tháng 12 16, 2018 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
KangKung 252 Báo cáo bài đăng Đã đăng Tháng 12 16, 2018 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: 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) 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
nguyenanh93 11 Báo cáo bài đăng Đã đăng Tháng 12 16, 2018 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: 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) 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. 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
ksxdTVC 2 Báo cáo bài đăng Đã đăng Tháng 12 17, 2018 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? 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
KangKung 252 Báo cáo bài đăng Đã đăng Tháng 12 17, 2018 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
nguyenanh93 11 Báo cáo bài đăng Đã đăng Tháng 12 17, 2018 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
ksxdTVC 2 Báo cáo bài đăng Đã đăng Tháng 12 18, 2018 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
anhcos 196 Báo cáo bài đăng Đã đăng Tháng 12 18, 2018 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: 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) 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: 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
KangKung 252 Báo cáo bài đăng Đã đăng Tháng 12 18, 2018 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
phantuhuong 227 Báo cáo bài đăng Đã đăng Tháng 12 29, 2018 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 :( " 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
phantuhuong 227 Báo cáo bài đăng Đã đăng Tháng 12 29, 2018 Vào lúc 14/12/2018 tại 14:15, ketxu đã nói: @phantuhuongCũng đã lâu không thấy bác Hướng quay lại ngó diễn đàn ^^ Dạo này chắc đông học viên quá ^^ Lâu nay dạy dỗ ai đâu em :) 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
tigerhn 0 Báo cáo bài đăng Đã đăng Tháng 2 13, 2019 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
tigerhn 0 Báo cáo bài đăng Đã đăng Tháng 2 15, 2019 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
LoVe_ActiveX_VBNET 0 Báo cáo bài đăng Đã đăng Tháng 2 3, 2021 Cái này ko liên quan gì đâu bạn 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
LoVe_ActiveX_VBNET 0 Báo cáo bài đăng Đã đăng Tháng 2 3, 2021 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
anhcos 196 Báo cáo bài đăng Đã đăng Tháng 2 19, 2021 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
Doan Van Ha 3210 Báo cáo bài đăng Đã đăng Tháng 5 20, 2021 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
cuongtk2 429 Báo cáo bài đăng Đã đăng Tháng 5 20, 2021 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(); } 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
Doan Van Ha 3210 Báo cáo bài đăng Đã đăng Tháng 5 20, 2021 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
cuongtk2 429 Báo cáo bài đăng Đã đăng Tháng 5 20, 2021 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. 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
Doan Van Ha 3210 Báo cáo bài đăng Đã đăng Tháng 5 20, 2021 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
cuongtk2 429 Báo cáo bài đăng Đã đăng Tháng 5 20, 2021 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
gia_bach 1558 Báo cáo bài đăng Đã đăng Tháng 5 21, 2021 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 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