一  在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编程中,经常需要使用当前数据库,例如需要获得当前图形中设置的文字样式、标注样式等。
要获得当前数据库,都可以直接使用下面的方法:
AcDbTextStyleTable *pTextStyleTAble;
AcDbObjectId textstyleId;
textstyleId=acdbHostApplicationServices()->workingDatabase()->textstyle();
如果用acadCurDwg来代替acdbHostApplicationServices()->workingDatabase(),也能得到同样的结果。
六 在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
}

下面的方法则打开指定位置的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);

 
 //  Function name    : SetCurLayer
 //  Description        : 设置当前层
 //  Return type        : Acad::ErrorStatus 
 //  Argument         : const char* lpLayerName
 //  Argument         : AcDbDatabase* pDb 
  Acad::ErrorStatus SetCurLayer( const   char *  lpLayerName, AcDbDatabase *  pDb   )
  {
    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;
}

//功能描述:选择指定图层上的所有实体!

// 函数名称:selectEntityInLayer
 // 函数类型:Acad::ErrorStatus 
 // 返回值:  正常:Acad::eOk
 // 功能描述:选择指定图层上的所有实体!
 // 函数作者:Darcy
 // 创建日期:200X-XX-XX
 // 参数列表:
 // 变量名:nLayerName     变量类型:const char*           变量说明:(输入)图层名
 // 变量名:nIDs           变量类型:AcDbObjectIdArray&    变量说明:(输出)图层中实体的对象标识符集合
 
 Acad::ErrorStatus selectEntityInLayer( const   char *  nLayerName,AcDbObjectIdArray &  nIDs)
  {
    Acad::ErrorStatus es  =  Acad::eOk;

ads_name ents;
     struct  resbuf  * rb;
    rb = acutNewRb(AcDb::kDxfLayerName);
    rb -> restype = 8 ;
    rb -> resval.rstring = ( char * )nLayerName;
    rb -> rbnext = NULL;
    acedSSGet( " X " ,NULL,NULL,rb,ents);
     long  entNums = 0 ;
    acedSSLength(ents, & entNums);
     if  (entNums  ==   0 )
        es  =  Acad::eInvalidInput;
     else 
       {
         for  ( long  a  =   0 ; a  <  entNums ; a  ++ )
          {
            AcDbObjectId  objId;
            ads_name      ent;
            acedSSName(ents,a,ent);
            acdbGetObjectId(objId, ent);
            nIDs.append(objId);
        } 
    } 
    acedSSFree(ents);
    acutRelRb(rb);

return  es;
}

生成新组
//生成新组(sGroupName)
//追加数组中所有实体到该组中
//组名字 ,   Id数组
int createGroup(CString sGroupName,
                                   const AcDbObjectIdArray *idArr)
{
    AcDbGroup       *pGroup = new AcDbGroup((LPSTR)(LPCTSTR)sGroupName);
    AcDbObjectId     groupObjectId;
    AcDbDictionary  *pGroupDict = NULL;

acdbHostApplicationServices()->workingDatabase()
        ->getGroupDictionary(pGroupDict, AcDb::kForWrite);
    pGroupDict->setAt(sGroupName, pGroup, groupObjectId);
    pGroupDict->close();
      pGroup->close();
    acdbOpenObject(pGroup, groupObjectId, AcDb::kForWrite);
    for (int i = 0; i < idArr->length(); i++)
    {
        groupObjectId = idArr->at(i);
        pGroup->append(groupObjectId);   
    }
    pGroup->close();
    return TRUE;
}
功能:新建一个图层
参数:LayerName -- 图层名,LayerColor -- 颜色名
返回:图层ID
//==========================================================
AcDbObjectId CreateNewLayer(CString LayerName, AcCmColor LayerColor)
{
    // 获得当前图形数据库的符号表
    AcDbLayerTable *pLayerTable;
    acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pLayerTable,
        AcDb::kForWrite);
    // 生成新的图层表记录
    AcDbLayerTableRecord *pLayerTableRecord = new AcDbLayerTableRecord;
    pLayerTableRecord->setName(LayerName);        // 设置图层名
    pLayerTableRecord->setColor(LayerColor);    // 设置图层颜色
    AcDbObjectId layerId;
    pLayerTable->add(layerId,pLayerTableRecord);
    // 关闭图层表和图层表记录
    pLayerTable->close();
    pLayerTableRecord->close();
    return layerId;
}

