Problem beim importieren einer dxf Datei in Freecad

In diesem Forum Fragen und Diskussionen in Deutsch
Forum rules
Foren-Regeln und hilfreiche Informationen

WICHTIG: Bitte zuerst lesen, bevor Sie posten
Hutiet
Posts: 1
Joined: Fri Mar 13, 2020 6:43 pm
Location: Frankfurt

Problem beim importieren einer dxf Datei in Freecad

Post by Hutiet »

Hallo,
ich möchte meine dxf Dateien gerne in "3D" sehen. Habe seit einiger Zeit die neuste Version von FreeCad auf dem PC. Nun wollte ich einfach mal eine dxf importieren. Leider bekomme ich das nicht hin. Wenn ich die dxf öffne, erscheint unten in der Leiste eine kurze Fehlermeldung die den aktuellen dxf Dateipfad beinhaltet und das Fenster bleibt aber leer.
Habe es mit mehreren Dateien probiert.
Immer das selbe Spiel.

Kann mir da jemand helfen?

Oder gibts nen Tip für ein anderes Freeware Proggi zum darstellen?

Vielen Dank
Last edited by Roy_043 on Mon Dec 25, 2023 9:17 am, edited 3 times in total.
Reason: Removed spam link
Michael
chrisb
Veteran
Posts: 53919
Joined: Tue Mar 17, 2015 9:14 am

Re: Problem beim importieren einer dxf Datei in Freecad

Post by chrisb »

FreeCAD importiert so weit ich weiß nur 2D dxf, vielleicht liegt's daran.

Was ist ein Proggi?
A Sketcher Lecture with in-depth information is available in English, auf Deutsch, en français, en español.
wega
Posts: 347
Joined: Mon Nov 11, 2013 3:13 pm

Re: Problem beim importieren einer dxf Datei in Freecad

Post by wega »

Hallo zusammen,

die Aussage, dasz DXF nur 2D importiert ist nicht ganz richtig.
Durchaus kann DXF auch 3D-Daten speichern und es gibt Programme,
die diese 3D-Daten auch importieren können.
Mir sind folgende CAD-Programme bekannt, die dies können.

a) TurboCAD
b) SpaceClaim

Mit Gruß
Werner
chrisb
Veteran
Posts: 53919
Joined: Tue Mar 17, 2015 9:14 am

Re: Problem beim importieren einer dxf Datei in Freecad

Post by chrisb »

wega wrote: Sat Mar 14, 2020 10:58 pm die Aussage, dasz DXF nur 2D importiert ist nicht ganz richtig.
Durchaus kann DXF auch 3D-Daten speichern und es gibt Programme,
die diese 3D-Daten auch importieren können.
Mir sind folgende CAD-Programme bekannt, die dies können.
Ich meinte nicht das dxf-Format an sich, sondern FreeCAD. Kann jemand das bestätigen - oder widerlegen -, dass FreeCAD dxf nur 2D importiert?
A Sketcher Lecture with in-depth information is available in English, auf Deutsch, en français, en español.
User avatar
Gift
Posts: 769
Joined: Tue Aug 18, 2015 10:08 am
Location: Germany, Sauerland

Re: Problem beim importieren einer dxf Datei in Freecad

Post by Gift »

Gibt es eine Beispieldatei?
jeno
Veteran
Posts: 1820
Joined: Sun Jun 29, 2014 10:41 am

Re: Problem beim importieren einer dxf Datei in Freecad

Post by jeno »

chrisb wrote: Sun Mar 15, 2020 6:18 am
wega wrote: Sat Mar 14, 2020 10:58 pm die Aussage, dasz DXF nur 2D importiert ist nicht ganz richtig.
Durchaus kann DXF auch 3D-Daten speichern und es gibt Programme,
die diese 3D-Daten auch importieren können.
Mir sind folgende CAD-Programme bekannt, die dies können.
Ich meinte nicht das dxf-Format an sich, sondern FreeCAD. Kann jemand das bestätigen - oder widerlegen -, dass FreeCAD dxf nur 2D importiert?
Wenn man in das zu Grunde liegende Import-Modul reinschaut dann werden nur 3D-Mesh unterstützt. Der interessantere Teil sind Daten des ACIS-Geometriekerns. Die Beschreibung ist seit um 2000 nicht mehr öffentlich zugänglich. Da hat Dassault die Hand drauf. Autodesk hat auf der Basis ACIS dann unabhängig weiterentwickelt (ShapeManager).
Auch das war und ist nicht öffentlich.
So gesehen könnte Freecad auch 3D-Daten aus dxf lesen, aber es wären nur Meshs. Das dürfte recht selten in dxf stecken. Es hätte allerdings keinen Vorteil gegenüber stl oder ply.

