1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
4 # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
5 # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
7 # This library is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU Lesser General Public
9 # License as published by the Free Software Foundation; either
10 # version 2.1 of the License.
12 # This library is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 # Lesser General Public License for more details.
17 # You should have received a copy of the GNU Lesser General Public
18 # License along with this library; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 # GEOM GEOM_SWIG : binding of C++ implementaion with Python
24 # File : GEOM_TestHealing.py
25 # Author : Julia DOROVSKIKH
29 def TestProcessShape (geompy):
31 ##Load shape from BREP file
33 #datadir = os.getenv("GEOM_TEST")
35 # datadir = datadir + "/Resources/"
37 # "Please, define GEOM_TEST variable !"
39 #print "Import ", datadir + "aze2.brep"
40 #Shape = batchmode_geompy.Import(datadir + "aze2.brep", "BREP")
42 p1 = geompy.MakeVertex(0,0,0)
43 p2 = geompy.MakeVertex(200,0,0)
44 p3 = geompy.MakeVertex(100,150,0)
46 edge = geompy.MakeEdge(p1,p2)
47 arc = geompy.MakeArc(p1,p3,p2)
48 wire = geompy.MakeWire([edge,arc])
49 face = geompy.MakeFace(wire, 1)
51 theShape = geompy.MakePrismVecH(face, edge, 130)
54 print "Before ProcessShape:"
55 isValid = geompy.CheckShape(theShape)
57 print "The shape is not valid"
59 print "The shape seems to be valid"
62 Operators = ["FixShape"]
63 Parameters = ["FixShape.Tolerance3d"]
66 PS = geompy.ProcessShape(theShape, Operators, Parameters, Values)
69 print "After ProcessShape:"
70 isValid = geompy.CheckShape(PS)
72 print "The shape is not valid"
73 raise RuntimeError, "It seems, that the ProcessShape() has failed"
75 print "The shape seems to be valid"
78 Id_Shape = geompy.addToStudy(theShape, "Invalid Shape")
79 Id_PS = geompy.addToStudy(PS, "Processed Shape")
81 def TestSuppressFaces (geompy):
83 #Create base geometry 3D
84 Box = geompy.MakeBoxDXDYDZ(200., 200., 200.)
88 faces = geompy.SubShapeAllSorted(Box, geompy.ShapeType["FACE"])
90 f_glob_id = geompy.GetSubShapeID(Box, faces[5])
93 SuppFace = geompy.SuppressFaces(Box, [f_glob_id])
96 Id_SuppFace = geompy.addToStudy(SuppFace, "SuppFace")
98 def TestSuppressInternalWires (geompy):
100 #Create Face with hole
101 p11 = geompy.MakeVertex( 0, 0, 0)
102 p12 = geompy.MakeVertex(30, 0, 0)
103 p13 = geompy.MakeVertex(30, 30, 0)
104 p14 = geompy.MakeVertex( 0, 30, 0)
106 p21 = geompy.MakeVertex(10, 10, 0)
107 p22 = geompy.MakeVertex(20, 10, 0)
108 p23 = geompy.MakeVertex(20, 20, 0)
109 p24 = geompy.MakeVertex(10, 20, 0)
111 e11 = geompy.MakeEdge(p11, p12)
112 e12 = geompy.MakeEdge(p12, p13)
113 e13 = geompy.MakeEdge(p13, p14)
114 e14 = geompy.MakeEdge(p14, p11)
116 e21 = geompy.MakeEdge(p21, p22)
117 e22 = geompy.MakeEdge(p22, p23)
118 e23 = geompy.MakeEdge(p23, p24)
119 e24 = geompy.MakeEdge(p24, p21)
121 w1 = geompy.MakeWire([e11, e12, e13, e14])
122 w2 = geompy.MakeWire([e21, e22, e23, e24])
124 id_w1 = geompy.addToStudy(w1, "Outside Wire")
125 id_w2 = geompy.addToStudy(w2, "Inside Wire")
127 f12 = geompy.MakeFaceWires([w1, w2], 0)
128 id_f12 = geompy.addToStudy(f12, "Face WO + WI")
131 Res1 = geompy.GetFreeBoundary(f12)
133 ClosedWires1 = Res1[1]
137 for wire in ClosedWires1:
141 raise RuntimeError, "GetFreeBoundary(f12) must return 2 closed wires, but returned ", nbw1
143 #SuppressInternalWires
144 face = geompy.SuppressInternalWires(f12, [])
147 Res2 = geompy.GetFreeBoundary(face)
149 ClosedWires2 = Res2[1]
153 for wire in ClosedWires2:
157 print "GetFreeBoundary(face) must return 1 closed wires, but returned ", nbw2
158 raise RuntimeError, "SuppressInternalWires() works not correctly"
161 Id_face = geompy.addToStudy(face, "Face without internal wires")
163 def TestCloseContour (geompy):
165 ##Load shape from BREP file
167 #datadir = os.getenv("GEOM_TEST")
169 # datadir = datadir + "/Resources/"
171 # "Please, define GEOM_TEST variable !"
173 #print "Import ", datadir + "open_cont.brep"
174 #Shape = geompy.Import(datadir + "open_cont.brep", "BREP")
176 p0 = geompy.MakeVertex(0. , 0. , 0. )
177 py = geompy.MakeVertex(0. , 100., 0. )
178 pz = geompy.MakeVertex(0. , 0. , 100.)
179 p200 = geompy.MakeVertex(200., 200., 200.)
181 Shape = geompy.MakePolyline([p0, pz, py, p200])
184 print "Before closing contour:"
185 isValid = geompy.CheckShape(Shape)
187 print "The shape is not valid"
189 print "The shape seems to be valid"
192 IsCommonVertex = 0 # false
194 shape_wires = geompy.SubShapeAll(Shape, geompy.ShapeType["WIRE"])
198 for wire in shape_wires:
199 Wires.append(geompy.GetSubShapeID(Shape, shape_wires[wi]))
202 CC = geompy.CloseContour(Shape, Wires, IsCommonVertex)
205 print "After closing contour:"
206 isValid = geompy.CheckShape(CC)
208 print "The shape is not valid"
209 raise RuntimeError, "It seems, that the contour was not closed"
211 print "The shape seems to be valid"
214 Id_Shape = geompy.addToStudy(Shape, "Shape with open wire")
215 Id_CC = geompy.addToStudy(CC, "Shape with closed wire")
217 def TestSuppressHoles (geompy):
219 #Create base Variables
224 p1 = geompy.MakeVertex(100., 100., 50.)
226 #Create base directions
227 vz = geompy.MakeVectorDXDYDZ(0., 0., 100.)
229 #Create base geometry 3D
230 Box = geompy.MakeBoxDXDYDZ(200., 200., 200.)
231 Cylinder = geompy.MakeCylinder(p1, vz, radius, height)
234 Cut = geompy.MakeBoolean(Box, Cylinder, 2)
235 idCut = geompy.addToStudy(Cut, "CUT")
237 #IDList for SuppressFaces
239 faces = geompy.SubShapeAllSorted(Cut, geompy.ShapeType["FACE"])
242 f_name = "FACE %d"%(ind)
243 f_id = geompy.addToStudyInFather(Cut, face, f_name)
245 f_glob_id = geompy.GetSubShapeID(Cut, face)
246 print "face ", ind, " global index = ", f_glob_id
249 f_glob_id_0 = geompy.GetSubShapeID(Cut, faces[0])
250 cut_without_f_0 = geompy.SuppressFaces(Cut, [f_glob_id_0])
253 faces1 = geompy.SubShapeAllSorted(cut_without_f_0, geompy.ShapeType["FACE"])
256 f_name = "FACE %d"%(ind)
257 f_id = geompy.addToStudyInFather(cut_without_f_0, face, f_name)
259 f_glob_id = geompy.GetSubShapeID(cut_without_f_0, face)
260 print "face ", ind, " global index = ", f_glob_id
263 f_glob_id_5 = geompy.GetSubShapeID(cut_without_f_0, faces1[5])
264 cut_without_f_0_5 = geompy.SuppressFaces(cut_without_f_0, [f_glob_id_5])
265 cut_without_f_0_5_id = geompy.addToStudy(cut_without_f_0_5, "Cut without faces 0 and 5")
269 wires = geompy.SubShapeAllSorted(cut_without_f_0_5, geompy.ShapeType["WIRE"])
272 w_name = "WIRE %d"%(ind)
273 w_id = geompy.addToStudyInFather(cut_without_f_0_5, wire, w_name)
275 w_glob_id = geompy.GetSubShapeID(cut_without_f_0_5, wire)
276 print "wire ", ind, " global index = ", w_glob_id
279 w_3 = geompy.GetSubShapeID(cut_without_f_0_5, wires[3])
281 SuppHole3 = geompy.SuppressHoles(cut_without_f_0_5, [w_3])
282 SuppHole3_id = geompy.addToStudy(SuppHole3, "Supp Hole 3")
284 def TestMakeSewing (geompy, math):
287 px = geompy.MakeVertex(100., 0., 0.)
288 py = geompy.MakeVertex(0., 100., 0.)
289 pz = geompy.MakeVertex(0., 0., 100.)
291 #Create base geometry 2D & 3D
292 Vector = geompy.MakeVector(px, py)
293 Arc = geompy.MakeArc(py, pz, px)
296 angle = 45. * math.pi / 180
297 WantPlanarFace = 1 #True
299 Wire = geompy.MakeWire([Vector, Arc])
300 Face = geompy.MakeFace(Wire, WantPlanarFace)
301 S = geompy.MakeRotation(Face, Vector, angle)
305 Sewing = geompy.MakeSewing([Face, S], precision)
308 id_Sewing = geompy.addToStudy(Sewing, "Sewing")
310 def TestDivideEdge (geompy):
313 Box = geompy.MakeBoxDXDYDZ(200., 200., 200.)
316 box_edges = geompy.SubShapeAllSorted(Box, geompy.ShapeType["EDGE"])
317 edge_ind = geompy.GetSubShapeID(Box, box_edges[1])
319 Divide = geompy.DivideEdge(Box, edge_ind, 0.5, 1) # Obj, ind, param, is_curve_param
322 Id_Box = geompy.addToStudy(Box, "Box")
323 Id_Divide = geompy.addToStudy(Divide, "Box with Divided Edge")
325 def TestHealingOperations (geompy, math):
327 TestMakeSewing(geompy, math)
328 TestDivideEdge(geompy)
329 TestSuppressHoles(geompy)
330 TestSuppressInternalWires(geompy)
331 TestCloseContour(geompy)
332 TestSuppressFaces(geompy)
333 TestProcessShape(geompy)