//==========================================================
功能:在指定图层上新建一条直线
参数:见注释
返回:直线ID
//==========================================================
AcDbObjectId CreateLine( double x1,double y1,double z1,  // 起点坐标
                     double x2,double y2,double z2,  // 终点坐标
                     AcDbObjectId layer)                   // 直线所在图层
{
    AcGePoint3d StartPt(x1,y1,z1);    // 起点
    AcGePoint3d EndPt(x2,y2,z2);    // 终点
    AcDbLine *pLine = new AcDbLine(StartPt,EndPt);
    // 获得当前图形数据库的符号表
    AcDbBlockTable *pBlockTable;
    acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable,
        AcDb::kForRead);
    // 获得符号表中的模型空间块表记录指针,用于添加对象
    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
    pBlockTable->close();
    // 将直线添加到模型空间块表记录中
    AcDbObjectId lineId;
    pLine->setLayer(layer,Adesk::kTrue);    // 设置直线所在图层
    pBlockTableRecord->appendAcDbEntity(lineId,pLine);
    // 关闭块表记录指针和直线指针
    pBlockTableRecord->close();
    pLine->close();
    // 返回直线ID号
    return lineId;
}

//函数名称:getPointAtDistInGeCurve
//函数类型:Acad::ErrorStatus 
//返回值:
//功能描述:返回曲线上距起点某距离值处的点。
//变量名:pGeCurve 变量类型:const AcGeCurve3d * 变量说明:
//变量名:dist 变量类型:double 变量说明:
//变量名:point 变量类型:AcGePoint3d& 变量说明:
//备 注:
Acad::ErrorStatus getPointAtDistInGeCurve(const AcGeCurve3d * pGeCurve,double dist,AcGePoint3d& point)
{
Acad::ErrorStatus es = Acad::eOk;

if ( pGeCurve != NULL )
{
AcGePoint3d spt;
double pa=0.,datumParam=0.;
//距离从起点起算!
Adesk::Boolean posParamDir=Adesk::kTrue;

pGeCurve->hasStartPoint(spt);

datumParam = pGeCurve->paramOf(spt);;

pa = pGeCurve->paramAtLength(
datumParam,
dist,
posParamDir
);

point=pGeCurve->evalPoint(pa);
}
else
es = Acad::eInvalidInput;

return es;

判断点是否在圆弧上

BOOL
IsAtArc(CAD_POINT firstPt,CAD_POINT secondPt,
double radius,double direct,int More,CAD_POINT thePt)

{
CAD_POINT centerPt,sectionPt;
CAD_POINT startPt,endPt;
double startAngle,endAngle,chordAngle,vertAngle;
double intLine,chordLine;
 
sectionPt.x = (firstPt.x + secondPt.x)/2;
sectionPt.y = (firstPt.y + secondPt.y)/2;

chordLine = sqrt( pow( (secondPt.x-firstPt.x),2 ) + pow( (secondPt.y-firstPt.y),2 ) );
intLine = sqrt((radius*radius-chordLine*chordLine/4) );

chordAngle = ads_angle(asDblArray(firstPt),asDblArray(secondPt)); //弦线的角度

if(direct>=0)//左偏
{
startPt=firstPt;
endPt=secondPt;
vertAngle=chordAngle+Pai/2;
}
else if(direct<0)//右偏
{
startPt=secondPt;
endPt=firstPt;
vertAngle=chordAngle-Pai/2;
}

if(More<=0)//小圆弧
{
centerPt.x=sectionPt.x+intLine*cos(vertAngle);
centerPt.y=sectionPt.y+intLine*sin(vertAngle);
}
else//大圆弧
{
centerPt.x=sectionPt.x-intLine*cos(vertAngle);
centerPt.y=sectionPt.y-intLine*sin(vertAngle);
}

if(fabs(centerPt.distanceTo(thePt)-radius)>1.0E-8)
return FALSE;
startAngle = ads_angle(asDblArray(centerPt),asDblArray(startPt)); 
endAngle = ads_angle(asDblArray(centerPt),asDblArray(endPt));

AcDbArc *pArc=new AcDbArc(centerPt,radius,startAngle,endAngle);
AcDbLine *pLine=new AcDbLine(centerPt,thePt);
AcGePoint3dArray Points;
pLine->intersectWith(pArc,AcDb::kOnBothOperands,Points);
if(Points.isEmpty()) return FALSE;

return TRUE;
}

设置当前的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;

//功能描述:选择指定图层上的所有实体!

 // ************************************************************************
 // 函数名称:selectEntityInLayer
 // 函数类型:Acad::ErrorStatus 
 // 返回值:  正常:Acad::eOk
 // 功能描述:选择指定图层上的所有实体!
 // 函数作者:Darcy
 // 创建日期:200X-XX-XX
 // 参数列表:
 // 变量名:nLayerName     变量类型:const char*           变量说明:(输入)图层名
 // 变量名:nIDs           变量类型:AcDbObjectIdArray&    变量说明:(输出)图层中实体的对象标识符集合
 // ************************************************************************ 
 Acad::ErrorStatus selectEntityInLayer( const   char *  nLayerName,AcDbObjectIdArray &  nIDs)
 {
    Acad::ErrorStatus es  =  Acad::eOk;

    ads_name ents;
     struct  resbuf  * rb;
    rb = acutNewRb(AcDb::kDxfLayerName);
    rb -> restype = 8 ;
    rb -> resval.rstring = ( char * )nLayerName;
    rb -> rbnext = NULL;
    acedSSGet( " X " ,NULL,NULL,rb,ents);
     long  entNums = 0 ;
    acedSSLength(ents, & entNums);
     if  (entNums  ==   0 )
        es  =  Acad::eInvalidInput;
     else 
      {
         for  ( long  a  =   0 ; a  <  entNums ; a  ++ )
         {
            AcDbObjectId  objId;
            ads_name      ent;
            acedSSName(ents,a,ent);
            acdbGetObjectId(objId, ent);
            nIDs.append(objId);
        } 
    } 
    acedSSFree(ents);
    acutRelRb(rb);

     return  es;
}

另一种实现

//************************************************************************
//函数名称:selectEntityInLayer
//函数类型:Acad::ErrorStatus 
//返回值:
//功能描述:选择指定层上的实体,得到其对象属性标识符!
//函数作者:Darcy
//创建日期:200X-XX-XX
//参数列表:
//变量名:nLayerName      变量类型:CString               变量说明:
//变量名:nIDs            变量类型:AcDbObjectIdArray&    变量说明:
//变量名:nModelSpace     变量类型:bool                  变量说明:
//************************************************************************
Acad::ErrorStatus    selectEntityInLayer(
                                         CString nLayerName,
                                         AcDbObjectIdArray& nIDs,
                                         bool nModelSpace
                                         )
{
    Acad::ErrorStatus es=Acad::eOk; 

    AcDbBlockTable*        pBlockTable=NULL;
    AcDbBlockTableRecord*  pSpaceRecord=NULL;
    if (acdbHostApplicationServices()->workingDatabase()==NULL)
        return Acad::eNoDatabase;
    if ((es = acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead))==Acad::eOk)
    {
        char entryName[13];
        if (nModelSpace)
            strcpy(entryName,ACDB_MODEL_SPACE);
        else
            strcpy(entryName,ACDB_PAPER_SPACE);
        //Get the Model or Paper Space record and open it for read:  
        if ((es = pBlockTable->getAt((const char*)entryName, pSpaceRecord, AcDb::kForRead))==Acad::eOk)
        {
                AcDbBlockTableRecordIterator* pIter;
                if (pSpaceRecord->newIterator(pIter)==Acad::eOk)
                {
                    for (pIter->start();!pIter->done();pIter->step())
                    {
                        char *name=NULL;
                        AcDbEntity* pEntity;
                        if (pIter->getEntity(pEntity,AcDb::kForRead)==Acad::eOk)
                        {
                            name=pEntity->layer();
                            if (nLayerName.CompareNoCase(name)==0)
                                nIDs.append(pEntity->objectId());

                            pEntity->close();
                            acutDelString(name); 
                        }
                    }
                    delete pIter;
                }            
                pSpaceRecord->close();
        }   
        pBlockTable->close();
    }

    return es;
}

