ObjectARX代码片段二

 

转载自网络

一  在ARX中禁用AutoCAD的某个命令
 以LINE命令为例,在程序中加入下面的一句即可禁用LINE命令:

acedCommand(RTSTR, "undefine", RTSTR, "line", RTNONE);

下面的语句则可恢复LINE命令的定义:

acedCommand(RTSTR, "redefine", RTSTR, "line", RTNONE);

二 在对话框中预览DWG文件

//使用acdbDisplayPreviewFromDwg函数,具体的方法为:
char fileName[100];
strcpy(fileName, "C:\\test.dwg");
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 ("yourName");
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("\nThe file %s cannot be opend",sFileName);
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("\ninsert ok\n");
}
else
{
AfxMessageBox("Insert failed");
delete pNewDb;
return;
} //这里blcokId是insert运行后产生的,它代表的是一个块表记录AcDbBlockRecord的ID. pBlockName是记录名,要在insert运行前设定其值.

如果我们在这里结束程序,我们看不到任何东西,因为source并没有真正被插入.我们还要做一些事,首先是创建一个AcDbBlockReference, 并将它指向blockId所代表的AcDbBlockRecord, 然后将这个AcDbBlockReference加入pDb所代表的图形数据库中.

AcDbBlockReference *pBlkRef = new AcDbBlockReference;
pBlkRef->setBlockTableRecord(blockId);//指向blockId;
pBlkRef->setPosition(Pt);//设定位置
pBlkRef->setRotation(Angle);//设定转角
pBlkRef->setScaleFactors( XrefScale);//设定放大比例 AcDbBlockTable *pBlockTable;
pDb->getSymbolTable(pBlockTable, AcDb::kForRead); AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
pBlockTable->close();
AcDbObjectId newEntId;
pBlockTableRecord->appendAcDbEntity(newEntId, pBlkRef);
pBlockTableRecord->close();

如果我们在这里结束程序,我们将看到当前图形中source.dwg已经被作为图块插入.但是图块中没有source.dwg所定义的Attibute. 因此我们还要做工作.后面的事情就简单了.

AcDbBlockTableRecord *pBlockDef;
acdbOpenObject(pBlockDef, blockId, AcDb::kForRead); AcDbBlockTableRecordIterator *pIterator;
pBlockDef->newIterator(pIterator);
AcGePoint3d basePoint;
AcDbEntity *pEnt;
AcDbAttributeDefinition *pAttdef;
for (pIterator->start(); !pIterator->done();
pIterator->step())//将source.dwg中所有的Attibute进行遍历
{
pIterator->getEntity(pEnt, AcDb::kForRead);
pAttdef = AcDbAttributeDefinition::cast(pEnt);
if (pAttdef != NULL && !pAttdef->isConstant()) {
AcDbAttribute *pAtt = new AcDbAttribute();
pAtt->setPropertiesFrom(pAttdef);
pAtt->setInvisible(pAttdef->isInvisible());
basePoint = pAttdef->position();
basePoint += pBlkRef->position().asVector();
pAtt->setPosition(basePoint);
pAtt->setHeight(pAttdef->height());
pAtt->setRotation(pAttdef->rotation());
pAtt->setTag("Tag");
pAtt->setFieldLength(25);
char *pStr = pAttdef->tag();
pAtt->setTag(pStr);
acutDelString(pStr);
pAtt->setFieldLength(pAttdef->fieldLength());
pAtt->setTextString("-"); AcDbObjectId attId; pBlkRef->appendAttribute(attId, pAtt);
pAtt->close();
}
pEnt->close(); // use pEnt... pAttdef might be NULL
}
delete pIterator;

六 在ARX打开文件
在AutoCAD中打开图形,并且显示在图形窗口中,可以使用acedSyncFileOpen()函数。需要注意的是,这个函数只能在单文档模式中工作,

用户可以在AutoCAD“选项”对话框的“系统”选项卡中进行设置,或者在主函数中添加下面的语句:

acrxDynamicLinker->registerAppNotMDIAware(pkt);

具体的函数如下:

//加载模板文件
void LoadTemplate()
{
char fname[50];
strcpy(fname,"E:\\TMCAD\\TMCADtukuang\\A3.DWG"); #ifndef _ACAD2000
Acad::ErrorStatuses;
es = acedSyncFileOpen(fname);
#else
acDocManager->appContextOpenDocument(fname);
#endif
}

