-
Notifications
You must be signed in to change notification settings - Fork 131
Expand file tree
/
Copy pathinverse_attr3.cc
More file actions
132 lines (113 loc) · 3.72 KB
/
inverse_attr3.cc
File metadata and controls
132 lines (113 loc) · 3.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/** \file inverse_attr3.cc
* Oct 2013
* Test inverse attributes; uses a tiny schema similar to a subset of IFC2x3
*
* This test originally used STEPfile, which didn't work. Fixing STEPfile would have been very difficult, it uses lazyInstMgr now.
*/
#include "config.h"
#include "cllazyfile/lazyInstMgr.h"
#include <lazyRefs.h>
#include "clstepcore/sdai.h"
#include "clstepcore/STEPattribute.h"
#include "clstepcore/ExpDict.h"
#include "clstepcore/Registry.h"
#include "clutils/errordesc.h"
#include <algorithm>
#include <string>
#include <superInvAttrIter.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#include "schema.h"
char * sc_optarg; // global argument pointer
int sc_optind = 0; // global argv index
int sc_getopt( int argc, char * argv[], char * optstring ) {
static char * next = NULL;
if( sc_optind == 0 ) {
next = NULL;
}
sc_optarg = NULL;
if( next == NULL || *next == '\0' ) {
if( sc_optind == 0 ) {
sc_optind++;
}
if( sc_optind >= argc || argv[sc_optind][0] != '-' || argv[sc_optind][1] == '\0' ) {
sc_optarg = NULL;
if( sc_optind < argc ) {
sc_optarg = argv[sc_optind];
}
return EOF;
}
if( strcmp( argv[sc_optind], "--" ) == 0 ) {
sc_optind++;
sc_optarg = NULL;
if( sc_optind < argc ) {
sc_optarg = argv[sc_optind];
}
return EOF;
}
next = argv[sc_optind];
next++; // skip past -
sc_optind++;
}
char c = *next++;
char * cp = strchr( optstring, c );
if( cp == NULL || c == ':' ) {
return '?';
}
cp++;
if( *cp == ':' ) {
if( *next != '\0' ) {
sc_optarg = next;
next = NULL;
} else if( sc_optind < argc ) {
sc_optarg = argv[sc_optind];
sc_optind++;
} else {
return '?';
}
}
return c;
}
int main( int argc, char * argv[] ) {
int exitStatus = EXIT_SUCCESS;
if( argc != 2 ) {
cerr << "Wrong number of args!" << endl;
exit( EXIT_FAILURE );
}
lazyInstMgr lim;
lim.initRegistry( SchemaInit );
lim.openFile( argv[1] );
//find attributes
instanceTypes_t::cvector * insts = lim.getInstances( "window" );
if( !insts || insts->empty() ) {
cout << "No window instances found!" << endl;
exit( EXIT_FAILURE );
}
SdaiWindow * instance = dynamic_cast< SdaiWindow * >( lim.loadInstance( insts->at( 0 ) ) );
if( !instance ) {
cout << "Problem loading instance" << endl;
exit( EXIT_FAILURE );
}
cout << "instance #" << instance->StepFileId() << endl;
SDAI_Application_instance::iAMap_t::value_type v = instance->getInvAttr("isdefinedby");
iAstruct attr = v.second; //instance->getInvAttr(ia);
if( attr.a && attr.a->EntryCount() ) {
cout << "Map: found " << attr.a->EntryCount() << " inverse references." << endl;
} else {
cout << "Map: found no inverse references. ias " << (void *) &(v.second) << ", ia " << (void*) v.first << endl;
exitStatus = EXIT_FAILURE;
}
EntityAggregate * aggr = instance->isdefinedby_(); //should be filled in when the file is loaded? not sure how to do it using STEPfile...
if( attr.a != aggr ) {
cout << "Error! got different EntityAggregate's when using map vs method" << endl;
exitStatus = EXIT_FAILURE;
}
if( aggr && aggr->EntryCount() ) {
cout << "Found " << aggr->EntryCount() << " inverse references." << endl;
} else {
cout << "inverse attr is not defined" << endl;
exitStatus = EXIT_FAILURE;
}
exit( exitStatus );
}