Branch data Line data Source code
1 : : #ifndef COMPOSITE_ENGINE_HPP
2 : : #define COMPOSITE_ENGINE_HPP
3 : :
4 : : #include "CubitDefines.h"
5 : : #include "GeometryDefines.h"
6 : : #include "CubitString.hpp"
7 : : #include <map>
8 : : #include "DLIList.hpp"
9 : : #include "IntermediateGeomEngine.hpp"
10 : : #include "VGDefines.h"
11 : : #include "TopologyBridge.hpp"
12 : :
13 : : class TBPoint;
14 : : class Curve;
15 : : class Surface;
16 : : class Lump;
17 : :
18 : : class BodySM;
19 : : class ShellSM;
20 : : class LoopSM;
21 : : class CoEdgeSM;
22 : :
23 : : class CompositePoint;
24 : : class CompositeCurve;
25 : : class CompositeSurface;
26 : : class CompositeLump;
27 : : class CompositeBody;
28 : : class CompositeCoEdge;
29 : : class CompositeLoop;
30 : : class CompositeShell;
31 : : class Body;
32 : :
33 : : class GeometryEntity;
34 : : class TopologyBridge;
35 : : class CubitSimpleAttrib;
36 : : class CubitVector;
37 : : class CubitTransformMatrix;
38 : :
39 : : class CompositeEngine : public IntermediateGeomEngine
40 : : {
41 : : public:
42 : : void get_all_curves_and_points(DLIList<TopologyBridge*> &tb_list,
43 : : DLIList<Curve*> &curves,
44 : : DLIList<TBPoint*> &points);
45 : : bool is_composite(TBOwner *bridge_owner);
46 : : bool is_composite(TopologyBridge *bridge);
47 : : bool is_partition(TBOwner *bridge_owner);
48 : :
49 : : virtual void remove_imprint_attributes_after_modify
50 : : ( DLIList<BodySM*> &old_sms,
51 : : DLIList<BodySM*> &new_sms );
52 : : virtual void push_named_attributes_to_curves_and_points
53 : : ( DLIList<TopologyBridge*> &tb_list, const char *name_in);
54 : : virtual void push_imprint_attributes_before_modify
55 : : ( DLIList<BodySM*> &body_sms );
56 : : virtual void attribute_after_imprinting(DLIList<TopologyBridge*> &tb_list,
57 : : DLIList<Body*> &old_bodies);
58 : :
59 : : // This is a copy of the function in MergeTool with the difference that it
60 : : // accepts a layer flag to dictate at which level the topology is traversed
61 : : // (solid modeler level or virtual level).
62 : : CubitBoolean about_spatially_equal( Curve *curve_1, Curve *curve_2,
63 : : CubitSense &relative_sense,
64 : : double tolerance_factor,
65 : : int layer = TopologyBridge::MAX_TB_LAYER);
66 : : virtual void remove_attributes_from_unmodifed_virtual(DLIList<TopologyBridge*> &bridges);
67 : :
68 : : virtual ~CompositeEngine();
69 : :
70 : : static CompositeEngine& instance();
71 : : static void delete_instance();
72 : :
73 : 3364 : int level() const { return COMPOSITE_LAYER; }
74 : :
75 : : CubitStatus import_geometry( DLIList<TopologyBridge*>& imported_geometry );
76 : : //- Recreate saved composite geometry and update the passed
77 : : //- list.
78 : :
79 : : int is_hidden(TopologyBridge *tb);
80 : :
81 : : CubitStatus export_geometry( DLIList<TopologyBridge*>& geometry_to_save );
82 : : //- Save composite geometry and update the passed list such
83 : : //- that it contains the underlying real geometry.
84 : :
85 : : CompositeCurve* composite( Curve* survivor,
86 : : Curve* dead,
87 : : TBPoint* keep_point = 0,
88 : : bool remove_partitions = false );
89 : : //- Combine two curves. The curves share both end vertices,
90 : : //- the retained vertex can be specified in keep_point.
91 : :
92 : : CompositePoint* stitch_points( TBPoint* point1, TBPoint* point2 );
93 : : CompositeCurve* stitch_curves( Curve* curve1, Curve* curve2 );
94 : : CompositeSurface* stitch_surfaces( Surface* surf, Surface* surf2 );
95 : :
96 : : CompositeCurve* remove_point( TBPoint* dead_point,
97 : : bool remove_partitions = false,
98 : : Curve* survivor = 0 );
99 : : //- Create a composite curve by removing the specified TBPoint.
100 : :
101 : :
102 : : CompositeSurface* remove_curve( Curve* dead_curve,
103 : : bool remove_partitions = false,
104 : : Surface* survivor = 0 );
105 : : //- Create a composite surface by removing the specified Curve
106 : :
107 : : CompositeLump* remove_surface( Surface* dead_surf,
108 : : Surface* stitch_partner = 0,
109 : : bool remove_partitions = false );
110 : : //- Create a composite lump by removing the specified Surface.
111 : : //- Note: If stitch_partner is non-null, you need to call
112 : : //- combine_bodies on the owning bodies first.
113 : :
114 : : CompositeBody* combine_bodies( BodySM* body1, BodySM* body2 );
115 : : //- Combine two BodySMs into one Composite Body.
116 : :
117 : : CubitStatus split_body( CompositeBody* body_to_split,
118 : : DLIList<BodySM*>& resulting_bodies );
119 : : //- Split a CompositeBody into several Bodies
120 : : //- as permissible by common child topology and
121 : : //- existing real Bodies.
122 : :
123 : : CubitStatus restore_point( TBPoint* point );
124 : : //- Split a composite curve by restoring the
125 : : //- passed, previously removed TBPoint.
126 : :
127 : : CubitStatus restore_curve( Curve* curve );
128 : : //- Split a composite surface by restoring the
129 : : //- passed, previously removed Curve.
130 : :
131 : : CubitStatus restore_surface( Surface* surface, Surface*& stitch_parnter );
132 : : //- Split a composite lump by restoring the
133 : : //- passed, previously removed surface.
134 : :
135 : : /*
136 : : static void fix_up_query_results( DLIList<TopologyBridge*>& list,
137 : : bool keep_hidden_entities = false );
138 : : //- Update TB-level query results obtained from calling
139 : : //- get_parents/children_virt such that the results are at the
140 : : //- "composite level" of the TB graph.
141 : : */
142 : : static CubitSimpleAttrib
143 : : find_attribute_by_name( TopologyBridge* bridge, const CubitString name );
144 : : //- Find the attribute with the specified name.
145 : : //- Caller is responsible for freeing the returned, heap-allocated
146 : : //- CubitSimpleAttrib object.
147 : :
148 : : CompositePoint* replace_point( TBPoint* dead_point );
149 : : CompositeCurve* replace_curve( Curve* dead_curve );
150 : : CompositeSurface* replace_surface( Surface* surface );
151 : : CompositeLump* replace_lump( Lump* lump );
152 : : CompositeBody* replace_body( BodySM* body );
153 : : //- These methods are public for use by other clases internal
154 : : //- to the VG code.
155 : :
156 : : /**************** To be called by PartitionEngine *****************/
157 : :
158 : : TBPoint* insert_point(CompositeCurve* curve, double u);
159 : : //- Partition a composite curve.
160 : :
161 : : TBPoint* insert_point_curve( CompositeSurface* surface,
162 : : const CubitVector& position );
163 : :
164 : : CubitStatus insert_curve( DLIList<Surface*>& surfaces,
165 : : DLIList<CubitVector*>& polyline,
166 : : DLIList<Surface*>& new_surfaces,
167 : : DLIList<Curve*>& new_curves );
168 : :
169 : : void notify_deactivated (CompositeBody* body);
170 : : void notify_deactivated (CompositeLump* volume);
171 : : void notify_deactivated (CompositeSurface* surface);
172 : : void notify_deactivated (CompositeCurve* curve);
173 : : void notify_deactivated (CompositePoint* point);
174 : : void clean_out_deactivated_geometry();
175 : :
176 : : CubitStatus restore_point_in_curve( TBPoint* point );
177 : : //- Restore a point hidden by a curve, splitting the
178 : : //- curve.
179 : :
180 : : CompositeCurve* restore_point_in_surface( TBPoint* point );
181 : : //- Restore a point hidden by a surface, creating a
182 : : //- point-curve.
183 : :
184 : :
185 : : CubitStatus translate( CompositeBody* body, const CubitVector& delta );
186 : : CubitStatus rotate( CompositeBody* body, const CubitVector& axis, double degrees );
187 : : CubitStatus scale( CompositeBody* body, const CubitVector& factors );
188 : : CubitStatus reflect( CompositeBody* body, const CubitVector& axis );
189 : : CubitStatus restore_transform( CompositeBody* body );
190 : :
191 : : CubitStatus translate( CompositeSurface* surface, const CubitVector& delta );
192 : : CubitStatus rotate( CompositeSurface* surface, const CubitVector& axis, double degrees );
193 : : CubitStatus scale( CompositeSurface* surface, const CubitVector& factors );
194 : : CubitStatus reflect( CompositeSurface* surface, const CubitVector& axis );
195 : :
196 : : CubitStatus translate( CompositeCurve* curve, const CubitVector& delta );
197 : : CubitStatus rotate( CompositeCurve* curve, const CubitVector& axis, double degrees );
198 : : CubitStatus scale( CompositeCurve* curve, const CubitVector& factors );
199 : : CubitStatus reflect( CompositeCurve* curve, const CubitVector& axis );
200 : :
201 : : CubitStatus notify_transform( TopologyBridge* bridge,
202 : : const CubitTransformMatrix& xform );
203 : :
204 : : static void strip_attributes( TopologyBridge* bridge );
205 : : // remove all attributes related to composite geometry
206 : : // from passed bridge.
207 : :
208 : : void remove_attributes( DLIList<TopologyBridge*> &bridge_list );
209 : : //remove Composite attributes off of topology bridges
210 : : virtual void remove_modified(DLIList<Surface*> &all_surfs,
211 : : DLIList<Curve*> &all_curves, DLIList<TBPoint*> &all_pts);
212 : :
213 : : void get_tbs_with_bridge_manager_as_owner( TopologyBridge *source_bridge,
214 : : DLIList<TopologyBridge*> &tbs );
215 : :
216 : :
217 : : protected:
218 : :
219 : : TBPoint* remove_composite( CompositePoint* point );
220 : : Curve* remove_composite( CompositeCurve* composite );
221 : : Surface* remove_composite( CompositeSurface* composite );
222 : : Lump* remove_composite( CompositeLump* composite );
223 : : BodySM* remove_composite( CompositeBody* composite );
224 : :
225 : : CubitStatus remove_partition_point( CompositePoint* point_owner );
226 : : CubitStatus remove_partition_curves( CompositeCurve* curve_owner );
227 : :
228 : : CompositePoint* destroy_point_curve( CompositeCurve* curve );
229 : :
230 : : CompositeCurve* combine( CompositeCurve* curve1,
231 : : CompositeCurve* curve2,
232 : : CompositePoint* keep_point = 0,
233 : : bool remove_partitions = false );
234 : : CubitStatus split( CompositeCurve* curve, int after_index,
235 : : Curve*& result1, Curve*& resutl2 );
236 : :
237 : : // Shell modification helpers for composite lump creation
238 : : CompositeShell* split_shell( CompositeShell* shell );
239 : : void insert_nonmanifold_surfaces( DLIList<CompositeSurface*>& surfs,
240 : : CompositeShell* shell1,
241 : : CompositeShell* shell2 );
242 : : CubitStatus inside_shell( CompositeShell* const shell,
243 : : CompositeSurface* const surf,
244 : : bool& result );
245 : :
246 : : CubitStatus create_composites( DLIList<BodySM*>& );
247 : : CubitStatus create_composites( DLIList<Surface*>& );
248 : : CubitStatus create_composites( DLIList<Curve*>& );
249 : : CubitStatus create_composites( DLIList<TBPoint*>& );
250 : : //- Methods called by import(..) to re-create
251 : : //- composites from saved attributes.
252 : :
253 : : CubitStatus save( CompositePoint* );
254 : : CubitStatus save( CompositeCurve* );
255 : : CubitStatus save( CompositeSurface* );
256 : : CubitStatus save( CompositeLump* );
257 : : CubitStatus save( CompositeBody* );
258 : :
259 : : static void append_attrib( TopologyBridge* bridge,
260 : : const CubitSimpleAttrib& attrib );
261 : :
262 : :
263 : : static CubitStatus find_coedges( CompositeSurface* surface,
264 : : CompositeCurve* curve,
265 : : CompositePoint* point,
266 : : CompositeCoEdge*& previous,
267 : : CompositeCoEdge*& next );
268 : : static CompositeCoEdge* find_next_point_coedge(
269 : : CompositeSurface* const surface,
270 : : CoEdgeSM* const coedge,
271 : : CompositePoint* point,
272 : : DLIList<CompositeCoEdge*>& point_coedges );
273 : :
274 : : static CompositeEngine* instance_;
275 : :
276 : : private:
277 : :
278 : : CompositeEngine();
279 : :
280 : : CompositeSurface* split_surface( CompositeSurface* surf_to_split,
281 : : CompositeLoop* loop_on_surf,
282 : : CompositeLoop* new_loop );
283 : :
284 : : CompositeLump* split_lump( CompositeShell* shell_to_split );
285 : : // If a shell had a previously-hidden surface inserted into
286 : : // it due to the un-hiding of that surface, test if the
287 : : // shell is split by the surface, and if so, split the shell
288 : : // and corresponding lump.
289 : : void process_curves_after_imprint(Curve *att_bridge,
290 : : Curve *other_bridge,
291 : : DLIList<BodySM*> &new_sms);
292 : : void process_points_after_imprint(TBPoint *att_bridge,
293 : : TBPoint *other_bridge,
294 : : DLIList<BodySM*> &new_sms);
295 : :
296 : : DLIList<TopologyBridge*> deactivatedList;
297 : : };
298 : :
299 : : #endif
|