zoukankan      html  css  js  c++  java
  • ObjectARX常用类和函数

    ObjectARX常用类和函数 

     

     (1)AcAx 开头的全局函数:这些函数通过 COM 的方式来让AutoCAD 完成一些操作。

     (a) acutPrintf函数:在 AutoCAD 命令行显示指定的字符串

    acutPrintf函数的具体用法如例:

    acutPrintf("
    输入不合法,请重新输入");

     (b) AcAxMove 函数:移动实体。需要链接 axauto15.lib 库

     AcAxMove 函数的定义形式为:

    HRESULT AXAUTOEXP AcAxMove(AcDbObjectId& objId,VARIANT fromPoint,VARIANT toPoint);

    VARIANT 是在 COM 中使用的一种特殊数据类型,因为COM是微软用于解决组件之间数据交换的一种技术,COM 对象建立在二进制可执行代码级的基础上,并由此来实现多种语言开发的组件对象可以进行交互。
    因此开发 COM 所使用的数据类型是独立于特定语言的,我们开发 COM 客户程序(调用 COM 对象的程序)也必须使用一些 COM 所规定的数据类型。

    AcAxMove 函数的具体用法如例:

    AcDbObjectId entId;//移动实体id
    AcGePoint3d ptFrom;//起点
    AcGePoint3d ptTo;//终点
    
    // 将AcGePoint3d类型的点坐标进行类型转换
    VARIANT *pvaFrom = Point3dToVARIANT(ptFrom);
    VARIANT *pvaTo = Point3dToVARIANT(ptTo);
    BOOL bRet = SUCCEEDED(AcAxMove(entId, *pvaFrom, *pvaTo));
    delete pvaFrom;
    delete pvaTo;
    
    
    static VARIANT* Point3dToVARIANT(const AcGePoint3d &point)
    {
    COleSafeArray *psa = new COleSafeArray();
    DOUBLE dblValues[] = {point[X], point[Y], point[Z]};
    psa->CreateOneDim(VT_R8, 3, dblValues);
    return (LPVARIANT)(*psa);
    }

    (c)AcAxRotate函数:旋转实体的操作

    (d)AcAxScaleEntity 函数:缩放实体的操作

    (e)全局函数 acdbOpenAcDbEntity用于从实体的 ID 号获得指向图形数据库中实体的指针。具体定义形式和用法参考另外一篇博客。https://my.oschina.net/u/2930533/blog/759568

    (f)acedGetString 函数:获得用户输入的字符串(acedGetPoint(点)、acedGetInt、acedGetKword(关键字) 、acedGetDist(距离) acedGetCorner(矩形框对角点)acedGetAngle (角度)和 acedGetReal(实数))

    acedGetString函数的定义形式为:

    int acedGetString(int cronly,const char * prompt,char * result);

    第一个参数:cronly 指定用户输入的字符串中是否可以包含空格,可以输入 Adesk::kTrue 或着Adesk::kFalse;

    第二个参数:prompt 指定了在命令行提示用户输入的文本;

    第三个参数:result 则保存了用户输入的结果(最大缓冲区为133个字符)。

    返回值:RTNORM:成功,RTERROR:失败,RTCAN:用户按下“ESC”键取消操作,RTREJ:拒绝执行操作(操作不合法),RTFAIL:与AutoLISP通信失败,RTKWORD:用户输入了关键字;

    具体用法如例:

    acedGetString(Adesk::kFalse, "
    输入图块的名称:", &blkName)

    注意:第三个参数用了&,是址传递.

    acedGetInt 函数的定义形式为:

    int acedGetInt(const char * prompt, int * result);

    第一个参数:prompt: 用于指定显示在命令窗口中的字符串,如果不需要使用可以指定 NULL 作为该参数的值。

    第二个参数:result :用户输入的整数。

    返回值:RTNORM:成功,RTERROR:失败,RTCAN:用户按下“ESC”键取消操作,RTREJ:拒绝执行操作(操作不合法),RTFAIL:与AutoLISP通信失败,RTKWORD:用户输入了关键字;

    (g)acedEntSel 函数:等待用户选择一个实体

    acedEntSel函数的定义形式为:

    int acedEntSel (const ACHAR *str, ads_name entres,ads_point ptres);

    第一个参数:str:提示信息;

    第二个参数:entres:实体名称;

    第三个参数:ptres:选择实体对象时候的拾取点。

    返回值:RTNORM:成功,RTERROR:失败,RTCAN:用户按下“ESC”键取消操作,RTREJ:拒绝执行操作(操作不合法),RTFAIL:与AutoLISP通信失败,RTKWORD:用户输入了关键字;

    具体用法如例:

    ads_name entres;
    ads_point ptres;
    
    if(RTNORM == acedEntSel(_T("
    请选择一个实体:"),entres,ptres))
    {
    	AcDbObjectId objId;
    	if(acdbGetObjectId(objId,entres) != Acad::eOk )
    		return;
    }

      (h)acedInitGet函数:限定输入的条件,该函数只能控制紧随其后的一个acedGetXXX,调用后立即失效. 

    acedInitGet函数的定义形式为:

    int acedInitGet(int val, const ACHAR *kwl);

    第一个参数:val:输入数据的范围和方式(1:RSG_NONULL:不允许空输入;2:RSG_NOZERO:不允许输入0;4:RSG_NONEG:不允许输入负数;8:RSG_NOLIM:不检查图形边界;32:RSG_DASH:用虚线表示矩形框或橡皮线;64:RSG_2D:不考虑3D的Z坐标;128:RSG_OTHER:允许用户任意输入);

    第二个参数:kwl:关键字列表;

    具体用法如例:

    int nCount = 1;
    acedInitGet(RSG_NONULL+RSG_NONEG+RSG_NOZERO,NULL);
    acedGetInt(_T("
    请输入多边形顶点数:"),&nCount);//不允许输入负数和0

    (i)acedSetColorDialog 函数:函数能够弹出选择颜色对话框,并且返回用户选择的结果。

    acedSetColorDialog 函数定义形式为:

    Adesk::Boolean acedSetColorDialog(int& nColor,Adesk::Boolean bAllowMetaColor,int nCurLayerColor);

    第一个参数:nColor 参数指定了显示【选择颜色】对话框时的默认颜色,并且在函数返回值后保存用户选择的新颜色;

    第二个参数:bAllowMetaColor 参数限定在【选择颜色】对话框中是否可以选择“随层”或“随块”;

    第三个参数:nCurLayerColor 参数指定当前图层的颜色。

     (j)acedCommand 函数:

    acedCommand 函数的定义形式为:

    int acedCommand(int rtype, ... unnamed);

    该函数的参数个数是可变的,并且参数成对出现。参数对中第一个参数表示参数的类型,第二个表示其实际的数据。参数表的最后一个参数必须是0或者RTNONE(使用RTNONE更好一些)。

    acedCommand 函数具体用法如例:

    acedCommand(RTSTR, "Circle",RTSTR, “0,0,0”, RTSTR, “10”, RTNONE); 

    创建一个圆心为(0,0)、半径为10的圆。

     (k)acedCmd 函数:

    acedCmd 函数的定义形式为:

    int acedCmd(const struct resbuf * rbp);

    参数是一个 resbuf 类型的指针,这里需要的结果缓冲区可以由 acutBuildList 函数生成。

    (l)acutNewRb 函数:创建一个新的结果缓冲区,并为其分配存储空间。使用该函数分配的存储空间必须在不用的时候手工释放空间。

    (m)acutRelRb  函数:释放结果缓冲区链表的存储空间。

    (n)acedGetFileD 函数:文件对话框提示用户输入一个文件名。

    acedGetFileD 函数的定义形式为:

    int acedGetFileD(const char * title,const char * default,const char * ext,int flags,struct resbuf * result);

    第一个参数:title 指定对话框的标题;

    第二个参数:default 指定默认的文件名称;

    第三个参数:ext 指定默认的文件扩展名;

    第四个参数:flags 参数用一个位值控制对话框的样式;

    第五个参数:result 参数包含了用户选择的文件名和路径。

    (o)

    (p)

    (2)AcDbObject 类:所有实体对应的类都间接继承于 AcDbObject 类

     clone 函数:生成一个调用者的克隆对象,并返回指向克隆对象的指针,clone 函数仅仅会生成对象的一个克隆,对于实体对象来说,这样还没有完成复制操作的全部。还必须把它添加到模型空间中才能被显示出来;

    clone函数的定义形式为:

    virtual AcRxObject* clone() const;

    cast 函数:类型转换,实体转为多段线、文本、直线等。。。。。。

    AcDbEntity *pEnt;
    AcDbPolyline *pPoly = AcDbPolyline::cast(pEnt);

    isKindOf 函数:判断是否是实体是什么类型

    if (pEnt->isKindOf(AcDbPolyline::desc()) == Adesk::kTrue)
    //是多段线

    (3)AcDbEntity类:继承与AcDbObject类,

    (a)layer 函数:获得实体所在图层的名字。acutDelString函数:释放layer函数返回的字符串所占用的内存。

    具体用法如例:

    char *layerName = pEnt->layer();
    if (strcmp(layerName, "测试") == 0)
    {
    // 执行需要的
    ……
    }
    acutDelString(layerName );

    (b) layerId 函数:获得实体所在图层的 ID。

    (c) transformBy函数:对实体进行几何变换;https://my.oschina.net/u/2930533/blog/1501531

    transformBy函数的定义形式为:

    virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);

    具体用法如例:

    AcGeMatrix3d mat;
    pEnt->transformBy(mat);

    (d)getOsnapPoints 函数:得到捕捉点

    getOsnapPoints函数的定义形式为:

    ACDB_PORT ADESK_SEALED_VIRTUAL Acad::ErrorStatus getOsnapPoints(AcDb::OsnapMode osnapMode,  Adesk::GsMarker gsSelectionMark, const AcGePoint3d& pickPoint,  const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform,  AcGePoint3dArray& snapPoints, AcDbIntArray & geomIds) const;

    第一个参数:osnapMode:捕捉点模式:AcDb::kOsModeEnd:找到实体上离pickPoint最近的端点;AcDb::kOsModeMid:找到实体上离pickPoint最近的中点(直线,圆弧等的中点); AcDb::kOsModeCen:圆心点;AcDb::kOsModeNode:节点;AcDb::kOsModeQuad:象限点;AcDb::kOsModeIns :插入点;AcDb::kOsModePerp:过lastPoint点的垂足;AcDb::kOsModeTan:过lastPoint点的切点;AcDb::kOsModeNear:找到离pickPoint最近的实体上的点;

    第二个参数:gsSelectionMark:gs标记(如果没有设置,就默认GS标记值0,0 为实体本身,一般AcDbBlockReference和AcDbPolyline用到);

    第三个参数:pickPoint:当前鼠标所在的点(WCS坐标系);

    第四个参数:lastPoint:pickPoint之前选择的点,用来确定垂直和切线的对象捕捉值;

    第五个参数:viewXform:将WCS转为DCS的坐标转换矩阵;

    第六个参数:snapPoints:将生成的捕捉点添加到数组中去,可以添加0个或多个;

    第七个参数:geomIds:未使用.

    (e)getGripPoints 函数:得到夹点

    getGripPoints函数的定义形式为:

    Acad::ErrorStatus getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray & osnapModes, AcDbIntArray & geomIds) const;

    第一个参数:gripPoints:夹点数组

     第二个参数:osnapModes:未使用

    第三个参数:geomIds:未使用

    Acad::ErrorStatus getGripPoints(AcDbGripDataPtrArray& grips, const double curViewUnitSize, const int gripSize, const AcGeVector3d& curViewDir, const int bitflags) const;

    第一个参数:grips:夹点数组

    第二个参数:curViewUnitSize:当前视图中一个绘图单元的大小(以像素为单位)

    第三个参数:gripSize:夹点大小,以像素为单位

    第四个参数:curViewDir:当前视图端口中的视图方向的向量

    第五个参数:bitflags:标识

    (f)meveGripPointsAt 函数:编辑夹点

    moveGripPointsAt函数的定义形式为:

    Acad::ErrorStatus moveGripPointsAt(const AcDbIntArray & indices,  const AcGeVector3d& offset);

     第一个参数:indices:"热的"夹点数组

    第二个参数:offset:夹点平移的方向和大小

    Acad::ErrorStatus moveGripPointsAt(const AcDbVoidPtrArray& gripAppData, const AcGeVector3d& offset, const int bitflags);

    第一个参数:gripAppData:移动的夹点

    第二个参数:offset:WCS坐标系中,夹点平移的方向和大小

    第三个参数:bitflags:保留供将来使用,目前为零

    (g)getSubentPathsAtGsMarker 函数:

    getSubentPathsAtGsMarker函数的定义形式为:

    ACDB_PORT ADESK_SEALED_VIRTUAL Acad::ErrorStatus getSubentPathsAtGsMarker(AcDb::SubentType type, Adesk::GsMarker gsMark, const AcGePoint3d& pickPoint, const AcGeMatrix3d& viewXform, int& numPaths, AcDbFullSubentPath*& subentPaths,  int numInserts = 0,  AcDbObjectId* entAndInsertStack = NULL) const;
    

    第一个参数:type:输入子实体类型(AcDb::kFaceSubentType:面, AcDb::kEdgeSubentType:边, AcDb::kVertexSubentType顶点, AcDb::kMlineSubentCache :线);

    第二个参数:gsMark:输入子实体的gs标识,从 ads_ssnamex()/acedSSNameX()获得;

    第三个参数:pickPoint:当前鼠标所在的点(WCS坐标系);

    第四个参数:viewXform:输入转换矩阵,WCS转DCS;

    第五个参数:numPaths:输出subentPaths数组中的AcDbFullSubentPath对象的个数;

    第六个参数:subentPaths:输出动态分配的地址数组;

    第七个参数:numInserts :在entAndInsertStack中AcDbBlockReferences输入的对象id数量,第一个是实体本身,所以少一个;

    第八个参数:entAndInsertStack:

    (4)AcEdCommandStack类:(命令堆栈)来添加和删除命令

    (a) addCommand 函数:用来向 AutoCAD 注册一个外部命令

    addCommand 函数的定义形式为:

    virtual Acad::ErrorStatus addCommand(const char* cmdGroupName,const char* cmdGlobalName,const char* cmdLocalName,Adesk::Int32 commandFlags,AcRxFunctionPtr FunctionAddr,AcEdUIContext * UIContext = NULL,int fcode = -1,HINSTANCE hResourceHandle = NULL,AcEdCommand** cmdPtrRet = NULL) = 0;

    前面的5个参数,分别用来指定命令组名称、命令的国际名称、命令的本国名称、命令的类型(模态命令或者透明命令等)和指向实现函数的指针。

    addCommand 具体用法如例:

    void initApp()
    {
            acedRegCmds->addCommand("Hello1","Hello", "Hello", ACRX_CMD_MODAL,HelloWorld);
    }

    acedRegCmds 宏提供了一个指向 AcEdCommandStack 类的指针

    ACRX_CMD_MODAL: 在别的命令执行的时候该命令不会在其中执行 ;ACRX_CMD_SESSION : 防止CAD自动锁定到当前文档 ; ACRX_CMD_TRANSPARENT: 命令可以再其它命令中执行,但在该标志下ads_sssetfirst()不能使用(http://blog.csdn.net/arthurfangmc/article/details/6907312) 。

    (b)removeGroup 函数用来删除已经存在的一个外部命令组,以及保存在其中的所有命令。

    removeGroup函数的具体用法如例:

    acedRegCmds->removeGroup("Hello1");

    ACED_ARXCOMMAND_ENTRY_AUTO的具体用法如例:

    ACED_ARXCOMMAND_ENTRY_AUTO(CCreateEntsApp, HHL, CreateEntsLine, CreateLine, ACRX_CMD_TRANSPARENT, NULL);

    第二个参数HHL代表事件响应函数的前缀,

    第三个参数是事件响应函数名称,

    第四个参数是命令名称

    在acrxEntryPoint.cpp中要实现该命令的事件响应函数 HHLCreateEntsLine:

    static void HHLCreateEntsLine(void)
        {
            AcGePoint3d ptStart(0, 0, 0);
            AcGePoint3d ptEnd(100, 100, 0);
            AcDbObjectId lineId;
            lineId = CCreateEnt::CreateLine(ptStart, ptEnd);
            CModifyEnt::ChangeColor(lineId, 1);
            CModifyEnt::ChangeLayer(lineId, _T("虚线"));
            CModifyEnt::ChangeLinetype(lineId, _T("中心线"));
        }

    这样在AutoCAD的命令窗口输入“CreateLine”,就会去执行HHLCreateEntsLine函数,画一条红色的虚直线

    (5)AcDbDatabase 类:图形数据库

    getSymbolTable 函数: 从数据库获得符号表

    getBlockTable 函数,用于获得指向图形数据库的块表的指针。具体定义形式和用法参考另外一篇博客https://my.oschina.net/u/2930533/blog/759568

    getLayerTable 函数:从数据库获得层表,参数以及用法参照getBlockTable。

    setClayer 函数能够设置图形的当前图层。

    (6) AcDbSymbolTable 类:所有的符号表都继承自 AcDbSymbolTable 类

    (a)add 函数:向符号表添加一条新的记录,各种符号表实现的形式略有不同。

    (b)getAt 函数:获得符号表中特定名称的记录

    (c)has 函数:判断符号表中是否包含指定的记录,找到返回true,否则返回 false。

    has 函数的具体用法如例:

    // 判断是否存在名称为“测试”的图层
    AcDbLayerTable *pLayerTbl;
    if (!pLayerTbl->has("测试"))
    {
    acutPrintf("
    当前图形中未包含"测试"图层!");
    pLayerTbl->close();
    return;
    }

    (d)newIterator:创建一个符号表遍历器,访问符号表中的所有记录。

    newIterator 函数的具体用法如例:

    AcDbBlockTableRecordIterator *pItr;
    pBlkTblRcd->newIterator(pItr);

    (7)AcDbBlockTable 类:块表,继承 自AcDbSymbolTable 类,继承了has,getAt,add,newIterator等函数,参数以及用法参照AcDbSymbolTable类。

    (8)AcDbBlockTableRecord 类:

    (a)appendAcDbEntity 函数:用于将 pEntity 指向的实体添加到块表记录和图形数据库中。具体定义形式和用法参考另外一篇博客https://my.oschina.net/u/2930533/blog/759568

    (b) hasPreviewIcon 函数:用于判断指定的块表记录是否包含预览图标

    hasPreviewIcon 函数定义为:

    Acad::ErrorStatus getPreviewIcon(PreviewIcon & previewIcon) const;

    参数:PreviewIcon:在 ObjectARX 中被定义为:typedef AcArray<Adesk::UInt8> PreviewIcon;要从该数组中获得块定义的预览图标。

    (c)getPreviewIcon 函数:可以从块表记录中获得预览图标的相关数据

    (9)AcDbBlockTableRecordIterator类:块表记录遍历器,遍历器在使用完毕后一定要删除。

    (a)getEntity函数:获得遍历器的每一个实体;

    具体用法如例:

    pItr->getEntity(pEnt, AcDb::kFrWrite);

    (10)AcDbLayerTable类:层表,继承 自AcDbSymbolTable 类,继承了has,getAt,add,newIterator等函数,参数以及用法参照AcDbSymbolTable类。

    (11)AcDbLayerTableRecord 类:

    setColor 函数:设置图层的颜色。

    setLinetypeObjectId 函数:设置图层的线型。

    setLineWeight 函数:设置图层的线宽。

    (11)AcDbTextStyleTable类:文字样式表

    (12)AcDbTextStyleTableRecord 类:文字样式表记录

    setName函数:设置名称

    setFileName函数:设置字体文件名称

    具体用法如例:

    // 创建新的字体样式表记录
    AcDbTextStyleTableRecord *pTextStyleTblRcd = NULL;
    pTextStyleTblRcd = new AcDbTextStyleTableRecord();
    
    // 设置字体样式表记录的名称
    pTextStyleTblRcd->setName("仿宋体");
    // 设置字体文件名称
    pTextStyleTblRcd->setFileName("simfang.ttf");

    setFont函数:设置字体

    setFont函数定义为:

    Acad::ErrorStatus setFont(const ACHAR* pTypeface, Adesk::Boolean bold, Adesk::Boolean italic, int charset,  int pitchAndFamily);
    

    第一个参数:pTypeface:字体类型;

    第二个参数:bold:是否粗体;

    第三个参数:italic:是否斜体;

    第四个参数:charset:Windows字符集标识符;

    第五个参数:pitchAndFamily:Windows间距和字符族标识符;

    具体用法如例:

    pTextStyleTblRcd->setFont("楷体_GB2312",0,0,134,49);

    (11)AcDbLine类:直线;需要头文件#include "dbents.h"

    AcGePoint3d ptStart(0, 0, 0);
    AcGePoint3d ptEnd(100, 100, 0);
    AcDbLine *pLine = new AcDbLine(ptStart, ptEnd);(正确)//必须在堆上创建对象
    AcDbLine line(ptStart, ptEnd);(不正确)//直线对象仅被在内存上创建,并没有添加到图形数据库中,因此不可能会显示在
    图形窗口中。
    

    (12)AcDbPolyline类:轻量多段线;AcDb3dPolyline:三维多段线;AcDb2dPolyline:不常见

    AcDb3dPolyline 构造函数定义为:

    AcDb3dPolyline *pPoly3d = new AcDb3dPolyline(AcDb::k3dSimplePoly, points);

    第一个参数:AcDb::k3dSimplePoly 表示创建的多段线是一个未经拟合的标准多段线;

    第二个参数值指定了创建三维多段线的顶点数组;

    第三个参数指定是否闭合多段线,这里使用了默认参数值,不在创建多段线时将其闭合。

    (a)numVerts 函数:多段线的顶点数.

    numVerts 函数定义为:

    unsigned int numVerts() const;
    

    (b)getPointAt 函数:得到顶点坐标

    getPointAt 函数定义为:

    Acad::ErrorStatus getPointAt( unsigned int index, AcGePoint2d& pt) const
    
    Acad::ErrorStatus getPointAt( unsigned int index, AcGePoint3d& pt) const;

    具体语法如例:

    AcDbPolyline polyline;
    for (int nIndex = 0; nIndex < polyline->numVerts(); ++nIndex)
    	{
    		OdGePoint3d ptTemp;
    		polyline->getPointAt(nIndex,ptTemp);
    	}

    (c)addVertexAtget 函数,将每一个顶点添加到多段线中

    addVertexAt 函数定义为:

    Acad::ErrorStatus addVertexAt(unsigned int index, const AcGePoint2d& pt, double bulge = 0., double startWidth = -1., double endWidth = -1);

    第一个参数:index 用来指定插入顶点的索引号(从 0 开始);

    第二个参数:pt 指定顶点的位置;

    第三个参数:bulge 指出要创建的顶点的凸度(0 表示直线,1 表示半圆(逆时针),-1:半圆(顺时针)介于 0~1 之间为劣弧,大
    于 1 为优弧);

    第四,五个参数:startWidth 和 endWidth 指定了从该顶点到下一顶点之间连线的起始和终止线宽,利用该特性可以使用多段线创建一个实心箭头。

    (d)setPointAt 函数:设置顶点坐标(没有提供AcGePoint3d)

    setPointAt 函数定义为:

    Acad::ErrorStatus setPointAt(unsigned int index, const AcGePoint2d& pt);

    (e)getLineSegAt 函数:得到线段

    getLineSegAt 函数定义为:

    Acad::ErrorStatus getLineSegAt(unsigned int index, AcGeLineSeg2d& ln) const;

    第一个参数:index:索引,从0开始.

    第二个参数:AcGeLineSeg2d:线段

    (f)setClosed 函数:闭合

    setClosed (Adesk::kTrue);

    (13)AcDbText 类,用于 创建文字对象; AcDbMText:多行文本

    构造函数定义为:

    
    AcDbText( const AcGePoint3d& position,const char* text,AcDbObjectId style = AcDbObjectId::kNull,double height = 0,double rotation = 0);

    第一个参数:position 指定文字的插入点(文本右上角);

    第二个参数:text 是将要创建的文字对象的内容;

    第三个参数:style 指定要使用的文字样式的 ID,默认情况下使用 AutoCAD 中缺省的文字样式;

    第四个参数:height 为文字的高度;

    第五个参数rotation 为文字的旋转角度。

    需要头文件#include " dbmtext.h " 

    AcDbMText构造无参数,添加到模型空间之前用 setTextStyle() 和 setContents ()等来设置

    AcDbMText *pMText = new AcDbMText();
    // 设置多行文字的特性
    pMText->setTextStyle(style);
    pMText->setContents(text);
    pMText->setLocation(ptInsert);
    pMText->setTextHeight(height);
    pMText->setWidth(width);
    pMText->setAttachment(AcDbMText::kBottomLeft);
    
    //添加到空间模型
    CCreateEnt::PostToModelSpace(pMText);

    (14)AcDbCircle类:圆;

    AcDbCircle();
    AcDbCircle(const AcGePoint3d& cntr, const AcGeVector3d& nrm, double radius);

    (15)AcGeCircArc2d 类:几何类的圆弧;需要头文件#include "gearc3d.h"

    (16)AcDbAr 类:圆弧

    构造函数定义为:

    AcDbArc(const AcGePoint3d& center,double radius,double startAngle,double endAngle);
    AcDbArc(const AcGePoint3d& center,const AcGeVector3d& normal,double radius,double startAngle,double endAngle);
    AcDbArc();

    (17)AcDbEllipse 类:椭圆;需要头文件#include " dbelipse.h "

    构造函数定义为:

    AcDbEllipse( const AcGePoint3d& center,const AcGeVector3d& unitNormal,const AcGeVector3d& majorAxis,double radiusRatio,double startAngle = 0.0,double endAngle = 6.28318530717958647692);

    第一个参数:center: 椭圆的中心;

    第二个参数:unitNormal :椭圆所在的平面;

    第三个参数:majorAxis 输入代表 1/2长轴的矢量, 也就是说该矢量的起点是椭圆的中心, 终点是椭圆长轴的一个端点;

    第四个参数:radiusRatio:椭圆短轴与长轴的长度比例(为1时,椭圆变成圆);

    第五个参数:startAngle: 椭圆的起始角度(弧度) ;

    第六个参数:endAngle: 椭圆的终止角度(弧度)

    (17)AcDbSpline 类:样条曲线;需要头文件#include " dbspline.h "

    构造函数定义为:

     AcDbSpline( const AcGePoint3dArray& points, int  order = 4,  double fitTolerance = 0.0);

    第一个参数:points:样条曲线的拟合点;

    第二个参数:order:拟合曲线的阶数;

    第三个参数:fitTolerance:允许的拟合误差。

    AcDbSpline(const AcGePoint3dArray& points,const AcGeVector3d& startTangent,const AcGeVector3d& endTangent,int order = 4, double fitTolerance = 0.0);

    第一个参数:points:样条曲线的拟合点;

    第二个参数:startTangent:样条曲线起点切线方向;

    第三个参数:endTangent:样条曲线终点的切线方向;

    第四个参数:order:拟合曲线的阶数;

    第五个参数:fitTolerance:允许的拟合误差。

    (18)AcDbRegion 类:面域。需要头文件#include " dbregion.h "

    (a)createFromCurves:

    createFromCurves 函数的定义为:

    static Acad::ErrorStatus createFromCurves(const AcDbVoidPtrArray& curveSegments,AcDbVoidPtrArray& regions);

    第一个参数:curveSegments:指向曲线实体的指针数组(定义面域的边界,面域边界的曲线必须首尾相连);

    第二个参数:regions:指向新创建的面域的指针数组。

    注:面域边界的对象必须是 AcDbLine、 AcDbArc、 AcDbEllipse、AcDbCircle、AcDbSpline、AcDb3dPolyline 或 AcDbPolyline 类的对象。

    (19)AcDb3dSolid 类:三维实体。ACIS 实体才是实体真正的几何表示, AcDb3dSolid 类只是 ACIS 实体的容器和接口, 该类中并没有提供直接操作 ACIS实体边、顶点和面的方法。要遍历 ACIS 实体中隐含(无法直接访问子实体)的边、面和顶点,必须使用 ObjectARX 开发包中的 BREP 应用程序开发接口(API) 。

    (a)createBox:创建长方体。一个中心位于世界坐标系原点的长方体,并且其长、宽、高分别平行于世界坐标系的 X、Y 和 Z 轴。

    createBox函数定义为:

    virtual Acad::ErrorStatus createBox(double xLen, double yLen, double zLen);

    第一个参数:xLen:长方体的长;

    第二个参数:yLen:长方体的宽;

    第三个参数:zLen:长方体的高。

    (b)createFrustum:创建平截头体(圆柱体、圆锥体)。

    createFrustum 函数定义为:

    virtual Acad::ErrorStatus createFrustum(double height,double xRadius,double yRadius,double topXRadius);

    第一个参数:height:平截头体的高度;

    第二个参数:xRadius:底面在 X 轴方向的半径;

    第三个参数:yRadius:底面在 Y轴方向的半径;

    第四个参数:topXRadius:顶面在 X 轴方向的半径;(圆锥时topXRadius为0, xRadius 和 yRadius 的值相等)

    (c)createSphere:创建小球。

    (d)createTorus:圆环。

    (e)createWedge:创建楔形

    (f)extrudeAlongPath :拉伸面域创建实体。

    extrudeAlongPath函数定义为:

    virtual Acad::ErrorStatus extrudeAlongPath(const AcDbRegion* region,const AcDbCurve* path);

    第一个参数:region:指向拉伸截面的面域的指针;

    第二个参数:path:指向拉伸路径的曲线指针。

    (g)extrude:沿面域所在平面的法线方向拉伸面域创建新的实体,并且可以指定拉伸时的斜切角度。

    (h) revolve :绕给定的轴线旋转面域而生成实体。

    revolve函数定义为:

    virtual Acad::ErrorStatus revolve(const AcDbRegion* region,const AcGePoint3d& axisPoint,const AcGeVector3d& axisDir,double angleOfRevolution);

    第一个参数:region:指向旋转截面的面域的指针;

    第二个参数:axisPoint:旋转轴线上的一点;

    第三个参数:axisDir:旋转轴的方向;

    第四个参数:angleOfRevolution:旋转面的角度;(axisPoint和axisDir共同确定旋转轴的具体位置)

    (i)booleanOper:两个实体之间执行布尔运算。

    booleanOper函数定义为:

    virtual Acad::ErrorStatus booleanOper(AcDb::BoolOperType operation,AcDb3dSolid* solid);

    第一个参数:operation:布尔运算的方式(AcDb::kBoolUnite:并集 、AcDb::kBoolIntersect:交集和 AcDb::kBoolSubtract:差集);

    第二个参数:solid:指向布尔运算的另一个实体的指针。

    (20)AcDbBlockReference 类:块参照

    构造函数定义为:

    AcDbBlockReference(const AcGePoint3d& position,AcDbObjectId blockTableRec);

    第一个参数:position: 块参照的插入点;

    第二个参数:blockTableRec :块参照所参照的块表记录(块定义)的 ID。

    (a)rotation :旋转角度;

    AcDbObjectId blkRefId;
    double dAngle = 0.0;
    AcDbObject *pObj = NULL;
    acdbOpenObject(pObj,blkRefId,AcDb::kForRead);
    AcDbBlockReference *pBlkRef = AcDbBlockReference::cast(pObj);
    if (NULL != pBlkRef)
    {
    	dAngle = pBlkRef->rotation();
    }
    //如果需要0~180° 
    dAngle = dAngle *180/3.1475926;
    //在转回来
    dAngle = dAngle *PI/180;

    (21) AcDbAttributeDefinition 类: AcDbText 类的一个派生类, 属性定义对象,属性定义是 AutoCAD的一种图形对象(对应于 AutoCAD 中的“属性” ) ,可以直接创建该类的一个对象,然后将其添加到块表记录中。

    构造函数定义为:

    AcDbAttributeDefinition(const AcGePoint3d& position,const char* text,const char* tag,const char* prompt,AcDbObjectId style = AcDbObjectId::kNull);

    第一个参数:position: 属性定义的插入点;

    第二个参数:text: 属性定义默认的显示文字;

    第三个参数:tag: 属性定义的标记文字;

    第四个参数:prompt: 属性定义的提示文字;

    第五个参数:style :文字样式表记录的 ID,用来指定属性定义所使用的文字样式。

    (22)AcGeMatrix3d类:是一个几何类,用于表示一个四维矩阵。

    (a)setToTranslation:设置某个矢量为移动基准的移动变换

    (b)setToRotation:设置绕某一点旋转一定角度的旋转变换。

    (c)setToScaling:设置以某一个基点缩放变换

    (d)setToMirroring:设置以某一点进行对称的镜像变换。

    具体语法如例:

    // 构建用于实现移动实体的矩阵
    	AcGeVector3d vec(ptTo[X] - ptFrom[X], ptTo[Y] - ptFrom[X], ptTo[Z] - ptFrom[Z]); 
    	AcGeMatrix3d mat;
    	mat.setToTranslation(vec);

    (23)AcCmColor 类: 代表颜色对象,可以通过颜色索引来构建一个新的颜色对象。通过颜色索引,可以将【选择颜色】对话框的结果设置为指定图层的颜色。

    (a)colorIndex函数:得到颜色的索引值。

    (b)setColorIndex 函数:设置颜色的索引值。

    (24)AcGePoint2dArray  类:二维点数组,成员类型为AcGePoint2d(AcGePoint3dArray:成员AcGePoint3d)

    AcGePoi d::kOrigin:世界坐标系的原点;AcGeVector3d(0, 1, 0):矢量; AcGePoint3d(10, 10, 0):点。

    append 函数:向数组中添加一个二维点

    append函数的具体用法如例:

    AcGePoint2dArray points;
    AcGePoint2d ptStart;
    AcGePoint2d ptEnd;
    points.append(ptStart);
    points.append(ptEnd);

    removeAt 函数:从数组中删除指定的元素

    length 函数:数组长度

    (25)AcGeCurve3d类:直线,圆,椭圆,圆弧等的几何父类

    (a)getClosestPointTo函数:求实体上离输入点最近的点.

    getClosestPointTo函数定义为:

    void getClosestPointTo(const AcGePoint3d& pnt, AcGePointOnCurve3d& pntOnCrv, const AcGeTol& tol = AcGeContext::gTol) const;
    

    第一个参数:pnt:输入的参考点;

    第二个参数:pntOnCrv:实体上离输入点最近的输出点;

    第三个参数:tol :公差

    void getClosestPointTo( const AcGeCurve3d& curve3d,  AcGePointOnCurve3d& pntOnThisCrv,AcGePointOnCurve3d& pntOnOtherCrv, const AcGeTol& tol = AcGeContext::gTol) const;
    

    第一个参数:curve3d:输入参考实体;

    第二个参数:pntOnThisCrv:输出实体上离输入实体上最近的点;

    第三个参数:pntOnOtherCrv:输出输入实体上离实体最近的点;

    第四个参数:tol :公差

    getClosestPointTo函数的具体用法如例:

    OdGePoint3d startPoint,endPoint;
    OdGeLine3d line3d(startPoint,endPoint);         
    OdGePointOnCurve3d tmpPt;
    line3d.getClosestPointTo(lastPoint,tmpPt);
    OdGePoint3d ptTemp=tmpPt.point();
  • 相关阅读:
    RoIPooling、RoIAlign笔记
    ROI Align 的基本原理和实现细节
    ROI Align详解
    GIT总结
    java-变量,函数 下
    linux设置静态ip地址
    技术参考网站-网址
    python
    python
    python
  • 原文地址:https://www.cnblogs.com/mjgw/p/12392207.html
Copyright © 2011-2022 走看看