如果在多文档模式下,下面的方法可以在执行时弹出“选择文件”对话框,用户选择所要打开的文件后,在图形窗口中显示该图形。

void ZffOPENOpenDwg()
{
// 使用“选择文件”对话框选择所要打开的文件
acDocManager->openDocument();
}

下面的方法则打开指定位置的DWG文件。

void OpenDoc( void *pData)
{
AcApDocument* pDoc = acDocManager->curDocument();
if (acDocManager->isApplicationContext())
{
acDocManager->appContextOpenDocument((const char *)pData);
}
else
{
acutPrintf("\nERROR To Open Doc!\n");
}
}
// This is command 'OPEN1'
void ZffOPENopen1()
{
// 直接打开系统中存在的某个图形文件G:\AutoCAD图形\wen2.dwg
static char pData[] = "G:\\AutoCAD图形\\wen2.dwg";
acDocManager->executeInApplicationContext(OpenDoc, (void *)pData);
}

设置当前的layer和textstyle

//  Function name    : SetCurTextStyle
// Description : 设置当前TextStyle
// Return type : Acad::ErrorStatus
// Argument : const char* lpStyleName
// Argument : AcDbDatabase* pDb/* = NULL */
Acad::ErrorStatus SetCurTextStyle( const char * lpStyleName, AcDbDatabase * pDb /**/ /* = NULL */ )
{
AcDbDatabase * pCurDb = pDb;
if (pCurDb == NULL)
pCurDb = acdbHostApplicationServices() -> workingDatabase(); AcDbTextStyleTableRecordPointer spRecord(lpStyleName, pCurDb, AcDb::kForRead);
Acad::ErrorStatus es = spRecord.openStatus();
if (es == Acad::eOk)
{
es = pCurDb -> setTextstyle(spRecord -> objectId());
}
return es;
}
//  Function name    : SetCurLayer
// Description : 设置当前层
// Return type : Acad::ErrorStatus
// Argument : const char* lpLayerName
// Argument : AcDbDatabase* pDb/* = NULL */
Acad::ErrorStatus SetCurLayer( const char * lpLayerName, AcDbDatabase * pDb /**/ /* = NULL */ )
{
AcDbDatabase * pCurDb = pDb;
if (pCurDb == NULL)
pCurDb = acdbHostApplicationServices() -> workingDatabase(); AcDbLayerTableRecordPointer spRecord(lpLayerName, pCurDb, AcDb::kForRead);
Acad::ErrorStatus es = spRecord.openStatus();
if (es == Acad::eOk)
{
es = pCurDb -> setClayer(spRecord -> objectId());
}
return es;
}
 1 //功能描述:选择指定图层上的所有实体!
2
3 // ************************************************************************
4 // 函数名称:selectEntityInLayer
5 // 函数类型:Acad::ErrorStatus
6 // 返回值: 正常:Acad::eOk
7 // 功能描述:选择指定图层上的所有实体!
8 // 函数作者:Darcy
9 // 创建日期:200X-XX-XX
10 // 参数列表:
11 // 变量名:nLayerName 变量类型:const char* 变量说明:(输入)图层名
12 // 变量名:nIDs 变量类型:AcDbObjectIdArray& 变量说明:(输出)图层中实体的对象标识符集合
13 // ************************************************************************
14 Acad::ErrorStatus selectEntityInLayer( const char * nLayerName,AcDbObjectIdArray & nIDs)
15 {
16 Acad::ErrorStatus es = Acad::eOk;
17
18 ads_name ents;
19 struct resbuf * rb;
20 rb = acutNewRb(AcDb::kDxfLayerName);
21 rb -> restype = 8 ;
22 rb -> resval.rstring = ( char * )nLayerName;
23 rb -> rbnext = NULL;
24 acedSSGet( " X " ,NULL,NULL,rb,ents);
25 long entNums = 0 ;
26 acedSSLength(ents, & entNums);
27 if (entNums == 0 )
28 es = Acad::eInvalidInput;
29 else
30 {
31 for ( long a = 0 ; a < entNums ; a ++ )
32 {
33 AcDbObjectId objId;
34 ads_name ent;
35 acedSSName(ents,a,ent);
36 acdbGetObjectId(objId, ent);
37 nIDs.append(objId);
38 }
39 }
40 acedSSFree(ents);
41 acutRelRb(rb);
42
43 return es;
44 }

另一种实现

 1 //************************************************************************
