API Documentation
Loading...
Searching...
No Matches
DXFBlockWriter.h
Go to the documentation of this file.
1#pragma once
9
11
12#include "Design/Headers/Text.h"
19
26namespace NDEVR
27{
29 {
30
31 Ray<3, fltp08> up(0.0, 0.0, 1.0);
32 data.extrusion = (transform * up).normalized<fltp08>();
33 transform = EntityConverter::GetOrientation(data.extrusion) * transform;
34 data.offset = transform.decomposeOffset();
35 auto rotation = transform.decomposeRotation<fltp08>();
36 data.scale = transform.decomposeScale();
37 data.azimuth = rotation[YAW];
38
39 }
40 bool DXFShouldExport(FactoryOptions options, const Model& model)
41 {
42 BitFlag flag = model.parentMatrixFlags();
46 return false;
48 return false;
50 return false;
51 if (options.ignore_invisible && !model.isVisible())
52 return false;
53 return true;
54 }
56 {
57 public:
62
67
68
70 const bool write_materials;
71 const bool flatten_model;
73 : handle_manager(writer.handleManager())
74 , params(params)
75 , writer(writer)
78 {
79 LayerData default_0;
80 default_0.name = "0";
81 default_0.color_info.color = RGBColor(255, 255, 255);
83 layers["0"] = default_0;
84 writer.addLayer(default_0);
85 model_filter = [&params](const Model& model) -> bool
86 {
87 return DXFShouldExport(params.options, model);
88 };
89
90 }
92 {
93 uint04 primitive_count = geo.primitiveCount(PrimitiveProperty::Solid);
94 if (primitive_count == 0)
96 else
97 num_of_shapes += primitive_count;
98 if (flatten_model)
99 {
100 BlockData data = convertToBlock(model);
101 UUID id = geo.uuid().appendUUID(model.uuid());
102 data.handle = handle_manager->getHandleIndex(id);
103 block_data.insert({ id, data });
104 }
105 }
106 ParseResult process(Model& model, Geometry& geo) final override
107 {
108 if (!params.options.useValue(geo.getGeometryType()))
110 processTablesSection(model, geo);
112 }
113 ParseResult process(Model& model) final override
114 {
115 if (!flatten_model)
116 {
117 if (model.isScene() && model.hasMetaData("is_cad_core") && model.metaData("is_cad_core").getAs<bool>())
118 {
119 //we don't add an actual block here, as the binding is "temporary"
120 convertToBlock(model);
121 }
122 else
123 {
124
125 for (CADWriteModifier* write_modifier : write_modifiers)
126 {
127 if (write_modifier->canHandleBlock(model))
128 return write_modifier->handleBlock(model, *this);
129 }
130 if (model.childCount() > 0 && !model.getGeometry().isValid())
131 {
132 BlockData data = convertToBlock(model);
133 data.handle = handle_manager->getHandleIndex(data.name);
134 handle_manager->setHandleToUUID(model.uuid(), data.handle);
135 handle_manager->setHandleIndex(data.name, data.handle);
136 writer.handleManager()->setTransfromCoords(data.handle
137 , params.options.units.coordinate_space_unit.get()->matrix() * model.getCompleteTransform());
138 block_data.insert({ model.uuid(), data });
139 }
140 else
141 {
142 if(model.getGeometry().isValid())
143 getMaterialHandle(model);
144 processLayerName(model, processName(model));
145 }
146 }
147 }
149 }
151 {
153 if (material.isValid())
154 {
155 if (!material_data.hasKey(material.uuid()))
156 {
157 switch (material.getUVMode(UVType::e_KD))
158 {
161 break;
162 default:
163 {
164 uint04 handle = handle_manager->getHandleIndex(material.uuid());
165 DXFMaterial dxf_mat = convertToMaterial(material);
166 dxf_mat.handle = handle;
167 writer.cleanupCADName(dxf_mat.name);
168 material_data.insert({ material.uuid(), dxf_mat });
169 return handle;
170 } break;
171 }
172 }
173 else
174 {
175 return handle_manager->getHandleIndex(material.uuid());
176 }
177 }
179 }
180 String processName(const Model& model) const
181 {
182 String name;
183 if (flatten_model)
184 name = model.displayNamePath("_").translation();
185 else
186 name = model.displayName().translation();
187 name.removeAllOrdered('\r');
188 name.removeAllOrdered('\n');
189
190 //data.name.replace("_Deployment_1", "", true);
191 name.replace("_Deployment_Linework", "", true);
192 name.replace("_Deployment", "_DEPL", true);
193 name.replace("Boretrak", "TRAK", true);
194 name.replace("Station", "STN", true);
195 name.replace("Linework_", "", true);
196 name.replace("_Linework", "", true);
197 name.replace("Points", "PTS", true);
198 name.replace("Mesh", "MESH", true);
199 name.replace("CircleScan", "CIR", true);
200 name.replace("Scan", "SCAN", true);
201 name.replace("Circle", "CIR", true);
202 return name;
203 }
204 String processLayerName(const Model& model, const String& model_name)
205 {
206 String layer_name;
207 if (!flatten_model && model.hasLayer())
208 {
209 LayerData layer_data;
210 Model layer = model.getLayer();
211 layer_name = layer.getProperty<TranslatedString>(DesignObject::e_name).translation();
212 writer.cleanupCADName(layer_name);
213 if (!layers.hasKey(layer_name))
214 {
215 FillOutLayerData(layer, layer_data);
216 layer_data.handle = handle_manager->getHandleIndex(layer.uuid());
217 //layer_data.material_handle = getMaterialHandle(layer);
218 writer.cleanupCADName(layer_data.name);
219 writer.addLayer(layer_data);
220 layers[layer_name] = layer_data;
221 }
222 }
223 else if (flatten_model)
224 {
225 layer_name = model_name;
226 if (!layers.hasKey(layer_name))
227 {
228 LayerData layer_data;
229 layer_data.name = layer_name;
230 layer_data.color_info = GenerateDXFColorInfo(model, flatten_model, false);
231 layers[layer_name] = layer_data;
232 writer.addLayer(layer_data);
233 }
234 }
235 else
236 {
237 //layer_name = layerName(model);
238 layer_name = "0";
239 }
240 return layer_name;
241 }
243 {
244 BlockData data;
245 data.name = processName(model);
247 data.description.replaceAll('\n', ' ');
248
249 data.offset = Vertex<3, fltp08>(0.0);
250
252 if (block_names.hasKey(data.name))
253 {
254 block_names.get(data.name)++;
255 data.name += "_" + String(block_names.get(data.name));
257 }
258 else
259 {
260 block_names.insert({ data.name , 1 });
261 }
262
263 String layer_name = processLayerName(model, data.name);
264 data.layer = layer_name.size() > 0 ? layer_name : String("0");
265
266 data.color_info = GenerateDXFColorInfo(model, flatten_model, false);
268
269
270 return data;
271 }
273 {
274 if (image.size() == 0 || !ImageFactory::DefaultFactory().hasImage(image))
275 return File();
277 if (file.exists())
278 return String(file);
279 file = params.file().getParentDirectory();
280
282
283 String local_path = File::PathSepS + "Images" + File::PathSepS + file_name;
284
285 file.appendPath(local_path);
287 return "."+local_path;
288
289 }
291 {
292 DXFMaterial dxf_mat;
293 String material_name = material.getProperty<TranslatedString>(DesignObject::e_name).translation();
294 dxf_mat.name = material_name;
295 dxf_mat.description = material.getProperty<TranslatedString>(DesignObject::e_description).translation();
296 dxf_mat.handle = handle_manager->getHandleIndex(material.uuid());
297 switch (material.getUVMode(UVType::e_KD))
298 {
300 dxf_mat.diffuse.use_value = true;
301 break;
304 dxf_mat.diffuse.use_value = true;
305 break;
306 default:
307 dxf_mat.diffuse.use_value = false;
308 break;
309 }
310
311 dxf_mat.mat_matrix = material.getTransform();
312
313 if (material.getShadingModel() == Material::e_gouraud)
314 {
316 ? material.getUVColor(UVType::e_KD) : RGBColor(0, 0, 0));
317 dxf_mat.ambient.color = dxf_mat.diffuse.color;
318 dxf_mat.specular.color = dxf_mat.diffuse.color;
319 dxf_mat.ambient.use_value = dxf_mat.diffuse.use_value;
320 dxf_mat.specular.use_value = dxf_mat.diffuse.use_value;
321 dxf_mat.specular.map_file = dxf_mat.diffuse.map_file;
322 }
323 else
324 {
325 switch (material.getUVMode(UVType::e_KA))
326 {
329 dxf_mat.ambient.use_value = true;
330 break;
331 default:
332 dxf_mat.ambient.use_value = false;
333 break;
334 }
335 switch (material.getUVMode(UVType::e_KS))
336 {
338 dxf_mat.specular.use_value = true;
339 break;
342 dxf_mat.specular.use_value = true;
343 break;
344 default:
345 dxf_mat.specular.use_value = false;
346 break;
347 }
351
352 }
353
354 dxf_mat.diffuse.color_intensity = (material.hasUVIntensity(UVType::e_KD) ? material.getUVIntensity(UVType::e_KD) : 1.0f);
355 dxf_mat.ambient.color_intensity = (material.hasUVIntensity(UVType::e_KA) ? material.getUVIntensity(UVType::e_KA) : 0.3f);
356 dxf_mat.specular.color_intensity = (material.hasUVIntensity(UVType::e_KS) ? material.getUVIntensity(UVType::e_KS) : 0.3f);
358 if (isNaN(dxf_mat.specular_gloss_factor))
359 dxf_mat.specular_gloss_factor = 0.5;
360
362 return dxf_mat;
363 }
364
365 };
366
368 {
369 public:
388 void insertObject(const Model& model, uint04 parent_handle = Constant<uint04>::NaN)
389 {
390
391 UUID id = model.uuid();
392 if (!DXFShouldExport(params.options, model))
393 return;
394
395 for (CADWriteModifier* write_modifier : write_modifiers)
396 {
397 if (write_modifier->canHandleInsert(model))
398 {
399 Matrix<fltp08> transform = writer.handleManager()->transfromCoords(parent_handle).invert()
401 write_modifier->handleInsert(transform, model, parent_handle, *this);
402 return;
403 }
404 }
405 if (!block_data.hasKey(id))
406 {
407
408 Matrix<fltp08> transform = writer.handleManager()->transfromCoords(parent_handle).invert()
410
412 geo_options.parent_handle = parent_handle;
413 if (Geometry geo = model.getGeometry())
414 {
415 geo_options.setup(model, geo);
416 geo_options.transform = transform * geo.getTransform();
418 }
419 }
420 else
421 {
422 const BlockData& block_info = block_data.get(id);
423 BlockInsert block_insert;
424 block_insert.block_name = block_info.name;
425 block_insert.parent_handle = parent_handle;
426 block_insert.material_handle = block_info.material_handle;
427 block_insert.handle = writer.handleManager()->getHandleIndex(model.uuid());
428 Matrix<fltp08> complete_transform = params.options.units.coordinate_space_unit.get()->matrix() * model.getCompleteTransform();
429 Matrix<fltp08> transform = writer.handleManager()->transfromCoords(parent_handle).invert() * complete_transform;
430 convertToPlacementData(block_insert, transform);
431 writer.handleManager()->setTransfromCoords(block_insert.handle, complete_transform);
432 FillOutData(model, block_insert);
433 writer.cleanupCADName(block_insert.layer);
434 block_insert.color_info = GenerateDXFColorInfo(model, params.options.flatten_model, false);
435 writer.addInsert(block_insert);
436 }
437 }
438 ParseResult process(Model& model) final override
439 {
440 for (CADWriteModifier* write_modifier : write_modifiers)
441 {
442 if (write_modifier->canHandleBlock(model))
444 }
446 }
447 ParseResult postProcess(Model& model) final override
448 {
449 if (!DXFShouldExport(params.options, model))
451 for (CADWriteModifier* write_modifier : write_modifiers)
452 {
453 if (write_modifier->canHandleBlock(model))
454 return write_modifier->handleBlock(model, *this);
455 }
456 if (block_data.hasKey(model.uuid()))
457 {
458 const BlockData& block = block_data.get(model.uuid());
459 writer.startBlock(block);
460 Buffer<Model> children = model.getChildren();
461 for (const Model& model : children)
462 insertObject(model, block.handle);
463 if (Geometry geo = model.getGeometry())
464 {
465 Matrix<fltp08> transform = writer.handleManager()->transfromCoords(block.handle).invert()
466 * params.options.units.coordinate_space_unit.get()->matrix() * model.getCompleteTransform();
468 geo_options.setup(model, geo);
469 geo_options.transform = transform * geo.getTransform();
471
472 }
473 writer.endBlock(block);
475 }
476 else
477 {
478 if (model.isScene() && model.hasMetaData("is_cad_core") && model.metaData("is_cad_core").getAs<bool>())
481 }
482
483 }
484 };
485
486
487}
A bitset that stores 8 bits (elements with only two possible values: 0 or 1, true or false,...
Definition BitFlag.hpp:68
The equivelent of std::vector but with a bit more control. The basic array unit of the library.
Definition Buffer.hpp:64
bool contains(const t_type &element) const
Definition Buffer.hpp:674
constexpr t_index_type size() const
Definition Buffer.hpp:1461
void removeAllOrdered(const t_type &object)
Definition Buffer.hpp:1176
void replaceAll(const t_type &var, const t_type &replacement)
Definition Buffer.hpp:1246
void clear()
Definition Buffer.hpp:572
Definition CADWriteModifier.h:11
Definition DXFBlockWriter.h:368
const FactoryParameters & params
Definition DXFBlockWriter.h:371
void insertObject(const Model &model, uint04 parent_handle=Constant< uint04 >::NaN)
Definition DXFBlockWriter.h:388
ParseResult postProcess(Model &model) final override
Definition DXFBlockWriter.h:447
Buffer< CADWriteModifier * > write_modifiers
Definition DXFBlockWriter.h:374
DXFBlockWriter(Dictionary< UUID, BlockData > &block_data, CADGeometryWriter &geo_options)
Definition DXFBlockWriter.h:375
DXFWriter & writer
Definition DXFBlockWriter.h:372
const Dictionary< UUID, BlockData > & block_data
Definition DXFBlockWriter.h:370
ParseResult process(Model &model) final override
Definition DXFBlockWriter.h:438
CADGeometryWriter & geo_options
Definition DXFBlockWriter.h:373
Definition DXFBlockWriter.h:56
ParseResult process(Model &model, Geometry &geo) final override
Definition DXFBlockWriter.h:106
const FactoryParameters & params
Definition DXFBlockWriter.h:60
Dictionary< String, uint04 > block_names
Definition DXFBlockWriter.h:66
Dictionary< String, LayerData > layers
Definition DXFBlockWriter.h:63
void processTablesSection(Model &model, Geometry &geo)
Definition DXFBlockWriter.h:91
Buffer< CADWriteModifier * > write_modifiers
Definition DXFBlockWriter.h:58
DXFWriter & writer
Definition DXFBlockWriter.h:61
DynamicPointer< CADHandleManager > handle_manager
Definition DXFBlockWriter.h:59
const bool write_materials
Definition DXFBlockWriter.h:70
String processName(const Model &model) const
Definition DXFBlockWriter.h:180
ParseResult process(Model &model) final override
Definition DXFBlockWriter.h:113
uint04 num_of_shapes
Definition DXFBlockWriter.h:69
String getImageFile(const String &image)
Definition DXFBlockWriter.h:272
uint04 getMaterialHandle(const Model &model)
Definition DXFBlockWriter.h:150
Dictionary< UUID, BlockData > block_data
Definition DXFBlockWriter.h:64
String processLayerName(const Model &model, const String &model_name)
Definition DXFBlockWriter.h:204
DXFTableWriteIterator(const FactoryParameters &params, DXFWriter &writer, bool write_materials)
Definition DXFBlockWriter.h:72
const bool flatten_model
Definition DXFBlockWriter.h:71
BlockData convertToBlock(const Model &model)
Definition DXFBlockWriter.h:242
Dictionary< UUID, DXFMaterial > material_data
Definition DXFBlockWriter.h:65
DXFMaterial convertToMaterial(const Material &material)
Definition DXFBlockWriter.h:290
Definition DXFWriter.h:53
void startBlock(const BlockData &data)
Definition DXFWriter.cpp:191
void addInsert(const BlockInsert &insert)
Definition DXFWriter.cpp:1479
void endBlock(const BlockData &data)
Definition DXFWriter.cpp:218
void cleanupCADName(String &name)
Definition DXFWriter.cpp:1503
void addLayer(const LayerData &data)
Definition DXFWriter.cpp:1087
const DynamicPointer< CADHandleManager > & handleManager() const
Definition DXFWriter.h:56
bool isValid() const
Definition DesignObject.h:362
UUID uuid() const
Definition DesignObject.cpp:533
t_type getProperty(DesignProperty property) const
Definition DesignObject.h:263
Matrix< fltp08 > getTransform() const
Definition DesignObject.cpp:593
@ e_name
Definition DesignObject.h:100
@ e_description
Definition DesignObject.h:101
Definition Dictionary.h:48
Definition Pointer.hpp:303
static Matrix< fltp08 > GetOrientation(const Vector< 3, fltp08 > &extrusion)
Definition EntityConverter.h:2418
Definition FactoryOptions.h:46
Buffer< String > exclusion_model_types
Definition FactoryOptions.h:118
UnitManager units
Definition FactoryOptions.h:139
bool useValue(VertexProperty property) const
Definition FactoryOptions.h:89
bool flatten_model
Definition FactoryOptions.h:152
bool ignore_invisible
Definition FactoryOptions.h:167
Definition File.h:47
static NDEVR_BASE_API String PathSepS
Definition File.h:186
NDEVR_BASE_API File getParentDirectory() const
Definition File.cpp:1692
NDEVR_BASE_API bool exists() const
Definition File.cpp:1010
NDEVR_BASE_API File & appendPath(const String &cs)
Definition File.cpp:786
Definition Geometry.h:64
uint04 vertexCount() const
Definition Geometry.h:713
uint04 primitiveCount(PrimitiveProperty property) const
Definition Geometry.h:669
static ImageFactory & DefaultFactory()
void writeToFile(const String &image_id, const File &file)
bool hasImage(const String &image_id)
const File & getFile(const String &image_id)
String optimizedWriteFileName(const String &image_id, const Buffer< String > &optional_extenstions=Buffer< String >())
Definition Material.h:45
@ e_gouraud
Definition Material.h:50
t_type getMaterialProperty(MaterialProperties mat_index) const
Definition Material.h:168
bool hasUVIntensity(UVType index) const
Definition Material.cpp:738
@ e_opacity
Definition Material.h:111
@ e_shininess
Definition Material.h:113
String getUVImage(UVType uv_index) const
Definition Material.cpp:883
fltp04 getUVIntensity(UVType uv_index) const
Definition Material.cpp:895
ShadingModel getShadingModel() const
Definition Material.cpp:541
@ e_solid_color
Definition Material.h:70
@ e_color_by_model
Definition Material.h:73
@ e_color_by_layer
Definition Material.h:78
@ e_image
Definition Material.h:77
UVMode getUVMode(UVType uv_index) const
Definition Material.cpp:727
RGBColor getUVColor(UVType uv_index) const
Definition Material.cpp:889
Definition Matrix.hpp:173
constexpr Vector< 3, t_type > decomposeOffset() const
Definition Matrix.hpp:440
constexpr Vector< 3, Angle< t_angle_type > > decomposeRotation() const
Definition Matrix.hpp:454
constexpr Vector< 3, t_type > decomposeScale() const
Definition Matrix.hpp:421
Definition Model.h:54
Matrix< fltp08 > getCompleteTransform() const
Definition Model.cpp:117
Geometry getGeometry() const
Definition Model.cpp:427
TranslatedString displayNamePath(const String &seperator=":") const
Definition Model.cpp:1286
bool hasLayer() const
Definition Model.cpp:2328
BitFlag parentMatrixFlags() const
Definition Model.cpp:2053
bool isVisible() const
Definition Model.cpp:1149
Model getLayer() const
Definition Model.cpp:2342
Material getRootMaterial(PrimitiveProperty property) const
Definition Model.cpp:545
t_type getModelProperty(ModelProperty property) const
Definition Model.h:152
@ e_scale_to_camera
Definition Model.h:72
@ e_orient_to_camera
Definition Model.h:70
@ e_follow_camera
Definition Model.h:71
@ e_type
Definition Model.h:100
@ e_export_ignored
Definition Model.h:115
TranslatedString displayName() const
Definition Model.cpp:1258
Definition ModelIterator.h:39
bool post_process_model
Definition ModelIterator.h:74
ParseResult
Definition ModelIterator.h:42
@ e_continue_parsing
Definition ModelIterator.h:43
@ e_do_not_parse_children
Definition ModelIterator.h:44
std::function< bool(const Model &)> model_filter
Definition ModelIterator.h:69
Represents a color in the RGB space with optional alpha transparency.
Definition RGBColor.h:53
Definition Vertex.hpp:341
Definition String.h:40
NDEVR_BASE_API String & replace(const String &sub_string, const String &replace_sub_string, bool ignore_case=false)
Definition String.cpp:343
Definition TranslatedString.h:9
NDEVR_BASE_API const String & translation() const
Definition TranslatedString.cpp:104
Definition UUID.h:66
NDEVR_BASE_API UUID appendUUID(bool offset) const
Definition UUID.cpp:168
Resource< ConstPointer< Unit > > coordinate_space_unit
Definition UnitManager.h:185
A vertex.
Definition Vertex.hpp:54
Definition ACIColor.h:37
@ e_background_contrast
Definition CADEntities.h:46
bool DXFShouldExport(FactoryOptions options, const Model &model)
Definition DXFBlockWriter.h:40
void convertToPlacementData(PlacementData &data, Matrix< fltp08 > transform)
Definition DXFBlockWriter.h:28
float fltp04
Defines an alias representing a 4 byte floating-point number.
Definition BaseValues.hpp:157
@ YAW
Definition Angle.h:53
CADColorInfo GenerateDXFColorInfo(const Model &model, bool is_flat, bool is_vertex)
Definition CADGeometryWriter.h:22
void FillOutLayerData(const Model &layer, LayerData &data)
Definition CADGeometryWriter.h:108
uint32_t uint04
-Defines an alias representing a 4 byte, unsigned integer -Can represent exact integer values 0 throu...
Definition BaseValues.hpp:120
constexpr bool isNaN(const t_type &value)
Query if 'value' is valid or invalid.
Definition BaseFunctions.hpp:200
void FillOutData(const Model &model, EntityData &data)
Definition CADGeometryWriter.h:117
double fltp08
Defines an alias representing an 8 byte floating-point number.
Definition BaseValues.hpp:181
Definition CADEntities.h:172
Vertex< 3, fltp08 > offset
Definition CADEntities.h:178
String description
Definition CADEntities.h:179
Definition CADEntities.h:502
String block_name
Definition CADEntities.h:503
ColorMode mode
Definition CADEntities.h:69
RGBColor color
Definition CADEntities.h:70
Definition CADGeometryWriter.h:126
Matrix< fltp08 > transform
Definition CADGeometryWriter.h:131
void setup(const Model &m, const Geometry &geo)
Definition CADGeometryWriter.h:159
void writeGeometry()
Definition CADGeometryWriter.h:424
uint04 parent_handle
Definition CADGeometryWriter.h:138
String layer_name
Definition CADGeometryWriter.h:135
Definition BaseValues.hpp:272
Definition CADEntities.h:970
String description
Definition CADEntities.h:972
MaterialUVOptions ambient
Definition CADEntities.h:973
String name
Definition CADEntities.h:971
MaterialUVImageOptions diffuse
Definition CADEntities.h:974
fltp08 opacity_percent
Definition CADEntities.h:977
Matrix< fltp08 > mat_matrix
Definition CADEntities.h:978
fltp08 specular_gloss_factor
Definition CADEntities.h:976
MaterialUVImageOptions specular
Definition CADEntities.h:975
uint04 material_handle
Definition CADEntities.h:145
CADColorInfo color_info
Definition CADEntities.h:142
String layer
Definition CADEntities.h:140
Vector< 3, fltp08 > extrusion
Definition CADEntities.h:184
Definition IOFactory.h:56
const File & file(const String &name="default") const
Definition IOFactory.h:73
FactoryOptions options
Definition IOFactory.h:90
uint04 parent_handle
Definition CADEntities.h:135
uint04 handle
Definition CADEntities.h:134
Definition CADEntities.h:154
String name
Definition CADEntities.h:167
RGBColor color
Definition CADEntities.h:967
File map_file
Definition CADEntities.h:966
RGBColor color
Definition CADEntities.h:960
fltp08 color_intensity
Definition CADEntities.h:959
bool use_value
Definition CADEntities.h:958
Definition CADEntities.h:496
Vector< 3, fltp08 > scale
Definition CADEntities.h:498
Angle< fltp08 > azimuth
Definition CADEntities.h:499
Vector< 3, fltp08 > offset
Definition CADEntities.h:497