Phương pháp trích xuất đường cong kín từ CAD 3D vào CSV hoặc TXT


3

Tôi có dữ liệu kỹ thuật nổi lên từ các công trình phức tạp hơn hoặc ít hơn.

Trên cơ sở thường xuyên, tôi cần phác thảo từ dữ liệu xây dựng để thực hiện các tính toán hình học trên chúng. Dữ liệu xây dựng đến từ các gói CAD khác nhau (ví dụ: Inventor hoặc SolidWorks). Về cơ bản tôi cần một số đa giác kín nhất định được lưu trữ theo cách tôi có thể đọc nó bằng các phương thức nguyên thủy như các chương trình PERL được thiết kế cẩu thả.

Chỉnh sửa: Các đa giác là phẳng. Tức là dữ liệu tôi muốn xử lý là 2D. Về cơ bản, nó thường là một phác thảo của một đối tượng 3D, ví dụ như nhà ở.

Vì vậy, định dạng đầu vào ưa thích của tôi cho dữ liệu đa giác được trích xuất như vậy là tệp CSV hoặc văn bản thuần túy với bất kỳ dấu tách nào có sẵn.

Vì hầu hết CAD-SW có thể nhập Mô hình 3D được lưu trong BƯỚC, thực tế tôi có thể chọn phần mềm nào tôi sử dụng để lưu dữ liệu đa giác. Kết quả là, có lẽ tôi sẽ có các tệp DXF hoặc DWG, đây là các tệp CAD nguyên thủy nhất mà tôi có thể nhận được từ đó.

Điều này khiến tôi nhận được các đa giác của mình từ DXF chết tiệt đó vào một tệp CSV. Có ai có một cách (tốt nhất) dễ dàng để làm điều đó?

Phụ lục: Để làm rõ hơn, tôi mô tả nhiệm vụ của mình. Tôi phải thiết kế PCB phù hợp với vỏ có hình dạng kỳ lạ. Mặc dù EDA-sw của tôi thể hiện một thói quen khá hữu dụng để nhập dữ liệu DXF, nhưng trình tự động lập trình tự lập trình của tôi thì không. Vì vậy, trong tệp EDA của tôi, tôi có thể có một phác thảo đẹp, nhưng điều này không giúp tôi với việc đặt các thành phần bên trong đa giác đó. Do đó tôi cần dữ liệu đa giác riêng biệt trong autoplacer của tôi.


Bắt đầu bằng cách giải thích dữ liệu là gì, nó có phải là một bản vẽ phẳng không? Hay là một mô hình 3D? Nhưng, vâng, không có cách dễ dàng nào để làm điều này mà không sửa đổi hoàn toàn cách tiếp cận của bạn.
joojaa

Tại sao bạn không lưu hình học CAD vào tệp STL ASCII và sau đó bạn có thể dễ dàng chuyển đổi các đỉnh mặt thành danh sách dữ liệu csv?
Algo

@ Algo: Chưa bao giờ nghĩ về STL, vì tôi chưa sử dụng định dạng đó. Sẽ có một cái nhìn vào nó.
Ariser

@joojaa 2D. Thêm vào câu hỏi của tôi. Và đừng bận tâm đến cách tiếp cận của tôi. Tôi thích sử dụng các định dạng tệp liên quan đến Autodesk.
Ariser

Câu trả lời:


2

Có vẻ như bạn quan tâm đến một lát phẳng của mô hình CAD của bạn. Mặc dù bạn có thể sử dụng tệp 3D và tự cắt nó có vẻ hơi quá mức vì ứng dụng CAD hoàn toàn có khả năng thực hiện các lát cắt cho bạn.

nhanh chóng và hèn hạ

Ok, vì vậy mỗi CAD có chế độ vẽ 2D, bạn có thể lưu bản vẽ đó ra dxfhoặc pdfcả hai đều dễ phân tích. Nếu bạn không tìm thấy một công cụ tốt cho việc này, thì việc chuyển pdfthành svgcó thể dễ dàng hơn để phân tích cú pháp. Cách tiếp cận này cũng có thể được thực hiện nhanh chóng và bẩn thỉu bằng cách tận dụng các công cụ như Inkscape hoặc Illustrator. Hãy làm một ví dụ vì nó dễ làm:

nhập mô tả hình ảnh ở đây

Hình 1 : Bản vẽ xuất nhanh và bẩn dưới dạng pdf/ svgsau đó cô lập và đọc các điểm từ tệp đó Tôi đã sử dụng phiên bản sửa đổi công cụ này để kết xuất tọa độ từ đó pdf. Bạn sẽ có thể làm điều đó trong Perl một cách dễ dàng. dữ liệu có sẵn ở đây