2 //函数名称:selectEntityInLayer
3 //函数类型:Acad::ErrorStatus
4 //返回值:
5 //功能描述:选择指定层上的实体,得到其对象属性标识符!
6 //函数作者:Darcy
7 //创建日期:200X-XX-XX
8 //参数列表:
9 //变量名:nLayerName 变量类型:CString 变量说明:
10 //变量名:nIDs 变量类型:AcDbObjectIdArray& 变量说明:
11 //变量名:nModelSpace 变量类型:bool 变量说明:
12 //************************************************************************
13 Acad::ErrorStatus selectEntityInLayer(
14 CString nLayerName,
15 AcDbObjectIdArray& nIDs,
16 bool nModelSpace
17 )
18 {
19 Acad::ErrorStatus es=Acad::eOk;
20
21 AcDbBlockTable* pBlockTable=NULL;
22 AcDbBlockTableRecord* pSpaceRecord=NULL;
23 if (acdbHostApplicationServices()->workingDatabase()==NULL)
24 return Acad::eNoDatabase;
25 if ((es = acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead))==Acad::eOk)
26 {
27 char entryName[13];
28 if (nModelSpace)
29 strcpy(entryName,ACDB_MODEL_SPACE);
30 else
31 strcpy(entryName,ACDB_PAPER_SPACE);
32 //Get the Model or Paper Space record and open it for read:
33 if ((es = pBlockTable->getAt((const char*)entryName, pSpaceRecord, AcDb::kForRead))==Acad::eOk)
34 {
35 AcDbBlockTableRecordIterator* pIter;
36 if (pSpaceRecord->newIterator(pIter)==Acad::eOk)
37 {
38 for (pIter->start();!pIter->done();pIter->step())
39 {
40 char *name=NULL;
41 AcDbEntity* pEntity;
42 if (pIter->getEntity(pEntity,AcDb::kForRead)==Acad::eOk)
43 {
44 name=pEntity->layer();
45 if (nLayerName.CompareNoCase(name)==0)
46 nIDs.append(pEntity->objectId());
47
48 pEntity->close();
49 acutDelString(name);
50 }
51 }
52 delete pIter;
53 }
54 pSpaceRecord->close();
55 }
56 pBlockTable->close();
57 }
58
59 return es;
60 }

生成新组

 1 //生成新组(sGroupName)
2 //追加数组中所有实体到该组中
3 //组名字 , Id数组
4 int createGroup(CString sGroupName,
5 const AcDbObjectIdArray *idArr)
6 {
7 AcDbGroup *pGroup = new AcDbGroup((LPSTR)(LPCTSTR)sGroupName);
8 AcDbObjectId groupObjectId;
9 AcDbDictionary *pGroupDict = NULL;
10
11 acdbHostApplicationServices()->workingDatabase()
12 ->getGroupDictionary(pGroupDict, AcDb::kForWrite);
13 pGroupDict->setAt(sGroupName, pGroup, groupObjectId);
14 pGroupDict->close();
15 pGroup->close();
16 acdbOpenObject(pGroup, groupObjectId, AcDb::kForWrite);
17 for (int i = 0; i < idArr->length(); i++)
18 {
19 groupObjectId = idArr->at(i);
20 pGroup->append(groupObjectId);
21 }
22 pGroup->close();
23 return TRUE;
24 }

另一个

 1 Acad::ErrorStatus CDrawFunction::createGroup(CString groupname,AcDbObjectIdArray IdArray)
2 {
3 Acad::ErrorStatus es=Acad::eOk;
4 AcDbDictionary *pGroupDict=NULL;
5 AcDbGroup *pGroup=NULL;
6 if((es=acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict,AcDb::kForWrite))!=Acad::eOk)
7 {
8 return es;
9 }
10 AcDbObjectId groupId;
11 es=pGroupDict->getAt(groupname,groupId);
12 if(es==Acad::eInvalidKey)
13 {
14 acutPrintf("\n输入的词典名无效!");
15 pGroupDict->close();
16 return es;
17 }
18 else if(es==Acad::eKeyNotFound)
19 {
20 pGroup=new AcDbGroup("GroupDiscription");
21 if((es=pGroupDict->setAt(groupname,pGroup,groupId))!=Acad::eOk)
22 {
23 pGroup->close();pGroupDict->close();return es;
24 }
25 }
26 else if(es==Acad::eOk )
27 {
28 if((es=acdbOpenObject(pGroup,groupId,AcDb::kForWrite))!=Acad::eOk)
29 {
30 pGroupDict->close();return es;
31 }
32 }
33 for(int i=0;i pGroup->append(IdArray[i]);
34 pGroup->setSelectable(FALSE);
35 pGroupDict->close();
36 pGroup->close();
37 return es;
38 }

