<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Dear Gmsh-ers,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Simple issue, I am constructing a plate with a hole using csg in the python API. In terms of gmsh class members, everything goes well, as after the “occ.cut” operation the “getEntities()” method returns 7 surfaces and 1 volume<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><i>[(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (0, 10), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (1, 10), (1, 11), (1, 12), (1, 13), (1, 14), (1, 15), (2, 1), (2, 2), (2, 3), (2,
 4), (2, 5), (2, 6), (2, 7), (3, 3)]<o:p></o:p></i></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">which is exactly what is expected. However, oddly enough, when I write a step file and open it in gmsh, I see
<u>21 surfaces</u>, and not 7. These additional “ghost surfaces” come with their own points and curves, but there is no additional volume. I could not spot the problem, I guess it has to do with the fact that the removeObject and removeTool did not completely
 erase the corresponding surfaces, they are not class members any more, but somehow they reappear at export.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">This is problematic for me because I do some computations on the CAD surfaces themselves. I would like to programmatically generate many “swiss cheese” step files with multiple holes, but I need to be 100% sure that there is no duplicate
 surfaces kept in the cutting process. I am aware that this kind of geometry prep could be done with pythonocc as well but somehow I would prefer staying in the gmsh environment.
<o:p></o:p></p>
<p class="MsoNormal">Many thanks for your help!<o:p></o:p></p>
<p class="MsoNormal">Kind regards,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Hadrien<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0">import</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> os<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0">import</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> gmsh<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0">import</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> math<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p> </o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">gmsh.initialize()<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">gmsh.model.remove()<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">gmsh.option.setNumber(</span><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">"General.Terminal"</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">1</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">)<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">gmsh.model.add(</span><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">"boxwithhole"</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">)<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p> </o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#6A9955"># We first create the cube w/ tag 1</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">gmsh.model.occ.addBox(</span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">0</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">0</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">0</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">3000</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">2000</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">1000</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">1</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">)<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p> </o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#6A9955"># We then create the cylinder w/ tag 2</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">gmsh.model.occ.addCylinder(</span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">1500</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">1000</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, -</span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">100</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">0</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">0</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">1200</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">300</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">2</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">)<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p> </o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#6A9955"># We apply a boolean difference</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">gmsh.model.occ.cut([(</span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">3</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">1</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">)], [(</span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">3</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">2</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">)], </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">3</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">removeObject</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> = </span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">True</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">removeTool</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> = </span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">True</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">)<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p> </o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">gmsh.model.occ.synchronize()<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p> </o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#DCDCAA">print</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(gmsh.model.getEntities())<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p> </o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#6A9955"># Show the GUI:</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">this_folder = os.path.dirname(os.path.abspath(</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">__file__</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">))<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">gmsh.write(os.path.join(this_folder, </span><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">"boxwithhole.step"</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">))<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">gmsh.clear()<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p> </o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">gmsh.open(os.path.join(this_folder, </span><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">"boxwithhole.step"</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">))<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">gmsh.fltk.run()<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p> </o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">gmsh.finalize()<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p> </o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><img width="478" height="345" style="width:4.9791in;height:3.5937in" id="Picture_x0020_1" src="cid:image005.png@01D648DC.60265C20"> 
<img width="262" height="346" style="width:2.7291in;height:3.6041in" id="Picture_x0020_2" src="cid:image006.png@01D648DC.60265C20"><o:p></o:p></p>
</div>
</body>
</html>