生成新组

//生成新组(sGroupName)
//追加数组中所有实体到该组中
//组名字 ,   Id数组
int createGroup(CString sGroupName,
                                   const AcDbObjectIdArray *idArr)
{
    AcDbGroup       *pGroup = new AcDbGroup((LPSTR)(LPCTSTR)sGroupName);
    AcDbObjectId     groupObjectId;
    AcDbDictionary  *pGroupDict = NULL;

    acdbHostApplicationServices()->workingDatabase()
        ->getGroupDictionary(pGroupDict, AcDb::kForWrite);
    pGroupDict->setAt(sGroupName, pGroup, groupObjectId);
    pGroupDict->close();
      pGroup->close();
    acdbOpenObject(pGroup, groupObjectId, AcDb::kForWrite);
    for (int i = 0; i < idArr->length(); i++)
    {
        groupObjectId = idArr->at(i);
        pGroup->append(groupObjectId);   
    }
    pGroup->close();
    return TRUE;
}

另一个

Acad::ErrorStatus CDrawFunction::createGroup(CString groupname,AcDbObjectIdArray IdArray)
{
Acad::ErrorStatus es=Acad::eOk;
AcDbDictionary *pGroupDict=NULL;
AcDbGroup *pGroup=NULL;
if((es=acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict,AcDb::kForWrite))!=Acad::eOk)
{
return es;
}
AcDbObjectId groupId;
es=pGroupDict->getAt(groupname,groupId);
if(es==Acad::eInvalidKey)
{
acutPrintf("\n输入的词典名无效!");
pGroupDict->close();
return es;
}
else if(es==Acad::eKeyNotFound)
{
pGroup=new AcDbGroup("GroupDiscription");
if((es=pGroupDict->setAt(groupname,pGroup,groupId))!=Acad::eOk)
{
pGroup->close();pGroupDict->close();return es;
}
}
else if(es==Acad::eOk )
{
if((es=acdbOpenObject(pGroup,groupId,AcDb::kForWrite))!=Acad::eOk)
{
pGroupDict->close();return es;
}
}
for(int i=0;i pGroup->append(IdArray[i]);
pGroup->setSelectable(FALSE);
pGroupDict->close();
pGroup->close();
return es;
}

