Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : PartitionSurface.hpp
3 : : //
4 : : // Purpose :
5 : : //
6 : : // Special Notes :
7 : : //
8 : : // Creator : Jason Kraftcheck
9 : : //
10 : : // Creation Date : 04/21/02
11 : : //-------------------------------------------------------------------------
12 : :
13 : : #ifndef PARTITION_SURFACE_HPP
14 : : #define PARTITION_SURFACE_HPP
15 : :
16 : : #include <set>
17 : : #include "Surface.hpp"
18 : : #include "PartitionEntity.hpp"
19 : : #include "PartitionCoSurf.hpp"
20 : : #include "PartitionLoop.hpp"
21 : :
22 : : class FacetEvalTool;
23 : : class CubitFacetData;
24 : : class PartitionShell;
25 : : class PartitionLump;
26 : : class CubitFacetEdge;
27 : : class CubitFacet;
28 : : class CubitFacetEdgeData;
29 : : class CubitPointData;
30 : :
31 : : class PartitionSurface : public Surface,
32 : : public PartitionEntity
33 : : {
34 : :
35 : : public:
36 : :
37 : : virtual CubitStatus combine( PartitionSurface* dead_surface );
38 : :
39 : : static PartitionSurface* construct( const CubitSimpleAttrib& attrib, PartitionLump* vol );
40 : :
41 : : PartitionSurface( PartitionLump* owner );
42 : :
43 : : PartitionSurface* split( DLIList<CubitFacetData*>& facets_to_move );
44 : :
45 : : virtual ~PartitionSurface();
46 : :
47 : : int num_loops() const;
48 : : PartitionLoop* next_loop( const PartitionLoop* prev = 0 ) const;
49 : :
50 : : CubitStatus add( PartitionLoop* loop );
51 : : CubitStatus remove( PartitionLoop* loop );
52 : :
53 : : CubitStatus add( PartitionCoSurf* cosurf );
54 : : CubitStatus remove( PartitionCoSurf* cosurf );
55 : :
56 : : PartitionCoSurf* next_co_surface( const PartitionCoSurf* prev = 0 ) const;
57 : : PartitionCoSurf* find_first( const PartitionShell* shell ) const;
58 : : // Get the first CoSurface connecting this surface w/ the passed shell
59 : : PartitionCoSurf* find_first( const PartitionLump* lump ) const;
60 : : // Get the first CoSurface connecting this surface w/ a
61 : : // shell owned by the passed volume
62 : : PartitionCoSurf* find_next( const PartitionCoSurf* cosurf ) const;
63 : : // Get the next CoSurface after the passed CoSurface and
64 : : // with the same Shell as the passed CoSurface.
65 : : PartitionCoSurf* find_first( const PartitionShell* shell, CubitSense sense ) const;
66 : : // Get the first CoSurface w/ the passed shell and sense
67 : :
68 : : void get_points( DLIList<PartitionPoint*>& list ) const;
69 : :
70 : : virtual CubitStatus save( CubitSimpleAttrib& attrib );
71 : :
72 : : CubitBox bounding_box() const;
73 : :
74 : : double measure();
75 : : GeometryType geometry_type();
76 : :
77 : :
78 : : virtual CubitStatus move_to_geometry( CubitVector& position );
79 : : virtual void closest_point_trimmed( CubitVector from, CubitVector& closest);
80 : : virtual CubitStatus get_point_normal( CubitVector& point, CubitVector& normal );
81 : :
82 : : virtual CubitStatus closest_point_uv_guess(
83 : : CubitVector const& location,
84 : : double &u, double &v,
85 : : CubitVector* closest_location = NULL,
86 : : CubitVector* unit_normal = NULL );
87 : :
88 : : virtual CubitStatus evaluate( double u, double v,
89 : : CubitVector *position,
90 : : CubitVector *normal,
91 : : CubitVector *curvature1,
92 : : CubitVector *curvature2 );
93 : :
94 : : virtual CubitStatus get_projected_distance_on_surface( CubitVector *pos1,
95 : : CubitVector *pos2,
96 : : double &distance );
97 : :
98 : : virtual CubitStatus closest_point( CubitVector const& pos,
99 : : CubitVector* close = 0, CubitVector* norm = 0,
100 : : CubitVector* curv1 = 0, CubitVector* curv2 = 0);
101 : : virtual CubitStatus principal_curvatures( CubitVector const& loc,
102 : : double& curv1, double& curv2,
103 : : CubitVector* closest_location=0 );
104 : :
105 : : virtual CubitVector position_from_u_v( double u, double v );
106 : : virtual CubitStatus u_v_from_position( CubitVector const& location,
107 : : double& u, double& v,
108 : : CubitVector* closest_location = NULL );
109 : :
110 : : virtual CubitStatus closest_point_along_vector( CubitVector& from_point,
111 : : CubitVector& along_vector,
112 : : CubitVector& point_on_surface);
113 : : virtual CubitBoolean is_periodic();
114 : : virtual CubitBoolean is_periodic_in_U( double& period );
115 : : virtual CubitBoolean is_periodic_in_V( double& period );
116 : : virtual CubitBoolean is_singular_in_U( double u_param );
117 : : virtual CubitBoolean is_singular_in_V( double v_param );
118 : : virtual CubitBoolean is_closed_in_U();
119 : : virtual CubitBoolean is_closed_in_V();
120 : :
121 : : virtual CubitStatus get_sphere_params( CubitVector ¢er,
122 : : double &radius ) const;
123 : : //- Only valid for spherical surfaces
124 : : //O center
125 : : //O- The center of the sphere
126 : : //O radius
127 : : //O- The radius of the sphere
128 : :
129 : : virtual CubitStatus get_cone_params( CubitVector ¢er,
130 : : CubitVector &normal,
131 : : CubitVector &major_axis,
132 : : double &radius_ratio,
133 : : double &sine_angle,
134 : : double &cos_angle ) const;
135 : : //- Only valid for conical surfaces. Cylinders are a special case of conicals.
136 : : //O center
137 : : //O-
138 : : //O normal
139 : : //O-
140 : : //O major_axis
141 : : //O-
142 : : //O radius_ratio
143 : : //O-
144 : : //O sine_angle
145 : : //O-
146 : : //O cos_angle
147 : : //O-
148 : :
149 : : virtual CubitStatus get_torus_params( CubitVector ¢er,
150 : : CubitVector &normal,
151 : : double &major_radius,
152 : : double &minor_radius ) const;
153 : : //- Only valid for torus surfaces.
154 : : //O center
155 : : //O-
156 : : //O normal
157 : : //O-
158 : : //O major_radius
159 : : //O-
160 : : //O minor_radius
161 : : //O-
162 : :
163 : : virtual CubitStatus get_nurb_params( bool &rational,
164 : : int °ree_u,
165 : : int °ree_v,
166 : : int &num_cntrl_pts_u,
167 : : int &num_cntrl_pts_v,
168 : : DLIList<CubitVector> &cntrl_pts,
169 : : DLIList<double> &weights,
170 : : DLIList<double> &u_knots,
171 : : DLIList<double> &v_knots ) const;
172 : : //- Only valid for nurbs surfaces
173 : : //O rational
174 : : //O- True if the nurb is rational
175 : : //O degree_u
176 : : //O- The degree of the nurb in the u direction
177 : : //O degree_v
178 : : //O- The degree of the nurb in the v direction
179 : : //O num_cntrl_pts_u
180 : : //O- Number of control points in the u direction
181 : : //O num_cntrl_pts_v
182 : : //O- Number of control points in the v direction
183 : : //O cntrl_pts
184 : : //O- The control points stored as
185 : : //O- cntrl_pts[0 ] = pt[u=0][v=0]
186 : : //O- cntrl_pts[1 ] = pt[u=1][v=0]
187 : : //O- ...
188 : : //O- cntrl_pts[num_cntrl_pts_u-1] = pt[u=?][v=0]
189 : : //O- cntrl_pts[num_cntrl_pts_u ] = pt[u=0][v=1]
190 : : //O- ...
191 : : //O weights
192 : : //O- If rational, weights for each control point, stored in the same
193 : : //O- order as the control points. No weights are returned if
194 : : //O- rational == false
195 : : //O u_knots
196 : : //O- knot vector in the u direction
197 : : //O v_knots
198 : : //O- knot vector in the v direction
199 : :
200 : : virtual CubitStatus uv_derivitives( double u, double v,
201 : : CubitVector &du, CubitVector &dv );
202 : : virtual CubitBoolean is_parametric();
203 : : virtual CubitBoolean get_param_range_U( double& lo, double& hi );
204 : : virtual CubitBoolean get_param_range_V( double& lo, double& hi );
205 : :
206 : : virtual CubitBoolean is_position_on( CubitVector &test_position );
207 : :
208 : : virtual CubitPointContainment point_containment( const CubitVector &point );
209 : : virtual CubitPointContainment point_containment( double u, double v );
210 : : // virtual CubitPointContainment point_containment( CubitVector &point,
211 : : // double u, double v );
212 : : CubitPointContainment point_containment( const CubitVector &point,
213 : : PartitionCurve*& boundary_curve );
214 : :
215 : : CubitSense get_geometry_sense();
216 : : void reverse_sense();
217 : :
218 : :
219 : : void get_parents_virt( DLIList<TopologyBridge*>& );
220 : : void get_children_virt( DLIList<TopologyBridge*>& );
221 : 0 : int layer() const { return sub_entity_set().get_owner_layer(); }
222 : : GeometryQueryEngine* get_geometry_query_engine() const;
223 : :
224 : : virtual CubitSense get_shell_sense( ShellSM* shell_ptr ) const;
225 : :
226 : : void append_simple_attribute_virt(const CubitSimpleAttrib&);
227 : : void remove_simple_attribute_virt(const CubitSimpleAttrib&);
228 : : void remove_all_simple_attribute_virt();
229 : : CubitStatus get_simple_attribute(DLIList<CubitSimpleAttrib>&);
230 : : CubitStatus get_simple_attribute( const CubitString& name,
231 : : DLIList<CubitSimpleAttrib>& );
232 : :
233 : : void notify_split( FacetEntity* old_tri, FacetEntity* new_tri );
234 : : void notify_destroyed( CubitFacetData* facet );
235 : : void get_facet_data( DLIList<CubitFacetData*>& result_list ) const;
236 : : void set_facet_data( const DLIList<CubitFacetData*>& new_list );
237 : : void replace_facets(DLIList<CubitFacetData*> &dead_facets,
238 : : DLIList<CubitFacetData*> &new_facets);
239 : 0 : bool has_facets() const { return facetList.size() > 0; }
240 : : void draw_facets( int color ) const;
241 : :
242 : :
243 : : CubitStatus init_facet_data();
244 : :
245 : :
246 : : virtual void transform( const CubitTransformMatrix& xform );
247 : :
248 : : virtual void print_debug_info( const char* prefix = 0,
249 : : bool print_sub_entity_set = true ) const;
250 : : CubitFacet* closest_facet( const CubitVector& input_position,
251 : : CubitVector& result_position);
252 : : //- Call the following function for the facets owned by this surface.
253 : :
254 : : CubitStatus notify_moving_point( CubitPoint* point,
255 : : const CubitVector& new_pos );
256 : : //- Call fix_move_point for facetts of this PartitionSurface,
257 : : //- and update the facet list for this surface accordingly.
258 : :
259 : : protected:
260 : :
261 : : void interior_facet_points( DLIList<CubitPoint*>& result_list ) const;
262 : :
263 : : void update_facet_tool();
264 : :
265 : : void reverse_loops();
266 : :
267 : : PartitionSurface( );
268 : :
269 : : virtual PartitionSurface* copy();
270 : :
271 : : CubitStatus get_save_topology( DLIList<int>& curves );
272 : :
273 : :
274 : : CubitStatus insert_facets( DLIList <PartitionEntity*> points,
275 : : DLIList <CubitFacetEdgeData *> &boundary_edges,
276 : : DLIList <CubitFacetData*> &surf_facets);
277 : :
278 : : DLIList<CubitFacetData*> facetList;
279 : : CubitSense geometry_sense;
280 : :
281 : : private:
282 : :
283 : : PartitionSurface( PartitionSurface* split_from );
284 : :
285 : : PartitionSurface( const PartitionSurface& );
286 : :
287 : : PartitionLoop* firstLoop;
288 : : PartitionCoSurf* firstCoSurf;
289 : :
290 : :
291 : : };
292 : :
293 : : inline PartitionLoop*
294 : 0 : PartitionSurface::next_loop( const PartitionLoop* prev ) const
295 : : {
296 : : return !prev ? firstLoop :
297 : 0 : prev->mySurface == this ? prev->nextInSurface :
298 [ # # ][ # # ]: 0 : 0;
299 : : }
300 : :
301 : : inline PartitionCoSurf*
302 : 0 : PartitionSurface::next_co_surface( const PartitionCoSurf* prev ) const
303 : : {
304 : : return !prev ? firstCoSurf :
305 : 0 : prev->mySurface == this ? prev->surfaceNext :
306 [ # # ][ # # ]: 0 : 0;
307 : : }
308 : :
309 : : #endif
|