在 CATDrawing文档中创建框架和标题块
如何创建图形几何和注释
摘要
This article discusses the CAADrwTitleBlock use case. This use case explains how to read a CATDrawing document, get the sheet background view, and create geometry and annotations in it.
- 您将使用此用例学习什么
- CAADrwTitleBlock 用例
- CAADrwTitleBlock能做什么
- 如何启动CAADrwTitleBlock
- 在哪找到CAADrwTitleBlock代码
- 步骤
- 总之
- 参考
您将使用此用例学习什么
此用例旨在向您展示如何浏览图纸和视图,以及如何获取和使用几何和注释工厂。
CAADrwTitleBlock 用例
CAADrwTitleBlock 是http://CAADraftingInterfaces.edu框架的一个用例,它说明了DraftingInterfaces框架功能。
CAADrwTitleBlock 能做什么
图1:初始文档
![92d3ebd5a3f2d2e6084a2d029361afd6.png](https://i-blog.csdnimg.cn/blog_migrate/bc35df9f480877cf20625e226b7c225f.png)
图 1 表示将添加标题块的CATDrawing文档。此文档未随用例一起提供。
图 2 使用案例修改的文档
![2e1062f5bffcd810394e9415354d0e56.png](https://i-blog.csdnimg.cn/blog_migrate/e2be26034a7b24cd7c8a3dd5e8e22240.png)
图 2 表示由用例程序修改的 CATDrawing文档。它首先创建一个基本的绘图结构,由绘图、图纸和两个叠加视图组成。
这两种视图是:
1. 包含直接在工作表中创建的元素的主视图
2. 背景视图,专用于框架和标题块。
这两个视图是工作表的一部分。因此,它们不能被删除,并且它们不显示在图形中。然后,程序获取背景视图,并使用 2D 线条和右下角的文本创建框架。
如何启动CAADrwTitleBlock
要启动 CAADrwTitleBlock,您需要设置构建时间环境,然后编译 CAADrwTitleBlock 及其先决条件,设置运行时环境,然后执行用例 [1]。
启动用例时,将要将创建的文档存储为参数的文件的完整路径名。
- 在Windows中
e:> mkrun -c cmd
CAADrwTitleBlock c:DrawingTest.CATDrawing c:DrawingTestwithtitleblocks.CATDrawing
- 在UNIX中
$ mkrun -c cmd
CAADrwTitleBlock /u/users/DrawingTest.CATDrawing /u/users/DrawingTestwithtitleblocks.CATDrawing
在哪找到CAADrwTitleBlock代码
CAADrwTitleBlock 用例由一个名为 CAADrwTitleBlock.cpp 的单一源文件组成,该文件位于http://CAADraftingInterfaces.edu框架的 CAADrwTitleBlock.m 模块中:
Windows
InstallRootDirectoryhttp://CAADraftingInterfaces.eduCAADrwTitleBlock.m
Unix
InstallRootDirectory/http://CAADraftingInterfaces.edu/CAADrwTitleBlock.m/
其中InstallRootDirectory 是安装 CAA CD-ROM 的目录。
步骤
CAADRWTitleBlock 中有六个步骤:
1. 创建和初始化文档
2. 访问文档中的绘图
3. 在绘图和图纸中导航以获取背景视图
4. 获取几何工厂并创建框架 2D 线
5. 获取注释工厂并创建标题块文本
6. 保存文档和退出
创建和初始化文档
int main(int iArgc, // 参数数 (1)
char** iArgv) // 到新建*.CATDrawing文档的路径
{
// 检查参数
if(3 != iArgc) return 1;
const char *fileName = iArgv[1];
const char *fileNameOut = iArgv[2];
// 创建会话
// ==================
CATSession *pSampleSession = NULL;
HRESULT hr = ::Create_Session("SampleSession",pSampleSession);
if (FAILED(hr)) return 1;
...
本节表示创建 CATIA 文档 [2] 的常用顺序。
访问文档中的绘图
...
CATDocument* pDoc = NULL;
if (!SUCCEEDED(CATDocumentServices::OpenDocument(fileName, pDoc)))
{
// 结束会话
::Delete_Session("SampleSession");
return 2;
}
// 使用 CATIDftDocumentServices接口获取绘图功能
CATIDrawing *piDrawing = NULL;
CATIDftDocumentServices *piDftDocServices = NULL;
if (SUCCEEDED(pDoc->QueryInterface(IID_CATIDftDocumentServices, (void **)&piDftDocServices)))
{
piDftDocServices->GetDrawing(IID_CATIDrawing, (void **)&piDrawing);
piDftDocServices->Release();
}
if (NULL == piDrawing)
return 1;
...
绘图文档的根特征是绘图,即实现CATIDrawing接口的功能。我们可以使用由文档实现的CATIDftDocumentServices接口获得指向 CATIDrawing 的指针。GetDrawing 方法的第一个参数是 CATIDrawing 接口 IID。
在绘图和图纸中导航以获取背景视图
...
// 我们可以得到当前工作表
CATISheet_var spSheet = piDrawing->GetCurrentSheet();
// 和工作表背景视图
CATIView_var spBgView = spSheet->GetBackgroundView();
//内存清理
piDrawing->Release();
...
图形可能包含多张图纸,但一次只能有一张是最新的。当前工作表是包含活动视图的工作表,即当前编辑的视图。CATISheet 和 CATIView 接口的方法确实返回处理程序,因此我们不需要关心释放它们。绘图变量是指向 CATIDrawing的指针,因此我们必须在不再使用它时释放它。
获取几何工厂并创建框架 2D 线
...
//几何图形创建
// =================
// 现在,我们可以在 以下视图中创建几何体:
// - 将视图设置为当前视图
// - 获取视图几何工厂接口
spSheet->SetCurrentView(spBgView);
CATI2DWFFactory_var spGeomFactory = spBgView;
double X[8] = { 936.0, 949.0, 963.0, 1010.0, 1062.0, 1093.0, 1157.0, 1176.0};
double Z[11] ={ 17.0, 22.0, 35.0, 48.0, 53.0, 58.0, 63.0, 68.0, 73.0, 78.0, 88.0};
double PtTmp[6];
double startPoint[2], endPoint[2];
// 创建水平线
PtTmp[0]=Z[0];
PtTmp[1]=Z[1];
PtTmp[2]=Z[3];
PtTmp[3]=Z[5];
PtTmp[4]=Z[7];
PtTmp[5]=Z[10];
for (int i= 0;i < 6; i++)
{
startPoint[0] = X[0];
startPoint[1] = PtTmp[i];
endPoint[0] = X[7];
endPoint[1] = PtTmp[i];
spGeomFactory->CreateLine(startPoint, endPoint);
}
startPoint[0] = X[3];
startPoint[1] = Z[2];
endPoint[0] = X[7];
endPoint[1] = Z[2];
spGeomFactory->CreateLine(startPoint, endPoint);
startPoint[0] = X[0];
startPoint[1] = Z[9];
endPoint[0] = X[5];
endPoint[1] = Z[9];
spGeomFactory->CreateLine(startPoint, endPoint);
PtTmp[0]=Z[4];
PtTmp[1]=Z[6];
PtTmp[2]=Z[8];
for (i= 0;i < 3; i++)
{
startPoint[0] = X[3];
startPoint[1] = PtTmp[i];
endPoint[0] = X[5];
endPoint[1] = PtTmp[i];
spGeomFactory->CreateLine(startPoint, endPoint);
}
// 创建垂直线
PtTmp[0]=X[0];
PtTmp[1]=X[7];
for (i= 0;i < 2; i++)
{
startPoint[0] = PtTmp[i];
startPoint[1] = Z[0];
endPoint[0] = PtTmp[i];
endPoint[1] = Z[10];
spGeomFactory->CreateLine(startPoint, endPoint);
}
startPoint[0] = X[3];
startPoint[1] = Z[1];
endPoint[0] = X[3];
endPoint[1] = Z[10];
spGeomFactory->CreateLine(startPoint, endPoint);
startPoint[0] = X[5];
startPoint[1] = Z[3];
endPoint[0] = X[5];
endPoint[1] = Z[10];
spGeomFactory->CreateLine(startPoint, endPoint);
PtTmp[0]=X[4];
PtTmp[1]=X[6];
for (i= 0;i < 2; i++)
{
startPoint[0] = PtTmp[i];
startPoint[1] = Z[1];
endPoint[0] = PtTmp[i];
endPoint[1] = Z[2];
spGeomFactory->CreateLine(startPoint, endPoint);
}
startPoint[0] = X[1];
startPoint[1] = Z[5];
endPoint[0] = X[1];
endPoint[1] = Z[7];
spGeomFactory->CreateLine(startPoint, endPoint);
startPoint[0] = X[2];
startPoint[1] = Z[5];
endPoint[0] = X[2];
endPoint[1] = Z[9];
spGeomFactory->CreateLine(startPoint, endPoint);
// 投影模式符号的线条和圆圈创建。
double X1[3] = { 941.0, 949.0, 955.0};
double Z1[5] ={ 70.0, 71.0, 73.0, 75.0, 76.0};
startPoint[0] = X1[0];
startPoint[1] = Z1[1];
endPoint[0] = X1[0];
endPoint[1] = Z1[3];
spGeomFactory->CreateLine(startPoint, endPoint);
startPoint[0] = X1[0];
startPoint[1] = Z1[3];
endPoint[0] = X1[1];
endPoint[1] = Z1[4];
CATISpecObject_var Line1 = spGeomFactory->CreateLine(startPoint, endPoint);
startPoint[0] = X1[1];
startPoint[1] = Z1[4];
endPoint[0] = X1[1];
endPoint[1] = Z1[0];
spGeomFactory->CreateLine(startPoint, endPoint);
startPoint[0] = X1[1];
startPoint[1] = Z1[0];
endPoint[0] = X1[0];
endPoint[1] = Z1[1];
CATISpecObject_var Line2 = spGeomFactory->CreateLine(startPoint, endPoint);
// 创建两个同心圆:
double center[2];
center[0]=X1[2];
center[1]=Z1[2];
double radius = 3.0;
CATISpecObject_var Cercle1 = spGeomFactory->CreateCircle(center,radius);
radius = 2.0;
spGeomFactory->CreateCircle(center,radius);
...
在使用工厂之前,您必须使视图成为最新的视图。该视图实现了CATI2DWFFactory 2D 几何工厂接口。 它是草图绘制器工厂,因此,您可以使用相同的方法在零件中创建轮廓或在工程视图中创建 2D 几何对象。
获取注释工厂和创建装扮(文本、轴线和中心线)
...
//换装创建
// ================
// 获取视图注释工厂
CATIDrwAnnotationFactory_var spAnnFactory = spBgView;
//文本创建
CATIDftText *piDftText = NULL;
const double txtpos1[2] = {1013.,45.};
if (SUCCEEDED(spAnnFactory->CreateDftText(txtpos1,&piDftText)))
{
//设置字符串
CATUnicodeString textString("TITLE BLOCK PERFORMED BY CAA2 APPLICATION");
wchar_t *ptxtChar = new wchar_t[textString.GetLengthInChar()+1];
textString.ConvertToWChar(ptxtChar);
piDftText->SetString(ptxtChar);
delete [] ptxtChar;
ptxtChar = NULL;
// 修改文本属性:设置粗体和斜体
CATIDftTextProperties *piDftTextProp = NULL;
if (SUCCEEDED(piDftText->GetTextProperties(&piDftTextProp)))
{
piDftTextProp->SetBold(TRUE);
piDftTextProp->SetItalic(TRUE);
piDftTextProp->Release();piDftTextProp=NULL;
}
piDftText->Release();piDftText=NULL;
}
const double txtpos2[2] = {940., 40.};
if (SUCCEEDED(spAnnFactory->CreateDftText(txtpos2,&piDftText)))
{
//设置字符串
CATUnicodeString textString("DASSAULT nSYSTEMES");
wchar_t *ptxtChar = new wchar_t[textString.GetLengthInChar()+1];
textString.ConvertToWChar(ptxtChar);
piDftText->SetString(ptxtChar);
delete [] ptxtChar;
ptxtChar = NULL;
CATIDftTextProperties *piDftTextProp = NULL;
// 修改文本属性:设置粗体和斜体
if (SUCCEEDED(piDftText->GetTextProperties(&piDftTextProp)))
{
piDftTextProp->SetBold(TRUE);
piDftTextProp->SetItalic(TRUE);
piDftTextProp->Release();piDftTextProp=NULL;
}
piDftText->Release();piDftText=NULL;
}
const double txtpos3[2] = {940., 54.};
if (SUCCEEDED(spAnnFactory->CreateDftText(txtpos3,&piDftText)))
{
//设置字符串
CATUnicodeString textString("Date : 07 - 31 - 2000");
wchar_t *ptxtChar = new wchar_t[textString.GetLengthInChar()+1];
textString.ConvertToWChar(ptxtChar);
piDftText->SetString(ptxtChar);
delete [] ptxtChar;
ptxtChar = NULL;
// 修改文本属性:设置粗体和斜体
CATIDftTextProperties *piDftTextProp = NULL;
if (SUCCEEDED(piDftText->GetTextProperties(&piDftTextProp)))
{
piDftTextProp->SetBold(TRUE);
piDftTextProp->SetItalic(TRUE);
CATIDrwSubString *piDrwSubString = NULL;
if (SUCCEEDED(piDftText->QueryInterface(IID_CATIDrwSubString,(void **)&piDrwSubString)))
{
// 选择要修改的子字符串。
piDrwSubString->SetSelection(1,21);
piDftTextProp->SetFontSize(3.5);
piDrwSubString->Release();piDrwSubString=NULL;
}
piDftTextProp->Release();piDftTextProp=NULL;
}
piDftText->Release();piDftText=NULL;
}
// 轴线和中心线创建
CATIDrwAxisLine_var axisline = spAnnFactory->CreateDrwAxisLine(Line1,Line2);
CATIDrwCenterLine_var centerline = spAnnFactory->CreateDrwCenterLine(Cercle1);
...
CATIDrwAnnotationFactory 注释工厂由视图实现,因此在 CreateDrwText 中传递的坐标是视图坐标。CATIDrwTextProperties 接口允许修改文本属性,例如使用 SetBold 方法使用粗体字体设置文本。
保存文档和退出
...
// 保存结果
rc = CATDocumentServices::SaveAs(*pDoc, (char *)fileName);
... // 检查rc
rc = CATDocumentServices::Remove (*pDoc);
... // 检查 rc
//结束会话并删除文档
rc = ::Delete_Session("SampleSession");
... // 检查 rc
return 0;
}
本节表示保存新创建的 CATIA 文档 [2] 的常用顺序。
总之
此用例显示创建CATDrawing文档以及在当前工作表背景视图中创建框架和标题块时使用的对象和接口。CATIDrawing接口由绘图根对象实现。指向此接口的指针是输入和导航图形结构的关键,可以使用文档实现的 CATIDftDocumentServices 接口的 GetDrawing 方法检索。由于 CATIDrawing 接口的 GetCurrentSheet 方法,首先通过检索当前工作表来检索背景视图,然后使用 CATISheet 的 GetBackgroundView询问当前工作表。此背景视图使用 CATISheet 的 SetCurrentView 方法成为当前视图,并且由于 CreateLine 方法,将检索视图实现的 CATI2DWFFactory 接口处理程序以创建框架线。该视图还实现了 CATIDrwAnnotationFactory 接口,标题块是使用其 CreateDrwText 方法创建的,并使用 SetBold 方法使用粗体字体进行设置。
参考
[1]
构建和启动CAA V5样例
[2]
创新文件