Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »


 
This chapter introduces readers to the principles of application development using the EDMinterface.
The list of EDMinterface functions found in this chapter is not complete, nor is it intended to be so. For a complete list of all functions, readers should refer to the following documents:

  • "EDMinterface : SDAI C binding reference"
  • "EDMinterface : EDMI C binding reference".

 
Setting up for Application Development
All the necessarily files for application development are available in the form of the EDMdeveloperSeat toolkit and they are:
On the WINDOWS platform:

  • <EDM home directory>\Toolkit\Include\sdai.h

The EDMI header file.

  • <EDM home directory>\Toolkit\Lib\edmikit400.lib

  <EDM home directory>\Toolkit\Lib\edmikit400.dll
  The EDMinterface library.

  • <EDM home directory>\Toolkit\Include\cpp_edmi.h

The EDMinterface/C++ header file.
 

  •  <EDM home directory>\Toolkit\Lib\cpp_edmi.lib

<EDM home directory>\Toolkit\Lib\cpp_edmi.dll
 The EDMinterface/C++ library.
 

  •  <EDM home directory>\Toolkit\Lib\jexpress1-11.dll

<EDM home directory>\Toolkit\Lib\ jexpress1-11ts.dll
 The EDMinterface/Java native library.
 

  •  <EDM home directory>\Java\jexpress-1-11.jar

 The EDMinterface/Java archive.
 

  •  <EDM home directory>\Toolkit\Lib\edmivb.dll

 The EDMinterface/VB library.
 
All dll files belonging to the EDM toolkit, will during EDM installation be installed in the WINDOWS system directory, i.e. it is not necessary to add <EDM_home_directory>\Toolkit\lib to the PATH.
The <EDM home directory>\Java\jexpress-1-11.jar will be added to the CLASSPATH during installation of EDM.
Visual C++ options (version 5.0/6.0)
In Project Settings:C/C++ folder:
Category PreprocessorAdd _STDC_in Preprocessor definitions (Settings for All configuration)
Ad<EDM home directory>\Toolkit\Includein Additional include directories (Settings for All configuration)
Category Code Generation Struct member alignment: 8 Bytes (Settings for All configurations)
Use run-time library: Multithreaded (Settings for Win 32 Release)
Use run-time library: Debug Multithreaded (Settings for Win 32 debug)
 
On UNIX platforms:

  • <EDM home directory>/edmi/sdai.h

The EDMI header file.

  • <EDM home directory>/edmi/edmi.a

  The EDMinterface static library.

  • <EDM home directory>/edmi/jexpress1-11.so

The EDMinterface shared library (including The EDMinterface/Java native library)
 

  •  <EDM home directory>/jar/jexpress-1-11.jar

 The EDMinterface/Java archive.
 
ANSI C conformance option should be used when compiling C. Also add <EDM_home_directory>/edmi to the preprocessor #include file search path.
If you follow the instructions found in EDMassistVolume II during installation no further setup is needed. The LD_LIBRARY_PATH (LIBPATH) and CLASSPATH will then be defined each time you log in.
 
Manipulating EDM databases.
As indicated previously in this chapter, a newly created EDMdatabase contains two distinct repositories, namely a dictionary repository and a data repository. The two repositories can be manipulated by the same set of EDMinterface functions.
Database operations
The following functions handle EDM databases.

  • edmiCreateDatabase.
  • edmiOpenDatabase.
  • edmiCloseDatabase.
  • edmiDeleteDatabase.

 
Repository operations
The following functions initializes and closes a repository:

  • sdaiOpenRepository.
  • sdaiOpenRepositoryBN.
  • sdaiCloseRepository.

 
There are two classes of open repository functions. One class which performs a call by repository identifier, and another one with a BN suffix, which performs a call by name.
The EDMinterface also provides additional functions to manipulate repositories. These functions are prefixed with edmi.

  • edmiCreateRepository
  • edmiDeleteRepository
  • edmiDeleteRepositoryBN
  • edmiGetRepository
  • edmiGetRepositoryOpenMode
  • edmiGetRepositoryOpenModeBN
  • edmiOpenRepository
  • edmiOpenRepositoryBN

 
