Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : CompositeSurface.hpp
3 : : //
4 : : // Purpose : A class for composited surface geometry
5 : : //
6 : : // Special Notes :
7 : : //
8 : : // Creator : Jason Kraftcheck
9 : : //
10 : : // Creation Date : 03/10/98
11 : : //
12 : : // Owner : Jason Kraftcheck
13 : : //-------------------------------------------------------------------------
14 : :
15 : : #ifndef COMPOSITE_SURFACE_HPP
16 : : #define COMPOSITE_SURFACE_HPP
17 : :
18 : : #include "VGDefines.h"
19 : : #include "CompositeGeom.hpp"
20 : : #include "Surface.hpp"
21 : : #include "TBOwner.hpp"
22 : : #include "HiddenEntitySet.hpp"
23 : : #include "CompositeLoop.hpp"
24 : : #include "CompositeCoSurf.hpp"
25 : :
26 : : class CompositeCoSurf;
27 : : class CompositeEngine;
28 : : class CompositePoint;
29 : : class CompositeCurve;
30 : : class CompositeShell;
31 : : class CompositeLump;
32 : : class CompSurfFacets;
33 : : class GMem;
34 : :
35 : : class CompositeSurface: public Surface, public TBOwner
36 : : {
37 : : friend class CompositeEngine;
38 : :
39 : : public:
40 : : CompositeSurface( Surface* surf_ptr );
41 : : CompositeSurface( CompositeGeom* geom_ptr );
42 : : //- Constructor
43 : :
44 : : virtual ~CompositeSurface();
45 : : //- Destructor
46 : :
47 : : //CubitStatus add( Surface* surface, CubitSense relative_sense );
48 : : //CubitStatus remove( Surface* surface );
49 : : void get_ignored_surfs(DLIList<Surface*> &surfs);
50 : : int num_surfs() const;
51 : : int index_of( Surface* surface ) const;
52 : : void update();
53 : : Surface* get_surface( int index ) const;
54 : : CubitSense get_sense( int index ) const;
55 : : Surface* remove_surface( int index );
56 : : void ignore_surface(int surface_id);
57 : : void ignore_surface(Surface *surf);
58 : : void unignore_surface(int surface_id);
59 : : CompositeLoop* first_loop() const;
60 : : CompositeLoop* next_loop( CompositeLoop* after_this = 0 ) const;
61 : : CubitStatus add( CompositeLoop* loop );
62 : : CubitStatus remove( CompositeLoop* loop );
63 : :
64 : : CubitStatus add( CompositeCoSurf* cosurf );
65 : : CubitStatus remove( CompositeCoSurf* cosurf );
66 : :
67 : : CompositeCoSurf* next_co_surface( CompositeCoSurf* prev = 0 ) const;
68 : :
69 : : CompositeCoSurf* find_first( CompositeShell* shell ) const;
70 : : // Get the first CoSurface connecting this surface w/ the passed shell
71 : : CompositeCoSurf* find_first( CompositeLump* lump ) const;
72 : : // Get the first CoSurface connecting this surface w/ a
73 : : // shell owned by the passed volume
74 : : CompositeCoSurf* find_next( CompositeCoSurf* cosurf ) const;
75 : : // Get the next CoSurface after the passed CoSurface and
76 : : // with the same Shell as the passed CoSurface.
77 : :
78 : : void get_curves( DLIList<CompositeCurve*>& curves );
79 : :
80 : : HiddenEntitySet& hidden_entities();
81 : : bool has_hidden_entities() const;
82 : :
83 : : CompositeSurface* split( VGArray<int>& indices_to_move );
84 : : CubitStatus combine( CompositeSurface* dead_surface );
85 : :
86 : : CubitStatus stitch( CompositeSurface* stitch_partner );
87 : : CompositeSurface* unstitch( );
88 : 0 : CompositeSurface* get_stitch_partner() const
89 : 0 : { return stitchPartner; }
90 : :
91 : :
92 : : /************************************************
93 : : **** Methods Inhereted from GeometryEntity *****
94 : : ************************************************/
95 : : CubitBox bounding_box() const;
96 : : double measure();
97 : : GeometryQueryEngine* get_geometry_query_engine() const;
98 : : GeometryType geometry_type();
99 : :
100 : :
101 : : /************************************************
102 : : ******** Methods Inhereted from TBOwner ********
103 : : ************************************************/
104 : : CubitStatus remove_bridge( TopologyBridge* bridge );
105 : : CubitStatus swap_bridge( TopologyBridge* old_tb, TopologyBridge* new_tb,
106 : : bool reversed );
107 : : CubitBoolean contains_bridge( TopologyBridge* bridge ) const;
108 : : void notify_reversed( TopologyBridge* bridge );
109 : : void notify_split( TopologyBridge* new_bridge, TopologyBridge* old_bridge );
110 : : void notify_topology_modified( TopologyBridge* bridge );
111 : :
112 : : /************************************************
113 : : **** Methods Inhereted from TopologyBridge *****
114 : : ************************************************/
115 : : void append_simple_attribute_virt( const CubitSimpleAttrib& simple_attrib_ptr );
116 : : void remove_simple_attribute_virt( const CubitSimpleAttrib& simple_attrib_ptr );
117 : : void remove_all_simple_attribute_virt();
118 : : CubitStatus get_simple_attribute( DLIList<CubitSimpleAttrib>& attrib_list );
119 : : CubitStatus get_simple_attribute( const CubitString& name,
120 : : DLIList<CubitSimpleAttrib>& attrib_list );
121 : :
122 : :
123 : : void get_parents_virt( DLIList<TopologyBridge*>& parents );
124 : : void get_children_virt( DLIList<TopologyBridge*>& children );
125 : 0 : int layer() const { return COMPOSITE_LAYER; }
126 : :
127 : : /**********************************************************
128 : : **** Methods Inhereted from Surface, and implemented *****
129 : : **********************************************************/
130 : : virtual CubitSense get_shell_sense( ShellSM* shell_ptr ) const;
131 : :
132 : : virtual void closest_point_trimmed( CubitVector from_point,
133 : : CubitVector& result );
134 : : virtual CubitStatus get_point_normal( CubitVector& origin,
135 : : CubitVector& normal );
136 : :
137 : : virtual CubitStatus closest_point_uv_guess(
138 : : CubitVector const& location,
139 : : double &u, double &v,
140 : : CubitVector* closest_location = NULL,
141 : : CubitVector* unit_normal = NULL );
142 : :
143 : : virtual CubitStatus evaluate( double u, double v,
144 : : CubitVector *position,
145 : : CubitVector *normal,
146 : : CubitVector *curvature1,
147 : : CubitVector *curvature2 );
148 : :
149 : : virtual CubitStatus get_projected_distance_on_surface( CubitVector *pos1,
150 : : CubitVector *pos2,
151 : : double &distance );
152 : :
153 : : virtual CubitStatus closest_point( CubitVector const& location,
154 : : CubitVector* closest_location = NULL,
155 : : CubitVector* unit_normal = NULL,
156 : : CubitVector* curvature1 = NULL,
157 : : CubitVector* curvature2 = NULL );
158 : :
159 : : virtual CubitStatus closest_point_along_vector(CubitVector& from_point,
160 : : CubitVector& along_vector,
161 : : CubitVector& point_on_surface);
162 : :
163 : : virtual CubitStatus principal_curvatures( CubitVector const& location,
164 : : double& curvature_1,
165 : : double& curvature_2,
166 : : CubitVector* closest_location );
167 : : virtual CubitBoolean is_parametric();
168 : : virtual CubitBoolean is_position_on(CubitVector& position);
169 : : virtual CubitPointContainment point_containment( const CubitVector &point );
170 : : virtual CubitPointContainment point_containment( double u, double v );
171 : : // virtual CubitPointContainment point_containment( CubitVector &point,
172 : : // double u, double v );
173 : : virtual CubitSense get_geometry_sense();
174 : : virtual void reverse_sense();
175 : :
176 : :
177 : : /**************************************************************
178 : : **** Methods Inhereted from Surface, and not implemented *****
179 : : **************************************************************/
180 : : virtual CubitVector position_from_u_v( double u, double v );
181 : : virtual CubitStatus u_v_from_position( CubitVector const& position,
182 : : double& u, double& v,
183 : : CubitVector* closest_point );
184 : : virtual CubitBoolean is_periodic();
185 : : virtual CubitBoolean is_periodic_in_U( double& period );
186 : : virtual CubitBoolean is_periodic_in_V( double& period );
187 : : virtual CubitBoolean is_singular_in_U( double u_value );
188 : : virtual CubitBoolean is_singular_in_V( double v_value );
189 : : virtual CubitBoolean is_closed_in_U();
190 : : virtual CubitBoolean is_closed_in_V();
191 : : virtual CubitStatus uv_derivitives( double u, double v,
192 : : CubitVector& du,
193 : : CubitVector& dv );
194 : : virtual CubitBoolean get_param_range_U( double& lower, double& upper );
195 : : virtual CubitBoolean get_param_range_V( double& lower, double& upper );
196 : :
197 : : virtual CubitStatus get_sphere_params( CubitVector ¢er,
198 : : double &radius ) const;
199 : : //- Only valid for spherical surfaces
200 : : //O center
201 : : //O- The center of the sphere
202 : : //O radius
203 : : //O- The radius of the sphere
204 : :
205 : : virtual CubitStatus get_cone_params( CubitVector ¢er,
206 : : CubitVector &normal,
207 : : CubitVector &major_axis,
208 : : double &radius_ratio,
209 : : double &sine_angle,
210 : : double &cos_angle ) const;
211 : : //- Only valid for conical surfaces. Cylinders are a special case of conicals.
212 : : //O center
213 : : //O-
214 : : //O normal
215 : : //O-
216 : : //O major_axis
217 : : //O-
218 : : //O radius_ratio
219 : : //O-
220 : : //O sine_angle
221 : : //O-
222 : : //O cos_angle
223 : : //O-
224 : :
225 : : virtual CubitStatus get_torus_params( CubitVector ¢er,
226 : : CubitVector &normal,
227 : : double &major_radius,
228 : : double &minor_radius ) const;
229 : : //- Only valid for torus surfaces.
230 : : //O center
231 : : //O-
232 : : //O normal
233 : : //O-
234 : : //O major_radius
235 : : //O-
236 : : //O minor_radius
237 : : //O-
238 : :
239 : : virtual CubitStatus get_nurb_params( bool &rational,
240 : : int °ree_u,
241 : : int °ree_v,
242 : : int &num_cntrl_pts_u,
243 : : int &num_cntrl_pts_v,
244 : : DLIList<CubitVector> &cntrl_pts,
245 : : DLIList<double> &weights,
246 : : DLIList<double> &u_knots,
247 : : DLIList<double> &v_knots ) const;
248 : : //- Only valid for nurbs surfaces
249 : : //O rational
250 : : //O- True if the nurb is rational
251 : : //O degree_u
252 : : //O- The degree of the nurb in the u direction
253 : : //O degree_v
254 : : //O- The degree of the nurb in the v direction
255 : : //O num_cntrl_pts_u
256 : : //O- Number of control points in the u direction
257 : : //O num_cntrl_pts_v
258 : : //O- Number of control points in the v direction
259 : : //O cntrl_pts
260 : : //O- The control points stored as
261 : : //O- cntrl_pts[0 ] = pt[u=0][v=0]
262 : : //O- cntrl_pts[1 ] = pt[u=1][v=0]
263 : : //O- ...
264 : : //O- cntrl_pts[num_cntrl_pts_u-1] = pt[u=?][v=0]
265 : : //O- cntrl_pts[num_cntrl_pts_u ] = pt[u=0][v=1]
266 : : //O- ...
267 : : //O weights
268 : : //O- If rational, weights for each control point, stored in the same
269 : : //O- order as the control points. No weights are returned if
270 : : //O- rational == false
271 : : //O u_knots
272 : : //O- knot vector in the u direction
273 : : //O v_knots
274 : : //O- knot vector in the v direction
275 : :
276 : : void get_hidden_curves( DLIList<Curve*>& curves );
277 : :
278 : : void print_debug_info( const char* line_prefix = 0, bool brief = false );
279 : :
280 : : int closest_underlying_surface( const CubitVector& position );
281 : :
282 : : static void print_cpt_stats();
283 : : static void reset_cpt_stats();
284 : :
285 : 0 : void read_attributes() { compGeom->read_attributes(); }
286 : 0 : void write_attributes() { compGeom->write_attributes(); }
287 : :
288 : :
289 : : CubitStatus get_graphics( GMem& gmem );
290 : :
291 : : // handles transformation of composite surface
292 : : // child loops, coedges, etc. must be handled separately
293 : : void notify_transformed();
294 : :
295 : : protected:
296 : :
297 : : void update_facet_tool();
298 : : void update_facets_to_ignore();
299 : : CubitStatus closest_trimmed( int underlying_surface,
300 : : const CubitVector& position,
301 : : CubitVector& result );
302 : :
303 : : void update_modified( Surface* modified_surface,
304 : : DLIList<CompositeCurve*>& new_curves );
305 : : void update_modified();
306 : : bool is_dead_coedge( CompositeCoEdge* coedge );
307 : : void remove_dead_coedge( CompositeCoEdge* coedge );
308 : :
309 : : private:
310 : : int HadBridgeRemoved;
311 : :
312 : : DLIList<Surface*> surfacesToIgnore;
313 : :
314 : : // these have no implementation, just private delcarations
315 : : // to prevent the compiler from generating default implementations
316 : : CompositeSurface& operator=(const CompositeSurface&);
317 : : CompositeSurface(const CompositeSurface&);
318 : :
319 : : CompositeGeom *compGeom;
320 : : CompositeSurface *stitchPartner;
321 : :
322 : : CompositeCoSurf* firstCoSurf;
323 : :
324 : : CompositeLoop* firstLoop;
325 : :
326 : : HiddenEntitySet* hiddenSet;
327 : :
328 : : CompSurfFacets* facetTool;
329 : : };
330 : :
331 : :
332 : 0 : inline Surface* CompositeSurface::get_surface( int index ) const
333 [ # # ]: 0 : { return dynamic_cast<Surface*>(compGeom->entity(index)); }
334 : :
335 : 0 : inline CubitSense CompositeSurface::get_sense( int index ) const
336 : 0 : { return compGeom->sense(index); }
337 : :
338 : 0 : inline int CompositeSurface::num_surfs() const
339 : 0 : { return compGeom->num_entities(); }
340 : :
341 : 0 : inline int CompositeSurface::index_of( Surface* surf ) const
342 : 0 : { return compGeom->index_of( surf ); }
343 : :
344 : 0 : inline void CompositeSurface::update()
345 : 0 : { compGeom->update_cached_data(); }
346 : 0 : inline CompositeLoop* CompositeSurface::first_loop( ) const
347 : 0 : { return firstLoop; }
348 : :
349 : 0 : inline CompositeLoop* CompositeSurface::next_loop( CompositeLoop* loop ) const
350 [ # # ][ # # ]: 0 : { return !loop ? firstLoop : loop->mySurface == this ? loop->loopNext : 0; }
351 : :
352 : 0 : inline CompositeCoSurf* CompositeSurface::next_co_surface( CompositeCoSurf* prev ) const
353 [ # # ]: 0 : { return prev ? prev->surfaceNext : firstCoSurf; }
354 : :
355 : 0 : inline HiddenEntitySet& CompositeSurface::hidden_entities()
356 : : {
357 [ # # ]: 0 : if( !hiddenSet )
358 [ # # ]: 0 : hiddenSet = new HiddenEntitySet(this);
359 : 0 : return *hiddenSet;
360 : : }
361 : :
362 : :
363 : : #endif
364 : :
|