对于cad二次开发的程序员来说,定位功能可谓是常用操作。下面介绍一种定位方式。
/// <summary>
/// 定位
/// </summary>
/// <param name="oid"></param>
public void Orientate(ObjectId[] oid)
{
ObjectIdCollection oic = new ObjectIdCollection();
// 定义最大点
double locationMaxX = -100000000000000;
double locationMaxy = -100000000000000;
double locationMaxZ = -100000000000000;
double locationMinX = 100000000000000;
double locationMinY = 100000000000000;
double locationMinZ = 100000000000000;
Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
Database db = HostApplicationServices.WorkingDatabase;
using (DocumentLock docLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
{
//定义过滤器
PromptSelectionResult res = ed.SelectAll();
if (res.Status == PromptStatus.OK)
{
using (Transaction trans = db.TransactionManager.StartTransaction())
{
//遍历选择集
foreach (ObjectId id in res.Value.GetObjectIds())
{
if (id == oid)
{
oic.Add(oid);
//获取选择集里的对象
Entity entObject = trans.GetObject(id, OpenMode.ForWrite) as Entity;
// 定义最大点X
double maxX = 0;
// 定义最大点Y
double maxY = 0;
// 定义最大点Z
double maxZ = 0;
// 定义最小点X
double minX = 0;
// 定义最小点Y
double minY = 0;
// 定义最小点Z
double minZ = 0;
// 得到最大点X
maxX = entObject.GeometricExtents.MaxPoint.X;
// 得到最大点Y
maxY = entObject.GeometricExtents.MaxPoint.Y;
// 得到最大点Z
maxZ = entObject.GeometricExtents.MaxPoint.Z;
// 得到最小点X
minX = entObject.GeometricExtents.MinPoint.X;
// 得到最小点Y
minY = entObject.GeometricExtents.MinPoint.Y;
// 得到最小点Z
minZ = entObject.GeometricExtents.MinPoint.Z;
// 得到最大点x
if (maxX > locationMaxX)
{
// 得到最大点x
locationMaxX = maxX;
}
// 得到最大点y
if (maxY > locationMaxy)
{
// 得到最大点y
locationMaxy = maxY;
}
// 得到最大点z
if (maxZ > locationMaxZ)
{
// 得到最大点Z
locationMaxZ = maxZ;
}
// 得到最小点x
if (minX < locationMinX)
{
// 得到最小点x
locationMinX = minX;
}
// 得到最小点y
if (minY < locationMinY)
{
// 得到最小点y
locationMinY = minY;
}
// 得到最小点z
if (minZ < locationMinZ)
{
// 得到最小点z
locationMinZ = minZ;
}
// 计算中心点
double x = (locationMaxX + locationMinX) / 2;
double y = (locationMaxy + locationMinY) / 2;
double z = (locationMaxZ + locationMinZ) / 2;
// 定位的中心点
Point3d center = new Point3d();
// 得到中心点
center = new Point3d(x, y, z);
// 长度
double length = (locationMaxX - locationMinX);
// 宽度
double weight = (locationMaxy - locationMinY);
// 定位
VPoint(center, length + 150, weight + 150);
break;
}
else
{
continue;
}
}
trans.Commit();
}
}
}
}
#endregion
该方法的实现步骤是,通过过滤器选择实体id进行匹配。如果匹配成功,则进行中心点计算。之后通过中心点和长宽。即可将被定位的实体以合适的视角展示到视图中(俯视)。读者也可以调用前面的其他设置视图方法,得到不同视角的定位视图效果。