Model operations
The principal functions to initialize and close models are:

  • sdaiCreateModel.
  • sdaiCreateModelBN.
  • sdaiOpenModel.
  • sdaiOpenModelBN.
  • sdaiCloseModel.
  • sdaiDeleteModel.

There are two classes of functions. One class which performs calls by identifier, and another one, with a BN suffix, which performs calls by name.
The EDMinterface also provides additional functions to manipulate models. These functions are prefixed with edmi.

  • edmiConvertModelBN
  • edmiConvertModelsBN
  • edmiCopyModel
  • edmiCopyModelBN
  • edmiCreateModel
  • edmiCreateModelBN
  • edmiDeleteModel.
  • edmiDeleteModelBN.
  • edmiDeleteModelContents.
  • edmiGetModel
  • edmiGetModelBN
  • edmiGetModelOpenMode
  • edmiGetModelOpenModeBN
  • edmiGetModelRepository

 
Instance operations
The principal functions to create and delete instances are:

  • sdaiCreateInstance.
  • sdaiCreateInstanceBN.
  • sdaiDeleteInstance.

There are two classes of functions. One class which performs call by identifier, and another one, with a BN suffix, which performs call by name.
In addition to the principal functions, metadata for instances can be obtained by means of these EDMinterface functions:

  • sdaiGetInstanceType.
  • sdaiIsInstanceOf.
  • sdaiIsInstanceOfBN.
  • sdaiIsKindOf.
  • sdaiIsKindOfBN.

 
Aggregate operations
The principal functions to create aggregates are:

  • sdaiCreateAggr.
  • sdaiCreateAggrBN.

The functions accept an argument representing an attribute either by identifier or by name.
The functions to populate an aggregate are:

  • sdaiPutAggrByIndex.
  • sdaiPutAggrByIterator.
  • sdaiInsertAfter.
  • sdaiInsertBefore.
  • sdaiAdd
  • sdaiAppend.
  • sdaiPrepend.

 
The functions to retrieve an element from an aggregate are:

  • sdaiGetAggrByIndex.
  • edmiGetAggrElement

 
The following functions provide iterated operations:

  • sdaiCreateIterator.
  • sdaiGetAggrByIterator.
  • sdaiPrevious.
  • sdaiNext.

 
The following function gets the number of elements in an aggregate:

  • sdaiGetMemberCount.

 
The functions to unset elements of an ARRAY are:

  • sdaiUnsetAggrByIndex.
  • sdaiUnsetAggrByIterator.

 
The EDMinterface provides additional functions specific to EDM, to obtain aggregate type information. These functions are:

  • edmiGetAggrType.

 
The EDMinterface also implements the Express aggregate operators as specified in ISO 10303-11:1994 chapter 12.6.

  • edmiAggrDifference
  • edmiAggrIntersection
  • edmiAggrUnion
  • edmiIsAggrSubset
  • edmiIsAggrSuperset

 
Attribute operations
The functions to set attribute values are:

  • sdaiPutAttr.
  • sdaiPutAttrs
  • sdaiPutAttrBN.
  • sdaiPutAttrsBN.

 
There are two classes such of functions. On class which set a single attribute whereas the other one sets one or more attributes in a single call.
The functions to unset an attribute are:

  • sdaiUnsetAttr.
  • sdaiUnsetAttrBN.

 
The EDMinterface provides additional functions specific to EDM, to obtain attribute type information. These functions are:

  • edmiGetAttrPrimitiveType.
  • edmiGetAttrPrimitiveTypeBN.

 
The EDM macro functions.
The EDMinterface also provides a set of functions with high level functionality. These functions are referred to as the EDMI macro functions.
| |EDMexpressCompiler .|edmiDefine….Schema functions|

 