Mit freundlichen
UR_
Veteran
Posts: 1354
Joined: Tue Jan 03, 2017 8:42 pm

Re: Problem beim importieren einer dxf Datei in Freecad

Post by UR_ »

Beispieldatei:

sample area - sphere surface.DXF
(147.76 KiB) Downloaded 25 times
Screenshot 001.png
Screenshot 001.png (22.12 KiB) Viewed 1202 times

Importeinstellungen:

Screenshot 002.png
Screenshot 002.png (117.34 KiB) Viewed 1202 times

benutzte version:
OS: Windows 10 (10.0)
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.19.19758 (Git)
Build type: Release
Branch: master
Hash: c165edd52c7f06ac09f992e5b5bf1d37661a8c0f
Python version: 3.7.3
Qt version: 5.12.5
Coin version: 4.0.0a
OCC version: 7.3.0
Locale: German/Germany (de_DE)
chrisb
Veteran
Posts: 53919
Joined: Tue Mar 17, 2015 9:14 am

Re: Problem beim importieren einer dxf Datei in Freecad

Post by chrisb »

Danke für die Info.
A Sketcher Lecture with in-depth information is available in English, auf Deutsch, en français, en español.
jeno
Veteran
Posts: 1820
Joined: Sun Jun 29, 2014 10:41 am

Re: Problem beim importieren einer dxf Datei in Freecad

Post by jeno »

chrisb wrote: Sun Mar 15, 2020 8:26 am Danke für die Info.
Gerne. Noch ergänzt: Alles was Shapemanager oder ACIS als Geometriekern hat dürfte mit 3D-DXF umgehen können.
Hutiet wrote: Sat Mar 14, 2020 9:38 pm ...
Oder gibts nen Tip für ein anderes Freeware Proggi zum darstellen?
Von Autodesk gibt es kostenlose Viewer und der edrawings-viewer wird vermutlich auch damit klarkommen.
Ich kann beides nicht testen, da kein Windows.

Mit freundlichen
User avatar
Gift
Posts: 769
Joined: Tue Aug 18, 2015 10:08 am
Location: Germany, Sauerland

Re: Problem beim importieren einer dxf Datei in Freecad

Post by Gift »

UR_ wrote: Sun Mar 15, 2020 8:26 am Beispieldatei:


sample area - sphere surface.DXF


Screenshot 001.png


Importeinstellungen:


Screenshot 002.png


benutzte version:
OS: Windows 10 (10.0)
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.19.19758 (Git)
Build type: Release
Branch: master
Hash: c165edd52c7f06ac09f992e5b5bf1d37661a8c0f
Python version: 3.7.3
Qt version: 5.12.5
Coin version: 4.0.0a
OCC version: 7.3.0
Locale: German/Germany (de_DE)
Die DXF-Datei enthält einfach nur Flächen mit 3 Punkten. Ich hatte mal eine einfache DXF-Lib mit numpy gebastelt. Wenn du Konsole kopierst, kannst du die nachfolgenden Schritt testen:

1. fc_dxflib.py

Code: Select all

# a FreeCAD Library 

#***************************************************************************
#*   (c) Benjamin Alterauge (gift) 2018 - 2019                             *   
#*                                                                         *
#*   This file is part of the FreeCAD CAx development system.              *
#*                                                                         *
#*   This program is free software; you can redistribute it and/or modify  *
#*   it under the terms of the GNU Lesser General Public License (LGPL)    *
#*   as published by the Free Software Foundation; either version 2 of     *
#*   the License, or (at your option) any later version.                   *
#*   for detail see the LICENCE text file.                                 *
#*                                                                         *
#*   FreeCAD is distributed in the hope that it will be useful,            *
#*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
#*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
#*   GNU Lesser General Public License for more details.                   *
#*                                                                         *
#*   You should have received a copy of the GNU Library General Public     *
#*   License along with FreeCAD; if not, write to the Free Software        *
#*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
#*   USA                                                                   *
#*                                                                         *
#***************************************************************************

