DATAKIT SDK  V2026.2
WriteComponent.hpp File Reference

Go to the source code of this file.

Functions

Dtk_ErrorStatus WriteComponent (Dtk_ComponentPtr inComponent, const Dtk_transfo &inMatrix=Dtk_transfo())
 
Dtk_ErrorStatus WriteDocument (Dtk_MainDocPtr inDocument)
 
Dtk_ErrorStatus WriteInstance (Dtk_ComponentPtr inComponent)
 
void WritePrototype (Dtk_ComponentPtr inComponent, const Dtk_transfo &inMatrix)
 

Function Documentation

◆ WriteComponent()

Dtk_ErrorStatus WriteComponent ( Dtk_ComponentPtr  inComponent,
const Dtk_transfo inMatrix = Dtk_transfo() 
)
13 {
14  // Get the unit scale (e.g., 25.4 for inch) for the component.
15  double unitFactor;
16  inComponent->GetConceptionUnitScale(unitFactor);
17 
18  // Get the component name.
19  Dtk_string componentName = inComponent->Name();
20 
21  // Get component attributes (activation, blanked status, color).
22  Dtk_InfoPtr componentAttributes = inComponent->GetInfos();
23  if (componentAttributes.IsNotNULL())
24  {
25  // Get activation flag (1 if activated, 0 otherwise).
26  int activationStatus = 1;
27  activationStatus = componentAttributes->GetActivationFlag();
28 
29  // Get blanked status (0: visible, 1: invisible, 2: construction geometry).
30  int blankedStatus = 0;
31  blankedStatus = componentAttributes->GetBlankedStatus();
32 
33  // Get color (RGB values).
34  Dtk_RGB color = componentAttributes->GetColor();
35  }
36 
37  // Get and save preview image if available.
38  Dtk_PreviewPtr preview = inComponent->GetPreview();
39  if (preview.IsNotNULL())
40  {
41  Dtk_Int32 size = preview->GetStreamSize();
42  char *jpgImage = preview->GetStream();
43  Dtk_string previewName = "ComponentPreview.jpg";
44  FILE *jpg = previewName.OpenFile("wb");
45  if (jpg)
46  {
47  // Write JPEG image data to file.
48  fwrite(jpgImage, sizeof(char), size, jpg);
49  fclose(jpg);
50  }
51  }
52 
53  if (IsXmlDumpActivated())
54  {
55  // initialize XML output for the component if XML export is enabled.
56  XmlInitComponent(inComponent);
57  }
58 
59  // Process the component based on its type.
60  Dtk_Component::ComponentTypeEnum type = inComponent->ComponentType();
61  switch (type)
62  {
63  // Instance: represents a prototype with a matrix placement.
65  {
66  // Write the component instance
67  WriteInstance(inComponent);
68  break;
69  }
70  // Prototype: check if already processed to avoid redundant work.
71  // Use inComponent->GetID() to obtain its unique ID.
73  {
74  // Write the prototype component with the given transformation matrix.
75  WritePrototype(inComponent, inMatrix);
76  break;
77  }
78  // Catalog: represents multiple possible configurations (scene, workspace, etc.).
80  {
81  // Get number of children and recursively write each child component.
82  Dtk_Size_t numChildren = inComponent->GetNumChildren();
83  if (numChildren > 0)
84  {
85  // Get default component index in the catalog
86  Dtk_Int32 defaultComponentIndex = inComponent->GetDefaultChildInCatalog();
87 
88  // Get activated component indices in the catalog
89  Dtk_tab<Dtk_Int32> activatedComponentIndices = inComponent->GetActivatedChildrenInCatalog();
90 
91  // Get number of activated components in the catalog
92  Dtk_Size_t numActivatedComponents = activatedComponentIndices.size();
93 
94  if (IsXmlDumpActivated())
95  {
96  // Write all non-activated and non-default children as XML dump entries (to provide a complete component tree)
97  for (Dtk_Size_t i = 0; i < numChildren; i++)
98  {
99  // Skip activated components
100  if( activatedComponentIndices.find( ( Dtk_Int32 )i ) >= 0 )
101  {
102  continue;
103  }
104 
105  // Skip default component
106  if( defaultComponentIndex == ( Dtk_Int32 )i )
107  {
108  continue;
109  }
110 
111  // Write XML entry for non-activated and non-default child component
112  Dtk_ComponentPtr childComponent = inComponent->GetChild(i);
113  XmlInitComponent(childComponent);
114  XmlEndComponent();
115  }
116  }
117 
118  // Write activated components or default component
119  if (numActivatedComponents > 0)
120  {
121  // Write all activated components
122  for ( Dtk_Size_t i = 0; i < numActivatedComponents; i++)
123  {
124  // Write the activated component
125  Dtk_ComponentPtr activatedComponent = inComponent->GetChild(activatedComponentIndices[i]);
126  WriteComponent(activatedComponent, inMatrix);
127  }
128  }
129  else
130  {
131  // Write the default component
132  Dtk_ComponentPtr defaultChildComponent = inComponent->GetChild(defaultComponentIndex);
133  WriteComponent(defaultChildComponent, inMatrix);
134  }
135  }
136 
137  // If necessary, iterate over all children and select the desired one(s) to process based on their name.
138  break;
139  }
140  // Virtual: component containing only children.
142  {
143  // Get number of child components and recursively write each child component.
144  Dtk_Size_t numChildComponents = inComponent->GetNumChildren();
145  for (Dtk_Size_t i = 0; i < numChildComponents; i++)
146  {
147  Dtk_ComponentPtr childComponent = inComponent->GetChild(i);
148  WriteComponent(childComponent, inMatrix);
149  }
150  break;
151  }
152  }
153 
154  if (IsXmlDumpActivated())
155  {
156  // Finalize XML output for the component if XML export is enabled.
157  XmlEndComponent();
158  }
159 
160  return dtkNoError;
161 }