EDMp21Handler .

edmiReadStepFile, edmiWriteStepFile

| |EDMmodelConverter .|edmiConvertModel… functions|
| |EDMmodelChecker .|edmiValidate… functions|
 
 
Two sample  applications:
The two applications found below are clearly quite simplified ones. Nevertheless, they demonstrate the basic principles, which are just as applicable to a complex application.
 
Example One: Hello world
 
/---------------------------------------------------------------/
/* */
/* C-LateBinding hello example: */
/* - Creates and opens a database. */
/* - Compiles an EXPRESS schema. */
/* - Creates a data model. */
/* - Populates an instance. */
/* - Retrieves an attribute value. */
/* */
/* --------------------------------------------------------------*/
 
#include <stdio.h>
#include "sdai.h"
 
#define DBLOC "db"
#define EXP_FILE "hello.exp"
#define DBNAME "db"
#define DBPASSW "db"
#define MYSCHEMA "hello_schema"
#define MYMODEL "HELLO"
#define DIA_FILE "comp.dia"
#define STEP_FILE "hello.stp"
 
void main()
{
long rstat,nwarnings,nerrors;
SdaiRepository data_repository;
SdaiSession sessionId;
SdaiModel mymodel;
SdaiInstance hello_instance;
SdaiString hello_world;
char c;
/------------------------------------------/
/* CREATE DATABASE AND OPEN SESSION */
/* -----------------------------------------*/
rstat = edmiDeleteDatabase(DBLOC,DBNAME,DBPASSW);
rstat = sdaiErrorQuery();
rstat = edmiCreateDatabase(DBLOC,DBNAME,DBPASSW);
rstat = edmiOpenDatabase(DBLOC,DBNAME,DBPASSW);
sessionId = sdaiOpenSession();
if(rstat = sdaiErrorQuery()) goto err;
/------------------------------------------/
/* COMPILE THE SCHEMA */
/* -----------------------------------------*/
if(rstat = edmiDefineSchema(EXP_FILE, DIA_FILE, NULL, 0,   &nwarnings, &nerrors)) goto err;
if(nerrors){
printf("\nErrors when compiling %s",EXP_FILE);
goto end;
}
/-----------------------------------------------------/
/* OPEN THE DATA REPOSITORY,CREATE A MODEL AND OPEN IT */
/* ----------------------------------------------------*/
data_repository = sdaiOpenRepositoryBN("DataRepository");
mymodel = sdaiCreateModelBN(data_repository,MYMODEL,MYSCHEMA);
mymodel = sdaiOpenModelBN(data_repository,MYMODEL,sdaiRW);
if(rstat = sdaiErrorQuery()) goto err;
/-----------------------------------------------------/
/* POPULATE INSTANCE */
/* ----------------------------------------------------*/
hello_instance = sdaiCreateInstanceBN(mymodel,"HELLO");
sdaiPutAttrBN(hello_instance,"HELLO",sdaiSTRING,"Hello world!");
if(rstat = sdaiErrorQuery()) goto err;
/-----------------------------------------------------/
/* RETRIEVE ATTRIBUTE VALUE */
/* ----------------------------------------------------*/
sdaiGetAttrBN(hello_instance,"HELLO",sdaiSTRING,&hello_world);
if(rstat = sdaiErrorQuery()) goto err;
printf("\n%s\n",hello_world);
goto end;
err:
/-------/
/* ERROR */
/* ------*/
printf("\nERROR: rstat= %d: %s",rstat,edmiGetErrorText(rstat));
end:
/-----------------/
/* CLOSE DATABASE */
/* ----------------*/
edmiCloseDatabase("");
if(rstat){
printf("\n(sad)\n");
} else {
printf("\n(smile)\n");
}
#ifdef _WINDOWS
c = getchar();
#endif
}
 
 
Example two: The Flinstone family:
 