Phương pháp đúng

Có thể truy cập cả SolidWorks và Inventor qua cầu COM để bạn có thể truy cập mô hình dữ liệu ứng dụng CAD trực tiếp từ mã Perl của mình. Điều này có một số lợi ích nhưng chủ yếu không cần phân tích các tệp trung gian. Bạn có thể chọn các cạnh có liên quan và chỉ cần di chuyển chúng trực tiếp từ CAD. Bây giờ tôi chỉ có quyền truy cập vào SolidWorks tại nơi làm việc nhưng cách tiếp cận tương tự hoạt động trong nhà phát minh như tôi đã làm.

Tôi đã có thêm thời gian tại nơi làm việc để làm một số VBAmã nhanh cho SolidWorks. Mã này lấy tất cả các dòng của một bản phác thảo kín, sắp xếp chúng thành đa giác (với thuật toán N ^ 2 ngây thơ) và in chúng trong VBAbảng điều khiển gỡ lỗi.

Option Explicit

Sub main()
    Dim swApp                   As SldWorks.SldWorks
    Dim swModel                 As SldWorks.ModelDoc2
    Dim swPart                  As SldWorks.PartDoc
    Dim swSelMgr                As SldWorks.SelectionMgr
    Dim swFeat                  As SldWorks.Feature
    Dim swSketch                As SldWorks.Sketch
    Dim numLines                As Long
    Dim vLines                  As Variant
    Dim dict                    As New Collection
    Dim i                       As Variant

    Set swApp = CreateObject("SldWorks.Application")
    Set swModel = swApp.ActiveDoc
    Set swPart = swModel
    Set swSelMgr = swModel.SelectionManager
    Set swFeat = swSelMgr.GetSelectedObject5(1)
    Set swSketch = swFeat.GetSpecificFeature2


    numLines = swSketch.GetLineCount2(1) 'Exclude crosshatch lines
    vLines = swSketch.GetLines2(1) 'Exclude crosshatch lines

    Dim startP, endP, line As Variant

    For i = 1 To numLines - 1
        line = Array(Array(vLines(12 * i + 6) * 1000, _
                           vLines(12 * i + 7) * 1000), _
                     Array(vLines(12 * i + 9) * 1000, _
                           vLines(12 * i + 10) * 1000))
        dict.Add (line)
    Next i

    startP = Array(vLines(6) * 1000, _
                   vLines(7) * 1000)
    endP = Array(vLines(9) * 1000, _
                 vLines(10) * 1000)

    pp startP
    pp endP

    For i = 1 To dict.Count - 1
        endP = NextPoint(dict, endP)
        pp endP
    Next i
End Sub

Sub pp(point As Variant)
    Debug.Print " " & Str(point(0)) & ", " & Str(point(1))
End Sub

Function NextPoint(dict As Collection, point As Variant) As Variant
    Dim i As Variant
    For i = 1 To dict.Count

        Dim data, startRP, endRP As Variant
        data = dict.Item(i)
        startRP = data(0)
        endRP = data(1)

        If endRP(0) = point(0) And endRP(1) = point(1) Then
            dict.Remove (i)
            NextPoint = startRP
            Exit Function
        End If
        If startRP(0) = point(0) And startRP(1) = point(1) Then
            dict.Remove (i)
            NextPoint = endRP
            Exit Function
        End If

    Next i
End Function

Vì vba đang gọi COM, bạn nên sử dụng mã ca, bạn có thể sử dụng gần như bất kỳ ngôn ngữ nào, ví dụ như perl thực hiện Win32 :: OLE có thể thực hiện công việc.

nhập mô tả hình ảnh ở đây

Hình 2 : Phần ví dụ với kết quả phác thảo một vòng đơn giản trong kết quả đầu ra này

Phần kết

Nếu bạn thực sự muốn xuất dữ liệu đa giác 3D và thực hiện cắt lát theo cách thủ công thì tôi sẽ xuất OBJ hoặc STL. Nhưng điều này sẽ nằm trong danh sách các cách tiếp cận của tôi chủ yếu vì tất cả các cách tiếp cận khác đều đơn giản hơn.


Tôi không thể đến máy trạm của mình một thời gian, nhưng đã thử giải pháp của bạn. Nó hoạt động tốt với các bản phác thảo đơn giản. Đi để thử các bộ phận phức tạp hơn, sớm.
Ariser
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.