SMLib Functionality | ||
ContentsIntroductionSMLib provides five high level topological operations: Solid Booleans, Merge, Make-Manifold, Topology-Based Filleting and Shell Offset. Other information about how to create trimmed surfaces and then sew them together into open shells, and about surface-based filleting, is contained in the Trimmed Surfaces Introduction and Tutorial.Non-Manifold TopologyThis is an introduction to SMLib Geometric Objects, and how the various pieces of geometry are put together. The relationships between the objects is the topology and SMLib topology is similar to that of other systems. This provides a general understanding that will apply to many geometric modeling systems.When a closed curve lies on a surface, it can be used to trim the surface to that boundary curve and this results in a trimmed surface. If two surfaces share the same segment of a boundary, this is called an edge and the two surfaces are neighbors. If we have a way to keep track of which surfaces share an edge, we have added a topology to our modeling system. A trimmed surface, together with the information about its neighbors is referred to as a face. A face must have an outer boundary and it may have many inner boundaries or "holes". When two faces are joined along an edge, the result is then referred to as a shell. A shell is just a set of two or more connected faces. If a shell is closed then you have a solid. A solid has an outer closed shell and possibly many inner shells that define cavities in the solid. A "region" encloses space from a closed outer shell or between two closed shells (one inside the other) and has volume. The outer region is the infinite region, so a closed box is represented by two regions - the outer infinite region, and the region within the box. If there is a box within the box ( a 'thick' box) then there are 3 regions. The inner box may 'float in space' without being attached to the outer box....it may not be physically possible, but it is topologically acceptable. In a closed solid, each boundary has edges which are shared by two neighboring faces, so this is referred to as a boundary representation or "Brep". The first implementations of a Brep model were Manifold, that is. ...they allowed for only two faces to share an edge, hence the name "twin-edge boundary representation"....or brep. If more than two faces can share an Edge, the topology is Non-Manifold. It turns out that the manifold restriction that an edge may have only two neighbors is very limiting. Any time you intersect two surfaces, if you look in the neighborhood of a point on the intersection curve, there appear to be four neighboring surfaces at that point. That's what is meant by being "non-manifold". A manifold edge is restricted to having two neighboring surfaces and a non-manifold edge may have more than two surfaces that share that edge. Each boundary of a face consists of a closed loop of edges. In the topology structure each loop has a list of edges, and the same edge may be used by two or more faces and that's what "EdgeUse" refers to. The term edgeuse has real importance since there could be many uses of an edge. If we construct a box (it defines a region) and then if we add another box right next to it, we have another region. Since they share the same face, you can see why we need to have "FaceUses". The face is used on one region, and the face is also used in the other region. There are many methods for extracting topological information that defines a Brep. Down to the FaceUse level, the various methods include: To get to the region from a faceuse you use:
Brep - Boundary Representation
The SMLib Brep
model is an instance of a modeling structure called
the radial edge structure.
The Brep ObjectNow we need to explain some of the details of the SMLib Brep object that is shown in the diagram above. The figures that follow will help us understand how FaceUse, LoopUse, EdgeUse and VertexUse are used in the radial edge structure.Faces and FaceUses
Within the SMLib Brep,
faces are two sided; each side of a face is
represented by a Faceuse and each Faceuse (acting as
part of a shell) is used to bound one region. The two
Faceuses representing the two sides of a single face
are called "mates". Each Faceuse is contained in just
one Shell.
This represents the topological information used for one Faceuse on one side of a Face. We are looking at this face from inside the region that this Faceuse bounds. The other side of the face sitting on the other side of this image is not displayed. It is associated with a second Faceuse that contains a mirrored set of all the mate Loopuses, Edgeuses, and Vertexuses shown for this Faceuse. If it were shown, we would be looking at that 2nd Faceuse from a point outside of its region located on the other side of this image.
IwVertex *pV1 = pEdge->GetPrimaryEdgeUse()->GetVertexUse()->GetVertex(); IwVertex *pV2 = pEdge->GetPrimaryEdgeUse()->GetMate()->GetVertexUse()->GetVertex(); Shells and Regions
Shells are one sided and
are used just once to bound one region. A shell is a
set of connected Faceuses all bounding a common
region. A region is always bounded by one outer shell
defining its overall extent and bounded by any number
of inner shells each representing a cavity within
the
region.
There is one special region called the
infinite-region that models all space outside of the
current model. That one region is an exception in
that it has no outer shell, but it may have any
number of inner shells marking the distinct pieces of
the Brep model as cavities within infinite
space. Loops and LoopUsesFaces are bounded by loops. A loop is a closed sequence of connected Edgeuses all bounding a common Faceuse. Loops, like shells, are one sided and bound just one face. A face is always bounded by one outer loop defining its overall extent and bounded by any number of inner loops each representing a hole within the face. Unlike shells Loops are always closed, they are never open. Every Faceuse must have one outer boundary, which is sometimes just the surface boundary edges. SMLib does not allow outer-boundaries to be nested within an inner boundary - in that case it would form a new face.Since faces are used twice, each loop is also used twice to bound both sides of the face. In SMLib, the actual connection between a face and a loop is made between the Faceuse and the Loopuse. One could imagine a face that had different loops on each of its two sides, but in SMLib every loop on a face is represented equally on both sides of the face. Each Loop has one pointer to its primary Loopuse. Each Faceuse has a pointer to its first outer loop. Each Loopuse has a pointer to its owning Loop and to its mate. Each Loopuse also has a pointer to its owning Faceuse and a doubly linked list to other Loopuses owned by the same Faceuse. The first Loopuse on this list is always the Faceuse's outer loop and all other Loopuses on this list are inner loops. The FaceUse points to EdgeUses, not VertexUses. An EdgeUse only points to one VertexUse, yet an Edge has (usually) two vertices, one at the start and one at the end. In order to get the Vertex at one end of an Edge, we get the primary EdgeUse for the Edge, get its VertexUse, and get its Vertex:
To get the other Vertex , we use the mate of the EdgeUse, which is the corresponding oppositely-oriented edge on the other side of the face to provide the VertexUse:
Edges and EdgeUses
Each Loopuse will point
to its first Edgeuse – which has no special
significance.
Each Edgeuse also has a pointer to its owning edge
and has a 2nd circular doubly link list of (radial
and mate) connected Edgeuses all owned by the same
edge. Trimmed Surfaces and Trim Curves
Radial EdgesIn non-manifold modeling, an Edge may be shared by many different Faces. As a result, it is necessary that we maintain this information in the form of a list of EdgeUses for each Edge. This list of EdgeUses is ordered since it is critical to know the relationship between the Faces that share the same Edge. An Edge together with the ordering of the Faces that share the Edge is referred to as a Radial Edge and it is one of the most important features of this representation. This figure shows the radial/mate Edgeuses relationships for one edge shared by two faces. Here one edge connects to both Face1 and Face2. Face1 and Face2 both have two sides making for 4 Faceuses in total. Each Faceuse is bound by one Edgeuse making for 4 Edgeuses as shown surrounding the Edge between Face1 and Face2. These 4 Edgeuses are connected in a circular sequence of radial and mate relationships. Note that the 2 EdgeUses of Face1 are associated with each other as Mate so given any EdgeUse
returns the EdgeUse on the other side of the Face. EdgeUse2 (eu2) of Face1 and EdgeUse3 (eu3) of Face2 are associated to each other as Radial so given any EdgeUse
returns the EdgeUse on the neighboring Face. The real power of this representation is shown by the case where 3 Faces share the same Edge. Now we see why we needed to introduce FaceUses, LoopUses and EdgeUses. The relationship between all the Faces that share this Edge is now available. Starting with EdgeUse1 (eu1) if we go Mate, Radial, Mate, Radial, Mate, Radial we are back at EdgeUse1. Note that a single next/previous value in the EdgeUse is used for both the Mate and the Radial pointers. For each EdgeUse either (the next is the radial, and the previous is the mate) OR (the next is the mate, and the previous is the radial). Which of these two applies depends on the Orientation - if it is the same as the primary edgeuse orientation, then the 'next' is the mate.
IwEdgeUse::GetRadial() is as above with next/last interchanged. Vertices and Vertex Uses
Vertices, like faces and edges, are also multi-sided
in that they can be used to bound any number of
edges. One Vertexuse object is created each time a
vertex is used to bound an edge. The connection
between a vertex and an edge is made between the
Vertexuse and the Edgeuse. Edgeuses always come in
pairs to match the two sides of a face and it would
seem that each connection between a vertex and an
edge would require two Vertexuses. In the SMLib
internals the number of actual Vertexuses is cut in
half by only recording a connection between one
Vertexuse and one Edgeuse for each vertex-edge
connection. The second connection is deduced when
needed at run time by examining the Edgeuse mate
relationships.
This situation shown in
this figure can arise as a planar model in which 5
different faces connect to one vertex through 5
different edges, or it can be thought of, like the
last image, as a single vertex attached to one edge
that is connected to five different faces oriented so
that we see the edge and faces end-on. Walking The
Topology Model
Orientation
Faceuse Orientation:
Loop Orientation:
Loopuse Orientation:
Edgeuse Orientation
Vertexuse Orientation
Degenerate Boundaries
Vertex/Face Bound RepresentationAll faces boundaries are represented by Loopuses. When a vertex bounds a face, the Loopuse points to a Vertexuse object (skipping the typical Edgeuse level) and the Vertexuse points back to the Loopuse. Vertex/Region and Edge/Region Bound Representations
BooleanBoolean operations are supported through the IwMerge::ManifoldBoolean method. You may specify intersection, union or difference. In the case where you have two solids the operation performed is a Regularized Volumetric Boolean. You can also perform Boolean operations between surfaces and solids. The following gives the results for the operations:
MergeThe Merge operation is like the Boolean in that it combines the topologies from two separate Breps. The major difference being that the Merge only adds topology it does not remove any topology. For example the Merge of a box and a cylinder may will contain all of the original edges and faces of both the cylinder and box plus any intersection edges. The Merge of two solids will typically create edges which have four or more faces and may have several regions (volumes).The Non-Manifold Topology enables us to represent the results of the Merge completely and explicitly with a single topological structure. We do not need to break things up into separate volumes. You may merge any combination of wireframe, surfaces, open shells, solids, and non-manifold topology models. To invoke the merge operation you do the same thing as show above in the Boolean except that the operation you send in is "IW_BO_MERGE " instead of "IW_BO_DIFFERENCE ". Make-ManifoldThe Make-Manifold operation produces a manifold solid or cellular topology from a non-manifold topology. It deletes excess faces, edges and vertices to get to either a manifold topology or cellular topology. The following shows how to utilize the operation.
SolidsAs noted above, the Merge process followed by the Make Manifold operator may be used to create a solid object. One thing that you should know right away is that solids are not only one of the most powerful representations, they are also the most prone to failure. It is even more difficult to control errors that are found in solids that have been imported from other systems as opposed to those which are built within a given system. Hence many times the reliability of SMLib in dealing with solid models is dependent upon receiving good data.SMLib does a lot of work on its own to try to measure the gaps between adjacent edges, vertices and faces and to adjust the tolerances to close the gaps. Although the problem is a difficult one, we have designed SMLib to try to handle many of the problems and to fail gracefully when it can not. SMLib is also highly dependent upon the initial tolerance set for the IwBrep prior to creation. If the tolerance is too large, it will invalidate small features. If the tolerance is too small you will get warnings when we increase the tolerances to fill the gaps. As a general guideline, a tolerance of 1.0e-3 to 1.0e-6 of the size of the Brep should work the best. The higher the quality (smaller the gaps) of the original Brep the smaller the tolerance should be. An additional way to construct a solid is through an indexed tabulated representation of our topology. The tabulated representation can be found in the IwBrepData include and source files. SMLib also includes a non-production IGES reader which demonstrates how to load up the IwBrepData object from an IGES solid and create a IwBrep (see IwIgesReader.h and IwIgesReader.cpp). There is also a section in the TSLib Tutorial which demonstrates creation of a solid box using the IwBrepData object. A word about m_bEditingEnabled. We have added a flag to IwBrep which enables editing. There are many of the creation and a few editing operations which require the m_bEditingEnabled flag to be turned on. An example is sewing. This flag needs to be turned off to make many of the evaluation functions work. Shell OffsetOne of the more difficult operations in solid modeling is the process of offsetting a solid object by a specified distance to create the new offset shell. As the offset distance increases, there may be massive changes in the topology of the object. By using the Merge operation, the SMLib shell offset process is able to correctly process these massive changes in the topology. Access to this functionality is available via the: IwOffsetExecutive, IwOffsetGeometry - two classes that support offsetting and shelling of solids. See usage examples in iwoffset_test.cpp.Offset of a SolidThe implementation of the Solid Offsetting Algorithm is relatively simple given the powerful tools available within SMLib. Offsetting utilizes facilities from the SMLib Merge and SMLib Filleting to do most of the difficult work. This unique approach also keeps special case handling to a minimum. The entire algorithm was implemented with two new classes (IwOffsetExecutive and IwOffsetGeometryCreation) and less than 20 new methods of moderate size. The basic approach is as follows: 1) Generate faces representing the offsets of existing faces of a solid. 2) Insert self-intersection edges of offset faces. 3) Generate faces representing the offsets of edges of the solid. This utilizes filleting tools to generate circular blends between corresponding edges of offset faces. In cases where the offset faces have self-intersections, a single edge may require several blends and corner patches. 4) Generate offset faces for vertices. We use a triangular trimmed piece of a sphere for simple cases and a complete sphere for some more difficult cases. 5) Utilize the “Partial Merge” to put all of the offset faces together. Note that we utilize existing topological relationships eliminate unnecessary surface/surface intersections and speed up the process several orders of magnitude over a straight “Merge”. 6) After the “Partial Merge” we need to identify which regions (i.e. volumes) to keep. In most cases this is just the shell bounding the outer region. However, it is possible to create void regions within a solid. 7) Call “Make Manifold” with the selected regions to remove all topology elements not bounding the given regions.This algorithm lends itself to the creation of very large offsets where the offsets of features of the solid intersect each other. This type of offset is ideal for various NC operations. Right now the algorithm works quite well with analytical parts that don’t have freeform fillets, blends, and corner patches. The proper handling of these things requires identification and special handling. The best way to do it is to regenerate the fillets, blends, and corner patches directly from the offset surfaces instead of trying to offset the surface directly. There are also some problems with self-intersecting surfaces that are basically impossible to solve in a reasonable way. For solids with these type of surfaces, it is only possible to create offsets of relatively small radius. Shelling of a SolidThe implementation of a shelling algorithm required only a few slight modifications to the Offset Solid algorithm:
Once the shelled solid is created it can be used in a number of ways to do very powerful operations.
Non-Manifold SweepSMLib has the ability to sweep faces, edges, and vertices to the same dimension or to a higher dimension.
The Non-Manifold Sweeping is designed as an Object-Oriented Framework. Application developers can easily create new geometric sweeps by implementing a new subclass that produces the geometry for the sweep operation while the Framework builds the topology for the sweep.
Polygon ModelingSMLib contains NURBS and analytical geometry modeling tools, polygonal modeling tools and functions to convert between the forms. SMLib's topology-based tessellation enables users to select from a variety of tessellation criteria to produce polygons which are optimized for various applications. The underlying geometric and topological information is used to produce a minimal number of polygons in a process known as "Polygon Optimization". SMLib produces "Crack-Free" polygonal meshes for connected sets of trimmed surfaces or solids at all tessellation tolerances. SMLib also contains a large variety of polygonal modeling functionality including polygon decimation, polygonal Booleans, sectioning, ray-firing, classification functions, etc. The performance makes it suitable for highly interactive applications.
TessellationTessellation is the process of converting smooth curves, surfaces and faces into linear or polygonal segments. See the SMLib Tutorial section for an example of source code. This has many uses, primarily in graphics, where curves are represented by a large number of small line segments, and surfaces get converted into planar triangles, which are then passed to a graphics engine for display. The criteria for tessellation may be selected by the user. In general they relate to curvature, (the flatter the curve, the less line segments are needed), and absolute size (very tiny curves would require less lines than very large curves of the same shape).
Polygon BooleansPolygonal Objects can be read in from external files, or created from an SMLIb Brep object and converted into a IwPolyBrep object, using a routines such as Brep_to_PolyBrep_Conversion(). The criteria are those used for tessellation. Very large complex models using polygons will show a very significant performance improvement over their precise-geometry counterpart. Many of the standard operations can be performed on PolyBrep's, such as:
See the SMLib Tutorial section for an example of source code.
DecimationDecimation is the process of removing polygons to achieve a significant data reduction with an acceptable loss of accuracy. This allows very large models to be reduced to a size where the performance of some of these complex operations can be run in real-time. Two decimation algorithms are available:
See the SMLib Tutorial section for an example of source code.
FilletingFilleting is the insertion of a connecting surface, called the fillet surface, between two other surfaces to control the shape of how the two surfaces connect to one another. The common fillet sequence is to replace an existing edge between two surfaces with a new fillet surface and two new rail curves marking where the new fillet surface connects to the original base surfaces. Typically the original surfaces need to be trimmed back to the new rail curves. This trimming operation, along with the creation of the fillet surface, the rail curves, and the modification of the topology connections to make sure that all the pieces are connected together within the Brep model, are all parts of the filleting functionality. Additionally, when working with Brep models, extra care is taken at the ends of the fillets to connect the new fillet geometry (the fillet surface and the rail curves) to the rest of the Brep. The fillet operation manages this by creating special-case fillet end-cap surfaces, edges, and vertices as necessary. SMLib supports several different kinds of fillet surface shapes to enable several different styles for connecting one surface to another. All but the linear cross section blend of these styles connect the surfaces together smoothly, replacing sharp edges with rounded-smooth edges and corners. The linear cross section blend is used to insert chamfers. These styles include constant radius blends, variable radius blends, circular cross section blends, linear cross section blends (chamfers), and G^{1}, G^{2} and G^{3} continuous blends. SMLib filleting has been implemented in a modular fashion making it straightforward to add additional fillet styles, potentially including things like elliptical, parabolic, and cubic blends.
Filleting FrameworkSMLib has implemented a filleting framework which handles a wide range of topological cases with a reasonable set of geometric cases. The framework handles the common bookkeeping tasks and has object-oriented handlers to accommodate difficult conditions. Examples of difficult conditions include fillets rolling off the edge of a surface, and fillet rail curves self-intersecting. SMLib implements a basic set of default handlers for each of these conditions. If necessary, end users can change the default behavior by implementing a subclass of the particular handler. For example, if the fillet rolls off the surface, the user might want to change the default behavior of rolling the fillet over onto the adjacent surface to cutting the fillet, rolling a ball along the edge, or just quitting. Users can also implement a subclass handler to change the default behavior of correcting for self-intersecting rail curves The Filleting Framework supports both Surface-Based Filleting and Topology-Based (or Solid-Based) Filleting. Surface-Based Filleting takes two surfaces and produces a separate fillet surface between them and optionally trims the original surfaces to the new rail curves of the fillet surface. Topology-Based Filleting takes a single Brep and inserts new topology to round edges and corners. Topology-Based Filleting can add fillets to any manifold edge within a solid, open shell, or non-manifold Brep. Because SMLib represents Non-Manifold Topology, SMLib is able to represent results of situations that would normally cause failures in other systems. SMLib's Filleting Framework is extremely flexible. Adding new functionality to the Framework is the real power of this software. It is designed to make adding seamless extensions as easy as possible. For example, the addition of variable-radius filleting required the implementation of only five methods totaling less than 200 lines of code. Should you decide to extend the Filleting capabilities of SMLib in your system, there are examples to guide you in extending the existing functionality in the Framework. In addition, SMS will be glad to offer you guidance in implementing the extension that you want. The Filleting Framework also supports a simplified filleting interface that removes most of the complexity for an application to add fillets to Brep models for most typical filleting cases. With a constructor call and two subroutine calls, an application can fillet any selection of edges in a model, with any combination of radius functions and cross section shapes. This document contains everything you need to know to both utilize existing filleting functionality and to customize the existing functionality to your specific needs. Let us begin by introducing the basic concepts and terminology used in SMLib.
TerminologyThe following terms will be used in this document: Fillet Surface: A new surface that is added to the model during the filleting operation. Filleted Edge, or Edge to be Filleted: The edge of the original Brep to which the fillet is applied. This edge will disappear during filleting, and be replaced with fillet surfaces. One filleted edge is usually replaced by one fillet surface, but it can be more than one, or zero, depending on the radius of the fillet and the surrounding geometry and topology. Rail Curves: The "long edges" of a fillet surface, which run along the two original faces that meet at the filleted edge. The rail curves are calculated first, before the fillet surface itself, and their intersections with other body topology, and with themselves, largely determine the overall filleting situation. Fillet Corner: The filleting activity at the vertices of the filleted edges. In topology-based filleting, this will depend on the number of body edges incident at the vertex, which of those are to be filleted, their relative convexity, and how the rail curves intersect with the surrounding topology. New edges and faces can be created at fillet corners. Cross Section: The shape of the cross section of the fillet surface. This is created after the rail curves are traced out, and is independent of the radius of the fillet. Fillet surfaces typically have a circular cross section for constant and variable radius rolling ball blends or linear cross sections for chamfers, but other shapes are possible.
Using the Filleting FrameworkSMlib uses three concepts to specify how to place the rail curves, form the fillet surface shape, and connect the ends of the fillets to the rest of the Brep geometry. These concepts are the radius of the fillet, the fillet surface cross section shape, and the fillet corner generation methodology. Radius Definition: The radius definition controls where SMLib generates the shape of the rail curves on the two underlying surfaces of the edge being filleted. These rail curves are used both as the fillet surface bounds and to connect the fillet surface to the original underlying surfaces. Examples of SMLib radius definitions include Constant Radius Rolling Ball, Variable Radius Rolling Ball, and Constant Distance Between Rail Curves. The Radius Definition is implemented in the classes derived from IwFilletSolver. Cross Section Type: The cross section type controls the cross section shape of the fillet surface between the two rail curves. Examples of SMLib cross section types include Circular Cross Section (Round), Linear Cross Section (Chamfer), and G^{1}, G^{2} and G^{3} continuous blends. Other possible cross sections could include elliptical, parabolic, and cubic blends. Cross section shape is implemented in classes derived from IwFilletSurfaceGenerator. Note that the Radius Definition and the fillet surface Cross Section Type are independent and can be mixed and matched in any way. Fillet Corner Generation: The fillet corner generation methodology specifies what happens at the ends of topological fillets. At vertices where only a single edge is filleted, this specifies how the end of the fillet joins the original Topology. For example, fillets may be extended to intersect adjacent surfaces, or there may be an extension of an adjacent surface to fill a gap. At vertices where more than one edge is filleted, this specifies how the fillets will join each other. For example, fillets may be joined by a Bevel or by a Corner Blend. Fillet corner generation is handled by classes derived from IwFilletCorner. It is generally done automatically by the system.
Surface-Based FilletingSee the TSNLib Functionality Document for details.
Topology-Based FilletingTopology-Based Filleting takes as input a single Brep model and modifies that representation to insert fillet topology and geometry. The algorithm is an edge- and vertex-filleting algorithm. You choose edges to fillet and attach Fillet Solvers to the edges. The Fillet Solvers tell the Filleting Framework how the filleting should be done. A default mechanism is used to either blend or bevel the joints between edge fillets that meet at a vertex. It is possible to fillet both solids and open shells.Filleting ProcessApplications can fillet any combination of manifold edges within solid, shell, and non-manifold Breps using either SMLib's simplified filleting interface or by calling filleting class methods directly. The simplified filleting interface should be sufficient for most common filleting operations.The Simplified Filleting Interface process:
Status of Topology-Based FilletingIn this section we discuss the current state of the three basics of SMLib filleting: radius definition, cross section shapes, and fillet corners. We also discuss the capabilities of SMLib in the case where the specified radius is too large to fit into a rounded inside corner, or interferes with other topology.Fillet Solvers: Radius DefinitionThe first step of topology-based filleting is to define and associate a fillet solver to a manifold edge to specify how to construct the fillet's rail curves. Any manifold edge can be filleted whether that edge is in a manifold, a non-manifold, or shell Brep. Manifold edges are edges connected to exactly two adjacent faces. The three currently implemented fillet solver types that generate rail curves are:
Fillet Surface Generators: Cross Section ShapesThe second step of topology-based filleting is to define and associate a fillet surface generator to the edge being filleted. After the edge's fillet solver has been used to define the rail curves, the edge's fillet surface generator is used to specify the shape of the fillet surface that fills in the space between the two rail curves. The following fillet surface generation techniques have been implemented:
Cross section shapes: Circular (black); G^{1} continuity (red); G^{2} (green); G^{3} (blue).
Fillet CornersThe final step of topology-based filleting is to define and associate a fillet corner object (IwFilletCorner) to every vertex attached to an edge being filleted. This controls how the edge fillets get connected to pre-existing and other newly created fillet geometry. SMLib automatically selects the type of fillet corner object to associate with each vertex depending on the number of edges connected to the vertex and the relative convexities of those edges. SMLib uses the following notation: a fillet corner where N total edges are incident, and M of them are to be filleted, is denoted an NxM corner. The following fillet corner cases have been implemented:
Examples of 3xN fillets at a mixed-convexity corner. Note the extensions of body faces and edges in some cases. A 3x3 (NxN) case is pictured for completeness.
Example: Chamfer, and NxN corners, same- and mixed-convexity cases.
Large Radius FilletingStandard filleting algorithms assume that the size of the fillet is relatively small compared to the size of the features of the object being filleting. For example, they assume that the radius of the fillet is smaller than the radius of curvature of the surfaces of the edge being filleted. They also assume that the rail curves of a fillet surface do not intersect interior features of the face, and that they do intersect the adjacent topological edges at each vertex. These assumptions make the implementation of filleting easier, but they do not cover an adequate number of cases required by real-world engineering problems. Therefore SMLib has algorithms to handle large-radius situations. SMLib's large-radius capabilities in the Filleting Framework include:
Topology-Based Filleting FiguresConstant Radius Constant Distance Variable Radius Linear Cross section Self Intersecting Rail Curves Cliff Rollover Tangent Surface Rollover Negative Fillet/Negative Feature Negative Fillet/Positive Feature Positive Fillet/Negative Feature Positive Fillet/Positive Feature Fillet/Fillet Intersections Filleting used in Offsetting: Original Solid Offset Solid/Positive Offset Offset Solid/Negative Offset Shelled Solid
More Filleting Figures
Submitting a Filleting BugThis could be a difficult task if you have added substantial functionality using the customization features. In that case you may have to ship us some software to test along with model geometry.For the current time and utilization of trimmed surface filleting the best thing to do is to dump out the two original Breps and send us the information used to generate the surface fillet (radius, surface orientations, tolerances, guess points, etc.). Optionally if you have created a high level function like the example given above, you should also send us that to utilize with the corresponding arguments. If the arguments are complex, it might be easier to write them to a Fillet Definition File as specified in the following section. Fillet Definition FileThe Fillet Definition File contains an implicit definition of a set of filleting operations. It is used primarily for testing and can be used to send a filleting bugs to us. The following is the definition for the file:Line 1: // CommentFor each filleting operation section of the file: Line 1: // CommentFor Surface Filleting there should be two Breps in the file: For Topology Filleting there should be one Brep in the file: Line 6: <ULONG> Number of Topology Fillet DefinitionsFor Each Topology Fillet Definition: Line 1: // CommentIf Vertex Fillet Definition: Line 3: <ULONG> <ULONG> <data> - Vertex Index, Vertex FilletIf Edge Fillet Definition: Line 3: <ULONG> <double> <ULONG> <data1> - If All Edges of a Face are Filleted:
Line 3: <ULONG> <double> <ULONG>
<data1> If All Edges of the Brep are Filleted:
Line 3: <double> <ULONG> <data1> If Regression Test - does each edge, each face, then all edges and lays them out into a grid for viewing.:
Line 3: <double> <ULONG> <data1> Legal StuffAll of the software and documentation received with this release is copyrighted by Solid Modeling Solutions, Inc. You may not distribute source code or documentation for this software outside of the company and the site which owns the license. The standard license agreement allows you to freely distribute object code in any application which does not contain a programmatic interface. All software and documentation is considered proprietary information and the intellectual property of Solid Modeling Solutions, Inc. This document contains trade secret information which is deemed proprietary.Copyright © 1998-2010 Solid Modeling Solutions
All rights reserved. |