旋转整个group

 1 void CMyDatabase::rotationGroup(CString strGroupName ,CReiPoint ptRotation,double rotationAngle)
2 {
3 AcGePoint3d pt;
4 AcDbDictionary *pGroupDict;
5 acdbCurDwg()->getGroupDictionary(pGroupDict,AcDb::kForWrite);
6 AcDbObjectId groupId;
7 AcDbGroup *pGroup;
8 pt.x=ptRotation.x;
9 pt.y=ptRotation.y;
10 pt.z=ptRotation.z;
11 if(pGroupDict->getAt(strGroupName,groupId)==Acad::eOk)
12 acdbOpenObject(pGroup,groupId,AcDb::kForWrite);
13 else
14 {
15 pGroupDict->close();
16 return;
17 }
18 pGroupDict->close();
19 AcDbGroupIterator* pIter=pGroup->newIterator();
20 AcDbEntity* pEnt;
21 AcDbObjectId objId;
22 pIter=pGroup->newIterator();
23 for(;!pIter->done();pIter->next())
24 {
25 objId=pIter->objectId();
26 acdbOpenAcDbEntity(pEnt,objId,AcDb::kForWrite);
27 rotationEntity(pEnt,pt,rotationAngle);
28 pEnt->close();
29 }
30 delete pIter;
31 pGroup->close();
32 }

新建一个图层.

 1 //==========================================================
2 //功能:新建一个图层
3 //参数:LayerName -- 图层名,LayerColor -- 颜色名
4 //返回:图层ID
5 //==========================================================
6 AcDbObjectId CreateNewLayer(CString LayerName, AcCmColor LayerColor)
7 {
8 // 获得当前图形数据库的符号表
9 AcDbLayerTable *pLayerTable;
10 acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pLayerTable,
11 AcDb::kForWrite);
12 // 生成新的图层表记录
13 AcDbLayerTableRecord *pLayerTableRecord = new AcDbLayerTableRecord;
14 pLayerTableRecord->setName(LayerName); // 设置图层名
15 pLayerTableRecord->setColor(LayerColor); // 设置图层颜色
16 AcDbObjectId layerId;
17 pLayerTable->add(layerId,pLayerTableRecord);
18 // 关闭图层表和图层表记录
19 pLayerTable->close();
20 pLayerTableRecord->close();
21 return layerId;
22 }
 1 //==========================================================
2 //功能:在指定图层上新建一条直线
3 //参数:见注释
4 //返回:直线ID
5 //==========================================================
6 AcDbObjectId CreateLine( double x1,double y1,double z1, // 起点坐标
7 double x2,double y2,double z2, // 终点坐标
8 AcDbObjectId layer) // 直线所在图层
9 {
10 AcGePoint3d StartPt(x1,y1,z1); // 起点
11 AcGePoint3d EndPt(x2,y2,z2); // 终点
12 AcDbLine *pLine = new AcDbLine(StartPt,EndPt);
13 // 获得当前图形数据库的符号表
14 AcDbBlockTable *pBlockTable;
15 acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable,
16 AcDb::kForRead);
17 // 获得符号表中的模型空间块表记录指针,用于添加对象
18 AcDbBlockTableRecord *pBlockTableRecord;
19 pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
20 pBlockTable->close();
21 // 将直线添加到模型空间块表记录中
22 AcDbObjectId lineId;
23 pLine->setLayer(layer,Adesk::kTrue); // 设置直线所在图层
24 pBlockTableRecord->appendAcDbEntity(lineId,pLine);
25 // 关闭块表记录指针和直线指针
26 pBlockTableRecord->close();
27 pLine->close();
28 // 返回直线ID号
29 return lineId;
30 }

已知一段弧的起点和终点以及其凸度,求其圆心

 1 int getCenter(ads_point startPoint,ads_point endPoint,double bulge,ads_point& center)
