4 In VTK, certain classes can have what are called
"implementations". When the
5 base
class is requested, it instead looks into a list of available
6 implementations. One of the implementations is then constructed and returned
10 constructed, it instead actually returns a window for the X window system,
11 Cocoa, or Win32 depending
on what is available.
13 VTK's implementation utilizes the
16 module system. A module which contains an object factory must declare itself as
17 `IMPLEMENTABLE` and modules which contain an implementation of an object
18 factory must claim that they `IMPLEMENTS` modules containing those base object
19 factories (a module may contain the object factory and an implementation; it
20 then says that it `IMPLEMENTS` itself).
23 set(_vtkObjectFactory_source_dir "${CMAKE_CURRENT_LIST_DIR}")
26 @brief Declare a factory
override
28 Declare that a
class in this module (the implementation) is an `OVERRIDE` for a
32 vtk_object_factory_declare(
34 OVERRIDE <implementation>)
37 function (vtk_object_factory_declare)
38 cmake_parse_arguments(PARSE_ARGV 0 _vtk_object_factory_declare
43 if (_vtk_object_factory_declare_UNPARSED_ARGUMENTS)
45 "Unparsed arguments for vtk_object_factory_declare: "
46 "${_vtk_object_factory_declare_UNPARSED_ARGUMENTS}")
49 if (NOT DEFINED _vtk_object_factory_declare_BASE)
51 "The `BASE` argument is required.")
54 if (NOT DEFINED _vtk_object_factory_declare_OVERRIDE)
56 "The `OVERRIDE` argument is required.")
59 set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}
" APPEND
61 _vtk_object_factory_overrides "${_vtk_object_factory_declare_OVERRIDE}
")
62 set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}
" APPEND
64 "_vtk_object_factory_override_${_vtk_object_factory_declare_OVERRIDE}
" "${_vtk_object_factory_declare_BASE}
")
68 @brief Generate source for overrides in a module
70 A module may only have a single declaration of all its object factory
71 implementations. This function generates the source for all of the overrides
72 declared using @ref vtk_object_factory_declare.
75 vtk_object_factory_configure(
76 SOURCE_FILE <variable>
77 [HEADER_FILE <variable>]
78 [EXPORT_MACRO <macro>]
80 [EXTRA_INCLUDES <include>...])
83 - `SOURCE_FILE`: (Required) A variable to set to the path to generated source
85 - `HEADER_FILE`: (Recommended) A variable to set to the path to generated
86 header file. This should not be treated as a public header.
87 - `EXPORT_MACRO`: (Recommended) The export macro to add to the generated
89 - `INITIAL_CODE`: C++ code to run when the object factory is initialized.
90 - `EXTRA_INCLUDES`: A list of headers to include. The header names need to
91 include the `<>` or `""` quoting.
93 function (vtk_object_factory_configure)
94 if (NOT DEFINED _vtk_build_module)
96 "The `vtk_object_factory_configure`
function needs to be run within a module context.
")
99 cmake_parse_arguments(PARSE_ARGV 0 _vtk_object_factory_configure
101 "SOURCE_FILE;HEADER_FILE;INITIAL_CODE;EXPORT_MACRO
"
104 if (_vtk_object_factory_configure_UNPARSED_ARGUMENTS)
106 "Unparsed arguments
for vtk_object_factory_configure:
"
107 "${_vtk_object_factory_configure_UNPARSED_ARGUMENTS}
")
110 get_property(_vtk_object_factory_done
112 PROPERTY "_vtk_object_factory_${_vtk_build_module}
"
114 if (_vtk_object_factory_done)
116 "An
object factory has already been created
for ${_vtk_build_module}.
")
120 "_vtk_object_factory_${_vtk_build_module}
" 1)
123 get_property(_vtk_object_factory_overrides
125 PROPERTY _vtk_object_factory_overrides)
127 if (NOT _vtk_object_factory_overrides)
129 "The ${_vtk_build_module} is generating an
object factory, but does not have any declared overrides.
")
132 set(_vtk_object_factory_doc
133 "Override
for ${_vtk_build_module} module
")
135 set(_vtk_object_factory_includes "")
136 set(_vtk_object_factory_functions "")
137 set(_vtk_object_factory_calls "")
139 foreach (_vtk_object_factory_extra_include IN LISTS _vtk_object_factory_configure_EXTRA_INCLUDES)
140 string(APPEND _vtk_object_factory_includes
141 "#include ${_vtk_object_factory_extra_include}\n
")
144 foreach (_vtk_object_factory_override IN LISTS _vtk_object_factory_overrides)
145 get_property(_vtk_object_factory_base
147 PROPERTY "_vtk_object_factory_override_${_vtk_object_factory_override}
")
148 string(APPEND _vtk_object_factory_includes
149 "#include \
"${_vtk_object_factory_override}.h\"\n")
150 string(APPEND _vtk_object_factory_functions
151 "VTK_CREATE_CREATE_FUNCTION(${_vtk_object_factory_override})\n")
152 string(APPEND _vtk_object_factory_calls
153 "this->RegisterOverride(\"${_vtk_object_factory_base}\", \"${_vtk_object_factory_override}\", \"${_vtk_object_factory_doc}\", 1, vtkObjectFactoryCreate${_vtk_object_factory_override});\n")
156 get_property(_vtk_object_factory_library_name GLOBAL
157 PROPERTY "_vtk_module_${_vtk_build_module}_library_name
")
159 set(_vtk_object_factory_overrides_header
160 "${CMAKE_CURRENT_BINARY_DIR}/${_vtk_object_factory_library_name}ObjectFactory.h
")
161 set(_vtk_object_factory_overrides_source
162 "${CMAKE_CURRENT_BINARY_DIR}/${_vtk_object_factory_library_name}ObjectFactory.cxx
")
166 "${_vtk_object_factory_overrides_header}
"
170 "${_vtk_object_factory_overrides_source}
"
173 if (_vtk_object_factory_configure_HEADER_FILE)
174 set("${_vtk_object_factory_configure_HEADER_FILE}
"
175 "${_vtk_object_factory_overrides_header}
"
179 set("${_vtk_object_factory_configure_SOURCE_FILE}
"
180 "${_vtk_object_factory_overrides_source}
"
create a window for renderers to draw into
abstract base class for vtkObjectFactories