精华内容
下载资源
问答
  • CAD创建属性块

    千次阅读 2019-07-09 10:49:01
    创建属性块 属性块就是在图块上附加一些文字属性(Attribute),这些文字不同于嵌入到图块内部的普通文字,无需分解图块,就可以非常方便地修改。属性块被广泛应用在工程设计和机械设计中,在工程设计中会用属性块...

    创建属性块

    1、属性块就是在图块上附加一些文字属性(Attribute),这些文字不同于嵌入到图块内部的普通文字,无需分解图块,就可以非常方便地修改。属性块被广泛应用在工程设计和机械设计中,在工程设计中会用属性块来设计轴号、门窗、水暖电设备等,在机械设计中会应用与粗糙度符号定制、图框标题栏、明细表等。例如建筑图中的轴号就是同一个图块,但属性值可以分别是1、2、3等,如下图所示。

    图片3.png

    2、利用属性块我们可以将类似的图形定义成一个图块,通过改变属性来调整图块的显示。当图块中有一些文字属性需要经常修改的时候,我们就可以在图块中添加属性文字,并定义成属性块。

    3、属性块的定义其实非常简单,就是画好图形,定义好属性文字,然后一起选中定义成图块就可以了,下面我们就用轴号这个简单的属性块来介绍一下定义的方法。

    (1)绘制好图块内部的图形,对于轴号来说就是一个圆,我们绘制一个半径为5的圆,如下图所示。

    图片4.png

    (2)在菜单中选择:绘图>块>定义属性,或者直接输入命令MX_ATTDEF,调用定义属性的命令,打开“定义属性”对话框,如下图所示。

    图片5.png

    4、标记就是告诉我们这个属性值是干什么的,比如是宽度、长度、图纸名、审核人,比如这个轴号我么可以写上AXISNO。

    5、提示就是当我们插入一个属性块,需要我们依次输入属性时,命令行弹出的提示,这个可以写的简单,也可以输入的复杂,比如我们可以写上:请输入轴号。提示也可以不输入,如果不输入提示,标记将作为提示。

    6、默认就是属性的一个默认值,比如轴号,可以将默认值设置为1,在插入的时候我们可以输入其他数值,或者插入后可以编辑成其他数值。

    7、其他参数暂时可以忽略,如下图所示。

    图片6.png

    (1)单击确定按钮关闭对话框,将属性文字定位到圆的中心位置,如下图所示。

    图片7.png

    (2)将圆和属性文字一起选中,输入BLOCK,回车,打开图块定义对话框,给图块命名为AXISNO,将图块基点指定到圆心或下面的象限点位置,如下图所示。

    图片8.png

    (3)单击确定按钮,关闭图块定义对话框,点击插入图块,此时会弹出编辑属性对话框,在此对话框中会显示我们之前设置的相关值,而且可以看到图块中标记也变成默认值,如下图所示。

    图片9.png

    (4)直接确定关闭编辑属性对话框,使用默认值,看看我们定义的属性块,如下图所示。

    图片10.png

    (5)双击其中一个图块,就会弹出增强属性编辑器,在这里我们可以将属性值修改成其他需要的值。

    展开全文
  • 在张帆老师的教程中,有VC6.0+ObjectArx2002创建对话框的详细指导,但由于项目需要,开发环境...本文将创建一个在对话框中查看定义图标的程序,通过对实现流程和源代码的讲解,详细介绍ObjectArx2010+VC2008开发MFC

    在张帆老师的教程中,有VC6.0+ObjectArx2002创建对话框的详细指导,但由于项目需要,开发环境选择了Win7+VC2008+ObjectArx2010+CAD2010,虽然基本思路和流程依然可以参考张帆老师的教程,但事过境迁,完全照着教程做已经走不通了!本文将创建一个在对话框中查看块定义图标的程序,通过对实现流程和源代码的讲解,详细介绍ObjectArx2010+VC2008开发MFC对话框程序的方法和过程。

    要实现在对话框中显示块定义的缩略图,就需要读者熟悉VC位图编程的基本知识,你也可以参考文章VC打开并缩放显示位图(.BMP)文件的方法以及VC编程实现位图处理类(显示位图、加载位图、获取/设置像素点颜色)。本文还用到了CComboBox控件罗列当前图形中用户定义的所有块表记录,关于CComboBox的更多用法,读者可以参考MFC程序使用CComboBox控件详解。好了,准备工作已经完成,我们正式开始创建属性定义查看对话框。

    Step 1:新建项目

    创建一个ObjectArx项目,点击MFC Support选项卡,在MFC Support的设置选中Extension DLL Using Shared DLL,如图所示:

    新建ObjectArx2010项目


    其余设置保持默认,点击Finish完成项目的创建。

    Step 2:添加对话框资源

    在新建的项目上点击鼠标右键,在添加子菜单选择资源,添加一个Dialog资源到项目中,对话框的最终布局如图:



    ObjectArx2011块属性查看对话框

    各控件的ID设置为:

           对话框:IDD_BLKPREVIEWICON。
           列表框:IDC_BLKDEF_LIST。
           图片框:IDC_BITMAP。
           块参照数量文本框:IDC_NUM_BLKDEF。
           是否包含属性文本框:IDC_HAS_ATT。
           “关闭”按钮:IDCANCEL。

    Step 3: 添加对话框类

    在完成对话框的布局和ID设置以后,就应该开始设计对话框管理的类了,由于本人的ObjectArx2010与VS2008中文版没有很好的兼容,张帆老师所说的“ObjectArx MFC Support”工具栏没有找到,于是我们先创建普通的对话框,最后手动将基类CDialog改成CAcUiDialog即可。在对话框设计区域点右键,选择“添加类”,类名设置成“CPreviewBlkDlg",基类选择CDialog,点完成。

    Step 4: 添加控件关联的变量

    逐个右击窗体中的控件,在弹出菜单中点”添加变量“,最终的结果如下: 

    1
    2
    3
    4
    DDX_Control(pDX, IDC_BLKDEF_LIST, m_lstBlkDef);
    DDX_Control(pDX, IDC_BITMAP, m_bitmap);
    DDX_Text(pDX, IDC_NUM_BLKDEF, m_strBlkRefNum);
    DDX_Text(pDX, IDC_HAS_ATT, m_strHasAttribute);

    变量类型:

    1
    2
    3
    4
    CComboBox m_lstBlkDef;
    CStatic m_bitmap;
    CString m_strBlkRefNum;
    CString m_strHasAttribute;

    Step 5: 添加实现函数

    5.1 重写窗体的初始化虚函数OnInitDialog,实现程序启动时在CComboBox控件中加载当前图形的块定义列表,你可以使用向导或者手动添加的方式完成。OnInitDialog函数的完整代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    BOOL CPreviewBlkDlg::OnInitDialog()
    {
        CAcUiDialog::OnInitDialog();
     
        // 获得当前图形的块表
        AcDbBlockTable *pBlkTbl;
        AcDbBlockTableRecord *pBlkTblRcd;
        acdbHostApplicationServices()
            ->workingDatabase()
            ->getBlockTable(pBlkTbl,AcDb::kForRead);
     
        //遍历块表,获得用户自定义块表记录的名称,将其添加到组合框中
        AcDbBlockTableIterator *pItr;
        pBlkTbl->newIterator(pItr);
        for(pItr->start();!pItr->done();pItr->step()){
            pItr->getRecord(pBlkTblRcd,AcDb::kForRead);
     
            ACHAR* pName;
            pBlkTblRcd->getName(pName);
            CString strName(pName);
            acutDelString(pName);
     
            if(strName.Compare(ACDB_MODEL_SPACE)!=0&&
                strName.Compare(ACDB_PAPER_SPACE)!=0&&
                strName.Compare(_T("*Paper_Space0"))!=0){
                    m_lstBlkDef.AddString(strName);
            }
            pBlkTblRcd->close();
        }
        delete pItr;
        pBlkTbl->close();
     
        return TRUE;
    }

    这段代码展示了获得当前图形块表、遍历块表以及组合框控件CComboBox添加元素的方法。

    5.2 添加CComboBox控件的CBN_SELCHANGE消息响应函数OnCbnSelchangeBlkdefList,处理CComboBox控件选定内容更改事件,OnCbnSelchangeBlkdefList函数的完整代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    void CPreviewBlkDlg::OnCbnSelchangeBlkdefList()
    {
        //显示预览图标
        CPaintDC dc(this);
        AcDbBlockTable *pBlkTbl;
        acdbHostApplicationServices()
            ->workingDatabase()
            ->getBlockTable(pBlkTbl,AcDb::kForRead);
     
        AcDbObjectId blkTblRcdId;
        CString strBlkDefName;
        m_lstBlkDef.GetLBText(m_lstBlkDef.GetCurSel(),strBlkDefName);
        Acad::ErrorStatus es=pBlkTbl->getAt(strBlkDefName,blkTblRcdId);
     
        HBITMAP hBitmap=BlockIconToBMP(blkTblRcdId,dc.GetSafeHdc());
     
        m_bitmap.SetBitmap(hBitmap);
     
        //获得块表记录的指针
        AcDbBlockTableRecord *pBlkTblRcd;
        pBlkTbl->getAt(strBlkDefName,pBlkTblRcd,AcDb::kForRead);
     
        //获得块参照的数量
        AcDbBlockReferenceIdIterator *pItr;
        pBlkTblRcd->newBlockReferenceIdIterator(pItr);
        int number=0;
        for(pItr->start();!pItr->done();pItr->step()){
            number++;
        }
        m_strBlkRefNum.Format(_T("%d"),number);
     
        //获得块参照是否包含属性
        if(pBlkTblRcd->hasAttributeDefinitions()){
            m_strHasAttribute=_T("是");
        }else{
            m_strHasAttribute=_T("否");
        }
     
        pBlkTblRcd->close();
        pBlkTbl->close();
     
        UpdateData(FALSE);
    }

    这段代码展示了在对话框中显示位图的简单方法,也给出了获取当前图形中指定块参照数量的具体实现。在代码中,使用了函数BlockIconToBMP根据ID获取指定块定义的缩略图,下面将给出函数BlockIconToBMP的完整代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    // 获得指定的块表记录的预览图像,输入参数:块表记录的ID、设备描述表句柄
    HBITMAP CPreviewBlkDlg::BlockIconToBMP(const AcDbObjectId& blkId, HDC hdc)
    {
        Acad::ErrorStatus es;
        //块表记录指针
        AcDbBlockTableRecord *pBlkTblRcd=NULL;
        //保存预览图标的数组
        AcArray<Adesk::UInt8> icon;
     
        //获得保存块表记录的预览图标的数组
        try{
            es=acdbOpenObject(pBlkTblRcd,blkId,AcDb::kForRead);
     
            if(es!=Acad::eOk)
                throw 1;
     
            //如果块表定义不包含预览图标
            if(!pBlkTblRcd->hasPreviewIcon()){
                pBlkTblRcd->close();
                return NULL;
            }
     
            es=pBlkTblRcd->getPreviewIcon(icon);
            if(es!=Acad::eOk)
                throw 2;
     
            es=pBlkTblRcd->close();
            if(es!=Acad::eOk)
                throw 3;
        }catch(...){
            pBlkTblRcd->close();
            return NULL;
        }
     
        //由icon数组获得可显示的位图
        BITMAPINFOHEADER ih;    //位图信息头
        memcpy(&ih,icon.asArrayPtr(),sizeof(ih));
        size_t memsize=sizeof(BITMAPINFOHEADER)+((1<<ih.biBitCount)*sizeof(RGBQUAD));
        LPBITMAPINFO bi=(LPBITMAPINFO)malloc(memsize);    //位图信息
        memcpy(bi,icon.asArrayPtr(),memsize);
        HBITMAP hbm=CreateDIBitmap(hdc,&ih,CBM_INIT,icon.asArrayPtr()+memsize,bi,DIB_RGB_COLORS);
        free(bi);
     
        return hbm;
    }

    Step 6: 注册AutoCAD命令

    使用ObjectArx集成的工具栏注册一个新命令ViewBlk,在响应函数中完成模态对话框的调用,最终代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    // - CHAP3._ViewBlk command (do not rename)
    static void CHAP3_ViewBlk(void)
    {
        // 显示 “块定义查看器”对话框
        CAcModuleResourceOverride resOverride;    //防止资源冲突
        CPreviewBlkDlg dlg;
        dlg.DoModal();
    }

    由于使用了类CAcModuleResourceOverride,你需要添加头文件:

    #include "AcExtensionModule.h"

    到此,查看当前图形块定义属性的ObjectArx对话框应用程序便完成了,最终程序的运行效果如图:

    ObjectArx2010开发的块定义属性浏览应用程序

    展开全文
  • 每个图从一格AcDbBlockBegin对象开始,紧接着是一个或多个AcDbEntity对象,最后以AcDbBolckEnd对象结束,按其所属关系得层次结构分为三层:第一层为表,是属于数据库管理的根对象;第二层为表记录,是属于表...

    一.图块设计技术:

     

    AutoCAD数据库中,以各图块实际上市存储在块表记录里的实体集合。每个图块从一格AcDbBlockBegin对象开始,紧接着是一个或多个AcDbEntity对象,最后以AcDbBolckEnd对象结束,按其所属关系得层次结构分为三层:第一层为块表,是属于数据库管理的根对象;第二层为块表记录,是属于块表管理的对象;第三层为组成图块的实体对象,是属于块表记录管理的基本对象。因而,在AutoCAD数据库中,定义图块的第一个过程式向块表中加入一条新的块表记录,然后将组成图块的实体对象写入该块表记录中。

     

    1.AutoCAD数据库中图块的引用

    AutoCAD系统中插入已定义的块并不是将块中所有实体复制到数据库中,而是通过块引用机制向块表记录增加一个AcDbBlockReference类引用对象。所谓的块引用实际上是用户用Insert命令或ARX引用程序向AutoCAD数据库中插入的图块。在ARX应用程序中,利用定义的AcDbBlockReference类实例及相应的成员函数可以设置插入块的有关特性,如插入点、旋转角以及XYZ方向的比例系数等。插入不带属性的简单图块的编程技术相对比较简单,做法如下:

    A.创建一个指向AcDbBlockReference类对象实例的指针。

    B.调用该类的成员函数setBlockTableRecord()设置引用图块的ID号。

    C.调用该类的成员函数setPosition(),setRotation()setScaleFactors()分别设置块引用的插入点、旋转角和XYZ方向的比例系数等。

    D.打开当前图形模型空间的块表,利用getBlockTable()函数获得指向当前图形的块表指针。

    E.调用appendAcDbEntity()函数将块引用加入当前数据库模型空间块表记录中。

     

    2. 属性块的引用:

    在块定义中的附加属性信息必须通过调用AcDbBlockReference类的成员函数appendAttribute()才能加入到块引用中。

    定义属性块时,属性实质上是附加于构成图块的某一实体上的一个或多个非图形信息。因此,在插入属性时必须检索出属性块定义时的所有附加信息,然后将其附加于块引用的相应实体上,这就需要遍历块中的全部实体。

    通过属性块的ID号打开其块表记录,从而获得指向块表记录的指针。程序代码为:

    AcDbBlockTableRecord *pBlockDef; //定义指向块表记录的指针

    acdbOpenObject(pBlockDef,blockid,AcDb::kForRead); //获得指向块表记录的指针

    参数blockid为属性的ID号,然后,定义一个用于遍历块表记录的浏览器,获得指向块表记录的浏览器指针,如:

    AcDbBlockTableIterator *pIterator; //定义指向块表记录浏览器的指针

    pBlockDef->newIterator(pIterator); //获得指向块表记录的浏览器指针

    成员函数newIterator()用于创建块表记录的浏览器对象,参数pIterator为指向块表记录的浏览器指针。在此基础上建立一个循环结构,用于遍历图块中的全部实体,得到指向某一实体的指针,其结构如下:

    AcDbEntity *pEnt; //定义指向实体的指针

    AcDbAttributeDefinition *pAttdef; //定义指向属性定义的指针

    For (pIterator->state(); !pterator->done(); pIterator->step())

    {

    pIterator->getEntity(pEnt,AcDb::kForRead); //得到指向实体的指针

    pAttdef = AcDbAttributeDefinition::cast(pEnt); //得到指向属性定义的指针

    //处理属性插入的代码

    ……

    pEnt->close(); //关闭尸体对象

    }

    实体属性的插入代码的执行机理如下:

    1创建AcDbAttribute类对象,获得指向该对象的指针。

    如: AcDbAttribute *pAtt = new AcDbAttribute;

    2设置新建的AcDbAttribute类对象的属性值及特性,如属性位置,字高,旋转角度,属性文本等.

    3) . 调用appendAttribute()函数将属性附加于pBlkRef指向的块引用中。

    如: pBlkRef->appendAttribute(attid,pAtt);

    其中,pBlkRef为指向块引用的指针,pAtt为前面创建的AcDbAttribute类对象的指针。

     

    3. AutoCAD数据库中图块的检索

    对于AutoCAD数据库来说,图块的检索主要包括用户定义的有名块和图形中已插入的块引用两个方面。

    1先介绍当前图形数据库中块的检索技术:

    ads_tblnext()函数可以得到当前图形的数据库中表示块定义得链表,将改链表存储于结果缓冲区类型的变量中,利用结果缓冲区中的联合体成员就可以获得块名、基点等信息。重复调用ads_tblnext()函数将遍历整个数据库链表中的所有块表记录,从而得到全部已定义的图块信息。

    2) . 用户定义数据库中块的检索:

    对于在ARX应用中定义的其他数据库,只能用ARX库的函数才能检索出该数据库中所定义的图块,程序的主要设计技术如下:

    A. 利用AcDbBlockTable类的成员函数newIterator()创建块表浏览器.

    如: pBTable->newiterator(pBIterator);

    pBTableAcDbBlockTable类指针;pBIteratorAcDbBlockTableIterator类块表浏览器指针.

    B. 利用循环结构和块表浏览器遍历块表。

    C.利用AcDbBlockTableIterator类成员函数getRecord()获得块表记录。

    如:pIterator->getRecord(pBTRecord,AcDb::kForRead);

    D. 利用块表记录类的成员函数getName()得到块名。

    4. 块中实体的检索:

    在检索任意数据库中的图块时,主要是利用块表浏览器遍历块表,从而获得图块名。而在获得块名的前提下,利用ARX库提供的块表记录浏览器遍历块表记录中的所有实体,从而实现对块中实体的检索。方法为:

    A.用一种合适的方式获得图块名,得到指向该图快的块表记录。

    B.生成块表记录浏览器。

    C.遍历块中的多有实体,得到检索结果。

     

    现在知道图框的名字是A3,要求遍历图框中属性:pBlkRefAcDbBlockReference实体。

    AcDbObjectIterator *pBlkRefAttItr=pBlkRef->attributeIterator();

    for (pBlkRefAttItr->start(); !pBlkRefAttItr->done();pBlkRefAttItr->step())

    {

    AcDbObjectId attObjId;

    attObjId = pBlkRefAttItr->objectId();

     

    AcDbAttribute *pAtt = NULL;

    Acad::ErrorStatus es = acdbOpenObject(pAtt, attObjId, AcDb::kForRead);

    if (es != Acad::eOk)

    {

    acutPrintf("\nFailed to open attribute");

    delete pBlkRefAttItr;

    continue;

    }

    if (strcmp(pAtt->tag(),"TITLE:") == 0)

    {

    CString title = pAtt->textString();

    if (strcmp(title,"PROGRESS(D)") == 0)

    { //操作

    }

    else if (strcmp(title,"PROGRESS(P)") == 0)

    {

    //操作

    }

    }

    pAtt->close();

    }

     

    二.容器对象:符号表的操作和使用技术

    符号表的操作主要分为向符号表中加入一条符号表记录,符号表记录的检索和符号表记录中对象的处理等,每一种操作都是通过相应的符号表类提供的成员函数来实现的。

    1.层表的操作和使用技术:

    A.创建新层:

    1). 以写的方式调用getSymbolTable()函数打开当前数据库的层表,获得指向该表的指针。

    2) 调用构造函数AcDbLayerTableRecord()创建层表建立对象。

    3) 设置层名。

    4) 设置层的有关属性。

    5) 调用add()函数将层表记录加入到层表中。

    6) 关闭层表和层表记录。

     

    2. 层的属性设置和查询函数

    层的属性包括:颜色、冻结状态、锁定状态、开关状态、在新视口中层的冻结状态和线型,下面列出的设置和查询函数均是AcDbLayerTableRecord类的成员函数。

    A.设置颜色:setColor(const AcCmColor color);

    B.设置冻结状态:setIsFrozen(bool frozen);

    如果参数frozentrue表层冻结;frozenfalse表层冻结。

    C.设置锁定状态:setIsLocked(bool locked);

    如果参数lockedtrue表层锁定;lockedfalse表层解锁。

    D.设置开关状态:setIsOff(bool off)

    如果参数offtrue表层关闭;offfalse表层打开。

    E.设置在新视口中层的冻结状态:setVPDFLT(bool frozen)

    如果参数frozentrue表在新视口中层将冻结;frozenfalse表在新视口中层解冻。

    F.设置线型:setLinetypeObjectId(AcDbObjectId id)

    在调用构造函数AcDbLayerTableRecord()创建层表记录时,上述参数的缺省值为:

    Color7(white),isFrozenfalseisLockedfalseisofffalseVPDFLTfalse,线型的ID号为NULL

     

    3. 层属性的修改和查询实例的基本方法:

    A.以读方式打开层表,获得指向层表的指针。

    B.调用层表类的成员函数getAt(),以写的方式获得指定层名的层表记录指针。

    C.调用属性设置函数修改属性或调用属性查询函数获得属性;

     

    4. 数据库中层的检索的基本方法:

    A.利用AcDbLayerTable类的成员函数newIterator()创建层表浏览器。

    B.利用循环结构和块表浏览器遍历块表。

    C.利用AcDbLayerTableIterator类的成员函数getRecord()获得块表记录。

    D.利用成员函数getName()得到层名。

     

    5. 设置图形数据库的当前层:

    调用AcDbDatabase类的成员函数setClayer()设置图形数据库的当前层,其函数原型为:

    Acad::ErrorStatus setClayer(AcDbObjectId objId);

    函数的参数为层表的ID号。获得层表记录ID号的主要方法有:

    1) 将新建的层表记录加入层表时,用下面的形式调用add()函数:

    AcDbLayerTable::add(AcDbObjectId & layerID,AcDbLayerTableRecord *pRecord);

    在关闭层表和层表记录的代码后,加入“acdbCurDwg()->setClayer(layerID);”设置当前层。

    2) 若层已经存在,则可利用获得指定符号表ID号的形式调用getAt()函数:

    AcDbLayerTable:: getAt(const char* entryName, AcDbObjectId& recordId, bool getErasedRecord = false) const;

    然后调用加入“acdbCurDwg()->setClayer(layerID);”设置当前层。

    6. 定义字体样式

    AutoCAD数据库的字体样式是字体样式中的一条记录,其缺省的字体样式名为STANDARD,字体文件名为txt.shx。用STYLE定义一个新的字体样式包括建立样式名,选择字体文件和确定字体效果三步操作。用户新定义的字体样式是作为一条字体样式表记录加入字体样式表中。

    A.以写方式调用getTextStyleTable()哈数打开当前图形数据库的字体样式表,获得指向该表的指针。

    B.调用构造函数AcDbTextStyleRecord()创建字体样式表记录对象。

    C.设置字体样式名和字体文件名。

    D.设置字体的效果,包括倒置、反向、垂直、宽度比例和倾斜角的设置。

    E.调用add()函数将字体样式表记录加入字体样式表中。

    F.关闭字体样式表和字体样式表记录。

     

    7. 尺寸标注样式和尺寸变量

    尺寸标注样式是AutoCAD数据库中尺寸标注样式表的一条记录,其缺省的尺寸标注样式名为STANDSRD,该样式由系统自动建立。尺寸变量是确定组成尺寸标注线、尺寸界线、尺寸文字以及箭头的样式、大小和它们之间相对位置等的变量。

    对标注样式名为STANDARD的尺寸变量进行修改,首先要打开当前图形数据库的尺寸标注样式表,并调用getAt()函数获得指向尺寸标注样式表记录STANDARD的指针,然后调用AcDbDimStyleTableRecord类成员函数设置尺寸变量。

    建立新的尺寸标注样式与建立图层和定义字体样式基本相同。,其步骤为:

    A.以写的方式调用getDimStyleTable()函数打开当前图形数据库的尺寸标注样式表,获得指向该表的指针.

    B.调用构造函数AcDbDimStyleRecord()创建尺寸标注样式表记录对象。

    C.设置尺寸标注样式名。

    D.调用AcDbDimStyleRecord类的成员函数设置尺寸变量。

    E.调用add()函数将尺寸标注样式表记录加入到尺寸标注样式中。

    F.关闭尺寸标注样式表和尺寸标注样式表记录。

     

    8. 符号表记录的建立:

    9种符号表作为AutoCAD数据库中的根对象和容器,包含的下级对象为相应的符号表记录。符号表本身只能由AutoCAD系统建立而不能由应用程序创建,应用程序只能创建符号表记录。如块表中的块表记录,层表中的层表记录,字体样式表中的字体样式记录等,虽然各种具体的符号表记录名称不同,但建立的基本方法相同。归纳主要以下几步:

    A.以写的方式调用get##BASE_NAME##Table()函数打开数据库的## BASE_NAME##表,获得指向该表的指针。

    B.调用构造函数AcDb##BASE_NAME##Record()创建相应的符号表记录对象。

    C.调用setName()函数设置相应的符号表记录名。

    D.調用符号记录表的成员函数设置其属性。

    E.调用add()函数将所创建立的符号表记录加入其符号表。

    F.关闭符号表和符号表记录。

     

    9. 符号表记录的编辑:

    对于符号表的符号表记录,可以通过符号表记录类的成员函数对其属性进行编辑,如更改字体样式表的字型文件、文字的字高和宽度比例等。符号表记录的编辑实现技术可以分三步:

    A.以读的方式调用get##BASE_NAME##Table()函数打开数据库的##BASE_NAME##表,获得指向该表的指针。

    B.调用符号表类的成员函数getAt()获得符号表记录指针。

    C.调用相应的符号表记录成员函数修改其属性。

     

    10.符号表记录的查询:

    符号表记录的查询主要利用符号表浏览器和循环结构实现,步骤如下:

    A.利用AcDb##BASE_NAME##Table类的成员函数newIterator()创建符号表浏览器。

    B.利用循环结构和块表浏览器遍历块表。

    C.利用AcDb##BASE_NAME##TableIterator类的成员函数getRecord()获得符号表记录。

    D.利用成员函数getName()得到符号表记录名。

    例子:

    AcDb##BASE_NAME##Table *pTable;

    acdbHostApplicationServices()->workingDatabase()

    ->get##BASE_NAME##Table (pTable,AcDb::kForRead);

     

    AcDb##BASE_NAME##TableIterator *pIter;

    pTable ->newIterator(pIter);

    pTable ->close();

     

    AcDb##BASE_NAME##TableRecord *pRecord;

    for (pIter ->start();!pIter ->done();pIter ->step())

    {

    pIter ->getRecord(pRecord,AcDb::kForWrite);

    char *m_name;

    pRecord ->getName(m_name);

    //添加相应的操作

    free(m_Layername);

    pRecord ->close();

    }

    delete pLayerIter;

     

     

     

     

     

     

     

    三.对象字典的操作

    对象字典和符号表均是AutoCAD图形数据库中的容器对象。在9种符号表中,每一种符号表只能用来存储特定的对象,如块表用来存储块表记录,层表用来存储层表记录等,而对象字典却不受此限制,它可以存储任何类型的对象,包括其他对象字典、数据库对象和应用程序创建的对象。因此,所谓的对象字典实际上是一种通用的对象容器。

     

    1. 组字典的操作使用技术:

    组是实体等数据库对象的有序集合,是组字典的成员。从层次关系来看,组是管理其所包含对象的容器,而组字典则是管理组对象的容器。一个组实际上可以认为是一个选择集,但又不同于一般的选择集,它是組字典中一個有名的常驻对象。当组中的一个实体被删除时,该实体自动地从组中移出;当恢复被删除的是天时,该实体又自动地加入到该组中。使用组可以简化操作,容易实现对一批对象的颜色、层和线型等属性的统一修改。

    组字典中可以包含若干个组,每个组通过其组名来区分。

    A.直接从数据库中获得指向组字典的指针:

    Acad::ErrorStatus getGroupDictionaryAcDbDictionary*& pDictAcDb::OpenMode mode);

    B.从对象字典中获得组字典的指针:

    由于组字典是对象字典中的一个名为“ACAD_GROUP”的成员,因此先获得数据库中指向对象字典的指针,然后调用getAt()函数获得指向组字典的指针。

    AcDbDictionary *pNamedObj,*pGroupDict;

    acdbCurDwg()->getNamedObjectsDictionary(pNamedObj,AcDb::kForRead);

    pNamedObj->getAt("ACAD_GROUP",(AcDbObject *&)pGroupDict,AcDb::kForWrite);

     

    2. 将组加入组字典中:

    setAt(const char* srchKey,AcDbObject *newValue,AcDbObjectId& retObjId);

    各参数的意义为:srchKey为组名,用字符串表示;newValue为加入到组字典中的新组的指针;retObjId为函数返回的已加入组字典中的组对象的ID号。如果在组字典中已有同名的组存在,则将被新加入的组取代。调用该函数时,必须先创建组对象,将指向组对象的指针和定义的组名作为输入参数,并获得加入组字典中的组对象ID号。

    其中组对象为AcDbGroup类。具体的操作查相关的类函数即可!

     

    3.建立多线样式:

    多线是指多条互相平行的直线,各条线的线型、颜色和他们之间的间距等属性可互不相同。多条的这些属性由多线样式定义。定义一个多线样式的步骤为:

    A.通过getMLStyleDictionary()函数获得指向图形数据库中的多线样式字典的指针。

    B.用多线样式的构造函数AcDbMlineStyle()创建多线样式对象。

    C.利用AcDbDictionary类的成员函数setAt()将所建立的多线样式加入字典中。

    D.调用有关函数设置多线样式的属性,如设置多次按名称、元素特性和多线特性等。

     

    4.用户对象字典的操作和使用技术:

    AutoCAD数据库中,对象字典是字典类数据库对象的总称。按其层次关系可分为两类,一是由AutoCAD数据库直接管理的第一层对象字典;二是由第一层对象字典管理的第二层对象字典。为了便于区别,我们把第一层对象字典成为有名对象字典,用户在应用程序中定义的字典成为用户字典。前面提到的组字典、多线样式字典和用户对象字典均属于第二层对象字典,其中组字典和多线字典是系统自动生成的对象字典。

    对象字典的第三层为字典中的对象。如:组诗组字典中的对象,多线样式是多线样式字典中的对象,在用户对象字典中可以包含任何类型的对象,如实体对象、自定义对象和数据库对象等。有名对象字典中的各用户对象字典之间,通过其字名来表示;用户字典中的对象利用其对象名来区分。

    4.1 用户对象字典的定义和字典对象的查询:

    在有名对象字典中定义一个用户对象字典的实质是创建一个AcDbDictionary类对象,并将其加入有名对象字典中,其步骤为:第一,调用AcDbDatabase类的成员函数getNameObjectDictionary()得到有名对象字典的地址(即指针);第二,定义新的用户对象字典并加入有名对象字典中。

    例子:

    AcDbDictionary *pNamedObj; //定义有名对象字典

    acdbCurDwg()->getNamedObjectsDictionary(pNamedObj,AcDb::kForWrite);

    AcDbDictionary *pDict = new AcDbDictionary; //定义用户对象字典

    AcDbObjectId eid;

    pNamedObj->setAt("Name",pDict,eid);

    而在用户字典中对象查询的第一步是建立字典浏览器遍历对象字典:

    AcDbDictionaryIterator *pDictIter = pDict->newIterator();

    字典对象查询的第二步是得到指向对象的指针:

    pDictIter->getObject(pObj,AcDb::kForRead);

    在获得对象指针的前提下,可以利用对象的成员函数进行查询、检索和编辑等操作。

    另外,用户字典中的对象名可以用AcDbDictionaryIterator类的成员函数name()获得。而该对象名表示的对象类名可以用“pObj->isA()->name()”形式获得。

    需要注意的是:将块表记录中的实体对象加入用户字典,并不是将实体复制到字典中,而是在字典中存储其对象的指针。因此,当块表记录中的实体被删除后,在字典中相应的对象名和指针也不再存在。

     

    4.2 用户对象字典:扩展记录的加入和查询。

    扩展记录属于AcDbxrecord类的对象,可用来定义任何类型的数据。扩展记录的数据项采用结果缓冲区链表的形式定义,每一项由DXF组码和相应的组值构成。扩展记录是一个在应用程序中定义的数据库对象,属于有名对象字典的下级对象或某一对象的扩展字典和其他扩展记录的下级对象。

    ARX中创建扩展记录的主要步骤如下:

    1.获得数据库中指向有名对象字典的指针。

    2.建立一个新的用户脆响字典,并加入有名对象字典中。

    3.创建新的扩展记录,并加入用户对象字典中,如:

    AcDbXrecord *pXrec = new AcDbXrecord;

    pDict->setAt("XREC1", pXrec, xrecObjId);

    4.ads_buildlist()函数构造由扩展记录数据项组成的缓冲区链表,其一般形式为:

    ads_buildlist(<组码1><组值1><组码2><组值2>,……,0)

    5. 调用AcDbXrecord的成员函数setFromRbChain()设置扩展记录所指向的链表指针。

     

    三.ARX应用程序中的尺寸标注技术

    1. 尺寸对象的组成和常用的尺寸标注类:

    尺寸标注也是AutoCAD数据库中块表记录中的一种对象。一个完整的尺寸对象由尺寸标注线,尺寸界线,尺寸箭头和尺寸文字构成。

    AutoCAD数据库中,AcDbDimension类为尺寸标注的基类,其派生类主要有对齐标注(AcDbAlignedDimension),两线定角标注(AcDb2LineAngularDimension),三点定角标注(AcDb3PointAngularDimension),直径标注(AcDbDiametricDimension),半径标注(AcDbRadialDimension),坐标尺寸标注(AcDbOrdinateDimension),定角标注(AcDbRotatedDimension)等。

    尺寸标注类是实体类(AcDbEntity)的派生类,其主要成员函数的原型为:

    1.设置尺寸文字位置:

    Acad::ErrorStatus setTextPosition(const AcGePoint3d& unnamed);

    2. 设置尺寸标注样式:

    Acad::ErrorStatus setDimensionStyle(AcDbObjectId unnamed);

    3. 设置尺寸文字:

    Acad::ErrorStatus setDimensionText(const char* unnamed);

    4. 设置尺寸文字旋转角度:

    Acad::ErrorStatus setTextRotation(double unnamed);

    5. 查询尺寸文字:

    Char* dimensionText()const;

    6. 查询尺寸文字位置:

    AcGePoint3d textPosition()const;

    7. 查询尺寸文字旋转角度

    double textRotation()const;

    2.尺寸标注的鼠标拖动技术:

    实现尺寸标注线和尺寸文字为字的鼠标拖动的关键是跟踪鼠标的移动,并根据鼠标的位置动态显示尺寸标注。用ads_grread()憾事跟踪鼠标的移动,其函数原型为:

    Int ads_grread(int track,int *type,struct resbuf *result);

    参数track为控制位,其值为1则将鼠标的坐标存入result中;type表示输入的种类,如按鼠标左键,则type=3

    尺寸标注的鼠标拖动原理为:

    首先,设置ads_grread()函数控制位track=1,在循环结构中用ads_grread()函数追踪鼠标的移动,获得当前鼠标位置的x,y坐标。用ads_grread(track,&type,&result)形式调用,则点的xy坐标值可分别用result.resval.rpoint[X]result.resval.rpoint[Y]形式获得。其次,以写方式打开尺寸标注对象,用获得的XY坐标设置尺寸标注线和尺寸位置,并关闭对象。循环执行,实现尺寸步标注对象的拖动。如果按鼠标左键拾取一个点,则type=3,结束循环。

    例子:公差标注设置函数:

    void SetDimtpAndDimtm(double tp,double tm)

    {

    AcDbDimStyleTable *pDimStyleTbl;

    acdbCurDwg()->getDimStyleTable(pDimStyleTbl,AcDb::kForRead);

    AcDbDimStyleTableRecord *pDimStyleTblRcd;

    pDimStyleTbl->getAt("",pDimStyleTblRcd,AcDb::kForWrite);

    if (fabs(tp) == fabs(tm))

    {

    pDimStyleTblRcd->setDimtfac(1.0)

    }

    else pDimStyleTblRcd->setDimtfac(0.5);

    if (tp == 0.0 && tm == 0.0)

    {

    pDimStyleTblRcd->setDimtol(0);

    }

    else

    {

    pDimStyleTblRcd->setDimtp(tp);

    pDimStyleTblRcd->setDimtol(1);

    pDimStyleTblRcd->setDimtm(tm);

    }

    pDimStyleTblRcd->close();

    pDimStyleTbl->close();

    }

     

    3.图案填充函数介绍:

    图案填充函数AcDbHatCh也是实体立体(AcDbEntity)的派生类,与尺寸标注类似,图案填充也是 AutoCAD数据库中块表记录中的一种对象。

    生成图案填充对象的步骤为:

    A.调用图案填充类的构造函数创建AcDbHatch类对象。

    B.调用AcDbHatch类的成员函数设置填充图案的法向矢量,关联,标高,缩放比例,填充图案,填充方式和填充边界等属性。

    C.调用evaluateHatch()显示填充图案。

    D.将AcDbHatch类对象写入当前图形数据库的块表记录中。

     

    4.ARX应用程序中视图管理技术和应用:

    视图和视口是AutoCAD环境中图形显示中经常涉及到的基本概念。图形屏幕上用于显示图形的一个矩形区域称为视口,可以把整个图形屏幕作为一个视口,也可以把整个视图屏幕设置成多个视口。当前视口中显示的复杂图形按不同的窗口大小设置,并以视图名为表示在图形数据库中保存。在需要时,显示指定视图以满足对图形编辑和浏览的需要。

    视图的管理包括视图的定义,显示,属性设置和查询等功能。在AutoCAD的交互环境中,用户可以使用VIEW命令对视图进行命名,保存,恢复和删除。在ARX应用程序中,主要是通过使图表类及视图表记录类的成员函数实现视图的管理功能。

    视图类作为视图表(AcDbViewTable)中的一条视图记录(AcDbViewTableRecord)保存在AutoCAD数据库中。把当前视口中指定窗口每得图形定义为一个新的视图的操作等价于向数据库中添加一个AcDbViewTableRecord类对象。其实现步骤为:

    A.调用视图标记录类的构造函数创建AcDbViewTableRecord类对象;

    B.调用AcDbViewTableRecord类的成员函数设置视图名,视图中心点,视图高度和宽度等属性;

    C.获得当前图形数据库中的视图表指针,将AcDbViewTableRecord类对象添加到数据库中。

    视图的查询首先要获得当前图形数据库中指定视图师表记录的指针,然后调用相应的成员函数得到该视图的属性。

     

    四.ARX中的实体造型技术和应用

    三维造型包括线框模型、表面模型和实体模型三种形式,其中三维实体具有体的特征。能夠較全面地反映形体的物理特征。在机械CAD中,利用实体造型技术用户不仅可以通过并、交、差布尔运算生成所需的机械零部件模型,而且还能够对形体进行剖切成剖视图以进行体积、重心和惯性矩等物性计算和分析,进而在实体模型的基础上生成NC代码,在ARX应用程序中,并不是直接使用AutoCAD系统本身提供的有关实体造型和编辑命令,而是通过直接生成数据库对象及调用AcDb3dSolid类的成员函数来进行实体造型。

    1.基本三维实体生成方法:

    AutoCAD数据库中,三维实体属于AcDb3dSolid类对象,该类是AcDbEntity类的派生类。

    对于一个具体的几何实体,即ACIS对象来说,AcDb3dSolid实体是一个容器和接口。

    通过AcDb3dSolid类的成员函数可以生成各种基本的三维实体以及实现实体的布尔运算。生成三维实体的基本步骤为:

    A.调用AcDb3dSolid类的构造函数创建一个容器对象:

    如:AcDb3dSolid *p3dObj = new AcDb3dSolid;

    B.调用AcDb3dSolid类的成员函数创建基本三维实体对象。其一般形式为:

    指向AcDb3dSolid类对象的指针-〉创建基本三维实体对象成员函数。

    B.将AcDb3dSolid类对象写入当前图形数据库的块表记录中,其代码设计方法与二维对象的添加完全相同。

     

     

     

    ARX程序的消息响应:

    ARX程序实质上是一动态库,它直接与AutoCAD进行对话,即AutoCAD发送各种消息给ARX程序,ARX程序负责对各种消息作出相应的处理。

    kInitAppMsg:

    ARX程序被加载时发送该消息,用以建立AutoCAD和应用程序之间的对话。

    kUnloadAppMsg:

    ARX程序卸载时(不论是用户卸载应用程序,还是由AutoCAD终止退出)发送该消息,关闭文件以及执行必要的清理工作。

    kOleUnloadAppMsg:

    发送该消息确定应用程序是否可以卸载,即该应用程序的ActiveX对象或接口是否被其他应用程序所引用。

    kLoadDwgMsg:

    当打开一幅图形时发送消息,此时AutoCAD的图形编辑环境进行了初始化,并且,应用程序可以调用ARX的全局函数,而acedCommand()函数除外。

    kUnLoadDwgMsg:

    当用户退出当前的图形编辑时发送该消息。

     

    下面的代码将实例生成由某一图层上所有的实体组成的选择集:

    struct resbuf *plb;

    char sbuf[32];

    ads_name ss1;

    plb = acutNewRb(8) //图层DXF组码是8

    strcpy(sbuf,PARTS); //图层名为PARTS

    plb->resval.rstring = sbuf;

    plb->rbnext = NULL;

    acedSSGet(“X”,NULL,NULL,plb,ss1);

    acutRelRb(plb); //don’t forget

    下面的例子是选择“PARTS”图层上的所有圆,这是一个利用acutBuildList()函数构造结果缓冲区表后再传给acedSSGet()函数的实例:

    ads_name ss1;

    struct resbuf *rb1;

    rb1 = acutBuildList(RTDXFO,”CIRCLE”,8,”PARTS”,RTNONE);

    acedSSGet(“X”,NULL,NULL,rb1,ss1);

    acutRelRb(plb); //don’t forget


    由于Arx程序本质是一个动态链接库程序,所以当该程序的生命周期为加载到卸载或CAD程序结束为止。使用静态变量时,注意及时清空静态变量。同理全局变量。否则可能会影响下一次运行结果的正确性。

    展开全文
  • 属性值导出为 AutoCAD 块属性

    千次阅读 2018-12-05 16:30:50
    本流程将说明如何在ArcMap中通过预留 CAD 字段 CADType 和 RefName 以及种子文件(.dwg)将要素属性通过Export to CAD工具导出为 AutoCAD 块属性。 完成此流程需要: 一个包含定义的 AutoCAD 种子文件,该文件的...

    本流程将说明如何在ArcMap中通过预留 CAD 字段 CADType 和 RefName 以及种子文件(.dwg)将要素属性通过Export to CAD工具导出为 AutoCAD 块属性。

    完成此流程需要:

    • 一个包含块定义的 AutoCAD 种子文件,该文件的属性将用于存储属性值
    • 一个 ArcGIS 点要素类,保证其属性表中已添加有 CADType 字段和 RefName 字段
    • 输入要素类属性表中的字段名与通过 AutoCAD 块定义所定义的块属性标签名相匹配

    在生成的 DWG 文件中,输入要素属性表中的每个点要素都将具有一个块参照。每个块参照中都将包含与块属性标签名相匹配的字段名的要素属性。

    准备种子文件

    如何准备种子文件,请参考http://desktop.arcgis.com/zh-cn/arcmap/10.3/manage-data/cad/preparing-a-dwg-seed-file.htm

    最终的块文件形如:

    在AutoCAD打开

    在 AutoCAD 种子文件中,通过 RefName 字段指定的每个块参照都必须具有一个块定义。您可以指定所有要素均参照同一块定义,

    还可以将要素定向到种子文件中定义的某些特定块。

    若指定的某个块定义不存在,则“要素转 CAD”工具将插入一个不具备任何属性的通用块参照,该块参照将定义为直径为一个单位的圆形。

    将预留 CAD 字段添加到属性表

    添加 CADType 字段

    CADType 字段用于指定要生成的 CAD 实体的类型。您可以使用字段计算器 来指定关键字 "INSERT"。

    (1)右键单击内容列表中的要素图层,然后单击打开属性表。

    (2)在属性表菜单栏上单击常规图表操作按钮 表选项,然后单击添加字段以打开对话框。

    (3)在名称文本框中输入字段名称 CADType。

    (4)单击类型下拉箭头,然后单击文本指定数据类型。

    (5)接受默认的字段长度 50。

    (6)单击确定关闭对话框并创建字段。

    (7)在属性表中右键单击 CADType 字段名,然后在快捷菜单上单击字段计算器 计算器。

    (8)在表达式文本框中输入 "INSERT"(包括双引号)。

    (9)单击确定以运行工具。

    此时,CADType 字段即可为所有记录显示值 INSERT。

    添加 RefName 字段

    RefName 字段用于指定 AutoCAD 块定义的名称(将在 CAD 文件中为每个要素实体插入该块定义)。该字段可用来置换存在于 AutoCAD 种子文件中的块名称。

    (1)右键单击内容列表中的要素图层,然后单击打开属性表。

    (2)在属性表菜单栏上单击常规图表操作按钮 表选项,然后单击添加字段以打开对话框。

    (3)在名称文本框中输入字段名 RefName。

    (4)单击类型下拉箭头,然后单击文本指定数据类型。

    (5)接受默认的字段长度 50。

    (6)单击确定关闭对话框并创建字段。

    (7)在属性表中右键单击 RefName 字段名,然后在快捷菜单上单击字段计算器 计算器。

    (8)清除“表达式”文本框中的任何现有值。

    (9)在表达式文本框中输入保存在 AutoCAD 种子文件中的块定义名称。例如:"632_25300700"(包括双引号)。

    (10)单击确定以运行工具。

    此时,RefName 字段即可为所有记录显示值块名。

    运行“要素转 CAD”工具

    (1)使用“搜索”窗口 搜索 查找并打开要素转 CAD 工具。

    (2)将包含新字段的要素图层从内容列表拖放到输入要素文本框。

    (3)单击输出类型下拉箭头,然后选择 AutoCAD DWG 格式。(请确保输出的DWG版本和种子文件的版本一致,比如都为“DWG_R2007”)

    (4)单击输出文件浏览按钮 浏览 导航到某个文件夹,输入新 CAD 文件名称,然后单击保存。

    您也可以接受默认的路径和文件名。

    (5)将 AutoCAD 种子文件从目录窗口中拖放到种子文件文本框。

    (6)单击确定以运行工具。

    在新创建的 CAD 数据集中打开 CAD 点要素图层属性表来验证成果。

    转完之后的.dwg文件在AutoCAD中打开如下图:

    提示:在ArcGIS10.6和10.6.1中成功运行后,将输出文件在AutoCAD打开后却没有显示块,通过和美国esri沟通告知这是一个bug,BUG-000112999,

    https://support.esri.com/zh-cn/bugs/nimbus/QlVHLTAwMDExMjk5OQ==

    预计在ArcGIS10.7.0版本中修复;用户可以使用ArcGIS10.5.1及以前的版本成功运行此工具。作者在ArcGIS10.3.1中亲测有效,转为.dwg文件后能够在AutoCAD显示种子文件中的块。

     

    参考资料

    http://desktop.arcgis.com/zh-cn/arcmap/10.3/manage-data/cad/exporting-attributes-to-autocad-block-attributes.htm

    http://desktop.arcgis.com/zh-cn/arcmap/10.3/manage-data/cad/preparing-a-dwg-seed-file.htm

    https://jingyan.baidu.com/article/3c48dd34a31b2de10be358b2.html

    https://jingyan.baidu.com/article/11c17a2c73ea6ef447e39d64.html?qq-pf-to=pcqq.c2c

    展开全文
  • 本人录制c#CAD二次开发视频 基础入门全套,感兴趣可以淘宝搜索店铺 PT的cad小店 ...courseId=112889 ... 定义类似于模具,而参照类似于模具浇筑出来的模型,在图形中只需用定义来保存的实际几何组成,...
  • ARX动态自定义属性获取和修改

    千次阅读 2019-05-30 14:48:17
    这个类可以获取动态的自定义属性名和属性值,判断当前参照是否是动态,并设置指定属性的值修改动态。 构造对象 AcDbDynBlockReference类有两种构造函数: AcDbDynBlockReference(ZcDbObjectId blockRefId);...
  • 静态属性、静态方法、静态代码

    千次阅读 2019-05-10 11:30:11
    1.什么是静态属性、静态方法 ...2.出现的时机不同:静态属性和方法在没创建对象之前就存在,而非静态的需要在创建对象才存在 3.静态属性是整个类都公用的 4.生命周期不一样,静态在类消失后被销毁,非静...
  • java静态代码/静态属性、构造、构造方法执行、main方法、普通代码的顺序 这也是在笔试中的一个重要的考点,就有一个输出语句让你写出输出的结果。 理论知识: 静态代码是:属于类的,在类加载时就自动执行。...
  • ObjectARX编程(六) ------属性

    千次阅读 2017-05-25 16:17:01
    1. 的新增 cstring blkname; //获取当前图形数据库 ...acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl,AcDb::kForWrite);...//创建新的表记录 AcDbBloc
  • (1)static 表示静态,它可以修饰属性,方法和代码。 1.static修饰属性(类变量),那么这个属性就可以用类名.属性名来访问,也就是使这个属性成为本类的类变量,为本类对象所共有。这个属性就是全类公有。...
  • 因为对象就是用来封装数据的,对象调用的方法不用到封装的数据,对象的创建便没有意义; 静态方法使用原则: 一、静态方法不能访问非静态成员或者方法 非静态方法可以访问静态成员或静态方法 二、静态方法...
  • 对于静态变量、静态初始化、变量、初始化、构造器,它们的初始化顺序以此是(静态变量、静态初始化)>(变量、初始化)>构造器。我们可以通过下面的测试代码来验证这一点:  Java代码  public class ...
  •  但是注意,虽然顺序都可以当第一,但是静态、静态属性执行的东西完全不一样,怎么不一样,已经写上去了自己看  (笔者注:这个问题,在花了很多时间的推敲后,最终有了答案,前后花了不少的时间去运行代码,...
  • 经过在网上大量的搜索和阅读后,发现大部分都是讲如何创建RDF文件后者是owl文件的,或者是获取指定属性名的属性值,并不能够获取owl文件中所有的属性以及属性值。后来通过查看jena的API找到了方法,记录下来一分享...
  • QML 静态值与属性绑定

    千次阅读 2017-03-05 18:03:48
    可以为 QML 对象中的属性分配两种类型的值 - 静态值和绑定表达式,后者也称为属性绑定。 - 静态值:一个不依赖于其他属性的常数值。 - 绑定表达式:一个用于描述属性间依赖关系的 JavaScript 表达式。 属性绑定是 ...
  • 最近研究了下css中的border属性,觉得功能很强大,可以制作各种三角形,正好设计有需求,于是就写了一个CSS效果。代码如下: css样式部分: &lt;style&gt; body{ background:#f2f2f2; } .border{ ...
  • static int mmc_add_disk(struct mmc_blk_data *md) { int ret; struct mmc_card *card = md->queue.card; ...gendisk到系统中 (注册设备) **/ ... // 此处略掉很多关于属性的代码 return ret; }
  • java反射机制是在运行状态中,对于任意一个类, 能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用他的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反射机制。 ...
  • Python AutoCAD

    千次阅读 热门讨论 2019-07-26 15:57:09
    创建...... 创建...... 添加图元到...... 插入...... 添加属性...... 已有块属性的读取...... 创建新组......
  • 初始化/* * 初始化 * 初始化变量方式:声明时、构造函数、代码 * 使用static关键字修饰的代码,称为静态代码 ... * 代码和构造方法在创建对象时执行 */ public class Test01 { public static vo
  • 编写类A(Armor)继承类B(Item)的属性,并在A类中创建A的对象调用B类的属性以及A自己的属性。 类B: 类A: 2、问题说明、解决: 1、在类A中调用name的过程中发现报错Type The field Item.name is visible,原因...
  • StackMap属性解析

    千次阅读 2019-07-01 17:59:12
    由于我们会在后续的文章介绍class验证环节,其中在校验方法时需要使用到StackMap....为了支持新算法,Class文件从版本50开始添加了一个新的属性表,叫做StackMapTable,里面记录的是一个方法中操作数栈与局部变...
  • 静态属性是指被static修饰符修饰的类、方法、变量或代码等。 非静态属性是指没有被static修饰的。 二、静态属性和非静态属性的特点是什么? 静态属性特点: 1. 一声明就被存储在栈中,直接占据内存,可以快速...
  • 知识点:创建Windows应用程序的方法,窗体的基本属性和方法、基本控件的使用、事件处理、消息框的使用 1、创建windows应用程序的方法 Windows应用程序是目前应用软的主流,用户使用方便且功能强大。所以掌握...
  • CSS 清理浮动 clear属性

    千次阅读 2018-02-21 22:09:50
    虽然设置上述属性都可以创建BFC,实现清除浮动的效果,但是,float、position、display 属性可能会影响整体布局。因此,最常用的还是设置 overflow 属性。 1)让容器浮动 让容器浮动后,容器就会创建一个新的BFC,使...
  • C#属性

    千次阅读 2011-08-23 12:10:17
    属性的定义:属性是一个声明的附加声明属性是这样的成员:它提供灵活的机制来读取、编写或计算某个私有字段的值。可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。这使得可以轻松访问...
  • java属性与方法

    千次阅读 多人点赞 2019-09-09 20:47:43
    java属性与方法 文章目录java属性与方法1,什么是类:2,什么是对象:属性:变量的分类:成员变量细分变量的作用域方法:3.变量的生命周期 1,什么是类: 类的定义 类是现实世界当中是不存在的,是一个模版,是一...
  • Oracle修改用户profile属性

    千次阅读 2018-12-26 18:30:47
    更改属性 1、查询profile 2、更改session连接属性 用户Profile详解 一、Profile目的: 二、条件: 三、查看系统的默认PROFILE 四、创建 profile 的语法如下: 五、部分解释: 六、尝试创建一个混合型的...
  • JAVA的实例和静态

    千次阅读 2018-06-02 17:03:46
    实例实例就是一个划分的代码区域。{ 代码 }1.它是在构造器之前执行。2.它和属性初始化一同执行。3.一个类中可以有很多个实例。...}静态 静态是类加载的时候和静态属性一起执行的。也是按顺序从上往...
  • 超级 i节点 数据 目录 间接

    千次阅读 2014-04-02 15:56:16
    文件系统用来存储文件内容、文件属性、和目录。这些类型的数据如何存储在磁盘上的呢?unix/linux使用了一个简单的方法。如图所示. 它将磁盘分为三个部分: 1)超级,文件系统中第一个被称为超级。这个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 540,430
精华内容 216,172
关键字:

如何创建属性块