root/branches/Carsten_PtrWork2/Tools/fcd2code/Field.py

Revision 1072, 16.5 kB (checked in by cneumann, 9 months ago)

replaced pointer field implementation
split FieldContainer/Fields? directory into Base and Handle subdir

Status: - ref counting seems to work (mt, cluster)

  • new OSB loader works (well, the unittest does)
  • VRML loader is deactivated
  • get/edit handle for dynamic (pointer) fields missing
  • need to remove some more old files - they get moved in this commit
  • generated (i.e. base) code in following commit
  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
Line 
1
2 import re;
3 import logging;
4
5 from FCDElement import FCDElement;
6
7 class Field(FCDElement):
8     """Represents a <Field/> element from a .fcd file.
9     """
10    
11     def __init__(self):
12         super(Field, self).__init__();
13         self.m_log            = logging.getLogger("Field");
14         self.m_fieldContainer = None;
15        
16         self.initFCDDict();
17    
18     def initFCDDict(self):
19         """Sets the fcd dictionary to default values.
20         """
21         self.setFCD("name",                     "");
22         self.setFCD("category",                 "");
23         self.setFCD("type",                     "");
24         self.setFCD("pointerType",              "");
25         self.setFCD("typeNamespace",            "");
26         self.setFCD("cardinality",              "");
27         self.setFCD("visibility",               "external");
28         self.setFCD("fieldFlags",               "");
29         self.setFCD("defaultValue",             "");
30         self.setFCD("access",                   "public");
31         self.setFCD("defaultHeader",            "");
32         self.setFCD("header",                   "(AUTO)");
33         self.setFCD("description",              "");
34         self.setFCD("checkNilPtr",              "true");
35         self.setFCD("linkParentField",          "");       # name of field that stores parent pointer
36         self.setFCD("tombstoneValue",           "");
37        
38         self.setFCD("clearMField",              "true");
39         self.setFCD("pushToField",              "");
40         self.setFCD("assignMField",             "");
41         self.setFCD("insertIntoMField",         "");
42         self.setFCD("replaceInMFieldIndex",     "");
43         self.setFCD("replaceInMFieldObject",    "");
44         self.setFCD("removeFromMFieldIndex",    "");
45         self.setFCD("removeFromMFieldObject",   "");
46         self.setFCD("clearField",               "");
47         self.setFCD("pushToFieldAs",            "");
48         self.setFCD("assignMFieldAs",           "");
49         self.setFCD("insertIntoMFieldAs",       "");
50         self.setFCD("replaceInMFieldIndexAs",   "");
51         self.setFCD("replaceInMFieldObjectAs""");
52         self.setFCD("removeFromMFieldIndexAs""");
53         self.setFCD("removeFromMFieldObjectAs", "");
54         self.setFCD("clearFieldAs",             "");
55         self.setFCD("needClassInclude",         "true");
56    
57     def setFieldContainer(self, container):
58         self.m_fieldContainer = container;
59    
60     def getFieldContainer(self):
61         return self.m_fieldContainer;
62    
63     #
64     # Common tests
65     
66     def isPrivate(self):
67         return self["accessPrivate"];
68    
69     def isProtected(self):
70         return self["accessProtected"];
71    
72     def isPublic(self):
73         return self["accessPublic"];
74    
75     def isSField(self):
76         return self["isSField"];
77    
78     def isMField(self):
79         return self["isMField"];
80    
81     def isPtrField(self):
82         return self["isPointerField"];
83            
84     #
85     # Fill out dictionary from in (fcd) dictionary
86     
87     def finalize(self):
88              
89         # -----------------------------------------------------------------
90         # Type and Namespace
91         # -----------------------------------------------------------------
92             
93         TypeRaw           = self.getFCD("type");
94         TypeRawCaps       = self._upcaseFirst(TypeRaw);
95        
96         Type              = self.getFCD("type");
97         TypeNS            = self.getFCD("typeNamespace");
98         TypeCaps          = self._upcaseFirst(Type);
99        
100         if TypeNS != "" and not TypeNS.endswith("::"):
101             TypeNS = TypeNS + "::"
102            
103         # -----------------------------------------------------------------
104         # Category
105         # -----------------------------------------------------------------
106                   
107         self["category"]        = "";
108         self["pointertype"]     = "";
109         self["pointerbasetype"] = "";
110        
111         if self.getFCD("category") == "":
112             self.m_log.info("finalize: \"category\" is empty, assuming \"data\"");
113             self.setFCD("category", "data");
114        
115         if self.getFCD("category") == "data":
116             self["category"] = "data";
117                    
118             FieldType     = Type;
119             FieldTypeNS   = TypeNS;
120             FieldTypeCaps = TypeCaps;
121            
122         elif self.getFCD("category") == "pointer":
123             self["category"]        = "pointer";
124             self["pointertype"]     = "unrecorded";
125          
126             Type          = Type + "Ptr";
127             TypeCaps      = self._upcaseFirst(Type);
128             FieldType     = TypeRaw + "UnrecPtr";
129             FieldTypeNS   = TypeNS;
130             FieldTypeCaps = TypeRawCaps + "UnrecPtr";
131            
132         elif self.getFCD("category") == "childpointer":
133             self["category"]        = "pointer";
134             self["pointertype"]     = "child";
135             self["ParentLinkField"] = self._upcaseFirst(self.getFCD("parentLinkField"));
136          
137             Type          = Type + "Ptr";
138             TypeCaps      = self._upcaseFirst(Type);
139             FieldType     = TypeRaw + "ChildPtr";
140             FieldTypeNS   = TypeNS;
141             FieldTypeCaps = TypeRawCaps + "ChildPtr";
142            
143         elif self.getFCD("category") == "parentpointer":
144             self["category"]        = "pointer";
145             self["pointertype"]     = "parent";
146          
147             Type          = Type + "Ptr";
148             TypeCaps      = self._upcaseFirst(Type);
149             FieldType     = TypeRaw + "ParentPtr";
150             FieldTypeNS   = TypeNS;
151             FieldTypeCaps = TypeRawCaps + "ParentPtr";
152        
153         elif self.getFCD("category") == "weakpointer":
154             self["category"]        = "pointer";
155             self["pointertype"]     = "weak";
156          
157             Type          = Type + "Ptr";
158             TypeCaps      = self._upcaseFirst(Type);
159             FieldType     = TypeRaw + "WeakPtr";
160             FieldTypeNS   = TypeNS;
161             FieldTypeCaps = TypeRawCaps + "WeakPtr";
162            
163         else:
164             self.m_log.warning("finalize: \"category\" has invalid value: >%s<",
165                 self.getFCD("category"));   
166              
167         if TypeNS == "std::":
168             FieldTypeNS = "";
169                
170         self["Type"]     = Type;
171         self["TypeNS"]   = TypeNS;
172         self["TypeCaps"] = TypeCaps
173            
174         self["FieldType"]     = FieldType;
175         self["FieldTypeNS"]   = FieldTypeNS;
176         self["FieldTypeCaps"] = FieldTypeCaps
177                
178         # -----------------------------------------------------------------
179         # Name and Cardinality
180         # -----------------------------------------------------------------
181                 
182         self["Name"]     = self._upcaseFirst(self.getFCD("name"));
183         self["DescName"] = self.getFCD("name");
184                
185         self["isSField"] = False;
186         self["isMField"] = False;
187        
188         if self.getFCD("cardinality") == "single":
189             self["cardinality"] = "single"
190             self["isSField"]    = True;
191             self["CARD"]        = "SF";
192             self["VarName"]     = "_sf" + self["Name"];
193         elif self.getFCD("cardinality") == "multi":
194             self["cardinality"] = "multi"
195             self["isMField"]    = True;
196             self["CARD"]        = "MF";
197             self["VarName"]     = "_mf" + self["Name"];
198         else:
199             self.m_log.warning("finalize: \"cardinality\" has invalid value: %s",
200                 self.getFCD("cardinality"));
201        
202         if self.getFCD("access") == "private":
203             self["access"] = "private";
204         elif self.getFCD("access") == "protected":
205             self["access"] = "protected";
206         elif self.getFCD("access") == "public":
207             self["access"] = "public";
208         elif self.getFCD("access") == "none":
209             self["access"] = "none";
210         else:
211             self.m_log.warning("finalize: \"access\" has invalid value: >%s<",
212                 self.getFCD("access"));
213                                
214         if self.getFCD("description").strip() == "":
215             self["Description"]     = "";
216             self["SafeDescription"] = "\"\"";
217         else:
218             self["Description"]     = self._formatString    (self.getFCD("description"), 4)
219             self["SafeDescription"] = self._formatSafeString(self.getFCD("description"), 8)
220        
221         if self["isMField"] == True:
222             self["GenFieldFlags"] = "(Field::MFDefaultFlags"
223         else:
224             self["GenFieldFlags"] = "(Field::SFDefaultFlags"
225                        
226         if self.getFCD("checkNilPtr") == "true":
227             self["checkNilPtr"] = True;
228         else:
229             self["checkNilPtr"] = False;
230                
231         typeInclude = "";
232        
233         if ((self.getFCD("header") == "")      or
234             (self.getFCD("header") == "(AUTO)")  ):
235             if self.getFieldContainer().isSystemComponent():
236                 typeInclude = "OSG";
237             else:
238                 typeInclude = "OpenSG/OSG";
239            
240             typeInclude = typeInclude + TypeRawCaps + "Fields.h"               
241         else:
242             typeInclude = self.getFCD("header");
243        
244         self["TypeInclude"] = typeInclude;
245        
246         if self.getFieldContainer().isDecoratable():
247             self["MethodType"] = "virtual";
248         else:
249             self["MethodType"] = "";
250        
251         if self.getFCD("defaultHeader") != "":
252             self["hasDefaultHeader"] = True;
253            
254             if ((self.getFCD("defaultHeader").find("\"") == -1) and
255                 (self.getFCD("defaultHeader").find("<")  == -1)    ):
256                 self["DefaultHeader"] = "\"" + self.getFCD("defaultHeader") + "\"";
257             else:
258                 self["DefaultHeader"] = self.getFCD("defaultHeader");
259         else:
260             self["hasDefaultHeader"] = False;
261        
262         if self.getFCD("defaultValue") != "":
263             self["TypedDefault"] = \
264                 self["TypeNS"] + self["Type"] + "(" + self.getFCD("defaultValue") + ")";
265         else:
266             if self["category"] == "pointer" and self["cardinality"] == "single":
267                 self["TypedDefault"] = self["TypeNS"] + self["Type"] + "(NullFC)";
268             else:
269                 self["TypedDefault"] = "";
270        
271         if self.getFCD("visibility") == "external":
272             self["Visibility"] = "false";
273         elif self.getFCD("visibility") == "internal":
274             self["Visibility"]    =  "true";
275             self["GenFieldFlags"] += " | Field::FInternal"
276         else:
277             self.m_log.warning("finalize: \"visibility\" has invalid value: %s",
278                 self.getFCD("visibility"));
279
280         self["GenFieldFlags"] += ")"
281        
282         fieldFlagsOverride = False;
283         flags              = None,
284        
285         if self.isSField():
286             if self.getFCD("fieldFlags") != "":
287                 fieldFlagsOverride = True;
288             else:
289                 flags = "Field::SFDefaultFlags";
290            
291         elif self.isMField():
292             if self.getFCD("fieldFlags") != "":
293                 fieldFlagsOverride = True;
294             else:
295                 flags = "Field::MFDefaultFlags";
296        
297         if fieldFlagsOverride:
298             flagsFCD = self.getFCD("fieldFlags").split(",");
299             numFlags = len(flagsFCD);
300            
301             flags = "(";
302            
303             for i, flag in enumerate(flagsFCD):
304                 flag = flag.replace(" """);
305                 flag = flag.replace("\t", "");
306                 flag = flag.replace("\n", "");
307                
308                 if (i == 0)  and (i != numFlags - 1):
309                     flags = flags + "Field::" + flag + " |";
310                     continue;
311                
312                 if i == numFlags - 1:
313                     if i != 0:
314                         flags = flags + " Field::" + flag;
315                     else:
316                         flags = flags + "Field::" + flag;
317                    
318                     continue;
319                
320                 flags = flags + " Field::" + flag + " |";
321            
322             flags = flags + ")";
323        
324         self["Flags"] = flags;
325        
326         self["writePushToField"]            = False;
327         self["writeAssignMField"]           = False;
328         self["writeInsertIntoMField"]       = False;
329         self["writeReplaceInMFieldIndex"]   = False;
330         self["writeReplaceInMFieldObject"]  = False;
331         self["writeRemoveFromMFieldIndex"]  = False;
332         self["writeRemoveFromMFieldObject"] = False;
333         self["writeClearField"]             = False;
334        
335         if self.getFCD("pushToField") == "" or self.getFCD("pushToField") == "true":
336             self["writePushToField"] = True;
337             if self.getFCD("pushToFieldAs") == "":
338                 self["PushToField"] = "add" + self["Name"];
339             else:
340                 self["PushToField"] = self.getFCD("pushToFieldAs");
341
342         if self.getFCD("assignMField") == "" or self.getFCD("assignMField") == "true":
343             self["writeAssignMField"] = True;
344             if self.getFCD("assignMFieldAs") == "":
345                 self["AssignMField"] = "assign" + self["Name"];
346             else:
347                 self["AssignMField"] = self.getFCD("assignMFieldAs");
348        
349         if self.getFCD("insertIntoMField") == "" or self.getFCD("insertIntoMField") == "true":
350             self["writeInsertIntoMField"] = True;
351             if self.getFCD("insertIntoMFieldAs") == "":
352                 self["InsertIntoMField"] = "insert" + self["Name"];
353             else:
354                 self["InsertIntoMField"] = self.getFCD("insertIntoMFieldAs");
355        
356         if self.getFCD("replaceInMFieldIndex") == "" or self.getFCD("replaceInMFieldIndex") == "true":
357             self["writeReplaceInMFieldIndex"] = True;
358             if self.getFCD("replaceInMFieldIndexAs") == "":
359                 self["ReplaceInMFieldIndex"] = "replace" + self["Name"];
360             else:
361                 self["ReplaceInMFieldIndex"] = self.getFCD("replaceInMFieldIndexAs");
362        
363         if self.getFCD("replaceInMFieldObject") == "" or self.getFCD("replaceInMFieldObject") == "true":
364             self["writeReplaceInMFieldObject"] = True;
365             if self.getFCD("replaceInMFieldObjectAs") == "":
366                 self["ReplaceInMFieldObject"] = "replace" + self["Name"];
367             else:
368                 self["ReplaceInMFieldObject"] = self.getFCD("replaceInMFieldObjectAs");
369        
370         if self.getFCD("removeFromMFieldIndex") == "" or self.getFCD("removeFromMFieldIndex") == "true":
371             self["writeRemoveFromMFieldIndex"] = True;
372             if self.getFCD("removeFromMFieldIndexAs") == "":
373                 self["RemoveFromMFieldIndex"] = "sub" + self["Name"];
374             else:
375                 self["RemoveFromMFieldIndex"] = self.getFCD("removeFromMFieldIndexAs");
376        
377         if self.getFCD("removeFromMFieldObject") == "" or self.getFCD("removeFromMFieldObject") == "true":
378             self["writeRemoveFromMFieldObject"] = True;
379             if self.getFCD("removeFromMFieldObjectAs") == "":
380                 self["RemoveFromMFieldObject"] = "sub" + self["Name"];
381             else:
382                 self["RemoveFromMFieldObject"] = self.getFCD("removeFromMFieldObjectAs");
383        
384         if self.getFCD("clearField") == "" or self.getFCD("clearField") == "true":
385             self["writeClearField"] = True;
386             if self.getFCD("clearFieldAs") == "":
387                 self["ClearField"] = "clear" + self["Name"];
388             else:
389                 self["ClearField"] = self.getFCD("clearFieldAs");
390        
391         if self.getFCD("tombstoneValue") != "":
392             self["hasTombstoneValue"] = True;
393             self["tombstoneValue"]    = self.getFCD("tombstoneValue");
394         else:
395             self["hasTombstoneValue"] = False;
396        
397         if self.getFCD("clearMField") == "true":
398             self["doClearMField"] = True;
399         else:
400             self["doClearMField"] = False;
401        
402         classInclude = "";
403        
404         if self["category"] == "pointer":
405             if self.getFieldContainer().isSystemComponent():
406                 classInclude = "OSG";
407             else:
408                 classInclude = "OpenSG/OSG";
409            
410             classInclude = classInclude + self["TypeCaps"];
411            
412             if classInclude.endswith("Ptr"):
413                 classInclude = classInclude[:-3];
414            
415             classInclude = classInclude.replace("Parent", "");
416             classInclude = classInclude + ".h";
417            
418             self["ClassInclude"]     = classInclude;
419             self["needClassInclude"] = True;
420        
421     def _dumpValues(self):
422         self.m_log.info("Field dumpValues:");
423         super(Field, self)._dumpValues(self.m_log);
424    
Note: See TracBrowser for help on using the browser.