0022898: IGES import fails in german environment
[occt.git] / src / Materials / Materials_MaterialsDictionary.cxx
CommitLineData
b311480e 1// Created on: 1993-01-18
2// Created by: Gilles DEBARBOUILLE
3// Copyright (c) 1993-1999 Matra Datavision
4// Copyright (c) 1999-2012 OPEN CASCADE SAS
5//
6// The content of this file is subject to the Open CASCADE Technology Public
7// License Version 6.5 (the "License"). You may not use the content of this file
8// except in compliance with the License. Please obtain a copy of the License
9// at http://www.opencascade.org and read it completely before using this file.
10//
11// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13//
14// The Original Code and all software distributed under the License is
15// distributed on an "AS IS" basis, without warranty of any kind, and the
16// Initial Developer hereby disclaims all such warranties, including without
17// limitation, any warranties of merchantability, fitness for a particular
18// purpose or non-infringement. Please see the License for the specific terms
19// and conditions governing the rights and limitations under the License.
20
7fd59977 21// Historique :
22// CRD : 03/07/97 : Portage Windows NT.
23#ifdef HAVE_CONFIG_H
24# include <config.h>
25#endif
26
27#include <Materials_MaterialsDictionary.ixx>
28
29#ifdef HAVE_SYS_TYPES_H
30# include <sys/types.h>
31#endif
32#if defined (HAVE_SYS_STAT_H) || defined (WNT)
33# include <sys/stat.h>
34#endif
35#ifdef HAVE_STDLIB_H
36# include <stdlib.h>
37#endif
38#ifdef HAVE_STRINGS_H
39# include <strings.h>
40#endif
41
42#include <Standard_Stream.hxx>
43
44#include <Materials.hxx>
45#include <Materials_MaterialsSequence.hxx>
46#include <Materials_Material.hxx>
47#include <Materials_Color.hxx>
48#include <Quantity_Color.hxx>
49#include <TCollection_AsciiString.hxx>
50
51#ifdef WNT
52#define stat _stat
53#endif
54//#define strcasecmp _stricoll
55#include <stdio.h>
56//#endif
57
58//=======================================================================
59//function : Materials_MaterialsDictionary
60//purpose :
61//=======================================================================
62
63Materials_MaterialsDictionary::Materials_MaterialsDictionary()
64{
65 Standard_Integer i,fr,begin,end,lengthname;
66 //char* filename;
67
68 char line[255];
69 char name[80];
70 char type[80];
71 char value1[80],value2[80],value3[80];
72 Handle(Materials_MaterialsSequence) materialssequence;
73 Handle(Materials_Material) material;
74 Handle(Materials_Color) pcolor;
75
76 struct stat buf;
77
78 Standard_CString filename = Materials::MaterialsFile();
79
80 ifstream file(filename);
81 if(!file)
82 {
83 cout<<"unable to open "<<filename<<" for input"<<endl;
84 return;
85 }
86
87 thefilename = new TCollection_HAsciiString(filename);
88
89 if(!stat(filename, &buf)) thetime = buf.st_ctime;
90
91 thematerialssequence = new Materials_MaterialsSequence();
92
93 for(;;)
94 {
95 for(i=0; i<255; i++) line[i]=0;
96 file.getline(line,255);
97 if(!file)break;
98
99 i = 254;
100 while( i >= 0 && ( line[i] == ' ' || !line[i]))line[i--] = 0;
101 fr = i+1;
102 if(fr <= 1)continue;
103
104 if(line[0] != ' ')
105 {
106 material = new Materials_Material(line);
107 thematerialssequence->Append(material);
108 }
109 else
110 {
111 begin = end = 0;
112 for(i=0; i<fr; i++)
113 {
114 if(line[i] == '"')
115 {
116 if(begin)
117 {
118 end = i;
119 break;
120 }
121 else
122 {
123 begin = i;
124 }
125 }
126 }
127
128 for(i=0; i<80; i++)name[i]=0;
129
130 lengthname = 0;
131 for(i=begin+1; i<=end-1; i++)name[lengthname++] = line[i];
132
133 for(i=0; i<80; i++)type [i] = 0;
134 for(i=0; i<80; i++)value1 [i] = 0;
135 for(i=0; i<80; i++)value2 [i] = 0;
136 for(i=0; i<80; i++)value3 [i] = 0;
137
138 // fr = sscanf(&line[end+1],"%s%s%s%s",&type,&value1,&value2,&value3);
139 fr = sscanf(&line[end+1],"%s%s%s%s",type,value1,value2,value3);
140
141 if(fr == -1) continue;
142
143 if (!strcasecmp(type,"Materials_Color"))
144 {
145 Quantity_Color color
91322f44 146 (Atof(value1),Atof(value2),Atof(value3),Quantity_TOC_RGB);
7fd59977 147 pcolor = new Materials_Color(color);
148 material->Parameter(name,pcolor);
149 }
150 else if(!strcasecmp(type,"Standard_Real"))
151 {
91322f44 152 material->Parameter(name,Atof(value1));
7fd59977 153 }
154 else if(!strcasecmp(type,"Standard_CString"))
155 {
156 material->Parameter(name,value1);
157 }
158 }
159 }
160 file.close();
161}
162
163//=======================================================================
164//function : Material
165//purpose :
166//=======================================================================
167
168Handle(Materials_Material) Materials_MaterialsDictionary::Material
169 (const Standard_CString amaterial) const
170{
171 Handle(Materials_Material) material;
172
173 for(Standard_Integer index=1;index<=thematerialssequence->Length();index++)
174 {
175 material = thematerialssequence->Value(index);
176 if(material->Name() == amaterial) return material;
177 }
178 Standard_NoSuchObject::Raise("Material not in the dictionary");
179// Pour compil sur NT ....
180 return material;
181}
182
183Standard_Boolean Materials_MaterialsDictionary::ExistMaterial(const Standard_CString amaterial) const
184{
185 Handle(Materials_Material) material;
186
187 for(Standard_Integer index=1;index<=thematerialssequence->Length();index++)
188 {
189 material = thematerialssequence->Value(index);
190 if(material->Name() == amaterial) return Standard_True;
191 }
192 return Standard_False;
193}
194
195//=======================================================================
196//function : NumberOfMaterials
197//purpose :
198//=======================================================================
199
200Standard_Integer Materials_MaterialsDictionary::NumberOfMaterials() const
201{
202 return thematerialssequence->Length();
203}
204
205//=======================================================================
206//function : Material
207//purpose :
208//=======================================================================
209
210Handle(Materials_Material) Materials_MaterialsDictionary::Material
211 (const Standard_Integer anindex) const
212{
213 return thematerialssequence->Value(anindex);
214}
215
216//=======================================================================
217//function : UpToDate
218//purpose :
219//=======================================================================
220
221Standard_Boolean Materials_MaterialsDictionary::UpToDate() const
222{
223 struct stat buf;
224
225 TCollection_AsciiString string = thefilename->String();
226 if(!stat(string.ToCString(),&buf))
227 {
228 if(thetime == buf.st_ctime) return Standard_True;
229 }
230
231 return Standard_False;
232}
233
234//=======================================================================
235//function : Dump
236//purpose :
237//=======================================================================
238
239void Materials_MaterialsDictionary::Dump(Standard_OStream& astream) const
240{
241 Standard_Integer index;
242 Handle(Materials_Material) material;
243
244 for(index=1;index<=thematerialssequence->Length();index++)
245 {
246 material = thematerialssequence->Value(index);
247 material->Dump(astream);
248 }
249}
250