2 {
3 if (bulge==0.0)
4 {
5 ads_point_set(startPoint,center);
6 return 0;
7 }
8 ads_point startPt,endPt;
9 if (bulge<0.0)
10 {
11 ads_point_set(endPoint,startPt);
12 ads_point_set(startPoint,endPt);
13 bulge=bulge*(-1.0);
14 }
15 else
16 {
17 ads_point_set(startPoint,startPt);
18 ads_point_set(endPoint,endPt);
19 }
20 double distStartToEnd,distX,distY,radius;
21 distStartToEnd=ads_distance(startPt,endPt);
22 distX=distStartToEnd/2.0;
23 distY=bulge*distX;
24 radius=((distX*distX)+(distY*distY))/(2.0*distY);
25
26 double tmpAng;
27 ads_point tmpPt;
28
29 tmpAng=ads_angle(startPt,endPt);
30 ads_polar(startPt,tmpAng,distX,tmpPt);
31 ads_polar(tmpPt,(tmpAng+(_PI/2.0)),(radius-distY),center);
32 return 1;
33
34 };

创建填充

 1 AcDbObjectId CreateHatch(
2 AcDbObjectId dbOId,
3 char cLayer[],
4 char cPattern[] = "SOLID",
5 int nColor = 256,
6 double dAngle = 0.0,
7 double dScale = 1.0,
8 AcDbDatabase * pDbDatab = acdbHostApplicationServices()->workingDatabase())
9 {
10 AcCmColor CmC;
11 AcDbObjectId DbOId;
12 AcDbObjectIdArray DbOIdA(0, 2);
13 AcDbBlockTable * pDbBT;
14 AcDbBlockTableRecord * pDbBTR;
15 AcGeVector3d normal(0.0, 0.0, 1.0);
16
17 DbOIdA.append(dbOId);
18
19 AcDbHatch* pDbHat = new AcDbHatch();
20
21 pDbHat->setDatabaseDefaults();
22
23 pDbHat->setAssociative(Adesk::kTrue); // BUG: doesn't do squat! have to set the reactor yourself to get associativity!
24
25 pDbHat->appendLoop(AcDbHatch::kExternal, DbOIdA);
26
27 pDbHat->setPatternScale(dScale);
28
29 pDbHat->setPatternAngle(dAngle);
30
31 pDbHat->setPattern(AcDbHatch::kPreDefined, cPattern);
32
33 pDbHat->setNormal(normal);
34
35 pDbHat->evaluateHatch(); // crucial call or nothing gets displayed!
36
37 pDbDatab->getSymbolTable(pDbBT, AcDb::kForRead);
38
39 pDbBT->getAt(ACDB_MODEL_SPACE, pDbBTR, AcDb::kForWrite);
40
41 pDbBTR->appendAcDbEntity(DbOId, pDbHat);
42
43 pDbHat->setLayer(cLayer);
44
45 CmC.setColorIndex(nColor);
46
47 ((AcDbEntity *)pDbHat)->setColor(CmC);
48
49 pDbBT->close();
50
51 pDbBTR->close();
52
53 pDbHat->close();
54
55 return DbOId;
56
57 }
 1 //************************************************************************
2 //函数名称:getPointAtDistInGeCurve
3 //函数类型:Acad::ErrorStatus
4 //返回值:
5 //功能描述:返回曲线上距起点某距离值处的点。
6 //函数作者:Darcy
7 //创建日期:2003-XX-XX
8 //参数列表:
9 //变量名:pGeCurve 变量类型:const AcGeCurve3d * 变量说明:
10 //变量名:dist 变量类型:double 变量说明:
11 //变量名:point 变量类型:AcGePoint3d& 变量说明:
12 //备 注:
13 //************************************************************************
14 Acad::ErrorStatus getPointAtDistInGeCurve(const AcGeCurve3d * pGeCurve,double dist,AcGePoint3d& point)
15 {
16 Acad::ErrorStatus es = Acad::eOk;
17
18 if ( pGeCurve != NULL )
19 {
20 AcGePoint3d spt;
21 double pa=0.,datumParam=0.;
22 //距离从起点起算!
23 Adesk::Boolean posParamDir=Adesk::kTrue;
24
25 pGeCurve->hasStartPoint(spt);
26
27 datumParam = pGeCurve->paramOf(spt);;
28
29 pa = pGeCurve->paramAtLength(
30 datumParam,
31 dist,
32 posParamDir
33 );
34
35 point=pGeCurve->evalPoint(pa);
36 }
37 else
38 es = Acad::eInvalidInput;
39
40 return es;
41 }

判断点是否在圆弧上

  1 BOOL
