Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : Body.cpp
3 : : //
4 : : // Purpose : This file contains the implementation of the class
5 : : // Body.
6 : : //
7 : : // Special Notes :
8 : : //
9 : : // Creator :
10 : : //
11 : : // Creation Date :
12 : : //
13 : : // Owner :
14 : : //-------------------------------------------------------------------------
15 : :
16 : : #include <assert.h>
17 : : #include "CubitDefines.h"
18 : : #include "CubitMessage.hpp"
19 : : #include "CubitBox.hpp"
20 : :
21 : : #include "BodySM.hpp"
22 : : #include "Body.hpp"
23 : :
24 : : #include "CoVolume.hpp"
25 : : #include "CoEdge.hpp"
26 : :
27 : : #include "RefVolume.hpp"
28 : : #include "RefFace.hpp"
29 : : #include "RefEdge.hpp"
30 : : #include "DLIList.hpp"
31 : : #include "RefEntityFactory.hpp"
32 : : #include "GeometryQueryTool.hpp"
33 : : #include "GeometryQueryEngine.hpp"
34 : : #include "CastTo.hpp"
35 : :
36 : :
37 : : //-------------------------------------------------------------------------
38 : : // Purpose : Default constructor.
39 : : //
40 : : // Special Notes :
41 : : //
42 : : // Creator : Xuechen Liu
43 : : //
44 : : // Creation Date : 08/06/96
45 : : //-------------------------------------------------------------------------
46 [ # # ]: 0 : Body::Body()
47 : : {
48 : 0 : }
49 : :
50 : : //-------------------------------------------------------------------------
51 : : // Purpose : A constructor with a pointer to an TopologyBridge
52 : : // as input.
53 : : //
54 : : // Special Notes :
55 : : //
56 : : // Creator : Xuechen Liu
57 : : //
58 : : // Creation Date : 08/06/96
59 : : //-------------------------------------------------------------------------
60 [ + - ]: 5432 : Body::Body(BodySM* OSMEPtr)
61 : : {
62 : : // Set the new Body's OSME pointer
63 [ + - ]: 2716 : if (OSMEPtr != NULL)
64 : : {
65 [ + - ]: 2716 : set_topology_bridge(OSMEPtr) ;
66 : : }
67 : : else
68 : : {
69 [ # # ][ # # ]: 0 : PRINT_ERROR("In the Body(OSME*) constructor\n");
[ # # ][ # # ]
70 [ # # ][ # # ]: 0 : PRINT_ERROR(" Input OSME pointer is NULL\n");
[ # # ][ # # ]
71 [ # # ]: 0 : assert(OSMEPtr != NULL);
72 : : }
73 : :
74 : : // Set the Entity ID for this new Body
75 [ + - ][ + - ]: 2716 : entityId = RefEntityFactory::instance()->next_body_id();
76 : :
77 : : // read and initialize attributes
78 [ + - ]: 2716 : auto_read_cubit_attrib();
79 [ + - ]: 2716 : auto_actuate_cubit_attrib();
80 : :
81 : : // Assign a default entity name
82 [ + - ]: 2716 : assign_default_name();
83 : 2716 : }
84 : :
85 : : //-------------------------------------------------------------------------
86 : : // Purpose : The destructor
87 : : //
88 : : // Special Notes :
89 : : //
90 : : // Creator : Raikanta Sahu
91 : : //
92 : : // Creation Date : 10/22/96
93 : : //-------------------------------------------------------------------------
94 [ + - ]: 4647 : Body::~Body()
95 : : {
96 [ - + ]: 3098 : }
97 : :
98 : :
99 : : //-------------------------------------------------------------------------
100 : : // Purpose : Get BodySM ptr
101 : : //
102 : : // Special Notes :
103 : : //
104 : : // Creator : Jason Kraftcheck
105 : : //
106 : : // Creation Date : 07/23/03
107 : : //-------------------------------------------------------------------------
108 : 7860 : BodySM* Body::get_body_sm_ptr() const
109 : : {
110 : 7860 : TopologyBridge* bridge = bridge_manager()->topology_bridge();
111 [ + + ]: 7860 : return dynamic_cast<BodySM*>(bridge);
112 : : }
113 : :
114 : : //-------------------------------------------------------------------------
115 : : // Purpose : Check if this body contains only sheet volumes.
116 : : //
117 : : // Special Notes :
118 : : //
119 : : // Creator : Jason Kraftcheck
120 : : //
121 : : // Creation Date : 01/15/04
122 : : //-------------------------------------------------------------------------
123 : 55 : CubitBoolean Body::is_sheet_body()
124 : : {
125 [ + - ]: 55 : DLIList<RefVolume*> volumes;
126 [ + - ]: 55 : ref_volumes(volumes);
127 [ + - ][ + + ]: 88 : while (volumes.size())
128 [ + - ][ + - ]: 55 : if (!volumes.pop()->is_sheet())
[ + + ]
129 : 22 : return CUBIT_FALSE;
130 [ + - ]: 55 : return CUBIT_TRUE;
131 : : }
132 : :
133 : 22 : CubitVector Body::center_point()
134 : : {
135 [ + - ]: 22 : return bounding_box().center();
136 : : }
137 : :
138 : 0 : CubitPointContainment Body::point_containment( CubitVector &point )
139 : : {
140 : 0 : return get_body_sm_ptr()->point_containment( point );
141 : : }
142 : :
143 : 0 : CubitBoolean Body::get_mass_props(CubitVector &cofg)
144 : : {
145 : : double vol;
146 [ # # ][ # # ]: 0 : CubitStatus result = get_body_sm_ptr()->mass_properties(cofg, vol);
147 [ # # ]: 0 : return result ? CUBIT_TRUE : CUBIT_FALSE;
148 : : }
149 : :
150 : : //-------------------------------------------------------------------------
151 : : // Purpose : Get the bounding box of the object.
152 : : //
153 : : // Special Notes : This function assumes that a Body's spatial extent is
154 : : // defined by the set of RefVolumes it "owns".
155 : : //
156 : : // Creator : Malcolm J. Panthaki
157 : : //
158 : : // Creation Date : 10/23/96
159 : : //-------------------------------------------------------------------------
160 : 573 : CubitBox Body::bounding_box()
161 : : {
162 : : // Get the list of RefVolumes. Perform the union of the bounding
163 : : // boxes of all the RefVolumes to obtain the bounding box of
164 : : // the Body.
165 [ + - ]: 573 : DLIList<RefVolume*> ref_volume_list ;
166 : : /*CubitStatus status = */
167 [ + - ]: 573 : ref_volumes(ref_volume_list);
168 : :
169 [ + - ][ - + ]: 573 : if ( ref_volume_list.size() == 0 )
170 : : {
171 [ # # ]: 0 : CubitVector vec(0.0, 0.0, 0.0);
172 [ # # ]: 0 : return CubitBox( vec, vec );
173 : : }
174 : 573 : RefVolume* ref_volume_ptr = NULL ;
175 : :
176 [ + - ]: 573 : ref_volume_list.reset() ;
177 [ + - ][ + - ]: 1146 : CubitBox result_box = ref_volume_list.get_and_step()->bounding_box();
[ + - ]
178 [ + - ][ + + ]: 661 : for(int i = 1 ; i < ref_volume_list.size() ; i++)
179 : : {
180 [ + - ]: 88 : ref_volume_ptr = ref_volume_list.get_and_step() ;
181 [ + - ][ + - ]: 88 : result_box |= ref_volume_ptr->bounding_box() ;
[ + - ]
182 : : }
183 : :
184 [ + - ][ + - ]: 1146 : return result_box ;
185 : : }
186 : :
187 : :
188 : 95 : double Body::measure()
189 : : {
190 [ + - ]: 95 : DLIList<RefVolume*> volumes;
191 [ + - ]: 95 : ref_volumes(volumes);
192 : 95 : double volume = 0.0;
193 [ + - ][ + + ]: 201 : for (int i = volumes.size(); i > 0; i--)
194 : : {
195 [ + - ][ + - ]: 106 : volume += volumes.get_and_step()->measure();
196 : : }
197 : :
198 [ + - ]: 95 : return volume;
199 : : }
200 : :
201 : 0 : CubitString Body::measure_label()
202 : : {
203 : 0 : return "volume";
204 : : }
205 : :
206 : 0 : int Body::validate()
207 : : {
208 : 0 : int error = 0;
209 : :
210 : : // Perform general RefEntity checks (measure > 0)
211 [ # # ]: 0 : error += RefEntity::validate();
212 : :
213 : : // check the body from acis
214 [ # # ]: 0 : BodySM* osme_ptr = get_body_sm_ptr();
215 [ # # ]: 0 : DLIList <TopologyEntity*> bad_entities;
216 [ # # ]: 0 : if ( osme_ptr != NULL )
217 : : {
218 : :
219 [ # # ][ # # ]: 0 : error += osme_ptr->validate( entity_name(), bad_entities);
[ # # ]
220 : : }
221 : : else
222 : : {
223 [ # # ][ # # ]: 0 : PRINT_WARNING("\tWARNING: Null underlying solid modeling body for %s, (%s %d)\n",
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
224 [ # # ]: 0 : entity_name().c_str(), class_name(), id());
225 : 0 : error++;
226 : : }
227 [ # # ]: 0 : return error;
228 : : }
229 : :
230 : 0 : void Body::color(int value)
231 : : {
232 : : int i;
233 [ # # ]: 0 : DLIList<RefVolume*> refVolumeList;
234 [ # # ]: 0 : ref_volumes ( refVolumeList );
235 : :
236 [ # # ]: 0 : refVolumeList.reset();
237 [ # # ][ # # ]: 0 : for (i = refVolumeList.size(); i--; )
238 [ # # ][ # # ]: 0 : refVolumeList.get_and_step()->color(value);
[ # # ]
239 : 0 : }
240 : :
241 : 0 : int Body::color() const
242 : : {
243 : 0 : return RefEntity::color();
244 [ + - ][ + - ]: 6540 : }
245 : :
246 : :
|