转载自网络
一 在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 }