2 IsAtArc(CAD_POINT firstPt,CAD_POINT secondPt,
3 double radius,double direct,int More,CAD_POINT thePt)
4 /**//* 判断某点是否在圆弧上
5 firstPt 圆弧起点
6 secondPt 圆弧终点
7 radius 半径
8 direct 偏向( >=0__左偏 <0__右偏 )
9 More (More<0__小圆弧,More>0__大圆弧)
10 thePt 判断点
11 返回:TRUE__在圆弧上 FALSE__不在圆弧上
12 */
13 {
14 CAD_POINT centerPt,sectionPt;
15 CAD_POINT startPt,endPt;
16 double startAngle,endAngle,chordAngle,vertAngle;
17 double intLine,chordLine;
18 /**//* centerPt 圆弧圆心
19 sectionPt 弦线中心点
20 startAngle 圆弧起点切线角度(弧度)
21 endAngle 圆弧终点切线角度(弧度)
22 chordAngle 弦线角度(弧度)
23 vertAngle 与弦线垂直的垂线角度(弧度)
24 intLine 弦线中心至圆心距离
25 chordLine 弦线长度
26 */
27 sectionPt.x = (firstPt.x + secondPt.x)/2;
28 sectionPt.y = (firstPt.y + secondPt.y)/2;
29
30 chordLine = sqrt( pow( (secondPt.x-firstPt.x),2 ) + pow( (secondPt.y-firstPt.y),2 ) );
31 intLine = sqrt((radius*radius-chordLine*chordLine/4) );
32
33 chordAngle = ads_angle(asDblArray(firstPt),asDblArray(secondPt)); //弦线的角度
34
35 if(direct>=0)//左偏
36 {
37 startPt=firstPt;
38 endPt=secondPt;
39 vertAngle=chordAngle+Pai/2;
40 }
41 else if(direct<0)//右偏
42 {
43 startPt=secondPt;
44 endPt=firstPt;
45 vertAngle=chordAngle-Pai/2;
46 }
47
48 if(More<=0)//小圆弧
49 {
50 centerPt.x=sectionPt.x+intLine*cos(vertAngle);
51 centerPt.y=sectionPt.y+intLine*sin(vertAngle);
52 }
53 else//大圆弧
54 {
55 centerPt.x=sectionPt.x-intLine*cos(vertAngle);
56 centerPt.y=sectionPt.y-intLine*sin(vertAngle);
57 }
58
59 if(fabs(centerPt.distanceTo(thePt)-radius)>1.0E-8)
60 return FALSE;
61 startAngle = ads_angle(asDblArray(centerPt),asDblArray(startPt));
62 endAngle = ads_angle(asDblArray(centerPt),asDblArray(endPt));
63
64 AcDbArc *pArc=new AcDbArc(centerPt,radius,startAngle,endAngle);
65 AcDbLine *pLine=new AcDbLine(centerPt,thePt);
66 AcGePoint3dArray Points;
67 pLine->intersectWith(pArc,AcDb::kOnBothOperands,Points);
68 if(Points.isEmpty()) return FALSE;
69
70 return TRUE;
71 }
72
73 相object加xdata
74 void affixXdata(char *appName, char *xData, AcDbObject *pObj)
75 {
76 //向AcDbObject添加扩展数据Xdata
77 struct resbuf *pRb, *pTemp;
78
79 acdbRegApp(appName);
80 pRb = acutNewRb(AcDb::kDxfRegAppName);
81 pTemp = pRb;
82 pTemp->resval.rstring = new char[strlen(appName)+1];
83 strcpy(pTemp->resval.rstring, appName);
84
85 pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString);
86 pTemp = pTemp->rbnext;
87 pTemp->resval.rstring = new char[strlen(xData)+1];
88 strcpy(pTemp->resval.rstring, xData);
89
90 pObj->setXData(pRb);
91 acutRelRb(pRb);
92 }
93
94 //添加扩展数据
95 //实体添加扩展数据(字符串)
96 bool AddXData(CString appName, AcDbObjectId entId,CString data)
97 {
98 //open entity for read
99 AcDbEntity*pEnt;
100 Acad::ErrorStatus es=acdbOpenAcDbEntity(pEnt,entId,AcDb::kForRead);
101 if(es!=Acad::eOk)
102 {
103 ads_printf("error in open entity\n");
104 return false;
105 }
106 //get XData buffer
107 struct resbuf*pRb,*pTemp;
108 pRb=pEnt->xData(appName);
109 if(pRb!=NULL)//have XData
110 {
111 //pTemp移到表尾
112 pTemp=pRb;
113 for(pTemp=pRb;pTemp->rbnext!=NULL;pTemp=pTemp->rbnext){;}
114 }
115 else//NOT have XData
116 {
117 //create new xData
118 ads_regapp(appName);
119 pRb=ads_newrb(AcDb::kDxfRegAppName);
120 pRb->resval.rstring=(char*)malloc(appName.GetLength()+1);
121 strcpy(pRb->resval.rstring,appName);
122 pTemp=pRb;
123 }
124 //fill xData string
125 pTemp->rbnext=ads_newrb(AcDb::kDxfXdAsciiString);
126 pTemp=pTemp->rbnext;
127 pTemp->resval.rstring=(char*)malloc(data.GetLength()+1);
128 strcpy(pTemp->resval.rstring,data);
129 //add xData
130 es=pEnt->upgradeOpen();
131 if(es!=Acad::eOk)
132 {
133 ads_printf("\nError occur in updateOpen.");
134 pEnt->close();
135 ads_relrb(pRb);
136 return false;
137 }
138 es=pEnt->setXData(pRb);
139 if(es!=Acad::eOk)
140 {
141 ads_printf("\nError occur in setXData.");
142 pEnt->close();
143 ads_relrb(pRb);
144 return false;
145 }
146 //
147 pEnt->close();
148 ads_relrb(pRb);
149 return true;
150 }
 1 //向object加xdata
