找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1030|回复: 5

[求助]:关于 ARX 插入块的代码 包含属性

[复制链接]
发表于 2006-4-28 13:55:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我的目的是查找某文件夹下所有dwg文件,生成列表
然后根据选择的某一个dwg文件,创建块表,

最后插入块参照,这些都没有问题,

主要问题是,我的dwg文件中包含了"属性",为什么插入的块中没有属性呢?
用acad的acedcommand 插入可以包含属性,但是下面这些代码生成的块参照没有属性

请高手帮忙看看 谢谢

//要插入dwg的文件路径 a中包含属性值
char pathname[]="C:\a.dwg";

AcDbObjectId blockId ;
Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()->insert (blockId, filename, pDwg,
Adesk::kFalse) ;
delete pDwg ;

if ( es != Acad::eOk )
{
acutPrintf ("\n插入块错误.") ;
return;
}

BeginEditorCommand();

ads_point pt={0,0,0};
int rc=acedGetPoint(NULL,"\n选择插入点:",pt);
if (rc==RTCAN||rc==RTNONE)
{
acutPrintf("\n*取消了插入操作*");
CancelEditorCommand();
return;
}
CompleteEditorCommand();

//---- 设置插入点,旋转角度,比例等等
AcDbBlockReference *pBlkRef =new AcDbBlockReference ;
pBlkRef->setBlockTableRecord (blockId) ;
pBlkRef->setScaleFactors(AcGeScale3d(m_scale,m_scale,1));
pBlkRef->setPosition(AcGePoint3d(pt[0],pt[1],pt[2])) ;
pBlkRef->setRotation (m_angle) ;

//属性 <<<这里不能遍历属性 for直接跳出来了>>>
AcDbObjectIterator* pBlkIterator = pBlkRef->attributeIterator();
for(pBlkIterator->start(); !pBlkIterator->done();pBlkIterator->step())
{
AcDbAttribute* pAttrEnt = NULL;
Acad::ErrorStatus rc=acdbOpenObject(pAttrEnt, pBlkIterator->objectId(), AcDb::kForWrite);

if(pAttrEnt != NULL)
{
pAttrEnt->setTextString(m_attrib);
}
}


//获得模型空间块表记录
AcDbBlockTable *pBlockTable ;
acdbHostApplicationServices()->workingDatabase()->getBlockTable (pBlockTable, AcDb::kForRead) ;
AcDbBlockTableRecord *pBlockTableRecord ;
pBlockTable->getAt (ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite) ;
pBlockTable->close () ;
pBlockTableRecord->appendAcDbEntity(pBlkRef);
pBlockTableRecord->close();
pBlkRef->close();
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-4-28 14:33:53 | 显示全部楼层
你的文件是属性块么?  你这里指的属性是什么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-28 14:42:41 | 显示全部楼层
你把遍历属性的程序放到pBlockTableRecord->appendAcDbEntity(pBlkRef);后面看看?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-28 19:41:31 | 显示全部楼层
放到后面也没有关系的,问题不在这里, 我要研究一下这个问题
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-29 11:04:29 | 显示全部楼层

好了

放到后面也不行啊

这样就可以了,

