[Back to Blog](/blog) # Working with the Standard Data Access Interface in ODA IFC SDK

Egor Vorobyov October 08, 2020 [\#ifc](/blog/tag/ifc) [\#getting started](/blog/tag/getting-started)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

IFC SDK supports the Standard Data Access Interface (SDAI) which provides a low-level API for manipulating data defined with the EXPRESS Schema and provides the following functionality:

- Sessions, repositories, models, and schema instance management.
- Manipulations with application data (entity instances, aggregates, attributes), including data validation.

SDAI is defined in the ISO 10303-22 standard.

This article describes, in general, how to work with SDAI in IFC SDK.

#### Prepare the environment and load a model from file

Open a file and create a model. First create a new session using sdaiOpenSession:

```
SdaiSession session = sdaiOpenSession();
```

The next step is repository initialization. In the created session, create a repository from a file. For this example, we use a sample file and open it:

```
_sdaiCreateRepositoryFromFile(session, sdaiPathToFileDirectory, nameRepo);
```

Here we use \_sdaiCreateRepositoryFromFile. This function starts with the “\_” symbol, which means this function is an ODA utility function that is not described in the specification.

If we pass a valid path to the file repository, it should be successfully created. Then we should open it using sdaiOpenRepository:

```
repoCreate = sdaiOpenRepository(session, repoCreate);
```

Now we can get a model from the open repository by name. The name of the file model is “default”. We should use sdaiAccessModelBN to do it:

```
SdaiModel model = sdaiAccessModelBN(repoCreate, modelName, accessMode);
```

If we don’t need the model anymore, we can close it using the function sdaiEndModelAccess. After that all read and write operations fail.

#### Access application instances

Our model is open in read-only mode and ready to use.

First, we should know how to access application instances. Let’s view the sample file as plain text and open it in a text editor:

```
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [DesignTransferView_V1.0]'),'2;1');
FILE_NAME('001-00','2019-01-14T10:55:12',(''),(''),'The EXPRESS Data Manager Version 5.02.0100.07 : 28 Aug 2013','20180806_1515(x64) - Exporter 19.1.0.112 - Alternate UI 19.1.0.112','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1= IFCORGANIZATION($,'Autodesk Revit 2019 (ENU)',$,$,$);
#5= IFCAPPLICATION(#1,'2019','Autodesk Revit 2019 (ENU)','Revit');
#6= IFCCARTESIANPOINT((0.,0.,0.));
…
ENDSEC;
END-ISO-10303-21;
```

For simple analysis, each string in the DATA section becomes an application instance of a model. The number is a handle of this instance. The instance type in upper case is placed after the equal symbol. The data in the round brackets is a parameter of this application instance. SdaiAppInstance is an SDAI data type for working with application instances.

Let’s read application instance #5. Look at the appInstanceAccessByHandle function in the sample code.

sdaiGetEntityById reads the application model from the model by its handle ID. We use the macro TEST\_ASSERT for application instance validation. Then we call sdaiErrorQuery for the check error code of the last operation. We need to make sure that all operations are completed successfully:

```
//#5 = IFCAPPLICATION(#1, '2019', 'Autodesk Revit 2019 (ENU)', 'Revit');
SdaiAppInstance applicationInstance = _sdaiGetEntityById(model, 5);
TEST_ASSERT(applicationInstance != NULL);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
```

We can check the type of application instance using the function sdaiIsInstanceOfBN.

```
TEST_ASSERT(sdaiIsInstanceOfBN(applicationInstance, "IFCAPPLICATION") == sdaiTRUE);
```

And then get a handle of the application instance and compare it with the handle that is being used with \_sdaiGetEntityById:

```
TEST_ASSERT(_sdaiGetEntityId(applicationInstance) == 5);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
```

#### Finish and clean up the environment

When you finish working with the session, close the repository:

```
sdaiCloseRepository(repoCreate);
```

Then close the session:

```
sdaiCloseSession(session);
```

Future blog articles will describe how to work with SDAI in more detail.

## Get started today

**Try ODA software free for 60 days.  
No risk, no credit card required.**

[Try for Free](https://www.opendesign.com/free-trial)