2 void affixXdata(char *appName, char *xData, AcDbObject *pObj)
3 {
4 //向AcDbObject添加扩展数据Xdata
5 struct resbuf *pRb, *pTemp;
6
7 acdbRegApp(appName);
8 pRb = acutNewRb(AcDb::kDxfRegAppName);
9 pTemp = pRb;
10 pTemp->resval.rstring = new char[strlen(appName)+1];
11 strcpy(pTemp->resval.rstring, appName);
12
13 pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString);
14 pTemp = pTemp->rbnext;
15 pTemp->resval.rstring = new char[strlen(xData)+1];
16 strcpy(pTemp->resval.rstring, xData);
17
18 pObj->setXData(pRb);
19 acutRelRb(pRb);
20 }
 1 //添加扩展数据
2 //实体添加扩展数据(字符串)
3 bool AddXData(CString appName, AcDbObjectId entId,CString data)
4 {
5 //open entity for read
6 AcDbEntity*pEnt;
7 Acad::ErrorStatus es=acdbOpenAcDbEntity(pEnt,entId,AcDb::kForRead);
8 if(es!=Acad::eOk)
9 {
10 ads_printf("error in open entity\n");
11 return false;
12 }
13 //get XData buffer
14 struct resbuf*pRb,*pTemp;
15 pRb=pEnt->xData(appName);
16 if(pRb!=NULL)//have XData
17 {
18 //pTemp移到表尾
19 pTemp=pRb;
20 for(pTemp=pRb;pTemp->rbnext!=NULL;pTemp=pTemp->rbnext){;}
21 }
22 else//NOT have XData
23 {
24 //create new xData
25 ads_regapp(appName);
26 pRb=ads_newrb(AcDb::kDxfRegAppName);
27 pRb->resval.rstring=(char*)malloc(appName.GetLength()+1);
28 strcpy(pRb->resval.rstring,appName);
29 pTemp=pRb;
30 }
31 //fill xData string
32 pTemp->rbnext=ads_newrb(AcDb::kDxfXdAsciiString);
33 pTemp=pTemp->rbnext;
34 pTemp->resval.rstring=(char*)malloc(data.GetLength()+1);
35 strcpy(pTemp->resval.rstring,data);
36 //add xData
37 es=pEnt->upgradeOpen();
38 if(es!=Acad::eOk)
39 {
40 ads_printf("\nError occur in updateOpen.");
41 pEnt->close();
42 ads_relrb(pRb);
43 return false;
44 }
45 es=pEnt->setXData(pRb);
46 if(es!=Acad::eOk)
47 {
48 ads_printf("\nError occur in setXData.");
49 pEnt->close();
50 ads_relrb(pRb);
51 return false;
52 }
53 //
54 pEnt->close();
55 ads_relrb(pRb);
56 return true;
57 }