旋转整个group

void CMyDatabase::rotationGroup(CString strGroupName ,CReiPoint ptRotation,double rotationAngle) 
{
    AcGePoint3d pt;
    AcDbDictionary *pGroupDict;
    acdbCurDwg()->getGroupDictionary(pGroupDict,AcDb::kForWrite);
    AcDbObjectId groupId;
    AcDbGroup *pGroup;
    pt.x=ptRotation.x;
    pt.y=ptRotation.y;
    pt.z=ptRotation.z;
    if(pGroupDict->getAt(strGroupName,groupId)==Acad::eOk)
       acdbOpenObject(pGroup,groupId,AcDb::kForWrite);
    else
    {
        pGroupDict->close();
        return;
    }
    pGroupDict->close();
    AcDbGroupIterator* pIter=pGroup->newIterator();
    AcDbEntity* pEnt;
    AcDbObjectId objId;
        pIter=pGroup->newIterator();
    for(;!pIter->done();pIter->next())
    {
        objId=pIter->objectId();
        acdbOpenAcDbEntity(pEnt,objId,AcDb::kForWrite);
        rotationEntity(pEnt,pt,rotationAngle);
        pEnt->close();
    }
    delete pIter;
    pGroup->close();
}

新建一个图层

//==========================================================
功能:新建一个图层
参数:LayerName -- 图层名,LayerColor -- 颜色名
返回:图层ID
//==========================================================
AcDbObjectId CreateNewLayer(CString LayerName, AcCmColor LayerColor)
{
    // 获得当前图形数据库的符号表
    AcDbLayerTable *pLayerTable;
    acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pLayerTable,
        AcDb::kForWrite);
    // 生成新的图层表记录
    AcDbLayerTableRecord *pLayerTableRecord = new AcDbLayerTableRecord;
    pLayerTableRecord->setName(LayerName);        // 设置图层名
    pLayerTableRecord->setColor(LayerColor);    // 设置图层颜色
    AcDbObjectId layerId;
    pLayerTable->add(layerId,pLayerTableRecord);
    // 关闭图层表和图层表记录
    pLayerTable->close();
    pLayerTableRecord->close();
    return layerId;
}

