Metoda ekstrakcji zamkniętej krzywej z 3D CAD do CSV lub TXT

3

Mam dane techniczne pochodzące z mniej lub bardziej skomplikowanych konstrukcji.

Regularnie potrzebuję konturów z danych konstrukcyjnych, aby wykonywać na nich obliczenia geometryczne. Dane konstrukcyjne pochodzą z różnych pakietów CAD (np. Inventor lub SolidWorks). Zasadniczo potrzebuję pewnych zamkniętych wielokątów przechowywanych w sposób, który mogę odczytać za pomocą prymitywnych metod, takich jak źle zaprojektowane programy PERL.

Edycja: Wieloboki są płaskie. To znaczy dane, które chcę przetwarzać, to 2D. Zasadniczo często jest to obrys obiektu 3D, np. Obudowy.

Tak więc moim ulubionym formatem wejściowym dla takich wyodrębnionych danych wielokąta jest plik CSV lub zwykły tekst z wszelkimi dostępnymi separatorami.

Ponieważ większość CAD-SW może importować modele 3D zapisane w STEP, praktycznie mogę wybrać oprogramowanie, którego używam do zapisania danych wielokąta. Rezultat jest taki, że prawdopodobnie skończę na plikach DXF lub DWG, które są najbardziej prymitywnymi plikami CAD, jakie mogę z tego uzyskać.

To pozostawia mnie z wyciąganiem moich wielokątów z tego cholernego DXF do pliku CSV. Czy ktoś ma (najlepiej) łatwy sposób, aby to zrobić?

Dodatek: Dla większego wyjaśnienia opisuję swoje zadanie. Muszę zaprojektować płytki drukowane, które ładnie pasują do obudów o dziwnych kształtach. Podczas gdy mój EDA-sw wykazuje dość przydatną procedurę importowania danych DXF, mój autoprogramujący autoplacer nie. Tak więc w moim pliku EDA mogę mieć ładny zarys, ale to nie pomaga mi w umieszczeniu komponentów wewnątrz tego wielokąta. Dlatego potrzebuję danych wielokąta osobno w moim autoplacerze.

Ariser
źródło
Zacznij od wyjaśnienia, jakie są dane, czy jest to płaski rysunek? A może to model 3D? Ale tak, nie ma banalnie łatwego sposobu na zrobienie tego bez całkowitej modyfikacji podejścia.
joojaa
Dlaczego nie zapisujesz geometrii CAD w pliku ASCII STL, a następnie możesz łatwo przekonwertować wierzchołki twarzy na listę danych csv?
Algo
@ Algo: Nigdy nie myślałem o STL, ponieważ nie użyłem jeszcze tego formatu. Spójrz na to.
Ariser
@joojaa 2D. Dodałem to do mojego pytania. I nie wspominając o moim podejściu. Uwielbiam korzystać z formatów plików związanych z programem Autodesk.
Ariser

Odpowiedzi:

2

Wygląda na to, że interesuje Cię płaski wycinek modelu CAD. Możesz użyć pliku 3D i pokroić go sam, co wydaje się nieco przesadne, ponieważ aplikacja CAD jest w stanie wykonać plasterki za Ciebie.

szybko i brudno

Ok, więc każdy CAD posiada tryb rysowania 2D, które można zapisać jako rysunek dxfalbo pdfoba są łatwe do analizowania. Jeśli nie uda Ci się znaleźć dobrego narzędzia do tego, zmień to pdfw, svgktóre może być łatwiejsze do przeanalizowania. Takie podejście można również wykonać szybko i brudno, wykorzystując takie narzędzia, jak Inkscape lub Illustrator. Zróbmy przykład, ponieważ jest to łatwe:

wprowadź opis zdjęcia tutaj

Obraz 1 : Szybki i brudny rysunek eksportu jako pdf/ svgnastępnie izoluj i odczytuj punkty z tego pliku, którego użyłem zmodyfikowanej wersji tego narzędzia, aby zrzucić współrzędne pdf. Powinieneś być w stanie łatwo to zrobić w Perlu. dane dostępne tutaj

Właściwa metoda

Możliwe jest uzyskanie dostępu zarówno do SolidWorks, jak i Inventor poprzez most COM, dzięki czemu można uzyskać dostęp do modelu danych aplikacji CAD bezpośrednio z kodu Perla. Ma to kilka zalet, ale w większości nie wymaga analizowania plików pośrednich. Możesz wybrać odpowiednie krawędzie i po prostu przejść je bezpośrednio z CAD. Teraz mam tylko dostęp do SolidWorks w pracy, ale podobne podejście działa w programie wynalazczym, tak jak to zrobiłem.

Miałem trochę czasu w pracy, aby zrobić szybki VBAkod dla SolidWorks. Kod pobiera wszystkie linie zamkniętego szkicu, sortuje je w kolejności wielokątów (z naiwnym algorytmem N ^ 2) i drukuje je w VBAkonsoli debugowania.

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

Ponieważ vba wywołuje COM, możesz użyć dowolnego kodu, na przykład perl implementuje Win32 :: OLE, który może wykonać to zadanie.

wprowadź opis zdjęcia tutaj

Rysunek 2 : Przykład części prostych wyników jednej pętli w szkicu tego wyjścia

Epilog

Jeśli naprawdę chcesz wyeksportować dane wielokąta 3D i wykonać cięcie ręczne, wyeksportuję OBJ lub STL. Byłoby to jednak znacznie niższe na mojej liście podejść, głównie dlatego, że wszystkie inne podejścia są prostsze.

joojaa
źródło
Przez pewien czas nie mogłem dotrzeć do mojej stacji roboczej, ale wypróbowałem twoje rozwiązanie. Działa dobrze z prostymi szkicami. Wkrótce wypróbujemy bardziej złożone części.
Ariser