objectARX说明函数(4)

2020-04-21 00:53

AcGePoint3d LinePt0, LinePt1; AcGePoint3d origin; AcGeVector3d xAxis, yAxis; double perimeter, area, prodInertia;

double momInertia[2], prinMoments[2], radiiGyration[2]; AcGePoint2d centroid; AcGeVector2d prinAxes[2];

AcGePoint2d extentsLow, extentsHigh; if (pPline->isClosed() != Adesk::kTrue) {

ads_printf(\折线不封闭, 无法形成正确的区域。\return FALSE; }

curveSegments.append((AcDbCurve *) pPline);

if (AcDbRegion::createFromCurves(curveSegments, regions) != Acad::eOk){ ads_printf(\创建临时区域对象失败!\

//清除Region, 应第9 贴的指点,即使createFromCurves错误,也应清除之; iCount = regions.length(); for(i = 0; i < iCount; i++)

delete (AcDbRegion *)regions.at(i); return FALSE; }

AcDbRegion * pRegion;

if ((iCount = regions.length()) == 0){ ads_printf(\创建临时区域对象为空!\return FALSE; }

if (iCount > 1){

// 多个 AcDbRegion , 无法确定应该返回哪一个,干脆返回NULL; ads_printf(\多个区域实体。\for(i = 0; i < iCount; i++)

delete (AcDbRegion *)regions.at(i); return FALSE; }

pRegion = (AcDbRegion *) regions.at(0); origin.set(0,0,0); //设置原点坐标

xAxis.set(1,0,0); //设置X Y轴, yAxis.set(0,1,0);

if (pRegion->getAreaProp( origin, xAxis, yAxis,

perimeter, area, centroid, momInertia, prodInertia, prinMoments, prinAxes, radiiGyration, extentsLow, extentsHigh) != Acad::eOk ){

ads_printf(\区域面积: %.3f, 周长:%.3f\ads_printf(\获取区域对象属性失败!\delete pRegion; return FALSE; }

XYZ_POINT(CenPt, centroid.x, centroid.y, 0); //得到形心坐标 ads_printf(\区域面积: %.3f, 周长:%.3f\pRegion->close(); delete pRegion; return TRUE; }

AcDbObjectId CreateHatch( AcDbObjectId dbOId, char cLayer[],

char cPattern[] = \ int nColor = 256, double dAngle = 0.0, double dScale = 1.0,

AcDbDatabase * pDbDatab = acdbHostApplicationServices()->workingDatabase()) {

AcCmColor CmC; AcDbObjectId DbOId;

AcDbObjectIdArray DbOIdA(0, 2); AcDbBlockTable * pDbBT; AcDbBlockTableRecord * pDbBTR; AcGeVector3d normal(0.0, 0.0, 1.0);

DbOIdA.append(dbOId);

AcDbHatch* pDbHat = new AcDbHatch();

pDbHat->setDatabaseDefaults();

pDbHat->setAssociative(Adesk::kTrue); // BUG: doesn't do squat! have to set the reactor yourself to get associativity!

pDbHat->appendLoop(AcDbHatch::kExternal, DbOIdA);

pDbHat->setPatternScale(dScale);

pDbHat->setPatternAngle(dAngle);

pDbHat->setPattern(AcDbHatch::kPreDefined, cPattern);

pDbHat->setNormal(normal);

pDbHat->evaluateHatch(); // crucial call or nothing gets displayed!

pDbDatab->getSymbolTable(pDbBT, AcDb::kForRead);

pDbBT->getAt(ACDB_MODEL_SPACE, pDbBTR, AcDb::kForWrite);

pDbBTR->appendAcDbEntity(DbOId, pDbHat);

pDbHat->setLayer(cLayer);

CmC.setColorIndex(nColor);

((AcDbEntity *)pDbHat)->setColor(CmC);

pDbBT->close();

pDbBTR->close();

pDbHat->close();

return DbOId;

}

objectARX 常用功能实现集合

一 在ARX中禁用AutoCAD的某个命令

以LINE命令为例,在程序中加入下面的一句即可禁用LINE命令: acedCommand(RTSTR, \下面的语句则可恢复LINE命令的定义:

acedCommand(RTSTR, \

二 在对话框中预览DWG文件

使用acdbDisplayPreviewFromDwg函数,具体的方法为: char fileName[100];

strcpy(fileName, \bool es; HWND pWnd;

CFrameWnd *pFrame = (CFrameWnd*)GetDlgItem(IDC_PICTURE); es = acdbDisplayPreviewFromDwg(fileName, pFrame->m_hWnd); 上面的代码将在一个Picture控件中显示指定的图形。 另外,需要包含“dbmain.h”头文件。

三 通过ARX更改AutoCAD窗口的标题名称 CMDIFrameWnd *pp; pp=acedGetAcadFrame();

pp->SetWindowText (\pp->UpdateWindow ();

四 获得当前数据库

在ARX编程中,经常需要使用当前数据库,例如需要获得当前图形中设置的文字样式、标注样式等。 要获得当前数据库,都可以直接使用下面的方法: AcDbTextStyleTable *pTextStyleTAble; AcDbObjectId textstyleId;

textstyleId=acdbHostApplicationServices()->workingDatabase()->textstyle();

如果用acadCurDwg来代替acdbHostApplicationServices()->workingDatabase(),也能得到同样的结果。

五 将一个图插入另一个图(两种方法)

在实践中常常要将外部的图形文件source.dwg中插入到另外一个图形中或者当前图形中.以插入到当前图形dest.dwg为例.

为了将一个source.dwg插入dest.dwg中,首先要找到source.dwg这个文件. 我们可以使用各种基本的技术和相应的规则从你的机器上或PDM数据库中检索到你要插入的source.dwg, 返回来一个字符窜sFileName代表整个文件及其路径.

然后创建一个空的数据库pNewDb读入source.dwg.

AcDbDatabase *pNewDb =new AcDbDatabase(Adesk::kFalse); //在这里一定要用Adesk::kFalse

acDocManager->lockDocument(acDocManager->curDocument()) ;//如果确定你不需要LockDocument, 这一行可以不要

es=pNewDb->readDwgFile(sFileName , _SH_DENYNO,false); if (es!=Acad::eOk) {

acutPrintf(\return; }

这样,source.dwg以经用pNewDb来表示了. 我们用pDb来表示当前数据库 AcDbDatabase *pDb;

pDb =acdbHostApplicationServices ()->workingDatabase () ;

现在,我们用Insert来插入数据库. Insert有两种用法,一种是直接insert, source.dwg中的图元实体被分散地插入pDb中

pDb->insert( AcGeMatrix3d::kIdentity, pNewDb );//这里假定不对source.dwg做比例和转角的变换. 如果我们在这里结束程序,我们能看到source.dwg已经被插入,但不是一个图块.

另外一种插入法是要求插入后source.dwg成为一个图块,图块的attribute也要从source.dwg中得到.这种方法要做大量的工作.首先运行insert() CString pBlockName=”TestBlock”; AcDbObjectId blockId;

if((es=pDb->insert(blockId, pBlockName,pNewDb, true))==Acad::eOk) {

acutPrintf(\} else {

AfxMessageBox(\


objectARX说明函数(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:(道歉信)给女友的感人道歉信范文3篇

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: