- 积分
- 3266
- 明经币
- 个
- 注册时间
- 2002-7-5
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
首先,我在ACAD 2004和VC.NET中使用以下代码指定实体(AcDbEntity)的图层没有任何问题,因为没看到你的代码,请你自己对照一下,看看你的问题出在哪。
void setNewLayer(void) //不能用setLayer()函数名,这个函数名有点怪,将就一下哦
{
AcDbLayerTable *pLayerTbl;
acdbHostApplicationServices()->workingDatabase()
->getLayerTable(pLayerTbl,AcDb::kForRead );
AcDbLayerTableRecord *pLayerTblRcd;
if(pLayerTbl->getAt("MYNewLayer",pLayerTblRcd,AcDb::kForRead )!=Acad::eOk)
//若图形中没有你要设置的图层
{
acutPrintf("No This LayerName In Drawing") ;
pLayerTblRcd->close();
pLayerTbl->close();
return;
}
pLayerTbl->close();
//以下添加一条直线,用于以后操作,以便检验程序
AcGePoint3d startPoint(5.0,4.0,0.0);
AcGePoint3d endPoint(2.0,10.0,0.0);
AcDbLine *pLine=new AcDbLine(startPoint,endPoint);
//以下调用AcDbEntity::setLayer()函数,其参数可以是char *类型或CString类型,
//我没有试其它类似_bstr_t的COM类型。
//该函数的另一个重载版本使用一个图层的AcDbObjectId对象为输入参数,
//这两种方式我都试过,没有问题。
pLine->setLayer("MYNewLayer");
pLayerTblRcd->close();
//以下代码演示如何加载线型
AcDbLinetypeTable *pLtypeTbl; //线型表指针
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pLtypeTbl,AcDb::kForWrite ); //获取当前图形的线型表
AcDbLinetypeTableRecord *pLtypeTblRcd;
if(pLtypeTbl->getAt("HIDDEN",pLtypeTblRcd,AcDb::kForRead )!=Acad::eOk)
//若当前图形的线型表中没有你要的HIDDEN线型
{
//调用AcDbDatabase::loadLineTypeFile()函数加载线型。
//若该函数调用成功,HIDDEN线型已经加入到线型表中了。
acdbHostApplicationServices()->workingDatabase()
->loadLineTypeFile("HIDDEN","acadiso.lin");
//pLtypeTbl->getAt("HIDDEN",pLtypeTblRcd,AcDb::kForRead );
}
pLine->setLinetype("HIDDEN");
pLtypeTblRcd->close();
pLtypeTbl->close();
//以下代码将修改了图层和线型的直线加入当前图形数据库,用于在ACAD界面中显示
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pBlockTable,AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
pBlockTable->close();
AcDbObjectId lineId;
pBlockTableRecord->appendAcDbEntity(lineId,pLine);
pBlockTableRecord->close();
pLine->close();
} |
|