◆ WriteDocument()

Dtk_ErrorStatus WriteDocument ( Dtk_MainDocPtr  inDocument)
15 {
16  // Retrieve the root component from the document.
17  Dtk_ComponentPtr rootComponent = inDocument->RootComponent();
18 
19  // If the root component is valid, process it and its children.
20  if (rootComponent.IsNotNULL())
21  {
22  // Initialize PDF output for the root component if PDF export is enabled.
23  if (IsPdfDumpActivated())
24  {
25  PdfInitComponent(rootComponent);
26  }
27 
28  // Recursively process the root component and its children.
29  WriteComponent(rootComponent);
30 
31  // Finalize PDF output for the root component if PDF export is enabled.
32  if (IsPdfDumpActivated())
33  {
34  // Finalize PDF output for the root component if PDF export is enabled.
36  }
37  return dtkNoError;
38  }
39 
40  // Return error if the document is invalid.
41  return dtkErrorNullPointer;
42 }

◆ WriteInstance()

Dtk_ErrorStatus WriteInstance ( Dtk_ComponentPtr  inComponent)
17 {
18  // Get the prototype name.
19  Dtk_string prototypeName = inComponent->Name();
20 
21  // Get the instance name.
22  Dtk_string instanceName = inComponent->InstanceName();
23 
24  // Get the prototype component (first child of instance) and its transformation matrix.
25  Dtk_ComponentPtr prototype = inComponent->GetChild(0);
26  Dtk_transfo matrix = inComponent->TransformationMatrix();
27 
28  // Get the ID of the prototype component.
29  Dtk_ID childID = prototype->GetID();
30 
31  // Initialize PDF instance ID.
32  Dtk_ID pdfInstanceID = 0;
33 
34  // Initialize PDF output for the instance if PDF export is enabled.
35  if (IsPdfDumpActivated())
36  {
37  pdfInstanceID = PdfInitInstance(inComponent);
38  }
39 
40  // Write the prototype component.
41  // Note: The transformation matrix can be passed if needed for further processing.
42  WriteComponent(prototype, Dtk_transfo());
43 
44  // Finalize PDF output for the instance if PDF export is enabled.
45  if (IsPdfDumpActivated())
46  {
47  PdfEndInstance(pdfInstanceID, childID);
48  }
49 
50  // Track the processed component by its ID to avoid redundant processing.
51  if (ProcessedComponents.find(childID) < 0)
52  {
53  ProcessedComponents.push_back(childID);
54  }
55 
56  return dtkNoError;
57 }

◆ WritePrototype()

