DRX

Works with Bricscad (Windows) Classic, Pro and Platinum, Bricscad (Linux) Classic and Pro.


Terminology

DwgDirect: A library provided by the Open Design Aliance (www.opendesign.com), to read and write DWG files, generate graphic display objects of DWG entities, fire database related reactors, etc... Since version V8, Bricscad is based on this library. The full library is only available for ODA founding members, such as the Bricsys company.

DRX SDK: A free C++ SDK, consisting of the headers and libs of the DwgDirect library, and provided by the Open Design Aliance. The DwgDirect runtime dlls are not included in this SDK. Those are installed with the Bricscad product.This SDK can be downloaded freely on the public section of the ODA website (www.opendesign.com)

DRX applications

Since Bricscad V8 (or higher) is based on the DwgDirect libraries, DRX modules compiled with the DRX SDK can be loaded to run in Bricscad. Typically, such modules have the extension ".drx".

However, if you would consider to work with the DRX SDK, please read the following sections carefully. This documentation is intended to help you make the best decision for your application strategy, in particular the choice of API.

DRX and ARX compared: similarities and differences

There is some confusion in the market today, about how exactly DRX and DwgDirect relate to ObjectARX. In this section, we hope to give you a clear view on this subject.

At first sight, the DRX classes, methods and functions look very similar to the ones found in ObjectARX. If you look at the help files or headers delivered with the DRX SDK, you will recognize a lot of things when you have some experience in ARX development.

However, there are a number of fundamental differences that can be summarized as followed:

To illustrate this, please compare following code samples. The objective of the sample is simple: add a new line entity to the active drawing.

How it's done in ARX:
How it's done in DRX:

Note: The differences with the corresponding ARX code are added as comments in the code.

void createLine()
{
//1. message to command line
acutPrintf(ACRX_T("\nCreating a new line entity..."));

//difference: command function needs command context argument.
void createLine(OdEdCommandContext* pCmdCtx)
{
try
{
//1. message to command line
//difference: requires a command context and OdEdUserIO instance.
OdEdUserIO* pUserIO = pCmdCtx->userIO();
pUserIO->putString(_T("\nCreating a new line entity..."));

//2. get active database
AcDbHostApplicationServices* pServices = acdbHostApplicationServices();
AcDbDatabase* pDb = pServices->workingDatabase();

//2. get active database
//difference: the active database is provided through the command context.
OdDbCommandContextPtr dbCmdCtx = OdDbCommandContext::cast(pCmdCtx);
OdDbDatabase* pDb = dbCmdCtx->database();

//3. get model space BTR
AcDbBlockTable* pBlockTable = NULL;
pDb->getSymbolTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord* pBlockTableRecord = NULL;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
pBlockTable->close();

//3. get model space BTR
//difference: the modelspace BTR is provided through its object ID.
OdDbObjectId modelSpaceId = pDb->getModelSpaceId();
//difference: entities are opened by calling a method on the object ID.
OdDbBlockTableRecordPtr modelSpace = modelSpaceId.safeOpenObject(OdDb::kForWrite);

//4. create new line entity
AcDbObjectId lineId;
AcGePoint3d ptStart(0.0, 0.0, 0.0);
AcGePoint3d ptEnd(10.0, 10.0, 0.0);
AcDbLine* pLine = new AcDbLine(ptStart, ptEnd);

//4. create new line entity
OdDbObjectId lineId;
//difference: you can not call the constructor of OdDbLine, you need to call the OdRxClass::create function to construct objects.
OdDbLinePtr odLine = OdDbLine::desc()->create();
//difference: you can only set the start and end point of the line, after it has been created. There are no argument constructors.
odLine->setStartPoint(OdGePoint3d(0.0,0.0,0.0));
odLine->setEndPoint(OdGePoint3d(10.0,10.0,0.0));

//5. append entity to model space
pBlockTableRecord->appendAcDbEntity(lineId, pLine);

//5. append entity to model space
//difference: the object ID of the line is returned, not passed as an argument.
lineId = modelSpace->appendOdDbEntity(odLine.get());

//6. close all objects
pBlockTableRecord->close();
pLine->close();
}

//6. close all objects
//difference: in DRX there are no calls here, all objects are smart pointers so they don't need to be closed explicitly
}
catch (...)
{
//difference: exception based error handling. For the clarity of the sample, error handling has been minimized.
OutputDebugString(_T("\nDwgDirect exception"));
}
}

Conclusion: even for a simple operation, such as adding a line to a drawing, there are differences in nearly each line of code, which can not be worked around. As a consequence, maintaining an ARX and DRX version of your application, will require two separate sets of source code !

The better alternative: BRX

To overcome the differences explained above, Bricsys has developed another C++ API that is fully code compatible with ObjectARX. This API is called "BRX", the Bricscad Runtime eXtension.

We strongly recommend to use this API for C++ client applications. The advantages compared to DRX can be of major influence for reducing the time and resources spent to bring your application to the Bricscad platform:

For more information, please check the BRX section of this developer reference. In case you do prefer to work with the DRX SDK, please find some important information listed in the following paragraphs.

Compatibility between Bricscad and the DRX SDK

Bricsys is a founding member of the Open Design Alliance (ODA), and therefore has access to all the source code of the DwgDirect libraries. In order to bring Bricscad to the level of high quality CAD platform it represents today, some parts of the DwgDirect libraries were rewritten or extended by Bricsys, for different purposes:

In all of this, it was not possible to keep the DwgDirect runtime libraries that are installed with Bricscad 100% binary compatible with the DRX SDK as provided by the ODA. The most affected categories are OdGi, OdGs, and advanced OdGe. However, a major part of the DwgDirect libraries are kept binary compatible, in particular those categories required for basic functionality:

Downloading the DRX SDK

The DRX SDK can be downloaded freely at the public section of the ODA website, (www.opendesign.com). Different versions of the DRX SDK are presented there. It's important that you select the version that matches the version of the DwgDirect libaries installed with Bricscad. The recent release versions of Bricscad are based on DwgDirect 2.06.

Tip: the version number of the DwgDirect runtime dlls that are installed with Bricscad, can be seen in the names of those dlls. By looking into the Bricscad install folder, you will find dll's such as DD_Root_2.06_8, DD_Db_2.06_8.dll, DD_Ge_2.06_8.dll, ... In this naming, "2.06" indicates the DwgDirect version, suffix "_8" indicates that the dll's were built with VC8 (Visual Studio 2005).

Manual

A detailed manual and reference guide is included in the DRX SDK.

Samples

Some sample DRX modules are included in the DRX SDK.

Extensions useful for DRX and SDS applications

In the API folder that is installed with Bricscad, you can find some header files that contain useful extensions to the DRX interfaces. As explained above, these are mainly extensions required to provide access to some important functions of the editor environment of the CAD platform:

DRX project configuration

Some required Visual Studio project settings for DRX modules:


© Menhirs NV. All rights reserved.