import numpy as np
import FreeCAD

GC_ENTITY_TYPE = 0
GC_HANDLE      = 5
GC_DOUBLE      = np.concatenate((np.arange(10,59),np.arange(140,147)))
GC_INT16       = np.concatenate((np.arange(60,79),np.arange(170,175),np.arange(400,409),np.arange(1060,1070)))
GC_INT32       = np.concatenate((np.arange(90,99),[1071]))
GC_X           = 10
GC_Y           = 20
GC_Z           = 30

class DXFEntity:

    def __init__(self, et=''): self.groupcodes = {GC_ENTITY_TYPE : et}
    def set(self, gc, vl):     self.groupcodes[gc] = vl
    def value(self, gc):       return self.groupcodes[gc]
    def type(self):            self.groupcodes[GC_ENTITY_TYPE]
    def handle(self):          self.groupcodes[GC_HANDLE]
    
    def set_list(self, gc, vl):
        if gc in self.groupcodes:
            self.groupcodes[gc].append(vl)
        else:
            self.groupcodes[gc] = [vl] 

class DXFPolyline(DXFEntity):
    def __init__(self, et='POLYLINE'): 
        self.vertexes = []
        DXFEntity.__init__(self, et)

    def add_vertex(self, obj):
        self.vertexes.append(obj)

    def get_vertexes(self):
        return self.vertexes

    def count_vertexes(self):
        return len(self.vertexes)

    def to_wire(self):
        import Part
        dw = Part.makePolygon([i.vector() for i in self.get_vertexes()])
        Part.show(dw)
        return dw

    def to_points(self):
        import Points
        pp=Points.Points()
        pp.addPoints([i.vector() for i in self.get_vertexes()])
        Points.show(pp)
        return pp

    def to_fc(self):
        return self.to_wire()

    def is_polyline(self):
        return True

class DXFVertex(DXFEntity):
    def __init__(self, et='VERTEX'):
        DXFEntity.__init__(self, et)
        self.set(GC_X, 0.0)
        self.set(GC_Y, 0.0)
        self.set(GC_Z, 0.0)

    def x(self): return self.value(GC_X)
    def y(self): return self.value(GC_Y)
    def z(self): return self.value(GC_Z)
    def vector(self): return FreeCAD.Vector(self.x(), self.y(), self.z())
    def is_vertex(): return True

class DXFLine(DXFEntity):
    def __init__(self, et='LINE'):
        DXFEntity.__init__(self, et)
        self.set(GC_X, 0.0)
        self.set(GC_Y, 0.0)
        self.set(GC_Z, 0.0)
        self.set(GC_X+1, 0.0)
        self.set(GC_Y+1, 0.0)
        self.set(GC_Z+1, 0.0)

    def x1(self): return self.value(GC_X)
    def y1(self): return self.value(GC_Y)
    def z1(self): return self.value(GC_Z)
    def x2(self): return self.value(GC_X+1)
    def y2(self): return self.value(GC_Y+1)
    def z2(self): return self.value(GC_Z+1)
    # def vector(self): return FreeCAD.Vector(self.x(), self.y(), self.z())
    def is_line(self): return True

    
class DXFFACE(DXFEntity):
    def __init__(self, et='PLANE'):
        DXFEntity.__init__(self, et)
        self.set(GC_X, 0.0)
        self.set(GC_Y, 0.0)
        self.set(GC_Z, 0.0)
        self.set(GC_X+1, 0.0)
        self.set(GC_Y+1, 0.0)
        self.set(GC_Z+1, 0.0)
        self.set(GC_X+2, 0.0)
        self.set(GC_Y+2, 0.0)
        self.set(GC_Z+2, 0.0)

    def x1(self): return self.value(GC_X)
    def y1(self): return self.value(GC_Y)
    def z1(self): return self.value(GC_Z)
    def x2(self): return self.value(GC_X+1)
    def y2(self): return self.value(GC_Y+1)
    def z2(self): return self.value(GC_Z+1)
    def x3(self): return self.value(GC_X+2)
    def y3(self): return self.value(GC_Y+2)
    def z3(self): return self.value(GC_Z+2)
    def is_plane(true): return True