/------------------------------------------------------------/
/* */
/* C-LateBinding example. */
/* This small application demonstrates the most basic edmi */
/* functionality as it: */
/* - Creates and opens a database. */
/* - Compiles an EXPRESS schema. */
/* - Creates a data model. */
/* - Populates instances. */
/* - Relates instances. */
/* - Populates aggregates */
/* - Looks up instances. */
/* - Retrieves attribute values. */
/* - Performes aggregate iteration. */
/* - Exports a STEP file. */
/* */
/* The CHECK_ERR macro checks the edmi error code. */
/* For the purpose of readabilty the usage of macro has */
/* been restricted. */
/* In a real application one should perhaps condsider more */
/* frequent usage in order to achieve robust code. */
/* */
/* -----------------------------------------------------------*/
 
#include <stdio.h>
#include "sdai.h"
 
#define DBLOC "db"
#define EXP_FILE "family.exp"
#define DBNAME "db"
#define DBPASSW "db"
#define MYSCHEMA "family_schema"
#define MYMODEL "FAMILY"
#define DIA_FILE "comp.dia"
#define STEP_FILE "family.stp"
 
#define CHECK_ERR(file,line) \
casefile = file; \
caseline = line; \
if (rstat = sdaiErrorQuery()) goto err;
 
void main()
{
long rstat,nwarnings,nerrors;
SdaiRepository data_repository;
SdaiSession sessionId;
SdaiErrorCode sdaiError;
SdaiModel mymodel;
SdaiInstance the_flintstones;
SdaiInstance fred_flintstone;
SdaiInstance wilma_flintstone;
SdaiInstance pebbles_flintstone;
SdaiInstance rocky_flintstone;
SdaiInstance ff,wife,child,mother,family;
SdaiAggr pets,children,the_pets;
SdaiString given_name,surname,pet_name,family_name,adress;
SdaiInteger index,hits,number_of_children,number_of_pets;
SdaiIterator iter;
char c;
char* casefile;
int caseline;
/------------------------------------------/
/* CREATE DATABASE AND OPEN SESSION */
/* -----------------------------------------*/
rstat = edmiDeleteDatabase(DBLOC,DBNAME,DBPASSW);
rstat = sdaiErrorQuery();
rstat = edmiCreateDatabase(DBLOC,DBNAME,DBPASSW);
rstat = edmiOpenDatabase(DBLOC,DBNAME,DBPASSW);
sessionId = sdaiOpenSession();
CHECK_ERR(_FILE,LINE_);
/------------------------------------------/
/* COMPILE THE SCHEMA */
/* -----------------------------------------*/
rstat = edmiDefineSchema(EXP_FILE,DIA_FILE,NULL,0 ,&nwarnings,&nerrors);
CHECK_ERR(_FILE,LINE_);
if(nerrors){
printf("\nErrors when compiling %s",EXP_FILE);
goto end;
}
/-----------------------------------------------------/
/* OPEN THE DATA REPOSITORY,CREATE A MODEL AND OPEN IT */
/* ----------------------------------------------------*/
data_repository = sdaiOpenRepositoryBN("DataRepository");
mymodel = sdaiCreateModelBN(data_repository,MYMODEL,MYSCHEMA);
mymodel = sdaiOpenModelBN(data_repository,MYMODEL,sdaiRW);
CHECK_ERR(_FILE,LINE_);
/-----------------------------------------------------/
/* POPULATE A FAMILY INSTANCE */
/* ----------------------------------------------------*/
the_flintstones = sdaiCreateInstanceBN(mymodel,"FAMILY");
sdaiPutAttrBN(the_flintstones,"NAME",sdaiSTRING,"Flintstones");
sdaiPutAttrBN(the_flintstones,"ADRESS",sdaiSTRING,"Bedrock");
CHECK_ERR(_FILE,LINE_);
/-----------------------------------------------------/
/* POPULATE Fred Flintstone */
/* ----------------------------------------------------*/
fred_flintstone = sdaiCreateInstanceBN(mymodel,"MAN");
sdaiPutAttrBN(fred_flintstone,"GIVEN_NAME",sdaiSTRING,"Fred");
sdaiPutAttrBN(fred_flintstone,"SURNAME",sdaiSTRING,"Flintstone");
sdaiPutAttrBN(fred_flintstone,"FAMILY",sdaiINSTANCE,the_flintstones);
CHECK_ERR(_FILE,LINE_);
/-----------------------------------------------------/
/* POPULATE Wilma Flintstone */
/* ----------------------------------------------------*/
wilma_flintstone = sdaiCreateInstanceBN(mymodel,"WOMAN");
sdaiPutAttrBN(wilma_flintstone,"GIVEN_NAME",sdaiSTRING,"Wilma");
sdaiPutAttrBN(wilma_flintstone,"SURNAME",sdaiSTRING,"Flintstone");
sdaiPutAttrBN(wilma_flintstone,"FAMILY",sdaiINSTANCE,the_flintstones);
CHECK_ERR(_FILE,LINE_);
/-----------------------------------------------------/
/* MARRIAGE */
/* ----------------------------------------------------*/
sdaiPutAttrBN(fred_flintstone,"WIFE",sdaiINSTANCE,wilma_flintstone);
CHECK_ERR(_FILE,LINE_);
/-----------------------------------------------------/
/* POPULATE Pebbles Flintstone (daughter) */
/* ----------------------------------------------------*/
pebbles_flintstone = sdaiCreateInstanceBN(mymodel,"WOMAN");
sdaiPutAttrBN(pebbles_flintstone,"GIVEN_NAME",sdaiSTRING,"Pebbles");
sdaiPutAttrBN(pebbles_flintstone,"SURNAME",sdaiSTRING,"Flintstone");
sdaiPutAttrBN(pebbles_flintstone,"FATHER",sdaiINSTANCE,fred_flintstone);
sdaiPutAttrBN(pebbles_flintstone,"MOTHER",sdaiINSTANCE,wilma_flintstone);
sdaiPutAttrBN(pebbles_flintstone,"FAMILY",sdaiINSTANCE,the_flintstones);
CHECK_ERR(_FILE,LINE_);
/-----------------------------------------------------/
/* POPULATE Rocky Flintstone (son) */
/* ----------------------------------------------------*/
rocky_flintstone = sdaiCreateInstanceBN(mymodel,"MAN");
sdaiPutAttrBN(rocky_flintstone,"GIVEN_NAME",sdaiSTRING,"Rocky");
sdaiPutAttrBN(rocky_flintstone,"SURNAME",sdaiSTRING,"Flintstone");
sdaiPutAttrBN(rocky_flintstone,"FATHER",sdaiINSTANCE,fred_flintstone);
sdaiPutAttrBN(rocky_flintstone,"MOTHER",sdaiINSTANCE,wilma_flintstone);
sdaiPutAttrBN(rocky_flintstone,"FAMILY",sdaiINSTANCE,the_flintstones);
CHECK_ERR(_FILE,LINE_);
/-----------------------------------------------------/
/* POPULATE THE FLINTSTONE PETS */
/* ----------------------------------------------------*/
pets = sdaiCreateAggrBN(the_flintstones,"PETS");
sdaiAdd(pets,sdaiSTRING,"Dino");
sdaiAdd(pets,sdaiSTRING,"Hoppy");
sdaiAdd(pets,sdaiSTRING,"Gazoo");
CHECK_ERR(_FILE,LINE_);
/-----------------------------------------------------/
/* EXPORT MODEL TO STEP FILE */
/* ----------------------------------------------------*/
rstat = edmiWriteStepFile("DataRepository",NULL,MYMODEL,STEP_FILE,
NULL,NULL,EDM_IDENTIFIERS,8,
&nwarnings,&nerrors,&sdaiError);
if(rstat){
if(rstat != edmiESTEPWRITE){
CHECK_ERR(_FILE,LINE_);
} else {
printf("\n%d errors, %d warnings during export to:
%s",nerrors,nwarnings,STEP_FILE);
rstat = 0;
}
}
/-----------------------------------------------------/
/* LOOKUP Fred Flinstone */
/* ----------------------------------------------------*/
index = 0;
hits = 1;
rstat = edmiSelectInstancesBN(mymodel,"MAN","(GIVEN_NAME = 'Fred') AND
(SURNAME = 'Flintstone')",
0,sizeof(SdaiInstance),&index,&hits,&ff);
CHECK_ERR(_FILE,LINE_);
if(hits != 1){
printf("\nLookup failed. Should never happen!");
rstat = 1;
goto end;
}
sdaiGetAttrBN(ff,"FAMILY",sdaiINSTANCE,&family);
sdaiGetAttrBN(family,"NAME",sdaiSTRING,&family_name);
sdaiGetAttrBN(family,"ADRESS",sdaiSTRING,&adress);
CHECK_ERR(_FILE,LINE_);
printf("\nThe %s family lives in %s.",family_name,adress);
if(family_name) edmiFree(family_name);
if(adress) edmiFree(adress);
/-----------------------------------------------------/
/* GET FREDs WIFE AND THEIR COMMON CHILDREN */
/* ----------------------------------------------------*/
sdaiGetAttrBN(ff,"WIFE",sdaiINSTANCE,&wife);
sdaiGetAttrBN(wife,"GIVEN_NAME",sdaiSTRING,&given_name);
sdaiGetAttrBN(wife,"SURNAME",sdaiSTRING,&surname);
CHECK_ERR(_FILE,LINE_);
printf("\nFred Flinstone is married to %s %s.",given_name,surname);
if(given_name) edmiFree(given_name);
if(surname) edmiFree(surname);
printf("\nThey have the children: ");
sdaiGetAttrBN(ff,"CHILDREN",sdaiAGGR,&children);
number_of_children = sdaiGetMemberCount(children);
for(index = 0; index < number_of_children; ++index){
/* Using index to get element */
edmiGetAggrElement(children,index,sdaiINSTANCE,&child);
sdaiGetAttrBN(child,"MOTHER",sdaiINSTANCE,&mother);
if(mother == wife){
sdaiGetAttrBN(child,"GIVEN_NAME",sdaiSTRING,&given_name);
sdaiGetAttrBN(child,"SURNAME",sdaiSTRING,&surname);
printf("%s %s",given_name,surname);
if(index < (number_of_children-1)) printf(" and "); else printf(".");
if(given_name) edmiFree(given_name);
if(surname) edmiFree(surname);
}
}
CHECK_ERR(_FILE,LINE_);
/-----------------------------------------------------/
/* GET THE FLINTSTONE PETS */
/* ----------------------------------------------------*/
printf("\nThe Flintstones have the pets: ");
sdaiGetAttrBN(family,"PETS",sdaiAGGR,&the_pets);
number_of_pets = sdaiGetMemberCount(the_pets);
index = 0;
iter = sdaiCreateIterator(the_pets);
while(sdaiNext(iter)){
++index;
/* Using iterator to get element */
sdaiGetAggrByIterator(iter,sdaiSTRING,&pet_name);
printf("%s",pet_name);
if(index < (number_of_pets)) printf(" and "); else printf(".");
if(pet_name) edmiFree(pet_name);
}
sdaiDeleteIterator(iter);
CHECK_ERR(_FILE,LINE_);
goto end;
err:
/-------/
/* ERROR */
/* ------*/
printf("\nError at: %s,%d\nrstat= %d:
%s",casefile,caseline,rstat,edmiGetErrorText(rstat));
end:
/-----------------/
/* CLOSE DATABASE */
/* ----------------*/
edmiCloseDatabase("");
if(rstat){
printf("\nOOPS!(sad)\n");
} else {
printf("\nYabba-Dabba-Doo!\n");
}
#ifdef _WINDOWS
c = getchar();
#endif
}

  • No labels