File: ivNodeKitStructure.c%2B%2B

package info (click to toggle)
inventor 2.1.6%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 33,676 kB
  • sloc: ansic: 34,082; lisp: 7,361; cpp: 3,874; yacc: 369; sh: 343; perl: 234; awk: 141; csh: 35; makefile: 17; sed: 11
file content (145 lines) | stat: -rw-r--r-- 4,609 bytes parent folder | download | duplicates (2)
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
 *
 *  Copyright (C) 2000 Silicon Graphics, Inc.  All Rights Reserved. 
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  Further, this software is distributed without any warranty that it is
 *  free of the rightful claim of any third person regarding infringement
 *  or the like.  Any license provided herein, whether implied or
 *  otherwise, applies only to this software file.  Patent licenses, if
 *  any, provided herein do not apply to combinations of this program with
 *  other software, or any other product whatsoever.
 * 
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
 *  Mountain View, CA  94043, or:
 * 
 *  http://www.sgi.com 
 * 
 *  For further information regarding this notice, see: 
 * 
 *  http://oss.sgi.com/projects/GenInfo/NoticeExplan/
 *
 */

//
// Print information about the Structure of a Nodekit class.
//

#include <cstdlib>
#include <cstdio>
#include <dlfcn.h>
#include <unistd.h>
#include <Inventor/SoDB.h>
#include <Inventor/nodekits/SoBaseKit.h>
#include <Inventor/Xt/SoXt.h>

static void
print_usage(const char *progname)
{
    (void)fprintf(stderr, "\nThis program prints a diagram and a table of the structure of a nodekit class.\n");
    (void)fprintf(stderr, "See the README for details about the diagrams and tables.\n\n");
    (void)fprintf(stderr, "Usage: %s [-h] className\n\n", progname);
    (void)fprintf(stderr, "       -h : This message (help)\n");
    (void)fprintf(stderr, "className : The name of any node class");
    (void)fprintf(stderr, "derived from SoBaseKit.\n");
    (void)fprintf(stderr, "            This includes all dragger classes as well.\n");
    exit(99);
}

static void
parse_args(int argc, char **argv)
{
    int err = 0;	// Flag: error in options?
    int c;
    
    while ((c = getopt(argc, argv, "h")) != -1) {
	switch(c) {
	  case 'h':	// Help
	  default:
	    err = 1;
	    break;
	}
    }

    if (err) {
	print_usage(argv[0]);
    }
}

int
main(int argc, char **argv)
{
    SoXt::init(argv[0]);

    // Parse arguments

    parse_args(argc, argv);
    char *classString;

    if (optind != (argc - 1))
	print_usage(argv[0]);
    else
	classString = strdup(argv[optind]);

    // 'fromName' takes the name of the Class as it appears in file.
    // For the built-in Inventor types, this differs from the class name
    // because it has no 'So' prefix.
    // Therefore, if the class name begins with 'So', our first try will be
    // with the prefix removed.
    SbBool startsWithSo = FALSE;
    if ( !strncmp( classString, "So", 2 ) ) {
	startsWithSo = TRUE;
    }

    char *lookupString;
    if (startsWithSo == TRUE)
	lookupString = classString + 2;
    else
	lookupString = classString;

    SoType classType = SoType::fromName(lookupString);

    // If we got a bad type and the name began with "So" we will type
    // a message and try again with the full name.
    if (classType == SoType::badType() && startsWithSo) {
	fprintf(stderr,"The className you gave has a prefix of \"So\"\n");
	fprintf(stderr,"I tried to remove the prefix and look it up but\n");
	fprintf(stderr,"found no such class. Now I'll try again with the\n");
	fprintf(stderr,"full string you gave me\n");
	classType = SoType::fromName(classString);
    }

    if (classType == SoType::badType()) {
	fprintf(stderr, "ERROR: The given className is not a valid\n");
	fprintf(stderr, "       node type. Message retrieved \n");
	fprintf(stderr, "       from dlerror() follows:\n%s\n", dlerror());
	exit(0);
    }
    else if ( ! classType.isDerivedFrom(SoBaseKit::getClassTypeId())) {
	fprintf(stderr, "ERROR: The given className is not a subClass\n");
	fprintf(stderr, "       of SoBaseKit.\n");
	exit(0);
    }

    SoBaseKit *myKit = (SoBaseKit *) classType.createInstance();

    // Print the diagram and the table.
    myKit->printDiagram();
    fprintf(stdout, "\n\n");
    myKit->printTable();

    return 0;
}