summaryrefslogtreecommitdiff
path: root/doc/proposals/occ_stl.py
blob: 938e76ffd0edeb2f2c0de1d2f2879c18a4059fbd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/python
#see http://www.opencascade.org/org/forum/thread_3145/
#thanks Patrik Muller
#FIXME: this takes about 20 to 40 seconds to read up any STL file.

path = "/home/kanzure/local/ldraw/pyldraw/ldraw-0.10/main/temp.stl"

import OCC.TCollection
import OCC.gp
import OCC.OSD
import OCC.RWStl
import OCC.TopoDS
import OCC.BRep
import OCC.StlMesh
import OCC.BRepBuilderAPI

occ_path = OCC.TCollection.TCollection_AsciiString(path)
osd_path = OCC.OSD.OSD_Path(occ_path)
rw = OCC.RWStl.RWStl()
my_mesh = rw.ReadAscii(osd_path)
my_mesh2 = OCC.StlMesh.Handle_StlMesh_Mesh(my_mesh).GetObject() #mesh mesh mesh
number_domains = my_mesh2.NbDomains()
p1 = OCC.gp.gp_XYZ()
p2 = OCC.gp.gp_XYZ()
p3 = OCC.gp.gp_XYZ()
vertex1 = OCC.TopoDS.TopoDS_Vertex()
vertex2 = OCC.TopoDS.TopoDS_Vertex()
vertex3 = OCC.TopoDS.TopoDS_Vertex()
akt_face = OCC.TopoDS.TopoDS_Face()
akt_wire = OCC.TopoDS.TopoDS_Wire()
builder = OCC.BRep.BRep_Builder()
#x1, y1, z1
#x2, y2, z2
#x3, y3, z3
x1,y1,z1,x2,y2,z2,x3,y3,z3 = 0, 0, 0, 0, 0, 0, 0, 0, 0

result_shape = OCC.TopoDS.TopoDS_Compound()
compound_builder = builder
compound_builder.MakeCompound(result_shape)

a_m_exp = OCC.StlMesh.StlMesh_MeshExplorer(my_mesh)
#print "debug1"

for iND in range(number_domains):
    #print "debug2"
    a_m_exp.InitTriangle(1)
    #print "debug3"
    while a_m_exp.MoreTriangle():
        (x1,y1,z1,x2,y2,z2,x3,y3,z3) = a_m_exp.TriangleVertices()
        p1.SetCoord(x1,y1,z1)
        p2.SetCoord(x2,y2,z2)
        p3.SetCoord(x3,y3,z3)
        if not p1.IsEqual(p2,0.0) and not p1.IsEqual(p3,0.0):
            vertex1 = OCC.BRepBuilderAPI.BRepBuilderAPI_MakeVertex(OCC.gp.gp_Pnt(p1))
            vertex2 = OCC.BRepBuilderAPI.BRepBuilderAPI_MakeVertex(OCC.gp.gp_Pnt(p2))
            vertex3 = OCC.BRepBuilderAPI.BRepBuilderAPI_MakeVertex(OCC.gp.gp_Pnt(p3))
            akt_wire = OCC.BRepBuilderAPI.BRepBuilderAPI_MakePolygon(vertex1.Vertex(), vertex2.Vertex(), vertex3.Vertex(), True)
            #print "vertex1 = %s\nvertex2 = %s\nvertex3 = %s" % (p1.Coord(), p2.Coord(), p3.Coord())
            if akt_wire:#not akt_wire.IsNull():
                akt_face = OCC.BRepBuilderAPI.BRepBuilderAPI_MakeFace(akt_wire.Wire())
                #help(akt_face)
                if akt_face: #not akt_face.IsNull():
                    #print "debug4"
                    compound_builder.Add(result_shape, akt_face.Face())
                    #compound_builder.Add(OCC.TopoDS.TopoDS_Compound(), OCC.BRepBuilderAPI.BRepBuilderAPI_MakeFace().Shape())
                    #print "debug5"

        a_m_exp.NextTriangle()
true_result_shape = result_shape
print "done."

import OCC.Display.wxSamplesGui
OCC.Display.wxSamplesGui.display.DisplayShape(true_result_shape)
OCC.Display.wxSamplesGui.start_display()