Đến nội dung


Hình ảnh
- - - - -

Cách lấy tọa độ các đỉnh khi biết được đường bound


  • Please log in to reply
9 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 11 November 2013 - 02:49 PM

Chào các bạn,

Các bạn cho mình hỏi, sau khi mình lấy được đường bound của hình chữ nhật rồi. Thì có cách nào lấy được tọa độ của các đỉnh hình chữ nhật bằng .net không. Mình xin cảm ơn.


  • 1

#2 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 11 November 2013 - 03:56 PM

Cách thì có.

Nhưng bạn cần post code (project) của bạn lên forum thì mọi người mới có thể hướng dẫn được.

Hỏi chung chung như vậy không có ai giúp được đâu. (mắc công mọi người xả xì-trét rồi lại mang tiếng sỉ nhục gì gì đó ...)

 

Chú ý là đối với file cad cần saveAs xuống version Cad2007 hoặc 2004 cho những người ko cài Cad 2013 như bạn vẫn có thể đọc được.


  • 1

#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 11 November 2013 - 04:25 PM

Mình xin gửi project và file autocad. Vấn đề mới phát sinh là: Lúc đầu mình tự vẽ ra 1 hình bất kỳ(hình này được tạo ra từ 4 line hoặc nhiều hơn). Sau đó click chuột vào bên trong hình đó. Thì mình lấy được đường bound. Nhưng khi mình mở file autocad(Có đính kèm) thì lại không thể lấy được đường bound (Trong file autocad bao gồm nhiều hình được đánh số từ 1 đến...). Mình mong các bạn hướng dẫn cách lây toạ độ các đỉnh của các hình trong file này. Mình xin cảm ơn.


  • 1

#4 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 11 November 2013 - 08:59 PM

Vấn đề này mình nghĩ rất khó.Và đã tìm hiểu rất lâu nhưng vẫn chưa ra.


  • 1

#5 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 12 November 2013 - 09:48 AM

Mình xin gửi project và file autocad. Vấn đề mới phát sinh là: Lúc đầu mình tự vẽ ra 1 hình bất kỳ(hình này được tạo ra từ 4 line hoặc nhiều hơn). Sau đó click chuột vào bên trong hình đó. Thì mình lấy được đường bound. Nhưng khi mình mở file autocad(Có đính kèm) thì lại không thể lấy được đường bound (Trong file autocad bao gồm nhiều hình được đánh số từ 1 đến...). Mình mong các bạn hướng dẫn cách lây toạ độ các đỉnh của các hình trong file này. Mình xin cảm ơn.

..................

Hỏi hơi "ngu" một chút :

1. Sau khi lấy được đường bound, bạn có save file Cad lại không ?

2. Trong code bạn khai báo :

Dim ModelSpaceId As ObjectId = SymbolUtilityServices.GetBlockModelSpaceId(db)

nghĩa là bạn sẽ làm việc trên ModelSpace vậy thì chạy lệnh tst bạn cliclk chuột trong model hay Layout ?

Tôi đã test code của bạn, khi làm việc trên model thì tạo được đường boun.

Hãy thử chạy lại 1 lần nữa trên model xem sao ?

(nếu có ý định hỏi model hay layout là gì ? thì hãy học Cad trước khi lập trình)

 

3. Trong t/hợp muốn code lúc nào cũng làm việc được trên model lẫn layout thì sử dụng đoạn code sau :

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

        Dim ptpoint As New PromptPointOptions("Select point")
        ptpoint.AllowNone = False
        Dim ptResult As PromptPointResult = ed.GetPoint(ptpoint)
        If (ptResult.Status <> PromptStatus.OK) Then
            Return
        End If
        Dim collections As DBObjectCollection = ed.TraceBoundary(ptResult.Value, True)
        Using tx As Transaction = db.TransactionManager.StartTransaction()
            Dim btr As BlockTableRecord = tx.GetObject(db.CurrentSpaceId, OpenMode.ForWrite)
            For Each obj As DBObject In collections
                Dim ent As Entity = TryCast(obj, Entity)
                If ent IsNot Nothing Then
                    ' make the coler as red
                    ent.ColorIndex = 1
                    btr.AppendEntity(ent)
                    tx.AddNewlyCreatedDBObject(ent, True)
                End If
            Next
            tx.Commit()
        End Using
    End Sub

