Branch data Line data Source code
1 : : //- Class: ChollaSkinTool
2 : : //- Description: Creates a skin defined by facets and points, depending on the
3 : : //- dimensionality of the desired skin.
4 : : //- Owner: Steve Owen
5 : : //- Checked by:
6 : : //- Version:
7 : : #include "ChollaSkinTool.hpp"
8 : : #include "FacetEntity.hpp"
9 : : #include "TDGeomFacet.hpp"
10 : : #include "CastTo.hpp"
11 : : #include "ChollaSurface.hpp"
12 : : #include "ChollaCurve.hpp"
13 : : #include "CubitFacetEdge.hpp"
14 : : #include "TDFacetBoundaryEdge.hpp"
15 : : #include "ChollaDebug.hpp"
16 : : #include "GfxDebug.hpp"
17 : :
18 : : static int mydebug = 0;
19 : : //==================================================================================
20 : : //Function: ChollaSkinTool (PUBLIC) (constructor)
21 : : //==================================================================================
22 : 396 : ChollaSkinTool::ChollaSkinTool()
23 : : {
24 : 396 : }
25 : : //==================================================================================
26 : : //Function: ~ChollaSkinTool (PUBLIC) (destructor)
27 : : //==================================================================================
28 : 396 : ChollaSkinTool::~ChollaSkinTool()
29 : : {
30 : 396 : }
31 : :
32 : : //==================================================================================
33 : : //Function: skin_1d (PUBLIC)
34 : : //Description: creates a skin of the given facet entities.
35 : : //==================================================================================
36 : 0 : CubitStatus ChollaSkinTool::skin_1d(DLIList<FacetEntity*> &facet_list,
37 : : ChollaCurve *&facet_curve_mesh_ptr)
38 : : {
39 : 0 : CubitStatus rv = CUBIT_SUCCESS;
40 : :
41 : : // create a ChollaCurve if we have to (only if this is a 1D facet)
42 : :
43 [ # # ]: 0 : if (!facet_curve_mesh_ptr)
44 : : {
45 : 0 : FacetEntity *edge_ptr = facet_list.get();
46 : 0 : TDGeomFacet *td_gm = TDGeomFacet::get_geom_facet( edge_ptr );
47 [ # # ]: 0 : facet_curve_mesh_ptr = new ChollaCurve( td_gm->get_block_id() );
48 : :
49 : : // associate all of the tooldata on the faces of this surf with the
50 : : // new ChollaCurve
51 : :
52 : : int ii;
53 [ # # ]: 0 : for (ii=0; ii<facet_list.size(); ii++)
54 : : {
55 : 0 : edge_ptr = facet_list.get_and_step();
56 : 0 : facet_curve_mesh_ptr->add_facet( edge_ptr );
57 : 0 : td_gm = TDGeomFacet::get_geom_facet( edge_ptr );
58 : 0 : td_gm->add_cholla_curve( facet_curve_mesh_ptr );
59 : : }
60 : : }
61 : :
62 : : // Note: the start and end points of this curve will be defined in
63 : : // ChollaCurve::split_curve. The BlockPointMesh objects at these points
64 : : // will be defined in MeshGeometryCreator::classify_node
65 : :
66 : 0 : return rv;
67 : : }
68 : :
69 : : //==================================================================================
70 : : //Function: skin_2d (PUBLIC)
71 : : //Description: creates a skin of the given mesh entities.
72 : : //==================================================================================
73 : 396 : CubitStatus ChollaSkinTool::skin_2d(DLIList<FacetEntity*> &facet_list,
74 : : ChollaSurface *&facet_surface_mesh_ptr)
75 : : {
76 [ - + ]: 396 : if(facet_list.size() == 0){
77 : 0 : return CUBIT_SUCCESS;
78 : : }
79 : :
80 : 396 : int debugflag=0;
81 [ - + ]: 396 : if (debugflag)
82 : : {
83 : 0 : dcolor(CUBIT_YELLOW_INDEX);
84 : 0 : dldraw( facet_list );
85 : 0 : dview();
86 : 0 : dcolor(CUBIT_RED_INDEX);
87 : : }
88 : 396 : CubitStatus rv = CUBIT_SUCCESS;
89 : : int block_id;
90 : :
91 : : // create a ChollaSurface if we have to (only if this is a 2D model)
92 : :
93 : 396 : FacetEntity *face_ptr = facet_list.get();
94 : 396 : TDGeomFacet *td_gm = TDGeomFacet::get_geom_facet( face_ptr );
95 : 396 : block_id = td_gm->get_block_id();
96 [ + + ]: 396 : if (!facet_surface_mesh_ptr)
97 : : {
98 [ + - ]: 88 : facet_surface_mesh_ptr = new ChollaSurface(block_id);
99 : :
100 : : // associate all of the tooldata on the faces of this surf with the new ChollaSurface
101 : :
102 : : int ii;
103 [ + + ]: 1144 : for (ii=0; ii<facet_list.size(); ii++)
104 : : {
105 : 1056 : face_ptr = facet_list.get_and_step();
106 : 1056 : facet_surface_mesh_ptr->add_facet( face_ptr );
107 : 1056 : td_gm = TDGeomFacet::get_geom_facet( face_ptr );
108 : 1056 : td_gm->add_cholla_surf( facet_surface_mesh_ptr );
109 : 1056 : td_gm->set_hit_flag( facet_surface_mesh_ptr->get_id() );
110 : : }
111 : : }
112 : :
113 : : // create a single ChollaCurve for this surface (assumes one loop of edges)
114 : :
115 [ + - ]: 396 : ChollaCurve *fcm_ptr = new ChollaCurve( block_id );
116 : 396 : facet_surface_mesh_ptr->add_curve( fcm_ptr );
117 : 396 : fcm_ptr->add_surface( facet_surface_mesh_ptr );
118 : :
119 : : // loop through all faces on this surface searching for the boundary edges
120 : :
121 : : int jj, kk, ll;
122 [ + + ]: 2420 : for ( kk = 0; kk < facet_list.size(); kk++)
123 : : {
124 [ + - ]: 2024 : face_ptr = facet_list.get_and_step();
125 [ + - ]: 2024 : DLIList<CubitFacetEdge*> edge_list;
126 [ + - ]: 2024 : face_ptr->edges( edge_list );
127 : :
128 : : // loop through each edge on this face searching for boundary edges
129 : :
130 [ + - ][ + + ]: 8096 : for (jj=edge_list.size(); jj > 0; jj--)
131 : : {
132 [ + - ]: 6072 : CubitFacetEdge *edge_ptr = edge_list.get_and_step();
133 : :
134 : : // check if this edge has already been processed from an adjacent surface.
135 : : // If it has, then tool data would have already been defined at this edge
136 : : // and by definition would be at the boundary (only tooldatas on edges
137 : : // at the boundary ofa surface are created)
138 : :
139 [ + - ]: 6072 : TDGeomFacet *td_gm_edge = TDGeomFacet::get_geom_facet(edge_ptr);
140 : 6072 : int on_boundary = 0;
141 [ + + ]: 6072 : if (td_gm_edge != NULL)
142 : : {
143 : 1188 : on_boundary = 1;
144 : :
145 : : // check for internal C-zero edge
146 : :
147 [ + - ][ + + ]: 1188 : if (edge_ptr->num_adj_facets() == 2)
148 : : {
149 : : TDFacetBoundaryEdge *td_fbe =
150 [ + - ]: 1056 : TDFacetBoundaryEdge::get_facet_boundary_edge( edge_ptr );
151 [ + - ]: 1056 : if (td_fbe != NULL)
152 : : {
153 [ + - ][ - + ]: 1056 : if (td_fbe->is_internal_edge())
154 : : {
155 : 1188 : on_boundary = 0;
156 : : }
157 : : }
158 : : }
159 : : }
160 : :
161 : : // check for general case where no tool data yet defined
162 : :
163 : : else
164 : : {
165 [ + - ]: 4884 : DLIList<FacetEntity*> adj_face_list;
166 : :
167 : : // check the adjacent faces to this edge. If only one adjacent face, then
168 : : // it is on the boundary. If more than one face, then the other face(s)
169 : : // must be associated with a surface other than facet_surface_mesh_ptr
170 : : // in order to be on the boundary
171 : :
172 [ + - ]: 4884 : edge_ptr->get_parents( adj_face_list );
173 [ + - ][ + + ]: 4884 : if (adj_face_list.size() <= 1)
174 : : {
175 : 220 : on_boundary = 1;
176 : : }
177 : : else
178 : : {
179 [ + - ][ + + ]: 13992 : for (ll=adj_face_list.size(); ll> 0 && !on_boundary; ll--)
[ + - ]
180 : : {
181 [ + - ]: 9328 : FacetEntity *adj_face_ptr = adj_face_list.get_and_step();
182 [ + + ]: 9328 : if (adj_face_ptr != face_ptr)
183 : : {
184 [ + - ]: 4664 : TDGeomFacet *td_gm_adjface = TDGeomFacet::get_geom_facet(adj_face_ptr);
185 [ + - ]: 4664 : DLIList<ChollaSurface*> surf_list;
186 [ + - ]: 4664 : td_gm_adjface->get_cholla_surfs( surf_list );
187 : :
188 : : // if it doesn't have an associated surface yet, then it is
189 : : // a neighboring surface that has not been defined yet (this
190 : : // should only occur for the 2D case)
191 : :
192 [ + - ][ - + ]: 4664 : if (surf_list.size() == 0)
193 : : {
194 : 0 : on_boundary = 1;
195 : : }
196 : : else
197 : : {
198 : :
199 : : // there should only be one surface associated with
200 : : // each face - otherwise we've screwed up somewhere
201 : :
202 [ + - ][ - + ]: 4664 : assert ( surf_list.size() == 1 );
203 : :
204 : : // if the surface is not the same as the current surface
205 : : // then we are at the boundary
206 : :
207 [ + - ]: 4664 : ChollaSurface *check_bsm_ptr = surf_list.get();
208 [ - + ]: 4664 : if (facet_surface_mesh_ptr != check_bsm_ptr)
209 : : {
210 : 0 : on_boundary = 1;
211 : : }
212 [ + - ]: 4664 : }
213 : : }
214 : : }
215 [ + - ]: 4884 : }
216 : : }
217 [ + + ]: 6072 : if (on_boundary)
218 : : {
219 : : // create a tool data if needed
220 : :
221 [ + + ]: 1408 : if (td_gm_edge == NULL)
222 : : {
223 [ + - ]: 220 : TDGeomFacet::add_geom_facet(edge_ptr, -1);
224 [ + - ]: 220 : td_gm_edge = TDGeomFacet::get_geom_facet( edge_ptr );
225 [ + - ]: 220 : edge_ptr->set_as_feature();
226 : : }
227 : :
228 : : // add the pointer to this surface onto the edge tool data
229 : :
230 [ + - ]: 1408 : td_gm_edge->add_cholla_surf( facet_surface_mesh_ptr );
231 : :
232 : : // add this edge to the curve
233 : :
234 [ + - ]: 1408 : fcm_ptr->add_facet( edge_ptr );
235 [ - + ]: 1408 : if (mydebug)
236 [ # # ]: 0 : dedraw(edge_ptr);
237 : : }
238 : : }
239 [ + - ]: 2024 : }
240 : :
241 : 396 : return rv;
242 [ + - ][ + - ]: 6540 : }
243 : :
244 : :
245 : :
246 : :
247 : :
248 : :
|