.IsDynamicBlock 是用来判断是否是动态块的...
但是它有问题..当频繁使用的时候会出现报错..
但是你要获取 动态块名称 的时候,直接读就好了...不需要判断它是不是动态块的....
/// <summary> /// id有效,未被删除 /// </summary> /// <param name="id"></param> /// <returns></returns> public static bool IsOk(this ObjectId id) { return !id.IsNull && id.IsValid && !id.IsErased && !id.IsEffectivelyErased && id.IsResident; }
/// <summary> /// 获取真实块名 /// </summary> /// <param name="brRec">块参照</param> /// <returns>成功返回:块的真实名称,失败返回:null</returns> public static string GetBlockName(this BlockReference brRec) { //eInvalidObjectId 重复空格执行上次报这个错误,应该在所有GetObject位置写.Dispose(); string blockName = "";//存储块名 // brRec.IsDynamicBlock 如果是动态块这句会报错 //块的Z比例是0就会令动态块变成普通块,那么导致判断动态块失效 //打开动态块表记录,获取动态块名也可以获取普通块的名 if (brRec.DynamicBlockTableRecord.IsOk()) { var btRec = brRec.DynamicBlockTableRecord.GetObject(OpenMode.ForRead) as BlockTableRecord; blockName = btRec.Name; btRec.Dispose(); } return blockName; }
但是如果要构造选择集,那么把过滤器写成以下形式就好了.这可以令普通块和动态块都受惠~
如果你仍然会报 eInvalidObjectId 错误(我在频繁重复空格执行上次命令时候报这个错误)
这个时候应该在所有GetObject开启的东西最后 .Dispose();
测试版本Acad20008