Método para extraer la curva cerrada de CAD 3D en CSV o TXT

3

Tengo datos de ingeniería que surgen de construcciones más o menos complejas.

De manera regular, necesito esquemas de los datos de construcción para realizar cálculos geométricos en ellos. Los datos de construcción provienen de diferentes paquetes CAD (por ejemplo, Inventor o SolidWorks). Básicamente, necesito ciertos polígonos cerrados almacenados de manera que pueda leerlos con métodos primitivos como programas PERL descuidados.

Editar: los polígonos son planos. Es decir, los datos que quiero procesar son 2D. Básicamente, a menudo es un esquema de un objeto 3D, por ejemplo, una carcasa.

Entonces, mi formato de entrada favorito para dichos datos de polígonos extraídos es un archivo CSV o texto sin formato con los separadores disponibles.

Como la mayoría de CAD-SW puede importar modelos 3D guardados en STEP, prácticamente puedo elegir qué software usar para guardar los datos del polígono. El resultado es que probablemente terminaré teniendo archivos DXF o DWG, que son los archivos CAD más primitivos que puedo obtener de eso.

Esto me deja sacar mis polígonos de ese maldito DXF en un archivo CSV. ¿Alguien tiene una forma (preferiblemente) fácil de hacer eso?

Anexo: Para una mayor clarificación, describo mi tarea. Tengo que diseñar PCB que se adapten bien a las carcasas de formas extrañas. Si bien mi EDA-sw exhibe una rutina bastante utilizable para importar datos DXF, mi autoplacer autoprogramado no lo hace. Entonces, en mi archivo EDA, puedo tener un buen esquema, pero esto no me ayuda a colocar los componentes dentro de ese polígono. Por lo tanto, necesito los datos del polígono por separado en mi autoplacer.

Ariser
fuente
Comience explicando cuáles son los datos, ¿es un dibujo plano? ¿O es un modelo 3D? Pero sí, no hay una manera trivialmente fácil de hacer esto sin modificar su enfoque por completo.
joojaa
¿Por qué no guarda la geometría CAD en un archivo ASCII STL y luego puede convertir fácilmente los vértices de la cara en una lista de datos csv?
Algo
@Algo: Nunca pensé en STL, ya que todavía no he usado ese formato. Lo echaré un vistazo.
Ariser
@joojaa 2D. Agregué eso a mi pregunta. Y no importa mi enfoque. Me encanta crear cualquier uso de formatos de archivo relacionados con Autodesk.
Ariser

Respuestas:

2

Parece que está interesado en una porción plana de su modelo CAD. Si bien podría usar un archivo 3D y cortarlo usted mismo, parece un poco exagerado ya que la aplicación CAD es perfectamente capaz de hacer los cortes por usted.

rápido y sucio

Ok, entonces cada CAD tiene un modo de dibujo 2D, puede guardar ese dibujo como dxfo pdfambos son fáciles de analizar. Si no encuentras una buena herramienta para esto, conviértela pdfen algo svgque sea más fácil de analizar. Este enfoque también se puede hacer rápido y sucio aprovechando herramientas como Inkscape o Illustrator. Hagamos un ejemplo porque es fácil de hacer:

ingrese la descripción de la imagen aquí

Imagen 1 : Dibujo de exportación rápido y sucio como pdf/ svgluego aislar y leer puntos de ese archivo. Utilicé la versión modificada de esta herramienta para volcar coordenadas pdf. Deberías poder hacer eso en Perl fácilmente. datos disponibles aquí

Método adecuado

Es posible acceder a SolidWorks e Inventor a través de un puente COM para que pueda acceder al modelo de datos de aplicaciones CAD directamente desde su código Perl. Esto tiene varios beneficios, pero sobre todo no necesita analizar archivos intermedios. Puede seleccionar los bordes relevantes y solo recorrerlos directamente desde el CAD. Ahora solo tengo acceso a SolidWorks en el trabajo, pero un enfoque similar funciona en inventor como lo he hecho.

Tenía algo de tiempo extra en el trabajo para hacer un VBAcódigo rápido para SolidWorks. El código toma todas las líneas de un boceto cerrado, las ordena en orden de polígono (con un ingenuo algoritmo N ^ 2) y las imprime en la VBAconsola de depuración.

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

Como vba está llamando a COM, puede usar un código que puede usar casi cualquier idioma, por ejemplo, Perl implementa Win32 :: OLE que puede hacer el trabajo.

ingrese la descripción de la imagen aquí

Imagen 2 : La parte de ejemplo con un boceto simple de un bucle da como resultado esta salida

Epílogo

Si realmente desea exportar datos de polígonos 3D y hacer el corte manualmente, exportaría OBJ o STL. Pero esto estaría muy abajo en mi lista de enfoques, principalmente porque todos los demás enfoques son más simples.

joojaa
fuente
No pude llegar a mi estación de trabajo por algún tiempo, pero probé su solución. Funciona bien con bocetos simples. Voy a probar partes más complejas, pronto.
Ariser