void CAddBlock::OnOK()
{

        CDialog::OnOK();
        //获得要插入的块名
        CString blockname;
        m_listctrl.GetLBText(m_listctrl.GetCurSel(),blockname);

        //blockname = "CHART-20";

        //寻找是否已经定义
    AcDbDatabase *pCurDb = acdbHostApplicationServices()->workingDatabase();
        AcDbBlockTable *pBlkTable;
        AcDbObjectId blockId ;
    pCurDb->getBlockTable(pBlkTable, AcDb::kForRead);

    if(!pBlkTable->has(blockname))
    {
                pBlkTable->close();
                AcDbDatabase *pDwg =new AcDbDatabase (Adesk::kFalse) ;
                char dir[MAX_PATH];
                GetModuleFileName(NULL,dir,MAX_PATH);

                dir[CString(dir).ReverseFind('\\')]='\0';
                //AfxMessageBox(CString(dir)+"\\survingpack\\"+blockname+".dwg");
                pDwg->readDwgFile (CString(dir)+"\\survingpack\\"+blockname+".dwg") ;

                Acad::ErrorStatus es = pCurDb->insert (blockId, blockname, pDwg);//,         Adesk::kFalse) ; //
                delete pDwg ;
                if ( es != Acad::eOk )
                {
                        acutPrintf ("\n插入块错误.") ;
                        return;
                }               
    }

        else
    pBlkTable->getAt(blockname, blockId);
       

        BeginEditorCommand();
        //ShowWindow(SW_HIDE);
        ads_point pt={0,0,0};
        int rc=acedGetPoint(NULL,"\n选择插入点:",pt);
        if (rc==RTCAN||rc==RTNONE)  
        {
                acutPrintf("\n*取消了插入操作*");
                CancelEditorCommand();
                return;
        }
        CompleteEditorCommand();

        //---- 设置插入点,旋转角度,比例等等
        AcDbBlockReference *pBlkRef =new AcDbBlockReference(AcGePoint3d(pt[0],pt[1],pt[2]),blockId) ;
        //pBlkRef->setBlockTableRecord (blockId) ;
        pBlkRef->setScaleFactors(AcGeScale3d(m_scale,m_scale,1));
        //pBlkRef->setPosition(AcGePoint3d(pt[0],pt[1],pt[2])) ;
        pBlkRef->setRotation (m_angle) ;
        pBlkRef->setLayer(NULL); //设置图层



        //获得模型空间块表记录
        AcDbBlockTable *pBlockTable ;
        acdbHostApplicationServices()->workingDatabase()->getBlockTable (pBlockTable, AcDb::kForRead) ;
        AcDbBlockTableRecord *pBlockTableRecord ;
        pBlockTable->getAt (ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite) ;
        pBlockTable->close () ;
        pBlockTableRecord->appendAcDbEntity(pBlkRef);

        //获得属性
        AcDbBlockTableRecord *pBlkDefRecord;
        acdbOpenObject(pBlkDefRecord, blockId, AcDb::kForRead);

        if(pBlkDefRecord->hasAttributeDefinitions())        
        {
                //AcDbObjectIterator* pBlkIterator = pBlkRef->attributeIterator();        //修改

                AcDbBlockTableRecordIterator *pIterator;
                pBlkDefRecord->newIterator(pIterator);

                for(pIterator->start(); !pIterator->done();pIterator->step())
                {
                        AcDbEntity *pEnt;
                        pIterator->getEntity(pEnt, AcDb::kForRead);
                        AcDbAttributeDefinition *pAttDef = AcDbAttributeDefinition::cast(pEnt);

                        if(pAttDef != NULL && !pAttDef->isConstant())
                        {
                                AcDbAttribute* pAtt = new AcDbAttribute();
                                pAtt->setPropertiesFrom(pAttDef);
                                pAtt->setInvisible( pAttDef->isInvisible() );

                                pAtt->setHorizontalMode(pAttDef->horizontalMode());
                                pAtt->setVerticalMode(pAttDef->verticalMode());
/*                                AcGePoint3d basePt = pAttDef->position();
                                basePt[0]+=pt[0];
                                basePt[1]+=pt[1];
                                basePt[2]+=pt[2];
                                pAtt->setPosition(basePt);
*/
                                AcGePoint3d basePt = pAttDef->alignmentPoint();
                                basePt[0]+=pt[0];
                                basePt[1]+=pt[1];
                                basePt[2]+=pt[2];
                                pAtt->setAlignmentPoint(basePt);

                                pAtt->setHeight(pAttDef->height());
                                pAtt->setTextStyle(pAttDef->textStyle());

                                pAtt->setTag(pAttDef->tag());
                                pAtt->setTextString(m_attrib);
                                pAtt->setFieldLength(25);



                                pBlkRef->appendAttribute(pAtt);
                                pAtt->close();
                                pEnt->close();
                        }
                }
                delete pIterator;
        }//end if pBlkDefRecord->hasAttributeDefinitions

        pBlkDefRecord->close();
        pBlockTableRecord->close();
        pBlkRef->close();

}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-29 18:14:43 | 显示全部楼层
it is tricky!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-22 08:34 , Processed in 0.189799 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表