void WritePrototype ( Dtk_ComponentPtr  inComponent,
const Dtk_transfo inMatrix 
)
20 {
21  // Get the component ID.
22  Dtk_ID componentID = inComponent->GetID();
23 
24  // Check if the component has already been processed.
25  // Only process the prototype if it hasn't been processed yet.
26  Dtk_Int32 componentIndex = ProcessedComponents.find(componentID);
27  if (componentIndex == -1)
28  {
29  Dtk_NodePtr rootNode;
30 
31  // Get the Datakit API instance.
32  Dtk_API *myAPI = Dtk_API::GetAPI();
33 
34  // Recursively process all child components (instances, sub-assemblies, etc.).
35  Dtk_Size_t numChildComponents = inComponent->GetNumChildren();
36  for ( Dtk_Size_t i = 0; i < numChildComponents; i++)
37  {
38  // Get current child component.
39  Dtk_ComponentPtr childComponent = inComponent->GetChild(i);
40 
41  // Recursively write the child component with the current transformation matrix.
42  WriteComponent(childComponent, inMatrix);
43  }
44 
45  // Read the construction tree for this prototype.
46  Dtk_ErrorStatus errorStatus;
47  if( inComponent->ComponentAvailability() == Dtk_Component::ComponentMissing )
48  {
49  errorStatus = dtkErrorFileNotExist;
50  }
51  else
52  {
53  errorStatus = myAPI->ReadComponent( inComponent, rootNode );
54  }
55 
56  // If the construction tree is valid, process it.
57  // A rootNode == NULL with err == dtkNoError means the component is empty.
58  if (errorStatus == dtkNoError && rootNode.IsNotNULL())
59  {
60  // Set the current matrix for flattening assemblies.
61  CurrentMatrix = inMatrix;
62 
63  // Recursively process the root node and its children.
64  WriteNode(rootNode);
65 
66  // Write global data set and metadata to XML if XML export is enabled.
67  if (IsXmlDumpActivated())
68  {
69  XmlWriteGlobalDataSet(inComponent->GetGlobalDataSet());
70 
71  Dtk_Size_t numMetaData = inComponent->GetNumMetaData();
72  if (numMetaData)
73  {
74  for ( Dtk_Size_t i = 0; i < numMetaData; i++)
75  {
76  XmlWriteMetaData(inComponent->GetMetaData(i));
77  }
78  }
79  }
80  }
81 
82  // Write metadata to PDF if PDF export is enabled.
83  if (IsPdfDumpActivated())
84  {
85  PdfWriteMetaData(inComponent);
86  }
87 
88  // Finalize and free resources for the component.
89  errorStatus = myAPI->EndComponent(inComponent);
90  }
91  else
92  {
93  // If the prototype has already been processed, handle the PDF instance case.
94  // Use the unique ID returned by GetID() to map the component to your write ID.
95  if (IsPdfDumpActivated())
96  {
97  PdfInstanceExistingPrototype(componentIndex);
98  }
99  }
100 }
ProcessedComponents
Dtk_tab< Dtk_ID > ProcessedComponents
Definition: WritePrototype.cpp:16
Dtk_ID
uint32_t Dtk_ID
Definition: define.h:681
Dtk_transfo
This is the Transformation dedicated class.
Definition: dtk_transfo.hpp:19
Dtk_Info::GetBlankedStatus
int GetBlankedStatus() const
Retrieves the entity Blanked Status.
Dtk_Component::CatalogComponentType
@ CatalogComponentType
Definition: dtk_maindoc.hpp:571
dtkErrorFileNotExist
@ dtkErrorFileNotExist
Definition: error_dtk.hpp:101
WriteComponent
Dtk_ErrorStatus WriteComponent(Dtk_ComponentPtr inComponent, const Dtk_transfo &inMatrix)
Definition: WriteComponent.cpp:12
Dtk_SmartPtr::IsNotNULL
Dtk_bool IsNotNULL() const
Definition: util_ptr_dtk.hpp:119
XmlInitComponent
void XmlInitComponent(Dtk_ComponentPtr inComponent)
Definition: XmlWrite.cpp:50
XmlWriteMetaData
void XmlWriteMetaData(const Dtk_MetaDataPtr &inMetaData)
Definition: XmlWrite.cpp:130
XmlEndComponent
void XmlEndComponent()
Definition: XmlWrite.cpp:57
PdfWriteMetaData
void PdfWriteMetaData(Dtk_ComponentPtr inComponent)
Definition: PdfWrite.cpp:120
XmlWriteGlobalDataSet
void XmlWriteGlobalDataSet(const Dtk_GlobalDataSetPtr &inSelectionSet)
Definition: XmlWrite.cpp:124
Dtk_string
This is a high level string class.
Definition: dtk_string.hpp:53
PdfEndInstance
void PdfEndInstance(Dtk_ID pdfInstID, Dtk_ID childID)
Definition: PdfWrite.cpp:111
Dtk_Size_t
size_t Dtk_Size_t
Definition: define.h:704
Dtk_Info::GetColor
Dtk_RGB GetColor() const
Retrieves the entity color as Dtk_RGBA values.
Dtk_Info::GetActivationFlag
int GetActivationFlag() const
Dtk_API::EndComponent
Dtk_ErrorStatus EndComponent(Dtk_ComponentPtr &inComponent)
EndComponent.
WriteComponent
Dtk_ErrorStatus WriteComponent(Dtk_ComponentPtr inComponent, const Dtk_transfo &inMatrix=Dtk_transfo())
Definition: WriteComponent.cpp:12
Dtk_string::OpenFile
FILE * OpenFile(const Dtk_string &inRights) const
File Utility : Open a file with the given rights.
WritePrototype
void WritePrototype(Dtk_ComponentPtr inComponent, const Dtk_transfo &inMatrix)
Definition: WritePrototype.cpp:19
Dtk_Component::VirtualComponentType
@ VirtualComponentType
Definition: dtk_maindoc.hpp:572
Dtk_Component::InstanceComponentType
@ InstanceComponentType
Definition: dtk_maindoc.hpp:569
Dtk_API::GetAPI
static Dtk_API * GetAPI()
Get DATAKIT API.
WriteInstance
Dtk_ErrorStatus WriteInstance(Dtk_ComponentPtr inComponent)
Definition: WriteInstance.cpp:16
Dtk_tab::find
int find(const T &e) const
Definition: util_stl_dtk.hpp:746
PdfInstanceExistingPrototype
void PdfInstanceExistingPrototype(Dtk_ID ComponentIndex)
Definition: PdfWrite.cpp:141
Dtk_Int32
int32_t Dtk_Int32
Definition: define.h:679
Dtk_Component::ComponentTypeEnum
ComponentTypeEnum
Definition: dtk_maindoc.hpp:568
ProcessedComponents
Dtk_tab< Dtk_ID > ProcessedComponents
Definition: WritePrototype.cpp:16
Dtk_ErrorStatus
Dtk_ErrorStatus
Definition: error_dtk.hpp:6
CurrentMatrix
Dtk_transfo CurrentMatrix
Definition: WritePrototype.cpp:13
Dtk_SmartPtr< Dtk_Info >
PdfInitInstance
Dtk_ID PdfInitInstance(Dtk_ComponentPtr inComponent)
Definition: PdfWrite.cpp:93
Dtk_tab< Dtk_Int32 >
Dtk_tab::size
Dtk_Size_t size() const
Returns the size of the array.
Definition: util_stl_dtk.hpp:503
Dtk_Component::PrototypeComponentType
@ PrototypeComponentType
Definition: dtk_maindoc.hpp:570
IsXmlDumpActivated
Dtk_bool IsXmlDumpActivated()
Definition: XmlWrite.cpp:17
Dtk_Component::ComponentMissing
@ ComponentMissing
Definition: dtk_maindoc.hpp:559
dtkNoError
@ dtkNoError
Definition: error_dtk.hpp:149
Dtk_API::ReadComponent
Dtk_ErrorStatus ReadComponent(const Dtk_ComponentPtr &inComponent, Dtk_NodePtr &outRootNode)
Read Component from Assembly Tree (Call EndComponent to free data allocated)
WriteNode
Dtk_ErrorStatus WriteNode(Dtk_NodePtr inNode)
Definition: WriteNode.cpp:16
Dtk_RGB
Definition: dtk_rgb.hpp:7
IsPdfDumpActivated
Dtk_bool IsPdfDumpActivated()
Definition: PdfWrite.cpp:29
dtkErrorNullPointer
@ dtkErrorNullPointer
Definition: error_dtk.hpp:23
Dtk_API
Definition: dtk_api.hpp:75
PdfEndComponent
void PdfEndComponent()
Definition: PdfWrite.cpp:154
PdfInitComponent
Dtk_ID PdfInitComponent(Dtk_ComponentPtr inComponent)
Definition: PdfWrite.cpp:146