DATAKIT API  V2025.1
How To Use Solidworks Writer APIs for Solidworks writing of part or assembly

Table Of Contents:

Overview

The Solidworks Writer APIs support the version 2006 , you can create Part file (sldprt) or Assembly file (sldasm). Add the metadata for each file and set the unit DTK_UNIT_MM or DTK_UNIT_INCH of the file .

All functions are used from the namespace solidworksw .

So you need to initialize the writer as :

Dtk_ErrorStatus solidworksw::InitWriter(const Dtk_string& inLogFile,Licence_dtk inLicFct ,solidworksw::language inLanguage=solidworksw::english);

and delete the writer as :

Dtk_ErrorStatus solidworksw::EndWriter();

How to create a Part file (sldprt) step-by-step.

- You initialize part with its name , the metadata list and the unit , by default it is DTK_UNIT_MM  
Dtk_string inFilename = "../SampleFiles/dtk/essai.sldprt";
dtkerror = solidworksw::OpenPart(inFilename,FileDescription,DTK_UNIT_MM);
- You add all bodies by Dtk_Body or a parasolid file (only if you use PSKERNEL)
Dtk_Body MyCube ;
Dtk_mesh MyMesh ;
//add curves
//add point
//add plan
Dtk_Body body_plan = sampleWriter::CreatePlane();
//add axis system
//add fdt
Dtk_Fdt myfdt_dim = CreateFdtDimAssy();
Dtk_Fdt myfdt_datum = CreateFdtDatum();
//add axis
//add esquisse3d
//add esquisse2d
Dtk_MetaData metadata0 = Dtk_MetaData::CreateMetaDataWithUnits( Dtk_MetaData::TypeProperty, L"Title0 ", L"Value0", L"myunit0" );
Dtk_MetaData metadata1 = Dtk_MetaData::CreateMetaDataWithUnits( Dtk_MetaData::TypeProperty, L"Title1 ", L"Value1", L"myunit1" );
dtkerror = solidworksw::AddMetaData( metadata0 );
dtkerror = solidworksw::AddMetaData( metadata1 );
.....
#ifdef PSKERNEL_USER
Dtk_string ParasolidFile = L"../SampleFiles/dtk/Part5.x_t";
dtkerror = solidworksw::AddParasolidFile(ParasolidFile);
dtkerror = solidworksw::AddParasolidFile(ParasolidFile);
#endif
....
- You finalize the part 

How to create a Assembly file (sldasm) step-by-step.

- You initialize assembly with its name , the metadata list and the unit , by default it is DTK_UNIT_MM  
Dtk_string inFilename = "../SampleFiles/dtk/essai.sldasm";
dtkerror = solidworksw::OpenAssembly(inFilename,FileDescription,DTK_UNIT_MM);
- You add all instances with full path name , instance name and position
Dtk_string disk_name = "../SampleFiles/dtk/child.sldprt";
Dtk_string instance_name = L"MyPart1";
Dtk_transfo position = Dtk_transfo(Dtk_dir(1,0,0),Dtk_dir(0,1,0),Dtk_dir(0,0,1),Dtk_pnt(0,0,0));
solidworksw::Instance instance1(disk_name,instance_name,position);
dtkerror = solidworksw::AddInstanceComponent(instance1);
disk_name = "../SampleFiles/dtk/child.sldasm";
instance_name = L"MyAssembly2";
position.setOrigin(Dtk_pnt(100,150,0));
solidworksw::Instance instance2(disk_name,instance_name,position);
dtkerror = solidworksw::AddInstanceComponent(instance2);
//you can add the color and status hidden to the instance
/*//instance color
instance_name = L"MyColorPart2";
position.setOrigin(Dtk_pnt(200,250,0));
solidworksw::Instance instance3(disk_name,instance_name,position,Dtk_RGB(255,0,0,255));
dtkerror = solidworksw::AddInstanceComponent(instance3);
//instance visibility
instance_name = L"MyInvisiblePart2";
position.setOrigin(Dtk_pnt(300,350,0));
solidworksw::Instance instance4(disk_name,instance_name,position,Dtk_RGB(-1,-1,-1,-1),DTK_TRUE);
dtkerror = solidworksw::AddInstanceComponent(instance4);
//instance color + visibility
instance_name = L"MyColorInvisiblePart2";
position.setOrigin(Dtk_pnt(400,450,0));
solidworksw::Instance instance5(disk_name,instance_name,position,Dtk_RGB(0,255,0,255),DTK_TRUE);
dtkerror = solidworksw::AddInstanceComponent(instance5);*/
....
- You finalize the assembly 

