美好的一天,
我遇到的问题是c#程序在提示用户识别的各个不同点上将10个块(通过矩阵变换方法)插入到图形上。
这些块在名称和属性方面是相同的,唯一不同的是它们的X和Y值。
我需要一种方法来在用户提示符下更改某些块的属性,例如块7和仅块7.而不更改其他9个相同块的相同命名属性。
有没有办法扫描所有块并根据其X和Y值找到一个块?然后编辑该特定块的属性。
编辑:
我使用下面的方法代码添加了块,路径图只包含那个块。
我现在需要做的是更改该块的文本属性,这意味着我需要我的代码才能找到它。我考虑使用选择方法,但我更愿意将这部分代码自动化,而不是让用户不必选择所需的块。
我可以让代码扫描该特定名称的块的所有块,然后在所需的X和Y插入点位置再次扫描块的那些块(这可能吗?)(我的程序处理X和Y位置因此我知道点,不需要用户再次给他们)。为了问题,请将它们称为BlkPt1 - BlkPt10。
但是扫描所有块方法对于具有许多块的较大图纸可能有点强烈,是否有更短的方法呢?我知道一个解决方案是改变我插入块的方式,但我真的很讨厌通常的blockreference / blocktablerecord插入方法。没有别的办法吗?
using (tr)
{
Vector3d blockDisplacement1 = new Vector3d(ptInsert.Value.X, ptInsert.Value.Y, ptInsert.Value.Z);
double blockScale = 1.0;
string blockPath = @"T:\test.dwg";
Database tmpDb = new Database(false, true);
tmpDb.ReadDwgFile(blockPath, System.IO.FileShare.Read, true, "");
Matrix3d Transform = Matrix3d
.Scaling(blockScale, Point3d.Origin)
.PreMultiplyBy(Matrix3d.Displacement(blockDisplacement1))
.PreMultiplyBy(ed.CurrentUserCoordinateSystem);
db.Insert(Transform, tmpDb, true);
tr.Commit();
tr.Dispose();
}
}
答案 0 :(得分:0)
跟踪插入后分配给块的.Handle
- 这是AutoCAD数据库中对象的唯一标识符。它仅对该特定数据库是唯一的,它不是全局唯一的。请勿尝试使用.ObjectId
来跟踪此情况,它会在会话之间发生变化,.Handle
是一致的。
确保您要更改的AttributeReference
不是.Constant
,因为对BlockDefinition
的每次引用都相同。
tr.Dispose();
声明中不需要{p> using () {}
,只需tr.Commit();
即可。
有关AutoCAD代码的更多链接,请参阅Wiki。