class DXFSpline(DXFEntity):
    def __init__(self, et='VERTEX'):
        DXFEntity.__init__(self, et)
        
    def flag(self): return self.value(70)
    def is_spline(self): return True
    def is_closed(self): return (self.value(70)<<1)
    def is_periodic(self): return (self.value(70)<<2)
    def is_rational(self): return (self.value(70)<<4)
    def is_planar(self): return (self.value(70)<<8)
    def is_linear(self): return (self.value(70)&16) > 0
    
    def to_polygon(self):
        import FreeCAD, Part
        poly = [] 
        for i in np.arange(len(self.value(GC_X))):
            poly.append(FreeCAD.Vector(self.value(GC_X)[i],self.value(GC_Y)[i],self.value(GC_Z)[i]))

        poly.pop(0)
        print poly
        
        try:
            if (poly > 2):
                print poly
                return Part.makePolygon(poly)
            elif (poly == 2):
                return Part.LineSegment(poly)
            else:
                return None
        except Part.OCCError:
            return None
        

def dublette(dxffile):
    code  = int(dxffile.readline())
    value = dxffile.readline().strip()
    if (code == GC_ENTITY_TYPE):
        value.upper()
    elif code in GC_INT16:
        value = np.int16(value)
    elif code in GC_INT32:
        value = np.int32(value)
    elif code in GC_DOUBLE:
        value = np.float64(value)  
    return [code, value]

def prase(filename):
    entries = { 'POLYLINE': 0, 'VERTEX': 0, 'LINE': 0, 'SPLINE': 0, '3DFACE':0 }
    result = []
    dxffile = open(filename,'r')
    while True:
        code, value = dublette(dxffile)
        if (value=='EOF'): break
        elif (value=='SECTION'):
            code, value = dublette(dxffile)
            if (value=='ENTITIES'): 
                polyline = None
                code, value = dublette(dxffile)
                while not (value=='ENDSEC'):
                    if (code==GC_ENTITY_TYPE):
                        support = 0
                        if (value=='POLYLINE'):
                            polyline = DXFPolyline()
                            result.append(polyline)
                            support = 1
                        elif (value=='VERTEX'):
                           if polyline:
                            result.append(DXFVertex())   
                            polyline.add_vertex(result[-1]) 
                            support = 1
                        elif (value=='3DFACE'):
                            result.append(DXFFACE())   
                            support = 1
                        elif (value=='SEQEND'):
                            if polyline:
                                polyline = None 
                        elif (value=='LINE'):
                            result.append(DXFLine()) 
                            support = 1
                        elif (value=='SPLINE'):
                            result.append(DXFSpline()) 
                            support = 2
                        if support>0:
                            entries[value] += 1
                    else:
                        if (support==1):
                            result[-1].set(code, value)
                        elif (support==2):
                            if code in [10,20,30,40]:
                                result[-1].set_list(code, value)
                            else:
                                result[-1].set(code, value)

                    code, value = dublette(dxffile)
    dxffile.close()
    return [entries, result]
2. Datei laden

Code: Select all

entries, result = prase('Dateiname.dxf')
3. Infos anzeigen

Code: Select all

>>> entries
{'VERTEX': 0, 'LINE': 0, '3DFACE': 300, 'POLYLINE': 0, 'SPLINE': 0}

4. Fläche erstellen

Code: Select all

import Part
grp = []
for f in result:
    v1 = FreeCAD.Vector(f.x1(),f.y1(),f.z1())
    v2 = FreeCAD.Vector(f.x2(),f.y2(),f.z2())
    v3 = FreeCAD.Vector(f.x3(),f.y3(),f.z3())
    poly = Part.makePolygon([v2,v1,v3,v2])
    grp.append(Part.Face(poly)) 

g = Part.makeCompound(grp)
Part.show(g)
Das erstellt aber nur Dreiecke. Den vierten Punkte müsste man noch berechnen. Für Part.Plane & Part.makePlane fehlt mir noch der Winkel. :-D

Gruß
Benjamin
Post Reply