Loading...
Searching...
No Matches
surfaceWriter.H
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2011-2012 OpenFOAM Foundation
9 Copyright (C) 2015-2025 OpenCFD Ltd.
10-------------------------------------------------------------------------------
11License
12 This file is part of OpenFOAM.
13
14 OpenFOAM is free software: you can redistribute it and/or modify it
15 under the terms of the GNU General Public License as published by
16 the Free Software Foundation, either version 3 of the License, or
17 (at your option) any later version.
18
19 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26
27Namespace
28 Foam::surfaceWriters
29
30Description
31 Namespace for surface writers
32
33Class
34 Foam::surfaceWriter
35
36Description
37 Base class for surface writers.
38
39 The surfaceWriter interface is rather large since we need a writer that
40 can either be initially defined without a surface association
41 and have that added at a later stage, or be defined with a surface
42 association.
43
44 \verbatim
45 formatOptions
46 {
47 default
48 {
49 verbose true;
50 commsType scheduled;
51
52 fieldLevel
53 {
54 "p.*" 1e5; // Absolute -> gauge [Pa]
55 T 273.15; // [K] -> [C]
56 U #eval{ 10/sqrt(3) }; // Uniform magU=10
57 }
58 }
59
60 someFormat // Eg, ensight, vtk, etc
61 {
62 fieldScale
63 {
64 "p.*" 0.01; // [Pa] -> [mbar]
65 }
66
67 scale 1000; // [m] -> [mm]
68 transform
69 {
70 origin (0 0 0);
71 rotationCentre (0 0 0);
72 rotation axisAngle;
73 axis (1 0 0);
74 angle 45;
75 }
76 }
77 }
78 \endverbatim
79
80 Format options:
81 \table
82 Property | Description | Reqd | Default
83 verbose | Additional output verbosity | no | no
84 commsType | Communication type | no | scheduled
85 gatherv | Use MPI gatherv [experimental] | no | false
86 scale | Output geometry scaling | no | 1
87 transform | Output coordinate transform | no |
88 fieldLevel | Subtract field level before scaling | no | empty dict
89 fieldScale | Output field scaling | no | empty dict
90 \endtable
91
92Note
93 The \c transform sub-dictionary also supports a \c rotationCentre
94 keyword which applies \em untranslate by that amount prior to the rotation,
95 and subsequently followed by a \em translate.
96
97 For surface formats that require geometry in a separate file,
98 it is the responsibility of the implementation (not the caller)
99 to ensure that this occurs.
100
101 Using MPI gatherv [experimental] is not well tested and may change
102 or be removed in the future!
103
104SourceFiles
105 surfaceWriter.C
106 surfaceWriterI.H
107
108\*---------------------------------------------------------------------------*/
109
110#ifndef Foam_surfaceWriter_H
111#define Foam_surfaceWriter_H
112
113#include "typeInfo.H"
114#include "autoPtr.H"
115#include "tmp.H"
116#include "cartesianCS.H"
117#include "Field.H"
118#include "fileName.H"
119#include "instant.H"
120#include "mergedSurf.H"
121#include "meshedSurfRef.H"
122#include "UPstream.H"
123#include "InfoProxy.H"
125
126// Deprecated methods
127// #define Foam_surfaceWriter_directAccess
128
129// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
130
131namespace Foam
132{
133
134// Forward Declarations
135class Time;
136class surfaceWriter;
137
139
140
141/*---------------------------------------------------------------------------*\
142 Class surfaceWriter Declaration
143\*---------------------------------------------------------------------------*/
144
145class surfaceWriter
146{
147protected:
148
149 // Private Data
150
151 //- Reference to surface or surface components
152 meshedSurfRef surf_;
153
154 //- Surface after merging (parallel)
155 mutable mergedSurf mergedSurf_;
156
157 //- The surface after point coordinate transforms and scaling
158 mutable meshedSurfRef adjustedSurf_;
159
160 //- Dimension for merging
161 scalar mergeDim_;
162
163 //- Output geometry scaling after rotate/translate
164 scalar geometryScale_;
165
166 //- The centre of rotation (untranslate, translate)
168
169 //- Local coordinate system transformation
170 coordSystem::cartesian geometryTransform_;
171
172
173protected:
174
175 // Protected Data
176
177 //- The topology/surface is up-to-date?
178 mutable bool upToDate_;
179
180 //- Track if geometry has been written since the last open
181 mutable bool wroteGeom_;
182
183 //- Writing in parallel (via master)
184 bool parallel_;
185
186 //- Insert additional time sub-directory in the output path
187 bool useTimeDir_;
188
189 //- Is point vs cell data
191
192 //- Additional output verbosity
193 bool verbose_;
194
195 //- Communication type (for field merging)
197
198 //- Prefer MPI gatherv intrinsic (for field merging) [experimental]
199 bool gatherv_;
201 //- The number of fields
202 label nFields_;
203
204 //- The current time value/name
206
207 //- The full output directory and file (surface) name
209
210 //- Field level to remove (on output)
212
213 //- Field scaling (on output)
216
217 // Protected Member Functions
218
219 //- Verify that the outputPath_ has been set or FatalError
220 void checkOpen() const;
221
222 //- Merge surfaces if they are not already upToDate (parallel)
223 //- or simply mark the surface as being up-to-date
224 virtual bool merge() const;
225
226 //- Merge surfaces (if not upToDate) and return merged (parallel)
227 //- or regular surface (non-parallel)
228 const meshedSurf& surface() const;
229
230 //- Merge surfaces (if not upToDate) and return merged (parallel)
231 //- or regular surface (non-parallel)
232 //- and apply any coordinate system changes and/or output scaling.
233 const meshedSurfRef& adjustSurface() const;
234
235 //- Gather (merge) fields with renumbering and shrinking for point data
236 template<class Type>
238
239 //- Apply refLevel and fieldScaling
240 template<class Type>
242 (
243 const word& fieldName,
244 const tmp<Field<Type>>& tfield
245 ) const;
246
247#undef declareSurfaceFieldMethods
248#define declareSurfaceFieldMethods(Type) \
249 \
250 tmp<Field<Type>> mergeField(const Field<Type>& fld) const; \
251 \
252 tmp<Field<Type>> adjustField \
253 ( \
254 const word& fieldName, \
255 const tmp<Field<Type>>& tfield \
256 ) const;
257
264
265 #undef declareSurfaceFieldMethods
266
267 //- Dummy templated write operation
268 template<class Type>
271 const word& fieldName,
272 const Field<Type>& localValues
273 )
274 {
276 {
277 return this->write();
278 }
279 return fileName::null;
281
282public:
283
284 // Public Data
286 //- The default merge dimension (1e-8)
287 static scalar defaultMergeDim;
288
289
290 //- Runtime type information
291 TypeName("surfaceWriter");
292
293
294 // Declare run-time constructor selection table
296 (
297 autoPtr,
299 word,
300 (),
301 ()
302 );
303
305 (
306 autoPtr,
308 wordDict,
309 (
310 const dictionary& writeOpts
311 ),
312 (writeOpts)
313 );
314
315
316 // Helpers
317
318 //- Same as fileFormats::getFormatOptions
320 (
321 const dictionary& dict,
322 const word& formatName,
323 const word& entryName = "formatOptions"
324 );
325
326 //- Same as fileFormats::getFormatOptions
328 (
330 const dictionary& surfDict,
331 const word& formatName,
332 const word& entryName = "formatOptions"
333 );
334
335
336 // Factory Methods / Selectors
337
338 //- True if New is likely to succeed for this writeType
339 static bool supportedType(const word& writeType);
340
341 //- Optional select construct surfaceWriter.
342 // Return nullptr if the specified type is not supported.
343 static autoPtr<surfaceWriter> TryNew(const word& writeType);
344
345 //- Optional select construct surfaceWriter with extra write options.
346 // Return nullptr if the specified type is not supported.
348 (
349 const word& writeType,
350 const dictionary& writeOptions
351 );
352
353 //- Select construct a surfaceWriter
354 static autoPtr<surfaceWriter> New(const word& writeType);
355
356 //- Select construct a surfaceWriter with extra write options.
358 (
359 const word& writeType,
360 const dictionary& writeOptions
361 );
362
363
364 // Constructors
365
366 //- Default construct
368
369 //- Default construct with specified options
370 explicit surfaceWriter(const dictionary& options);
371
372
373 //- Destructor. Calls close()
374 virtual ~surfaceWriter();
375
376
377 // Member Functions
378
379 // Capability
380
381 //- The writer is enabled. If the writer is not enabled, it may be
382 //- possible for the caller to skip various preparatory operations.
383 // This method is primarily useful for the null writer
384 virtual bool enabled() const
386 return true;
387 }
388
389 //- True if the surface format requires geometry in a separate file.
390 virtual bool separateGeometry() const
391 {
392 return false;
393 }
394
395 //- True if the writer format uses faceIds as part of its output.
396 // Element ids are used by various CAE formats
397 // (abaqus, nastran, starcd, ...)
398 virtual bool usesFaceIds() const
399 {
400 return false;
401 }
402
403
404 // Bookkeeping
405
406 //- Does the writer need an update (eg, lagging behind surface changes)
407 virtual bool needsUpdate() const;
408
409 //- Geometry or fields written since the last open?
410 virtual bool wroteData() const;
411
412 //- Mark that surface changed and the writer will need an update,
413 //- and set nFields = 0.
414 // May also free up unneeded data.
415 // Return false if it was previously already expired.
416 virtual bool expire();
417
418 //- Close any open output, remove association with a surface and
419 //- expire the writer. The parallel flag remains untouched.
420 virtual void clear();
421
422
423 // Surface association
424
425 //- Change association with a surface, expire the writer
426 //- with defined parallel/serial treatment
427 virtual void setSurface
428 (
429 const meshedSurf& surf,
430 bool parallel
431 );
432
433 //- Change association with a surface, expire the writer
434 //- with defined parallel/serial treatment
435 virtual void setSurface
436 (
437 const pointField& points,
438 const faceList& faces,
439 bool parallel
440 );
441
442 //- Change association with a surface, expire the writer
443 //- with the current parallel/serial treatment
444 virtual void setSurface
445 (
446 const meshedSurf& surf
447 );
448
449 //- Change association with a surface, expire the writer
450 //- with the current parallel/serial treatment
451 virtual void setSurface
452 (
453 const pointField& points,
454 const faceList& faces
455 );
456
457
458 // Queries, Access
459
460 //- Test if outputPath has been set
461 inline bool is_open() const noexcept;
462
463 //- Writer is associated with a surface
464 bool hasSurface() const;
465
466 //- The surface to write is empty if the global number of faces is zero
467 bool empty() const;
468
469 //- The global number of faces for the associated surface
470 label size() const;
471
472 //- The number of expected output fields.
473 // Currently only used by the legacy VTK format.
474 inline label nFields() const noexcept;
475
476 //- Set the number of expected output fields
477 // Currently only used by the legacy VTK format.
478 // \return old value
479 inline label nFields(const label n) noexcept;
480
481 //- Are the field data to be treated as point data?
482 inline bool isPointData() const noexcept;
483
484 //- Set handling of field data to face/point data
485 // \return old value
486 inline bool isPointData(const bool on) noexcept;
487
488 //- Should a time directory be spliced into the output path?
489 inline bool useTimeDir() const noexcept;
490
491 //- Enable/disable use of spliced output path
492 // \return old value
493 inline bool useTimeDir(const bool on) noexcept;
494
495 //- Get output verbosity
496 inline bool verbose() const noexcept;
497
498 //- Enable/disable verbose output
499 // \return old value
500 inline bool verbose(const bool on) noexcept;
501
502 //- The current value of the point merge dimension (metre)
503 inline scalar mergeDim() const noexcept;
504
505 //- Change the point merge dimension (metre)
506 // \return old value
507 inline scalar mergeDim(const scalar dist) noexcept;
508
509 //- The current value of the geometry scaling
510 inline scalar scale() const noexcept;
512 //- Change the geometry scaling
513 // \return old value
514 inline scalar scale(const scalar factor) noexcept;
515
516 //- The current (cartesian) coordinate system transformation
517 inline const coordSystem::cartesian& transform() const noexcept;
518
519
520 // Time
521
522 //- True if there is a known time
523 inline bool hasTime() const;
524
525 //- The current time value/name
526 inline const word& timeName() const;
527
528 //- The current time value/name
529 inline scalar timeValue() const;
530
531
532 //- Set the current time
533 void setTime(const instant& inst);
534
535 //- Set current time from timeValue, auto generating the name
536 void setTime(scalar timeValue);
537
538 //- Set current time from timeValue and timeName
539 void setTime(scalar timeValue, const word& timeName);
540
541 //- Clear the current time
542 void unsetTime();
543
544
545 //- Begin a time-step
546 virtual void beginTime(const Time& t);
547
548 //- Begin a time-step
549 virtual void beginTime(const instant& inst);
550
551 //- End a time-step
552 virtual void endTime();
553
554
555 // Output
556
557 //- Open for output on specified path, using existing surface
558 virtual void open(const fileName& outputPath);
559
560 //- Open from components
561 virtual void open
562 (
563 const pointField& points,
564 const faceList& faces,
565 const fileName& outputPath,
566 bool parallel
567 );
568
569 //- Open from components
570 virtual void open
571 (
572 const meshedSurf& surf,
573 const fileName& outputPath,
574 bool parallel
575 );
576
577 //- Open from components, with the current parallel/serial treatment
578 virtual void open
579 (
580 const pointField& points,
581 const faceList& faces,
582 const fileName& outputPath
583 );
584
585 //- Open from components, with the current parallel/serial treatment
586 virtual void open
587 (
588 const meshedSurf& surf,
589 const fileName& outputPath
590 );
591
592 //- Finish output, performing any necessary cleanup
593 virtual void close();
594
595
596 // Write
597
598 //- Write separate surface geometry to file.
599 virtual fileName write() = 0;
600
601
602#undef declareSurfaceWriterWriteMethod
603#define declareSurfaceWriterWriteMethod(Type) \
604 \
605 virtual fileName write \
606 ( \
607 const word& fieldName, \
608 const Field<Type>& values \
609 ) = 0
610
617
618
619#undef declareSurfaceWriterWriteMethod
620#define declareSurfaceWriterWriteMethod(Type) \
621 \
622 \
623 virtual fileName write \
624 ( \
625 const word& fieldName, \
626 const Field<Type>& values \
627 ) // override
628
629
630 // Other IO
631
632 //- Return info proxy,
633 //- used to print information to a stream
635 {
636 return *this;
637 }
638
639 //- Output info proxy
640 friend Ostream& operator<<
641 (
642 Ostream& os,
643 const InfoProxy<surfaceWriter>& iproxy
644 );
645
646
647 // Housekeeping
648
649 #ifdef Foam_surfaceWriter_directAccess
650
651 //- Access number of expected output fields.
652 label& nFields() { return nFields_; }
653
654 //- Access handling of face/point data
655 bool& isPointData() { return isPointData_; }
656
657 //- Access handling of spliced output path
658 bool& useTimeDir() { return useTimeDir_; }
659
660 //- Access output verbosity
661 bool& verbose() { return verbose_; }
662
663 //- Access value of the point merge dimension
664 scalar& mergeDim() { return mergeDim_; }
665
666 #endif
667};
668
669
670// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
671
672} // End namespace Foam
673
674// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
675
676#include "surfaceWriterI.H"
677
678// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
679
680#endif
681
682// ************************************************************************* //
label n
Info<< nl;Info<< "Write faMesh in vtk format:"<< nl;{ vtk::uindirectPatchWriter writer(aMesh.patch(), fileName(aMesh.time().globalPath()/vtkBaseFileName));writer.writeGeometry();globalIndex procAddr(aMesh.nFaces());labelList cellIDs;if(UPstream::master()) { cellIDs.resize(procAddr.totalSize());for(const labelRange &range :procAddr.ranges()) { auto slice=cellIDs.slice(range);slice=identity(range);} } writer.beginCellData(4);writer.writeProcIDs();writer.write("cellID", cellIDs);writer.write("area", aMesh.S().field());writer.write("normal", aMesh.faceAreaNormals());writer.beginPointData(1);writer.write("normal", aMesh.pointAreaNormals());Info<< " "<< writer.output().name()<< nl;}{ vtk::lineWriter writer(aMesh.points(), aMesh.edges(), fileName(aMesh.time().globalPath()/(vtkBaseFileName+"-edges")));writer.writeGeometry();writer.beginCellData(4);writer.writeProcIDs();{ Field< scalar > fld(faMeshTools::flattenEdgeField(aMesh.magLe(), true))
Generic templated field type that is much like a Foam::List except that it is expected to hold numeri...
Definition Field.H:172
A helper class for outputting values to Ostream.
Definition InfoProxy.H:49
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition Ostream.H:59
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
Definition Time.H:75
commsTypes
Communications types.
Definition UPstream.H:81
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
Definition autoPtr.H:65
A Cartesian coordinate system.
Definition cartesianCS.H:68
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition dictionary.H:133
A class for handling file names.
Definition fileName.H:75
static const fileName null
An empty fileName.
Definition fileName.H:111
An instant of time. Contains the time value and name. Uses Foam::Time when formatting the name.
Definition instant.H:56
Simple class to manage surface merging information.
Definition mergedSurf.H:53
Implements a meshed surface by referencing another meshed surface or faces/points components.
Abstract definition of a meshed surface defined by faces and points.
Definition meshedSurf.H:44
Base class for surface writers.
surfaceWriter()
Default construct.
coordSystem::cartesian geometryTransform_
Local coordinate system transformation.
virtual void open(const fileName &outputPath)
Open for output on specified path, using existing surface.
meshedSurfRef surf_
Reference to surface or surface components.
virtual void endTime()
End a time-step.
virtual bool enabled() const
The writer is enabled. If the writer is not enabled, it may be possible for the caller to skip variou...
scalar geometryScale_
Output geometry scaling after rotate/translate.
virtual fileName write()=0
Write separate surface geometry to file.
bool useTimeDir_
Insert additional time sub-directory in the output path.
bool gatherv_
Prefer MPI gatherv intrinsic (for field merging) [experimental].
static autoPtr< surfaceWriter > New(const word &writeType)
Select construct a surfaceWriter.
bool wroteGeom_
Track if geometry has been written since the last open.
virtual InfoProxy< surfaceWriter > info() const noexcept
Return info proxy, used to print information to a stream.
bool isPointData_
Is point vs cell data.
bool useTimeDir() const noexcept
Should a time directory be spliced into the output path?
meshedSurfRef adjustedSurf_
The surface after point coordinate transforms and scaling.
const meshedSurf & surface() const
Merge surfaces (if not upToDate) and return merged (parallel) or regular surface (non-parallel).
bool isPointData() const noexcept
Are the field data to be treated as point data?
const word & timeName() const
The current time value/name.
fileName writeTemplate(const word &fieldName, const Field< Type > &localValues)
Dummy templated write operation.
void checkOpen() const
Verify that the outputPath_ has been set or FatalError.
void unsetTime()
Clear the current time.
scalar scale() const noexcept
The current value of the geometry scaling.
virtual void beginTime(const Time &t)
Begin a time-step.
label size() const
The global number of faces for the associated surface.
label nFields_
The number of fields.
static scalar defaultMergeDim
The default merge dimension (1e-8).
virtual ~surfaceWriter()
Destructor. Calls close().
virtual void setSurface(const meshedSurf &surf, bool parallel)
Change association with a surface, expire the writer with defined parallel/serial treatment.
static autoPtr< surfaceWriter > TryNew(const word &writeType)
Optional select construct surfaceWriter.
virtual void close()
Finish output, performing any necessary cleanup.
bool parallel_
Writing in parallel (via master).
bool empty() const
The surface to write is empty if the global number of faces is zero.
bool upToDate_
The topology/surface is up-to-date?
UPstream::commsTypes commType_
Communication type (for field merging).
dictionary fieldLevel_
Field level to remove (on output).
static bool supportedType(const word &writeType)
True if New is likely to succeed for this writeType.
bool is_open() const noexcept
Test if outputPath has been set.
void setTime(const instant &inst)
Set the current time.
declareRunTimeSelectionTable(autoPtr, surfaceWriter, wordDict,(const dictionary &writeOpts),(writeOpts))
virtual bool merge() const
Merge surfaces if they are not already upToDate (parallel) or simply mark the surface as being up-to-...
mergedSurf mergedSurf_
Surface after merging (parallel).
bool verbose_
Additional output verbosity.
tmp< Field< Type > > adjustFieldTemplate(const word &fieldName, const tmp< Field< Type > > &tfield) const
Apply refLevel and fieldScaling.
dictionary fieldScale_
Field scaling (on output).
virtual bool expire()
Mark that surface changed and the writer will need an update, and set nFields = 0.
virtual bool usesFaceIds() const
True if the writer format uses faceIds as part of its output.
virtual bool needsUpdate() const
Does the writer need an update (eg, lagging behind surface changes).
tmp< Field< Type > > mergeFieldTemplate(const Field< Type > &fld) const
Gather (merge) fields with renumbering and shrinking for point data.
instant currTime_
The current time value/name.
virtual bool separateGeometry() const
True if the surface format requires geometry in a separate file.
bool verbose() const noexcept
Get output verbosity.
bool hasSurface() const
Writer is associated with a surface.
const meshedSurfRef & adjustSurface() const
Merge surfaces (if not upToDate) and return merged (parallel) or regular surface (non-parallel) and a...
declareRunTimeSelectionTable(autoPtr, surfaceWriter, word,(),())
virtual void clear()
Close any open output, remove association with a surface and expire the writer. The parallel flag rem...
point geometryCentre_
The centre of rotation (untranslate, translate).
scalar timeValue() const
The current time value/name.
virtual bool wroteData() const
Geometry or fields written since the last open?
scalar mergeDim() const noexcept
The current value of the point merge dimension (metre).
bool hasTime() const
True if there is a known time.
fileName outputPath_
The full output directory and file (surface) name.
const coordSystem::cartesian & transform() const noexcept
The current (cartesian) coordinate system transformation.
label nFields() const noexcept
The number of expected output fields.
scalar mergeDim_
Dimension for merging.
static dictionary formatOptions(const dictionary &dict, const word &formatName, const word &entryName="formatOptions")
Same as fileFormats::getFormatOptions.
TypeName("surfaceWriter")
Runtime type information.
A class for managing temporary objects.
Definition tmp.H:75
A class for handling words, derived from Foam::string.
Definition word.H:66
OBJstream os(runTime.globalPath()/outputName)
const pointField & points
runTimeSource setTime(sourceTimes[sourceTimeIndex], sourceTimeIndex)
word timeName
Definition getTimeIndex.H:3
Namespace for coordinate systems.
Definition cartesianCS.C:30
Namespace for OpenFOAM.
refinementData transform(const tensor &, const refinementData val)
No-op rotational transform for base types.
List< face > faceList
List of faces.
Definition faceListFwd.H:41
Tensor< scalar > tensor
Definition symmTensor.H:57
Ostream & operator<<(Ostream &, const boundaryPatch &p)
Write boundaryPatch as dictionary entries (without surrounding braces).
vector point
Point is a vector.
Definition point.H:37
const direction noexcept
Definition scalarImpl.H:265
vectorField pointField
pointField is a vectorField.
Vector< scalar > vector
Definition vector.H:57
SphericalTensor< scalar > sphericalTensor
SphericalTensor of scalars, i.e. SphericalTensor<scalar>.
SymmTensor< scalar > symmTensor
SymmTensor of scalars, i.e. SymmTensor<scalar>.
Definition symmTensor.H:55
Macros to ease declaration of run-time selection tables.
#define declareRunTimeSelectionTable(ptrWrapper, baseType, argNames, argList, parList)
Declare a run-time selection (variables and adder classes).
dictionary dict
#define declareSurfaceFieldMethods(Type)
#define declareSurfaceWriterWriteMethod(Type)
Basic run-time type information using word as the type's name. Used to enhance the standard RTTI to c...
#define TypeName(TypeNameString)
Declare a ClassName() with extra virtual type info.
Definition typeInfo.H:68