向当前模型空间中插入带属性的块定义

//其中blockName为插入的块表的名称, ptInsert为块表指定的插入点

void InsertBlkToSpace(CString blockName, AcGePoint3d ptInsert)
{
//获得当前的数据库的块表
AcDbBlockTable *pBlkTab;
acdbHostApplicationServices()->workingDatabase()
->getBlockTable(pBlkTab, ZcDb::kForWrite);

//判断插入的块定义是否存在
if (!pBlkTab->has(blockName))
{
acutPrintf(_T("\n当前图纸中不包含此块表!"));
pBlkTab->close();
return;
}
//获得用户指定的块表记录
AcDbObjectId blkDefId;
pBlkTab->getAt(blockName, blkDefId);

//创建一个块参照对象
AcDbBlockReference *pBlkRef = new AcDbBlockReference(ptInsert, blkDefId);

//将块参照插入到模型空间中
AcDbBlockTableRecord *pBlkTabRcd;
pBlkTab->getAt(ACDB_MODEL_SPACE, pBlkTabRcd, ZcDb::kForWrite);
pBlkTab->close();
AcDbObjectId objId;
pBlkTabRcd->appendZcDbEntity(objId, pBlkRef);

//判断指定的块表记录是否包含属性
AcDbBlockTableRecord *pBlkDefRcd;
acdbOpenObject(pBlkDefRcd, blkDefId, ZcDb::kForRead);
if (pBlkDefRcd->hasAttributeDefinitions())
{
//创建一个遍历器用来遍历所有的属性
AcDbBlockTableRecordIterator *pItr;
pBlkDefRcd->newIterator(pItr);
AcDbEntity *pEnt;

//遍历块定义属性
for (pItr->start(); !pItr->done(); pItr->step())
{
pItr->getEntity(pEnt, ZcDb::kForWrite);

//检查是否是属性定义
AcDbAttributeDefinition *pAttDef;
pAttDef = AcDbAttributeDefinition::cast(pEnt);
if (pAttDef != NULL)
{
AcDbAttribute *pAtt = new AcDbAttribute();
//从属性定义获取属性对象的对象特征
pAtt->setPropertiesFrom(pAttDef);
//设置属性对象的其他特征
pAtt->setInvisible(pAttDef->isInvisible());//属性是否不可见
//设置属性对象插入点,根据块参照的插入点做相应的位移操作
AcGePoint3d basePt = pAttDef->position();
basePt += pBlkRef->position().asVector();
pAtt->setPosition(basePt);
pAtt->setHeight(pAttDef->height());//设置高
pAtt->setRotation(pAttDef->rotation());//设置旋转角度

//获取属性对象的Tag、 Prompt和TestString
TCHAR *str;
str = pAttDef->tag();
pAtt->setTag(str);
free(str);
pAtt->setFieldLength(pAttDef->fieldLength());
str = pAttDef->textString();
pAtt->setTextString(str);
free(str);

//向块参照中追加属性对象
pBlkRef->appendAttribute(pAtt);
pAtt->close();
}
pEnt->close();
}
delete pItr;
}
//关闭数据库
pBlkRef->close();
pBlkDefRcd->close();
pBlkTabRcd->close();
}

时间: 2024-10-15 10:37:34

向当前模型空间中插入带属性的块定义的相关文章

将外部dwg图纸中指定带属性的块插入到当前图纸中

static void InsertBlock() { //获取要插入的块名 TCHAR str[40]; acedGetString(Adesk::kFalse, _T("\n请输入要插入的块名称:"), str); CString blockName ; blockName.Format(_T("%s"), str); //判断在当前图纸中是否已经被定义 AcDbDatabase *pCurDb = acdbHostApplicationServices()-&

java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间

java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类). java.sql.Date是java.util.Date的子类,是一个包装了毫秒值的瘦包装器,允许 JDBC 将毫秒值标识为 SQL DATE 值.毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以来经过的毫秒数. 为了与 SQL DATE 的定义一致,由 java.sql.Date 实例包装的毫秒值必须通过将时间.分钟.秒和毫

RichEdit中插入带背景色文本的一种思路

uses RichEdit; function TextToRtf( // 将文本处理为RTF格式 mText: WideString // 输入文本 ): WideString; // 返回处理后的RTF文本 var I: Integer; begin Result := StringReplace(mText, #13#10, #10, [rfReplaceAll]); for I := Length(mText) downto 1 do begin case mText[I] of '\'

事物的一致性:向数据库中插入同一属性不同列的值,出现异常,致使出现异常前后,数据都无法插入

主要是使用connection的三个方法实现: 开始事物:取消默认提交:connection.setAutoCommit(false);//其可选择false和true 都成功提交事物:connection.commit(); 回滚事物:connection.rollback(); ------------------------------------------------------------------------------------------------------------

整理IOS中Block用作属性、传值、回调用法

1.block用作属性 封装一段代码 在模型类中声明block属性 ,注意block的属性要使用copy否则会出问题 @property (copy, nonatomic) void (^actionBlock)(); @property (copy, nonatomic) void (^actionWithPapameterBlock)(int papameter); @property (copy,nonatomic) NSString *(^actionToReturnStirng)();

创建一个块定义,并添加实体插入到指定位置

这里实现的是在当前图纸中创建一个新的块定义,并且向该块定义中添加实体,将实体插入到当前图纸中,例子如下: CString blockName = _T("adf");//这里为要创建的块定义名称 AcDbBlockTable *pBlkTab; acdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlkTab, ZcDb::kForWrite); if (pBlkTab->has(bloc

删除外部dwg中指定的块定义

本例实现删除外部图纸中指定的块定义,在外部图纸当前模型空间中是没有该块定义的块参照存在. 代码如下: void CBlockUtil::DeleteBlockDefFormOtherDwg(const TCHAR* fileName, const TCHAR* blkDefName) { // 使用_SH_DENYNO参数打开图形(只读打开),允许其它用户读写该文件 AcDbDatabase* pSourceDwg = new AcDbDatabase(Adesk::kFalse); Acad:

盒子模型中的margin属性

记: 1.如果margin只有一个值,表示上右下左的margin同为这个值.例如:margin:10px; 就等于 margin:10px 10px 10px 10px; 2.如果 margin 只有两个值,第一个值表示上下margin值,第二个值为左右margin的值.例如:margin:10px 20px; 就等于 margin:10px 20px 10px 20px; 3.如果margin有三个值,第一个值表示上margin值,第二个值表示左右margin的值,第三个值表示下margin的

利用runtime实现延展动态改变模型类中属性的set,get方法

昨天大概的阐述了一下关于构架控制容器的概念,但是如果要丰满这个想法还有很多问题,比如如果我想对一些controller进行管理就势必涉及到controller的加载以及缓存,而想做这些的前提就是构建一个controller表.对表中设定的字符串管理,从而管理对应的controller.传统创建表的方法有很多,最为常用的就是plist文件,但是对于iOS开发的程序员来说,如果这个plist写死,在管理的时候就会比较死板,要知道oc是一门灵活的,动态的语言.如果我们使用NSUserDefaults,