Dùng hàm sau khi chỉ cần xuất thông tin đường bao ra cửa sổ Cad   :

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

        Dim ptpoint As New PromptPointOptions("Select point")
        ptpoint.AllowNone = False
        Dim ptResult As PromptPointResult = ed.GetPoint(ptpoint)
        If (ptResult.Status <> PromptStatus.OK) Then
            Return
        End If
        Dim collections As DBObjectCollection = ed.TraceBoundary(ptResult.Value, True)
        Using tx As Transaction = db.TransactionManager.StartTransaction()
            For Each obj As DBObject In collections
                Dim pline As Polyline = TryCast(obj, Polyline)
                If pline IsNot Nothing Then
                    ed.WriteMessage(Environment.NewLine + "Diện tích boundary = " + pline.Area.ToString() _
                           + Environment.NewLine + "Số đỉnh = " + pline.NumberOfVertices.ToString() _
                           + Environment.NewLine + "Tọa độ các đỉnh :  ")
                    Dim i As Integer = 0
                    For i = 0 To pline.NumberOfVertices - 1
                        ed.WriteMessage(System.Environment.NewLine + pline.GetPoint2dAt(i).ToString())
                    Next
                End If
            Next
        End Using
    End Sub

PS: có mod nào đi qua, move bài này qua Topic : Lập trình điều khiển AutoCad từ bên ngoài giùm. Tks.

    <CommandMethod("read")> Public Sub Read()
        Dim doc As Document = Application.DocumentManager.MdiActiveDocument
        Dim db As Database = doc.Database
        Dim ed As Editor = doc.Editor
 
        Dim ptpoint As New PromptPointOptions("Select point")
        ptpoint.AllowNone = False
        Dim ptResult As PromptPointResult = ed.GetPoint(ptpoint)
        If (ptResult.Status <> PromptStatus.OK) Then
            Return
        End If
        Dim collections As DBObjectCollection = ed.TraceBoundary(ptResult.Value, True)
        Using tx As Transaction = db.TransactionManager.StartTransaction()
            For Each obj As DBObject In collections
                Dim pline As Polyline = TryCast(obj, Polyline)
                If pline IsNot Nothing Then
                    ed.WriteMessage(Environment.NewLine + "Diện tích boundary = " + pline.Area.ToString() _
                           + Environment.NewLine + "Số đỉnh = " + pline.NumberOfVertices.ToString() _
                           + Environment.NewLine + "Tọa độ các đỉnh :  ")
                    Dim i As Integer = 0
                    For i = 0 To pline.NumberOfVertices - 1
                        ed.WriteMessage(System.Environment.NewLine + pline.GetPoint2dAt(i).ToString())
                    Next
                End If
            Next
        End Using
 
    <CommandMethod("read")> Public Sub Read()
        Dim doc As Document = Application.DocumentManager.MdiActiveDocument
        Dim db As Database = doc.Database
        Dim ed As Editor = doc.Editor
 
        Dim ptpoint As New PromptPointOptions("Select point")
        ptpoint.AllowNone = False
        Dim ptResult As PromptPointResult = ed.GetPoint(ptpoint)
        If (ptResult.Status <> PromptStatus.OK) Then
            Return
        End If
        Dim collections As DBObjectCollection = ed.TraceBoundary(ptResult.Value, True)
        Using tx As Transaction = db.TransactionManager.StartTransaction()
            For Each obj As DBObject In collections
                Dim pline As Polyline = TryCast(obj, Polyline)
                If pline IsNot Nothing Then
                    ed.WriteMessage(Environment.NewLine + "Diện tích boundary = " + pline.Area.ToString() _
                           + Environment.NewLine + "Số đỉnh = " + pline.NumberOfVertices.ToString() _
                           + Environment.NewLine + "Tọa độ các đỉnh :  ")
                    Dim i As Integer = 0
                    For i = 0 To pline.NumberOfVertices - 1
                        ed.WriteMessage(System.Environment.NewLine + pline.GetPoint2dAt(i).ToString())
                    Next
                End If
            Next
        End Using

  • 1

