📄 _understanding_and_traversing_acis_topology_(part_ii).htm
字号:
<div class="thumb tleft"><div class="thumbinner" style="width:302px;"><a href="/r18/index.php/Image:Tutorial3_Coedge3.jpg" class="image" title="A face with an isolated vertex"><img alt="A face with an isolated vertex" src="/r18/images/thumb/8/87/Tutorial3_Coedge3.jpg/300px-Tutorial3_Coedge3.jpg" width="300" height="216" border="0" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/r18/index.php/Image:Tutorial3_Coedge3.jpg" class="internal" title="Enlarge"><img src="/r18/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>A face with an isolated vertex</div></div></div> <p><br/><br/>What happens at an isolated vertex in a face? The diagram to the left depicts the topology of a face with an isolated vertex. The face has two loops of coedges. The peripheral loop of coedges is identical to what we have seen previously. The inner loop has a single coedge. The next and previous coedges pointers of this coedge point to itself. It is a loop of one coedge. If a face had contained a finite sized hole surrounded by a single closed edge, the inner loop also would have contain a single coedge whose next and previous coedges pointers pointed the coedge. In other words, the topology would have been the same! In the isolated vertex case, however, the edge has zero length and does not have an underlying curve.<br/><br/><br/></p><div class="thumb tright"><div class="thumbinner" style="width:252px;"><a href="/r18/index.php/Image:Tutorial3_Coedge4.jpg" class="image" title="Four faces meeting at a vertex"><img alt="Four faces meeting at a vertex" src="/r18/images/thumb/4/47/Tutorial3_Coedge4.jpg/250px-Tutorial3_Coedge4.jpg" width="250" height="241" border="0" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/r18/index.php/Image:Tutorial3_Coedge4.jpg" class="internal" title="Enlarge"><img src="/r18/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Four faces meeting at a vertex</div></div></div> <p><br/><br/>Up to this point we have depicted coedges lying on a single face. Let's look at coedges lying on adjacent faces. The diagram to the right depicts the coedges on four faces of a sheet or solid that meet at a common, manifold vertex. Each of the manifold edges has two coedges. Each coedge that is directed into the common vertex will be linked (by its next pointer) to the coedge on its face that is directed away from the vertex. Each coedge that is directed away from the common vertex will be linked (by its previous pointer) to the coedge on its face that is directed into the vertex. Thus, the coedges on each face form doubly-linked lists of coedges on each face. This diagram is very symmetric about the common vertex. </p><p>How would this diagram be different if there were only three faces and one of the edges was a spur edge or a prop edge? There would be no differences in the next and previous pointers, so there would be no differences in the diagram. <br/><br/><br/><br/></p><blockquote class="templatequote"><div><p><i><b>Note:</b> If there were a spur edge the two coedges on the edge would be linked to each other at the spur vertex end of the edge. That is, the next pointer of the coedge that ended at the spur vertex would point to the coedge that started at the spur vertex, and the previous pointer of the coedge that started at the spur vertex would point to the coedge that ended at the spur vertex.</i></p></div></blockquote><p>How would this diagram be different if two of the edges were actually a single, closed edge? (For example, assume the top two edges in the diagram were connected to each other, forming a single edge.) There would be no differences in the diagram. If a coedge is on a face that is completely bounded by a closed edge, then the coedge's next and previous pointers point to itself.</p><a name="Coedge_partner_pointers"></a><h3> <span class="mw-headline"> Coedge partner pointers </span></h3><div class="thumb tright"><div class="thumbinner" style="width:252px;"><a href="/r18/index.php/Image:Tutorial3_Coedge5.jpg" class="image" title="Four faces meeting at a vertex"><img alt="Four faces meeting at a vertex" src="/r18/images/thumb/f/f0/Tutorial3_Coedge5.jpg/250px-Tutorial3_Coedge5.jpg" width="250" height="230" border="0" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/r18/index.php/Image:Tutorial3_Coedge5.jpg" class="internal" title="Enlarge"><img src="/r18/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Four faces meeting at a vertex</div></div></div> <p>What would the partner pointers look like for the above example? The diagram at the right shows four faces and edges meeting at a common vertex; however, instead of showing next and previous pointers, this diagram shows the partner pointers. Because there are only two coedges on each edge, each coedge on an edge points to the other coedge on the edge. Notice that two coedges on each edge are pointing in opposite directions. This occurs on all solids and on any sheets in which adjacent faces have consistently directed face normals. As with the previous diagram showing next and previous pointers, there would be no differences in this diagram if any of the edges were spur or prop edges, or if a closed edge were present.</p><p>Coedge partner pointers provide a means to obtain all the faces surrounding an edge. In fact, because the coedge partner pointer list is an ordered linked list (The coedges are listed in a counter clockwise order about the edge.) we know the order of the faces around the edge. If there are no internal or external sheet faces connected to an edge, the directions of the coedges surrounding the edge will alternate. In other words, each coedge will be aligned in the opposite direction as its partner. Why does this always occur? </p><blockquote><b>Hint:</b> <i>Think about the directions of the face normals of the faces surrounding the edge.</i></blockquote><a name="Wire_topology"></a><h2> <span class="mw-headline"> Wire topology </span></h2><div class="thumb tright"><div class="thumbinner" style="width:252px;"><a href="/r18/index.php/Image:Tutorial3_Coedge6.jpg" class="image" title="Four wire edges meeting at a vertex"><img alt="Four wire edges meeting at a vertex" src="/r18/images/thumb/d/dd/Tutorial3_Coedge6.jpg/250px-Tutorial3_Coedge6.jpg" width="250" height="248" border="0" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/r18/index.php/Image:Tutorial3_Coedge6.jpg" class="internal" title="Enlarge"><img src="/r18/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Four wire edges meeting at a vertex</div></div></div> <p><br/>Each wire points to a single coedge in the wire. In fact, the wire can point to <i>any</i> coedge in the wire. Each coedge points to its next and previous coedges in wire. Unlike coedges in solids and sheets, coedges in wires do not have partners. Similar to solids and sheets, the direction of a coedge in a wire may be the same as the direction of the edge, or it may be in the opposite direction of the edge. The next and previous coedge pointers for wires are slightly more complicated than for solids and sheets. The reasons for this are (1) the coedges are not necessarily connected head-to-tail at a vertex, (2) there may be any number of edges meeting at a vertex, and (3) there are no partner pointers. The diagram to the right provides one configuration for a set of four edges/coedges meeting at a vertex. Notice that if a coedge ends at the vertex its next pointer points to another coedge at the vertex. Alternatively, if a coedge starts at the vertex its previous pointer points to another coedge at the vertex. All of the coedges starting or ending at a vertex can be obtained by traversing the next and previous coedge pointers about the vertex. The order in which the coedges are obtained by traversing next and previous pointers is not specific. In other words, coedges are not ordered about a wire vertex as they are about an edge connected to a set of faces. </p><p>If there is only one edge starting or ending at a vertex; i.e., the vertex is a spur vertex, then the coedge's next or previous pointer (whichever corresponds to the spur vertex end of the coedge) will point to the coedge. This is also depicted in the diagram. If there is only one edge starting and ending at a vertex; i.e., the edge is a closed edge and there are no other edges connected to the vertex, then the coedge's next and previous pointers will point to the coedge. This is similar to what occurs for a closed edge lying in a face.</p><a name="Connecting_solids_and_sheets_with_wires"></a><h2> <span class="mw-headline"> Connecting solids and sheets with wires </span></h2><p>We have already described how multiple solid regions and/or multiple sheet regions can be connected using non-manifold vertices and/or non-manifold edges, but how can a solid or sheet region be connected to a wire region? </p><div class="thumb tright"><div class="thumbinner" style="width:322px;"><a href="/r18/index.php/Image:Tutorial3_FaceWire.jpg" class="image" title="A nonmanifold vertex connecting a face to two wire edges"><img alt="A nonmanifold vertex connecting a face to two wire edges" src="/r18/images/thumb/f/fc/Tutorial3_FaceWire.jpg/320px-Tutorial3_FaceWire.jpg" width="320" height="187" border="0" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/r18/index.php/Image:Tutorial3_FaceWire.jpg" class="internal" title="Enlarge"><img src="/r18/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>A nonmanifold vertex connecting a face to two wire edges</div></div></div> <p>The answer is relatively straight forward. Wires can only be attached to a sheet or solid at a vertex. (Why can't they be attached along an edge?) Each wire region is treated as a separation surface at the non-manifold vertex. That is, the non-manifold vertex points to the adjacent edge in the wire as well as an edge on the solid or sheet. If the wire connects to the middle of an existing face, the face will contain a NULL edge (an isolated vertex) and the non-manifold vertex will point to the NULL edge on the face. The figure to the right depicts a face with two wires attached to it at a NULL edge. (Remember, whenever a wire touches a face we split the wire at the face; therefore we must have two wires, not one.) What is the topology for this case? </p><p>The face has two loops: one is a closed edge and one is a NULL edge. The peripheral loop contains a single coedge, whose next and previous coedge pointers point to itself. The other loop also contains a single coedge, whose next and previous coedge pointers point to itself. Each wire contains a single edge. The coedges on each edge have next and previous pointers which point to themselves. So how are the two wires and the face connected? The non-manifold vertex contains pointers to each wire edge and the NULL edge on the face.</p><a name="Additional_comments_on_topology"></a><h2> <span class="mw-headline"> Additional comments on topology </span></h2><p>In what situations would you expect a coedge's next, previous, or partner pointer to be NULL? </p><p>The next and previous pointers should never be NULL in a wire. In a solid or sheet the next and previous pointers may be NULL if the loop is incomplete, implying that the face is only partially bounded. Partner pointers should always be NULL in a wire. Partner pointers are NULL in a solid or sheet if there is no adjacent face at an edge. This situation occurs frequently in sheets; however, because solids are generally closed, it rarely occurs in solids. (It typically means the solid is open or incompletely bounded.) Often when one encounters an incomplete loop or solid it implies the object is still under construction.</p><p>In what situations would you expect a coedge's next, previous, or partner pointer to point to the coedge? </p><p>A coedge's next or previous coedge pointer may frequently point to the coedge. For instance, if an edge is closed, its next and previous pointers point to itself. If an isolated vertex exists in a face, the coedge associated with the NULL edge has next and previous pointers which point to the coedge. In a wire when a spur edge exists the coedge associated with the edge will have a pointer to itself at the spur vertex. (Depending on whether the coedge starts or ends at the spur vertex will dictate whether it is the previous or next pointer that points to the coedge.)</p><p>How does one create these various topological configurations? </p><p>Typically an ACIS developer uses higher level operations to create models. One does not typically create individual topological entities and set their pointers. The preceding discussions are intended to help you understand the various cases that must be handled by your application's algorithms. The table below presents a small subset of the methods by which topological entities may be created. </p><table class="wikitable"><tr><th> Description</th><th> Operation Name</th><th> API Function</th></tr><tr><td> To create a solid body from a set of faces</td><td> Stitch</td><td> api_stitch( )</td></tr><tr><td> To create a solid body from a closed sheet body</td><td> Enclose</td><td> api_enclose_void( )</td></tr><tr><td> To create a sheet body from a solid body</td><td> None</td><td> api_body_to_2d( )</td></tr><tr><td> To create a solid block primitive</td><td> None</td><td> api_make_cuboid( )</td></tr><tr><td> To create a solid or sheet body by sweeping a face</td><td> Sweep</td><td> api_sweep_with_options( )</td></tr><tr><td> To create a face from a set of edges</td><td> Cover<p>Sweep</p><p>Skin</p><p>Loft</p><p>Net</p></td><td> api_cover( )<p>api_sweep_with_options( )</p><p>api_skin_wires( )</p><p>api_loft_coedges( )</p><p>api_net_wires( )</p></td></tr><tr><td> To create an offset of a face</td><td> Face Offset</td><td> api_offset_face( )</td></tr><tr><td> To create an offset of a body</td><td> Body Offset</td><td> api_offset_body( )</td></tr><tr><td> To move one or more faces of a body</td><td> Tweak</td><td> api_move_faces( )</td></tr><tr><td> To create an unbranched wire from a set of edges</td><td> None</td><td> api_make_ewire( )</td></tr><tr><td> To create an unbranched wire from a set of positions</td><td> None</td><td> api_make_wire( )</td></tr><tr><td> To create an offset of an unbranched, planar wire</td><td> Wire Offset
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -