Branch data Line data Source code
1 : : //=======================================================================
2 : : //
3 : : // File: CubitFacetEdgeData
4 : : // Description: used for edges of CubitFacets. These are optional
5 : : // and used only if specific information must be stored at
6 : : // the edge common to tow facets
7 : : // Owner: sjowen
8 : : //
9 : : //=======================================================================
10 : :
11 : : #include "CubitFacetEdge.hpp"
12 : : #include "CubitFacetEdgeData.hpp"
13 : : #include "CubitFacetData.hpp"
14 : : #include "CubitPoint.hpp"
15 : : #include "CubitVector.hpp"
16 : : #include "GeometryDefines.h"
17 : : #include "ToolData.hpp"
18 : :
19 : : static int counter_id = 0;
20 : :
21 : : //======================================================================
22 : : // Function: CubitFacetEdgeData (PUBLIC)
23 : : // Description: constructor. Determines the adjacencies from existing
24 : : // CubitPoint adjacency information
25 : : // Note: can handle non-manifold topology
26 : : // Author: sjowen
27 : : // Date: 8/00
28 : : //======================================================================
29 [ + - ]: 4972 : CubitFacetEdgeData::CubitFacetEdgeData( CubitPoint *p1, CubitPoint *p2 )
30 : : {
31 [ + - ][ - + ]: 2486 : assert( p1 && p2 );
32 [ - + ]: 2486 : assert( p1 != p2 );
33 : 2486 : pointArray[0] = p1;
34 : 2486 : pointArray[1] = p2;
35 : :
36 : 2486 : counter_id++;
37 : 2486 : entityId = counter_id;
38 : :
39 : : // determine adjacency (assumes facets are already defined)
40 : : // set the edge and use on the adjacent facets
41 : :
42 : : int sense;
43 : : int eindex;
44 : : CubitFacet *facet_ptr;
45 [ + - ]: 2486 : DLIList<CubitFacet*> facet_list;
46 [ + - ]: 2486 : p1->facets( facet_list );
47 : : CubitBoolean found;
48 [ + - ][ + + ]: 10516 : for(int ii=0; ii<facet_list.size(); ii++) {
49 : 8030 : found = CUBIT_FALSE;
50 [ + - ]: 8030 : facet_ptr = facet_list.get_and_step();
51 [ + + ][ + + ]: 29458 : for(int jj=0; jj<3 && !found; jj++)
52 : : {
53 [ + - ][ + + ]: 21428 : if (facet_ptr->point(jj) == p2)
54 : : {
55 : 3168 : found = CUBIT_TRUE;
56 [ + - ]: 3168 : adjFacetList.append(facet_ptr);
57 [ + - ]: 3168 : eindex = facet_ptr->edge_index( p1, p2, sense );
58 [ + - ]: 3168 : facet_ptr->edge( this, eindex );
59 [ + - ]: 3168 : facet_ptr->edge_use( sense, eindex );
60 : : }
61 : : }
62 [ + - ]: 2486 : }
63 : 2486 : }
64 : :
65 : : //======================================================================
66 : : // Function: CubitFacetEdgeData (PUBLIC)
67 : : // Description: overloaded constructor: Adjacency information is
68 : : // provided in the arguments -- assumes a 2D topology
69 : : // Author: sjowen
70 : : // Date: 8/00
71 : : //======================================================================
72 : 0 : CubitFacetEdgeData::CubitFacetEdgeData( CubitPoint *p1, CubitPoint *p2,
73 : : CubitFacet *facet1, CubitFacet *facet2,
74 [ # # ]: 0 : int edge_index1, int edge_index2)
75 : : {
76 [ # # ][ # # ]: 0 : assert( p1 && p2 );
77 [ # # ]: 0 : assert( p1 != p2 );
78 : 0 : pointArray[0] = p1;
79 : 0 : pointArray[1] = p2;
80 : :
81 : 0 : counter_id++;
82 : 0 : entityId = counter_id;
83 : :
84 [ # # ]: 0 : if (facet1) {
85 [ # # ]: 0 : adjFacetList.append(facet1);
86 [ # # ]: 0 : facet1->edge( this, edge_index1 );
87 [ # # ]: 0 : facet1->edge_use( 1, edge_index1 );
88 : : }
89 [ # # ]: 0 : if (facet2) {
90 [ # # ]: 0 : adjFacetList.append(facet2);
91 [ # # ]: 0 : facet2->edge( this, edge_index2 );
92 [ # # ]: 0 : facet2->edge_use( -1, edge_index2 );
93 : : }
94 : 0 : }
95 : :
96 : : //======================================================================
97 : : // Function: ~CubitFacetEdgeData (PUBLIC)
98 : : // Description: destructor
99 : : // Author: sjowen
100 : : // Date: 8/00
101 : : //======================================================================
102 [ # # ]: 0 : CubitFacetEdgeData::~CubitFacetEdgeData()
103 : : {
104 [ # # ][ # # ]: 0 : assert(adjFacetList.size() == 0);
105 [ # # ]: 0 : }
106 : :
107 : : //======================================================================
108 : : // Function: adj_facet (PUBLIC)
109 : : // Description: get a specific adjacent facet (by index)
110 : : // Author: sjowen
111 : : // Date: 4/01
112 : : //======================================================================
113 : 0 : CubitFacet *CubitFacetEdgeData::adj_facet( int index )
114 : : {
115 [ # # ][ # # ]: 0 : if (index < 0 || index > adjFacetList.size() - 1)
[ # # ]
116 : 0 : return (CubitFacet *)NULL;
117 : 0 : adjFacetList.reset();
118 : 0 : return adjFacetList.next(index);
119 : : }
120 : :
121 : : //======================================================================
122 : : // Function: facets (PUBLIC)
123 : : // Description: get the atached facets
124 : : // Author: sjowen
125 : : // Date: 4/01
126 : : //======================================================================
127 : 16346 : void CubitFacetEdgeData::facets(DLIList<CubitFacet*> &facet_list)
128 : : {
129 : 16346 : facet_list += adjFacetList;
130 : 16346 : }
131 : :
132 : : //======================================================================
133 : : // Function: edges (PUBLIC)
134 : : // Description: get the atached edges
135 : : // Author: sjowen
136 : : // Date: 4/01
137 : : //======================================================================
138 : 0 : void CubitFacetEdgeData::edges(DLIList<CubitFacetEdge*> &edge_list )
139 : : {
140 [ # # ]: 0 : edge_list.append( this );
141 : 0 : }
142 : :
143 : : //======================================================================
144 : : // Function: points (PUBLIC)
145 : : // Description: get the attached points
146 : : // Author: sjowen
147 : : // Date: 4/01
148 : : //======================================================================
149 : 1914 : void CubitFacetEdgeData::points(DLIList<CubitPoint*> &point_list )
150 : : {
151 : 1914 : point_list.append( pointArray[0] );
152 : 1914 : point_list.append( pointArray[1] );
153 : 1914 : }
154 : :
155 : : //======================================================================
156 : : // Function: remove_facet (PUBLIC)
157 : : // Description: remove the facet from the edge adjacency list
158 : : // Author: sjowen
159 : : // Date: 4/01
160 : : //======================================================================
161 : 0 : CubitStatus CubitFacetEdgeData::remove_facet( CubitFacet *facet_ptr )
162 : : {
163 : 0 : CubitStatus stat = CUBIT_SUCCESS;
164 : 0 : bool removed = adjFacetList.remove( facet_ptr );
165 [ # # ]: 0 : if (removed)
166 : 0 : stat = CUBIT_SUCCESS;
167 : : else
168 : 0 : stat = CUBIT_FAILURE;
169 : 0 : return stat;
170 : : }
171 : :
172 : : //-------------------------------------------------------------------------
173 : : // Purpose : Merge edges
174 : : //
175 : : // Special Notes : points must already be merged.
176 : : //
177 : : // Creator : Jason Kraftcheck
178 : : //
179 : : // Creation Date : 02/24/03
180 : : //-------------------------------------------------------------------------
181 : 0 : CubitStatus CubitFacetEdgeData::merge_edges( CubitFacetEdgeData* other_edge )
182 : : {
183 [ # # ]: 0 : if( other_edge == this )
184 : 0 : return CUBIT_SUCCESS;
185 : :
186 : 0 : int reversed = false;
187 [ # # ][ # # ]: 0 : if ( point(0) == other_edge->point(1) && point(1) == other_edge->point(0) )
[ # # ]
188 : 0 : reversed = true;
189 [ # # ][ # # ]: 0 : else if( point(0) != other_edge->point(0) || point(1) != other_edge->point(1) )
[ # # ]
190 : 0 : return CUBIT_FAILURE;
191 : :
192 : : CubitFacetData* facet;
193 : 0 : adjFacetList.reset();
194 [ # # ]: 0 : while( other_edge->adjFacetList.size() )
195 : : {
196 [ # # ]: 0 : facet = dynamic_cast<CubitFacetData*>(other_edge->adjFacetList.pop());
197 [ # # ]: 0 : for ( int i = 0; i < 3; i++ )
198 : : {
199 [ # # ]: 0 : if( facet->edge(i) == other_edge )
200 : : {
201 : 0 : facet->edge( this, i );
202 : 0 : add_facet(facet);
203 [ # # ]: 0 : if( reversed )
204 : 0 : facet->edge_use( -facet->edge_use(i), i );
205 : : }
206 : : }
207 : : }
208 : :
209 [ # # ]: 0 : delete other_edge;
210 : 0 : return CUBIT_SUCCESS;
211 : : }
212 : :
213 : 44 : void CubitFacetEdgeData::flip()
214 : : {
215 : 44 : CubitPoint* tmp = pointArray[0];
216 : 44 : pointArray[0] = pointArray[1];
217 : 44 : pointArray[1] = tmp;
218 [ + + ]: 88 : for ( int i = adjFacetList.size(); i--; )
219 : : {
220 : 44 : CubitFacet* facet = adjFacetList.get_and_step();
221 : 44 : int index = facet->edge_index(this);
222 [ - + ]: 44 : assert(index >= 0);
223 : 44 : facet->edge_use( -facet->edge_use(index), index );
224 : : }
225 : 44 : toggle_is_flipped();
226 : 44 : }
227 : :
|