audeze:关于 ARX 插入块的代码

来源:百度文库 编辑:高考问答 时间:2024/04/29 08:45:34
我的目的是查找某文件夹下所有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();
我再看看代码,

你自己已经解决了

这样就可以了,

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();

}

晕!看不懂!