#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 12 November 2013 - 11:46 AM

 Sau khi lấy được đường bound, bạn có save file Cad lại không ?

Không bạn. Mình chỉ truy xuất thông tin và việc lưu file cad chỉ thực hiện khi mình đánh số cho từng hình trong file(Như bạn đã thấy).

 

Trong code bạn khai báo :

 

Dim ModelSpaceId As ObjectId = SymbolUtilityServices.GetBlockModelSpaceId(db)

nghĩa là bạn sẽ làm việc trên ModelSpace vậy thì chạy lệnh tst bạn cliclk chuột trong model hay Layout ?

Tôi đã test code của bạn, khi làm việc trên model thì tạo được đường boun.

Hãy thử chạy lại 1 lần nữa trên model xem sao ?

Mình muốn làm cả 2. 

Mình có thắc mắc. Trong file autocad. Có một sô hình vuông bị một vài đường thẳng cắt ngang. Những đường thẳng này thuộc layer khác. Vậy có cách nào thực hiện cho các các hình cùng thuộc 1 layer không. Nghĩa là khi click vào những hình đó thì những đường thẳng kia không bị ảnh hưởng gì. Mình xin cảm ơn.


  • 1

#7 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 12 November 2013 - 01:47 PM

....

Mình có thắc mắc. Trong file autocad. Có một sô hình vuông bị một vài đường thẳng cắt ngang. Những đường thẳng này thuộc layer khác. Vậy có cách nào thực hiện cho các các hình cùng thuộc 1 layer không. Nghĩa là khi click vào những hình đó thì những đường thẳng kia không bị ảnh hưởng gì. Mình xin cảm ơn.

Vấn đề này liên quan đến kỹ năng drafting trong Cad.

Các lệnh Cad liên quan : Layfrz, layoff, layiso ..

bạn có thể tìm hiểu các bài viết về tính năng của các lệnh này trong CadViet.


  • -1

#8 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 12 November 2013 - 02:10 PM

Mình xin cảm ơn bạn.


  • 0

#9 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 18 November 2013 - 09:39 AM

Bạn gia_bach  cho mình hỏi chút. Cái đoạn code của bạn mình chạy khá tốt trên model nhưng khi trên layout. Nó lại không chạy được. Có phải do cái file autocad của mình không. Mong bạn giải đáp giúp mình. Mình xin cảm ơn.


  • 1

#10 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 18 November 2013 - 11:19 AM

Bạn gia_bach  cho mình hỏi chút. Cái đoạn code của bạn mình chạy khá tốt trên model nhưng khi trên layout. Nó lại không chạy được. Có phải do cái file autocad của mình không. Mong bạn giải đáp giúp mình. Mình xin cảm ơn.

Không phải là "trên Layout không chạy được", chính xác phải là "trên Layout đôi khi không chạy được"

 

Khi chạy trên Layout : 

- code trên "chỉ chạy được" khi đối tượng cần lấy đường bao thuộc Layout đang active.

- t/hợp đối tượng cần lấy đường bao nằm trên Model thì không chạy được.

 

Khi chạy trên Model, vì chỉ  "nhìn thấy" các đối tượng trên Model và không "nhìn thấy" các đối tượng trên Layout  nên "xem như" lúc nào cũng lấy được đường bao.

 

Qui luật này tương tự như lệnh Hatch.


  • 1