arx代码片段的更多相关文章

  1. sublimetext3中保存代码片段

    在日常的开发工作中,不断重复上一次敲过的代码,有时确实感到伐木累."蓝瘦"(难受)."香菇"(想哭),大概表达的也是这样的心境吧!:grinning: 所以,在 ...

  2. Code Snippets 代码片段

    Code Snippets 代码片段       1.Title : 代码片段的标题 2.Summary : 代码片段的描述文字 3.Platform : 可以使用代码片段的平台,有IOS/OS X/ ...

  3. 10个 jQuery 代码片段,可以帮你快速开发。

    转载自:http://mp.weixin.qq.com/s/mMstI10vqwu8PvUwlLborw 1.返回顶部按钮 你可以利用 animate 和 scrollTop 来实现返回顶部的动画,而 ...

  4. 代码片段添加智能提示,打造一款人见人爱的ORM框架

    SqlSugar ORM优点: 1.高性能,达到原生最高水准,比SqlHelper性能要高,比Dapper快30% 比EF快50% 2.支持多种数据库 ,sql版本更新最快,其它会定期更新,可以在多种 ...

  5. js/jquery/html前端开发常用到代码片段

    1.IE条件注释 条件注释简介 IE中的条件注释(Conditional comments)对IE的版本和IE非IE有优秀的区分能力,是WEB设计中常用的hack方法.条件注释只能用于IE5以上,IE ...

  6. Visual Studio 如何使用代码片段Code Snippet提高编程速度!!!

      使用Code Snippet简化Coding 在开发的项目的时候,你是否经常遇到需要重复编写一些类似的代码,比如是否经常会使用 for.foreach ? 在编写这两个循环语句的时候,你是一个字符 ...

  7. Visual Studio 的代码片段工具

    当安装完Visual Studio之后,会有附带一些原生的代码片段文件(*.snippet),对于vs2013参考目录如下: X:\Program Files (x86)\Microsoft Visu ...

  8. sublime代码片段

    创建方法:Tools > New Snippet 这时你会看到如下示例代码: <snippet>      <content><![CDATA[ Hello, ${ ...

  9. sublime 添加代码片段(snippets)

    1.工具-新代码片段(Tools -> New Snippet) 2. <snippet> <content><![CDATA[ if(\$rs && ...

随机推荐

  1. You don&#39;t have permission to access &#215;&#215;&#215; on this server.

    之前开发项目一直在linux上用的xampp集成环境,前几天突然想移到window上面去. 開始在window上安装了一个集成环境(名字大概是 Uniform Service),把项目文件已过去, o ...

  2. hdu 5361 2015多校联合训练赛#6 最短路

    In Touch Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total ...

  3. 使用Hibernate防止SQL注入的方法

    之前写代码,往后台传入一个组织好的String类型的Hql或者Sql语句,去执行. 这样其实是很蠢的一种做法!!!! 举个栗子~~ 我们模仿一下用户登录的场景: 常见的做法是将前台获取到的用户名和密码 ...

  4. HDU4267 树状数组 不连续区间修改(三维)

    A Simple Problem with Integers                                  Problem Description Let A1, A2, ... ...

  5. 转 source insight 复制后光标在前面

    source insight 里编辑的时候,每次粘贴后,光标停留在粘贴内容的前面. 我想把它设定为 粘贴后,光标移动倒粘贴内容的后面. 怎么做? 这是个设置问题,按照下面的步骤设定就可以了. Opti ...

  6. 符号修饰与函数签名、extern “C”(转载)

    转自:http://www.cnblogs.com/monotone/archive/2012/11/16/2773772.html 参考资料: <程序员的自我修养>3.5.3以及3.5. ...

  7. Linux系统下 为命令配置别名

    1.什么是别名 在管理和维护Linux系统的过程中,将会使用到大量命令,有一些很长的命令或用法经常被用到,重复而频繁的输入某个很长命令或用法是不可取的.这时可以使用 别名 功能将这个过程简单化. Li ...

  8. FPGA基础入门篇(四) 边沿检测电路

    FPGA基础入门篇(四)--边沿检测电路 一.边沿检测 边沿检测,就是检测输入信号,或者FPGA内部逻辑信号的跳变,即上升沿或者下降沿的检测.在检测到所需要的边沿后产生一个高电平的脉冲.这在FPGA电 ...

  9. git clone ssh permissions are too open 解决方案。

    错误如图所示 方案如下 https://stackoverflow.com/questions/9270734/ssh-permissions-are-too-open-error

  10. tomcat 参数调优

    JAVA_OPTS="-Xms2g -Xmx2g  -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath= ...