//==========================================================
功能:在指定图层上新建一条直线
参数:见注释
返回:直线ID
//==========================================================
AcDbObjectId CreateLine( double x1,double y1,double z1,  // 起点坐标
                     double x2,double y2,double z2,  // 终点坐标
                     AcDbObjectId layer)                   // 直线所在图层
{
    AcGePoint3d StartPt(x1,y1,z1);    // 起点
    AcGePoint3d EndPt(x2,y2,z2);    // 终点
    AcDbLine *pLine = new AcDbLine(StartPt,EndPt);
    // 获得当前图形数据库的符号表
    AcDbBlockTable *pBlockTable;
    acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable,
        AcDb::kForRead);
    // 获得符号表中的模型空间块表记录指针,用于添加对象
    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
    pBlockTable->close();
    // 将直线添加到模型空间块表记录中
    AcDbObjectId lineId;
    pLine->setLayer(layer,Adesk::kTrue);    // 设置直线所在图层
    pBlockTableRecord->appendAcDbEntity(lineId,pLine);
    // 关闭块表记录指针和直线指针
    pBlockTableRecord->close();
    pLine->close();
    // 返回直线ID号
    return lineId;
}

不太常用的啊

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

int getCenter(ads_point startPoint,ads_point endPoint,double bulge,ads_point& center)
{
if (bulge==0.0)
{
ads_point_set(startPoint,center);
return 0;
}
ads_point startPt,endPt;
if (bulge<0.0)
{
ads_point_set(endPoint,startPt);
ads_point_set(startPoint,endPt);
bulge=bulge*(-1.0);
}
else
{
ads_point_set(startPoint,startPt);
ads_point_set(endPoint,endPt);
}
double distStartToEnd,distX,distY,radius;
distStartToEnd=ads_distance(startPt,endPt);
distX=distStartToEnd/2.0;
distY=bulge*distX;
radius=((distX*distX)+(distY*distY))/(2.0*distY);

double tmpAng;
ads_point tmpPt;

tmpAng=ads_angle(startPt,endPt);
ads_polar(startPt,tmpAng,distX,tmpPt);
ads_polar(tmpPt,(tmpAng+(_PI/2.0)),(radius-distY),center);
return 1;

}; 

create hatch的

