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(\