Full Sample.

//standard header - needed for printf -
#include <stdio.h>
//DATAKIT headers needed
#include "datakit.h"
//start_of_mainswwrite
//This sample show you how to add a body into solidworks part file and create an assembly.
#ifdef PSKERNEL_USER
void StartParasolid();
void StopParasolid();
#endif
void
AddColortoFace(const Dtk_BodyPtr& inBody)
{
Dtk_Int32 cpt=1;
//add color to face
Dtk_Int32 i,sizei = (Dtk_Int32)inBody->GetNumTopologicalEntities(DTK_TYPE_UNKNOWN);
for (i=0;i<sizei;i++)
{
Dtk_TopologicalEntity topo = inBody->GetPtr((Dtk_ID)i);
if (topo.IsNotNULL())
{
if (face.IsNotNULL())
{
Dtk_Info info = face->get_info();
if (info.IsNULL())
{
face->info() = Dtk_Info::create();
info = face->get_info();
}
info->SetColor(Dtk_RGB((cpt*42),192,192,255));
cpt++;
Dtk_string face_name = inBody->get_info()->GetName() + L"Face_";
face_name.add_int(i);
info->SetName(face_name);
}
}
}
}
void
create_part(const Dtk_string& inFilename , const Dtk_string& inParasolidFile)
{
Dtk_tab<Dtk_MetaDataPtr> ArrayMetadata;
Dtk_MetaData metadata ;
ArrayMetadata.push_back(metadata);
solidworksw::FileDescription FileDescription(ArrayMetadata);
dtkerror = solidworksw::OpenPart(inFilename,FileDescription,DTK_UNIT_MM);
MyCube1->info() = Dtk_Info::create();
MyCube1->get_info()->SetName(L"Cube1");
AddColortoFace(MyCube1);
MyCube2->info() = Dtk_Info::create();
MyCube2->get_info()->SetName(L"Cube2");
AddColortoFace(MyCube2);
Dtk_transfo transfo ;
transfo.setOrigin(200,0,0);
MyCube2->Transform(transfo);
//only with pskernel
dtkerror = solidworksw::AddParasolidFile(inParasolidFile);
//without pskernel you will get an error dtkErrorTypeNotsupported
// Cylinder Sample
//add curves
//add point
//add plan
Dtk_Body body_plan = sampleWriter::CreatePlane();
//add axis system
//add fdt
Dtk_Fdt myfdt_dim = CreateFdtDimAssy();
Dtk_Fdt myfdt_datum = CreateFdtDatum();
//add axis
dtkerror = solidworksw::ClosePart();
}
void
create_assembly(const Dtk_string& inFilename,const Dtk_string& inFilenamePart)
{
Dtk_tab<Dtk_MetaDataPtr> ArrayMetadata;
Dtk_MetaData metadata ;
ArrayMetadata.push_back(metadata);
solidworksw::FileDescription FileDescription(ArrayMetadata);
dtkerror = solidworksw::OpenAssembly(inFilename,FileDescription,DTK_UNIT_MM);
Dtk_string disk_name = inFilenamePart;
Dtk_string instance_name = L"MyPart1";
Dtk_transfo position = Dtk_transfo(Dtk_dir(1,0,0),Dtk_dir(0,1,0),Dtk_dir(0,0,1),Dtk_pnt(0,0,0));
solidworksw::Instance instance1(disk_name,instance_name,position);
dtkerror = solidworksw::AddInstanceComponent(instance1);
instance_name = L"MyPart2";
position.setOrigin(Dtk_pnt(100,150,0));
solidworksw::Instance instance2(disk_name,instance_name,position);
dtkerror = solidworksw::AddInstanceComponent(instance2);
//you can add the color and status hidden to the instance
/*//instance color
instance_name = L"MyColorPart2";
position.setOrigin(Dtk_pnt(200,250,0));
solidworksw::Instance instance3(disk_name,instance_name,position,Dtk_RGB(255,0,0,255));
dtkerror = solidworksw::AddInstanceComponent(instance3);
//instance visibility
instance_name = L"MyInvisiblePart2";
position.setOrigin(Dtk_pnt(300,350,0));
solidworksw::Instance instance4(disk_name,instance_name,position,Dtk_RGB(-1,-1,-1,-1),DTK_TRUE);
dtkerror = solidworksw::AddInstanceComponent(instance4);
//instance color + visibility
instance_name = L"MyColorInvisiblePart2";
position.setOrigin(Dtk_pnt(400,450,0));
solidworksw::Instance instance5(disk_name,instance_name,position,Dtk_RGB(0,255,0,255),DTK_TRUE);
dtkerror = solidworksw::AddInstanceComponent(instance5);*/
}
int main(int argc, char* argv[])
{
{
//remove old file
Dtk_string temp ;
temp = L"../../SampleFiles/dtk/my_test_part.sldprt";
temp.unlink();
temp = L"../../SampleFiles/dtk/my_test_part2.sldprt";
temp.unlink();
temp = L"../../SampleFiles/dtk/my_test_assembly.sldasm";
temp.unlink();
temp = L"../../SampleFiles/dtk/logwrite.txt";
temp.unlink();
}
Dtk_ErrorStatus dtkerror;
Dtk_string StrSchemaPath = "../bin/Schema/";
_putenv("FLEXLM_BATCH=0");
#ifdef _X64
_wchdir(L"../../bin_x64");
StrSchemaPath = "../bin_x64/Schema/";
#else
_wchdir(L"../../bin");
StrSchemaPath = "../bin/Schema/";
#endif
#ifdef PSKERNEL_USER
//First if you haven't done yet, start the parasolid session
StartParasolid();
//And informs that the session is started
//Set the schema path
wchar_t *schPath;
schPath = (wchar_t*)malloc(sizeof(wchar_t) * (StrSchemaPath.len() + 10));
swprintf(schPath, 255, L"P_SCHEMA=%s", StrSchemaPath.w_str());
_wputenv(schPath);
free(schPath);
schPath=NULL;
#endif
Dtk_string workingdir= L"../SampleFiles/dtk/";
//Then You have to Start DATAKIT API with a temporary directory
Dtk_ErrorStatus errorStatus = dtkNoError;
Dtk_API * MyAPI = Dtk_API::StartAPI(workingdir, errorStatus);
if(MyAPI == NULL)
{
printf("Can't Start DATAKIT API %d\n",errorStatus);
}
MyAPI->SetSchemaDir(StrSchemaPath);
Dtk_string logwrite=MyAPI->GetWorkingDir() + L"logwrite.txt";
dtkerror = solidworksw::InitWriter(logwrite,NULL,solidworksw::english);
Dtk_string xmtfile = L"../SampleFiles/xmt/CS_WHEEL_CAP.X_T";
//how to create part file
Dtk_string FilenamePart = L"../SampleFiles/dtk/my_test_part.sldprt";
create_part(FilenamePart,xmtfile);
FilenamePart = L"../SampleFiles/dtk/my_test_part2.sldprt";
create_part(FilenamePart,xmtfile);
//how to create assembly file
Dtk_string FilenameAssm = L"../SampleFiles/dtk/my_test_assembly.sldasm";
create_assembly(FilenameAssm,FilenamePart);
dtkerror = solidworksw::EndWriter();
#ifdef PSKERNEL_USER
//Stop the parasolid session
StopParasolid();
#endif
return 0;
}
//end_of_mainswwrite
sampleWriter::CreateAxis
Dtk_BodyPtr CreateAxis()
Definition: testcreatecube.cpp:1492
Dtk_Entity::get_info
Dtk_InfoPtr get_info() const
Dtk_ID
uint32_t Dtk_ID
Definition: define.h:689
Dtk_transfo
This is the Transformation dedicated class.
Definition: dtk_transfo.hpp:19
Dtk_Body::Transform
Dtk_ErrorStatus Transform(const Dtk_transfo &inTransfo)
solidworksw::InitWriter
Dtk_ErrorStatus InitWriter(const Dtk_string &inLogFile, Licence_dtk inLicFct, solidworksw::language inLanguage=solidworksw::english)
Initialize the Solidworks Writer
DTK_TYPE_UNKNOWN
@ DTK_TYPE_UNKNOWN
Definition: define.h:37
solidworksw::ClosePart
Dtk_ErrorStatus ClosePart()
Free data allocated by solidworksw::OpenPart
Dtk_Info
This is the generic Info class.
Definition: util_ent_dtk.hpp:115
Dtk_Info::SetName
Dtk_ErrorStatus SetName(Dtk_string inName)
solidworksw::OpenPart
Dtk_ErrorStatus OpenPart(const Dtk_string &inSolidworksFile, const solidworksw::FileDescription &inFileDescription=solidworksw::FileDescription(), Dtk_Unit inUnit=DTK_UNIT_MM, const Dtk_string &inConfigurationName=Dtk_string())
Initialize the part
main
int main(int argc, char **argv)
Definition: LibReadersSample/main.cpp:36
Dtk_Face
is a surface bounded by Dtk_Loop.
Definition: util_topology_dtk.hpp:524
Dtk_transfo::setOrigin
void setOrigin(const Dtk_pnt &O)
Set a new O center point.
solidworksw::AddEntity
Dtk_ErrorStatus AddEntity(const Dtk_EntityPtr &inEntity)
Write the entity provided in parameter.
Dtk_API::StartAPI
static Dtk_API * StartAPI(const Dtk_string &inTemporyDirectory, Dtk_ErrorStatus &outErrorCode, const Dtk_string &inCustomerID=Dtk_string())
Start DATAKIT API.
create_assembly
void create_assembly(const Dtk_string &inFilename, const Dtk_string &inFilenamePart)
Definition: testlibswwrite.cpp:144
solidworksw.hpp
Dtk_TopologicalEntity
Definition: util_topology_dtk.hpp:27
Dtk_string
This is a high level string class.
Definition: dtk_string.hpp:58
solidworksw::CloseAssembly
Dtk_ErrorStatus CloseAssembly()
Write effectively the Assembly initialized by solidworksw::OpenAssembly.
create_part
void create_part(const Dtk_string &inFilename, const Dtk_string &inParasolidFile)
Definition: testlibswwrite.cpp:56
Dtk_string::unlink
int unlink() const
File Utility : Delete a file.
DTK_UNIT_MM
@ DTK_UNIT_MM
Definition: util_draw_dtk.hpp:85
sampleWriter::CreateAxisSystem
Dtk_AxisSystemPtr CreateAxisSystem()
Definition: testcreatecube.cpp:1465
Dtk_API::GetWorkingDir
const Dtk_string & GetWorkingDir() const
dtkErrorAPINotStarted
@ dtkErrorAPINotStarted
Definition: error_dtk.hpp:101
Dtk_API::SetSchemaDir
Dtk_ErrorStatus SetSchemaDir(const Dtk_string &inSchemaDir)
Set Schema Directory needed for Unigraphics, Parasolid, Solidedge, Solidworks and Jt readers.
solidworksw::SetIsAlreadyStart
void SetIsAlreadyStart(const Dtk_Int32 &inStop)
ONLY for PSKERNEL user.
solidworksw::EndWriter
Dtk_ErrorStatus EndWriter()
Free the Solidworks Writer
Dtk_mesh
This is a high level mesh class.
Definition: util_mesh_dtk.hpp:485
Dtk_MetaData::CreateMetaDataWithUnits
static Dtk_MetaDataPtr CreateMetaDataWithUnits(const MetaDataTypeEnum &inEnumType, Dtk_string inTitle, Dtk_string inValue, Dtk_string inUnits, Dtk_string inValueType=Dtk_string(L"STRING"))
Create a Dtk_MetaDataPtr .
Dtk_string::add_int
void add_int(const int integer, int force_unsigned_int=0)
concat an int to the Dtk_string (convert the int to Dtk_string)
solidworksw::FileDescription
This class provides several informations about a Solidworks File. It can be used with solidworksw::Op...
Definition: solidworksw.hpp:36
sampleWriter::CreateFdtDimAssy
Dtk_FdtPtr CreateFdtDimAssy()
PMI in Assembly : a dimension between faces of different instances.
Definition: testcreatefdt.cpp:118
sampleWriter::CreatePoint
Dtk_BodyPtr CreatePoint()
Definition: testcreatecube.cpp:1407
sampleWriter::CreateEsquisse2D
Dtk_BodyPtr CreateEsquisse2D()
Definition: testcreatecube.cpp:1625
sampleWriter::CreateFdtDatum
Dtk_FdtPtr CreateFdtDatum()
Create Simple Datum.
Definition: testcreatefdt.cpp:19
Dtk_Int32
int32_t Dtk_Int32
Definition: define.h:687
Dtk_MetaData::TypeProperty
@ TypeProperty
Definition: dtk_metadata.hpp:28
solidworksw::english
@ english
Definition: solidworksw.hpp:17
Dtk_SmartPtr< Dtk_Entity >::DtkDynamicCast
static Dtk_SmartPtr< Dtk_Entity > DtkDynamicCast(const Dtk_SmartPtr< T2 > &p)
Definition: util_ptr_dtk.hpp:101
Dtk_ErrorStatus
Dtk_ErrorStatus
Definition: error_dtk.hpp:6
sampleWriter::CreateEsquisse3D
Dtk_BodyPtr CreateEsquisse3D()
Definition: testcreatecube.cpp:1524
solidworksw::AddInstanceComponent
Dtk_ErrorStatus AddInstanceComponent(Instance &inInstance)
Add an instance into the Current Assembly (sldasm).
Dtk_SmartPtr
Definition: util_ptr_dtk.hpp:37
utilwriter.h
sampleWriter::CreateMeshCylinder
Dtk_MeshPtr CreateMeshCylinder(int nbpoints)
Mesh Cylinder sample.
Definition: testcreatemesh.cpp:337
Dtk_pnt
This is a mathematical point class.
Definition: dtk_pnt.hpp:22
datakit.h
testcreatemesh.hpp
testcreatecube.hpp
Dtk_tab
This is a high level array class.
Definition: util_stl_dtk.hpp:85
sampleWriter::CreateCube
Dtk_BodyPtr CreateCube()
Definition: testcreatecube.cpp:1249
Dtk_API::StopAPI
static void StopAPI(Dtk_API *&inAPI, Dtk_bool inWriteTimeInLog=1)
Stop DATAKIT API.
solidworksw::AddMetaData
Dtk_ErrorStatus AddMetaData(const Dtk_MetaDataPtr &inEntity)
Dtk_string::len
int len() const
Retrieve the length of the Dtk_string.
sampleWriter::CreateCurves
Dtk_BodyPtr CreateCurves()
Definition: testcreatecube.cpp:1292
solidworksw::AddParasolidFile
Dtk_ErrorStatus AddParasolidFile(const Dtk_string &inParasolidFile)
Add parasolid file.
Dtk_MetaData
This is the Dtk_MetaData Class. The Dtk_MetaDataPtr object is used to store any additional informatio...
Definition: dtk_metadata.hpp:23
dtkNoError
@ dtkNoError
Definition: error_dtk.hpp:140
Dtk_tab::push_back
void push_back(const T &x)
Inserts an element at the end of the array.
Definition: util_stl_dtk.hpp:415
Dtk_RGB
Definition: dtk_rgb.hpp:7
solidworksw::OpenAssembly
Dtk_ErrorStatus OpenAssembly(const Dtk_string &inFileName, const solidworksw::FileDescription &inFileDescription=solidworksw::FileDescription(), Dtk_Unit inUnit=DTK_UNIT_MM, const Dtk_string &inConfigurationName=Dtk_string())
Initialize a Assembly .
Dtk_Info::SetColor
Dtk_ErrorStatus SetColor(const int &R, const int &G, const int &B)
Dtk_Info::create
static Dtk_SmartPtr< Dtk_Info > create()
solidworksw::Instance
This class provides Instance about a Solidworks File. It can be used with solidworksw::OpenAssembly f...
Definition: solidworksw.hpp:79
Dtk_Body
A Dtk_Body Dtk_Body is the highest level topological entity. It allow you to handle manifold and non-...
Definition: util_topology_dtk.hpp:801
AddColortoFace
void AddColortoFace(const Dtk_BodyPtr &inBody)
Definition: testlibswwrite.cpp:25
Dtk_dir
This is a mathematical direction class.
Definition: dtk_dir.hpp:15
Dtk_API
Definition: dtk_api.hpp:75
Dtk_AxisSystem
This is the Dtk_AxisSystem class.
Definition: util_ent_dtk.hpp:722
Dtk_Fdt
This is the FD&T class. The base PMI Class contains a Dtk_2dEntity and Transformation Matrix to loca...
Definition: util_draw_dtk.hpp:7347
Dtk_MetaData::CreateMetaData
static Dtk_MetaDataPtr CreateMetaData(const MetaDataTypeEnum &inEnumType, Dtk_string inTitle, Dtk_string inValue, Dtk_string inValueType=Dtk_string(L"STRING"))
Create a Dtk_MetaDataPtr .
Dtk_Entity::info
Dtk_InfoPtr & info()