AcDbObjectId CreateHatch(
AcDbObjectId dbOId,
char cLayer[], 
char cPattern[] = "SOLID", 
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;

}
前阵困扰我的问题解决了,现在共享给大家:
//************************************************************************
//函数名称:getPointAtDistInGeCurve
//函数类型:Acad::ErrorStatus 
//返回值:
//功能描述:返回曲线上距起点某距离值处的点。
//函数作者:Darcy
//创建日期:2003-XX-XX
//参数列表:
//变量名:pGeCurve 变量类型:const AcGeCurve3d * 变量说明:
//变量名:dist 变量类型:double 变量说明:
//变量名:point 变量类型:AcGePoint3d& 变量说明:
//备 注:
//************************************************************************
Acad::ErrorStatus getPointAtDistInGeCurve(const AcGeCurve3d * pGeCurve,double dist,AcGePoint3d& point)
{
Acad::ErrorStatus es = Acad::eOk;

if ( pGeCurve != NULL )
{
AcGePoint3d spt;
double pa=0.,datumParam=0.;
//距离从起点起算!
Adesk::Boolean posParamDir=Adesk::kTrue;

pGeCurve->hasStartPoint(spt); 

datumParam = pGeCurve->paramOf(spt);;

pa = pGeCurve->paramAtLength(
datumParam,
dist,
posParamDir
);

point=pGeCurve->evalPoint(pa);
}
else
es = Acad::eInvalidInput;

return es;

判断点是否在圆弧上

/*****************************************************/
BOOL
IsAtArc(CAD_POINT firstPt,CAD_POINT secondPt,
double radius,double direct,int More,CAD_POINT thePt)
/* 判断某点是否在圆弧上
firstPt 圆弧起点
secondPt 圆弧终点 
radius 半径
direct 偏向( >=0__左偏 <0__右偏 )
More (More<0__小圆弧,More>0__大圆弧)
thePt 判断点
返回:TRUE__在圆弧上 FALSE__不在圆弧上
*/
{
CAD_POINT centerPt,sectionPt;
CAD_POINT startPt,endPt;
double startAngle,endAngle,chordAngle,vertAngle;
double intLine,chordLine;
/* centerPt 圆弧圆心
sectionPt 弦线中心点
startAngle 圆弧起点切线角度(弧度)
endAngle 圆弧终点切线角度(弧度)
chordAngle 弦线角度(弧度)
vertAngle 与弦线垂直的垂线角度(弧度)
intLine 弦线中心至圆心距离
chordLine 弦线长度
*/ 
sectionPt.x = (firstPt.x + secondPt.x)/2;
sectionPt.y = (firstPt.y + secondPt.y)/2;

chordLine = sqrt( pow( (secondPt.x-firstPt.x),2 ) + pow( (secondPt.y-firstPt.y),2 ) );
intLine = sqrt((radius*radius-chordLine*chordLine/4) );

chordAngle = ads_angle(asDblArray(firstPt),asDblArray(secondPt)); //弦线的角度

if(direct>=0)//左偏
{
startPt=firstPt;
endPt=secondPt;
vertAngle=chordAngle+Pai/2;
}
else if(direct<0)//右偏
{
startPt=secondPt;
endPt=firstPt;
vertAngle=chordAngle-Pai/2;
}

if(More<=0)//小圆弧
{
centerPt.x=sectionPt.x+intLine*cos(vertAngle);
centerPt.y=sectionPt.y+intLine*sin(vertAngle);
}
else//大圆弧
{
centerPt.x=sectionPt.x-intLine*cos(vertAngle);
centerPt.y=sectionPt.y-intLine*sin(vertAngle);
}

if(fabs(centerPt.distanceTo(thePt)-radius)>1.0E-8)
return FALSE;
startAngle = ads_angle(asDblArray(centerPt),asDblArray(startPt)); 
endAngle = ads_angle(asDblArray(centerPt),asDblArray(endPt)); 

AcDbArc *pArc=new AcDbArc(centerPt,radius,startAngle,endAngle);
AcDbLine *pLine=new AcDbLine(centerPt,thePt);
AcGePoint3dArray Points;
pLine->intersectWith(pArc,AcDb::kOnBothOperands,Points);
if(Points.isEmpty()) return FALSE;

return TRUE;
}

相object加xdata

void affixXdata(char *appName, char *xData, AcDbObject *pObj)
{
    //向AcDbObject添加扩展数据Xdata
    struct resbuf *pRb, *pTemp;

    acdbRegApp(appName);
    pRb = acutNewRb(AcDb::kDxfRegAppName);
    pTemp = pRb;
    pTemp->resval.rstring = new char[strlen(appName)+1];
    strcpy(pTemp->resval.rstring, appName);

    pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString);
    pTemp = pTemp->rbnext;
    pTemp->resval.rstring = new char[strlen(xData)+1];
    strcpy(pTemp->resval.rstring, xData);

    pObj->setXData(pRb);
    acutRelRb(pRb);
}
//添加扩展数据
//实体添加扩展数据(字符串)
bool AddXData(CString appName, AcDbObjectId entId,CString data)
{
//open entity for read
AcDbEntity*pEnt;
Acad::ErrorStatus es=acdbOpenAcDbEntity(pEnt,entId,AcDb::kForRead);
if(es!=Acad::eOk)
{
ads_printf("error in open entity\n");
return false;
}
//get XData buffer
struct resbuf*pRb,*pTemp;
pRb=pEnt->xData(appName);
if(pRb!=NULL)//have XData
{
//pTemp移到表尾
pTemp=pRb;
for(pTemp=pRb;pTemp->rbnext!=NULL;pTemp=pTemp->rbnext){;}
}
else//NOT have XData
{
//create new xData
ads_regapp(appName);
pRb=ads_newrb(AcDb::kDxfRegAppName);
pRb->resval.rstring=(char*)malloc(appName.GetLength()+1);
strcpy(pRb->resval.rstring,appName);
pTemp=pRb;
}
//fill xData string
pTemp->rbnext=ads_newrb(AcDb::kDxfXdAsciiString);
pTemp=pTemp->rbnext;
pTemp->resval.rstring=(char*)malloc(data.GetLength()+1);
strcpy(pTemp->resval.rstring,data);
//add xData
es=pEnt->upgradeOpen();
if(es!=Acad::eOk)
{
ads_printf("\nError occur in updateOpen.");
pEnt->close();
ads_relrb(pRb);
return false;
}
es=pEnt->setXData(pRb);
if(es!=Acad::eOk)
{
ads_printf("\nError occur in setXData.");
pEnt->close();
ads_relrb(pRb);
return false;
}
//
pEnt->close();
ads_relrb(pRb);
return true;
}

