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

Postby Hutiet » Sat Mar 14, 2020 9:38 pm

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?

und noch eine Frage. seit zwei Monaten besuche ich einen Programmierkurs und habe auch schon begonnen zu programmieren. Das ist gar nicht so schwer wie es so erzählt wird. Ich habe festgestellt, dass mit Windows und jetzigem Laptop das Programmieren nur begrenzt möglich ist. Deshalb möchte ich mir einen Thinkpad kaufen wie hier luxnote-hannover, da das Programmieren mit diesem besser funktioniert. Leider ist ein neues Thinkpad für mich zu teuer, deswegen will ich mir zuerst einen gebrauchten kaufen, das ich auch für das Studium, den ich im Oktober beginnen werde, gut gebrauchen kann. Wisst ihr von wo man gute gebrauchte Thinkpads kaufen kann?

Vielen Dank
Last edited by Hutiet on Wed Mar 25, 2020 6:25 am, edited 2 times in total.
Michael
chrisb
Posts: 27037
Joined: Tue Mar 17, 2015 9:14 am

Re: Problem beim importieren einer dxf Datei in Freecad

Postby chrisb » Sat Mar 14, 2020 10:35 pm

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

Was ist ein Proggi?
wega
Posts: 238
Joined: Mon Nov 11, 2013 3:13 pm

Re: Problem beim importieren einer dxf Datei in Freecad

Postby wega » Sat Mar 14, 2020 10:58 pm

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
Posts: 27037
Joined: Tue Mar 17, 2015 9:14 am

Re: Problem beim importieren einer dxf Datei in Freecad

Postby chrisb » 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?
User avatar
Gift
Posts: 519
Joined: Tue Aug 18, 2015 10:08 am
Location: Germany, Sauerland

Re: Problem beim importieren einer dxf Datei in Freecad

Postby Gift » Sun Mar 15, 2020 6:51 am

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

Re: Problem beim importieren einer dxf Datei in Freecad

Postby jeno » Sun Mar 15, 2020 7:54 am

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_
Posts: 1189
Joined: Tue Jan 03, 2017 8:42 pm

Re: Problem beim importieren einer dxf Datei in Freecad

Postby UR_ » Sun Mar 15, 2020 8:26 am

Beispieldatei:

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

Importeinstellungen:

Screenshot 002.png
Screenshot 002.png (117.34 KiB) Viewed 355 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
Posts: 27037
Joined: Tue Mar 17, 2015 9:14 am

Re: Problem beim importieren einer dxf Datei in Freecad

Postby chrisb » Sun Mar 15, 2020 8:26 am

Danke für die Info.
jeno
Posts: 801
Joined: Sun Jun 29, 2014 10:41 am

Re: Problem beim importieren einer dxf Datei in Freecad

Postby jeno » Sun Mar 15, 2020 9:43 am

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: 519
Joined: Tue Aug 18, 2015 10:08 am
Location: Germany, Sauerland

Re: Problem beim importieren einer dxf Datei in Freecad

Postby Gift » Thu Mar 19, 2020 5:37 pm

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