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 dxf
albo pdf
oba są łatwe do analizowania. Jeśli nie uda Ci się znaleźć dobrego narzędzia do tego, zmień to pdf
w, svg
któ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:
Obraz 1 : Szybki i brudny rysunek eksportu jako pdf
/ svg
nastę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 VBA
kod 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 VBA
konsoli 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.
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.