Arx常用代码《转》相关推荐

  1. pytorch常用代码

    20211228 https://mp.weixin.qq.com/s/4breleAhCh6_9tvMK3WDaw 常用代码段 本文代码基于 PyTorch 1.x 版本,需要用到以下包: impo ...

  2. 一、PyTorch Cookbook(常用代码合集)

    PyTorch Cookbook(常用代码合集) 原文链接:https://mp.weixin.qq.com/s/7at6y2NcYaxGGN8syxlccA 谢谢作者的付出.

  3. GitHub上7000+ Star的Python常用代码合集

    作者 | 二胖并不胖 来源 | 大数据前沿(ID:bigdataqianyan) 今天二胖给大家介绍一个由一个国外小哥用好几年时间维护的Python代码合集.简单来说就是,这个程序员小哥在几年前开始保 ...

  4. 收藏!PyTorch常用代码段合集

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:Jack Stark,来源:极市平台 来源丨https://zhu ...

  5. PyTorch常用代码段合集

    ↑ 点击蓝字 关注视学算法 作者丨Jack Stark@知乎 来源丨https://zhuanlan.zhihu.com/p/104019160 极市导读 本文是PyTorch常用代码段合集,涵盖基本 ...

  6. JavaScript常用代码

    在这存一下JavaScript常用代码: 1.封装输出 1 var log = function() { 2 console.log.apply(console, arguments) 3 } 4 5 ...

  7. javascript常用代码大全

    http://caibaojian.com/288.html     原文链接 jquery选中radio//如果之前有选中的,则把选中radio取消掉 $("#tj_cat .pro_ca ...

  8. mysql四列数据表代码_MySQL数据库常用代码

    MySQL数据库常用代码启动数据库服务:[ net Start MySQL ] 使用命令登录:[ Mysql -h localhost -u root -p] 关闭数据库服务: [net stop m ...

  9. Lambda表达式常用代码示例

    Lambda表达式常用代码示例 2017-10-24 目录 1 Lambda表达式是什么 2 Lambda表达式语法 3 函数式接口是什么   3.1 常用函数式接口 4 Lambdas和Stream ...

  10. 常用代码整理(重要)

    常用代码整理: 1.判断邮箱格式是否正确的代码: //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex ...

最新文章

  1. 16 岁的雅虎问答,因“不再受欢迎”将永久关闭
  2. argv[1] 路径问题
  3. Java高阶部分知识点汇总(三)-内存空间的引用
  4. 两个相邻时间之间的差值计算
  5. if else if语句的用法python_Python笔记3---if语句、if-elif-else 结构、使用if语句处理列表...
  6. 不同性能极限下的服务器,探求极限性能 服务器测试之ScienceMark
  7. 理解 with递归调用 Sqlserver 树查询
  8. 已知圆心 坐标和一点坐标和角度 就之后的坐标_LaTeX 中绘制多个相交椭圆(对起始角度与终止角度的思考)...
  9. 体验MSN聚酷(Juku)
  10. 使用weblogic部署应用
  11. Java实现 LeetCode 75 颜色分类
  12. 单片机课设中期报告_本科毕业设计中期检查报告.doc
  13. 零信任之微分段(微隔离)
  14. 新加坡区块链ICO公司是如何注册新加坡公司的
  15. 【图像处理】初识计算机视觉
  16. Python爬虫抓取指定网页图片代码实例
  17. SQL查询语句教程(浅显易懂)
  18. 【观察】谁是中国容器软件市场TOP厂商?权威研究机构IDC发布最新报告
  19. 天空图立方体贴图转化为辐照度立方体贴图
  20. 最大值和最小值(I)

热门文章

  1. Andriod7.0之wifi开启流程(含流程框图及流程图)
  2. sinx/cosx的泰勒展开式与库函数的比较
  3. 聊一聊TVS管的电路使用
  4. 2017-2018-1 《程序设计与数据结构》课程总结
  5. Java中Switch-Case用法小结
  6. c语言1至100的累乘求和,c语言 累加累乘课件.ppt
  7. Python编程之求累乘和
  8. 华为员工频繁自杀原因何在?
  9. oracle序时账是什么,​序时账和明细账区别是什么
  10. 为什么蚕宝宝很有钱?