AutoCAD 从 BlockReference 获取长度。
AutoCAD Get Length from BlockReference.
问题
我正在努力从 AutoCAD 中的 BlockReference 获取长度。
我不知何故是一个数学菜鸟得到了宽度和高度但我无法得到长度
到目前为止的 BlockReference。
有没有办法获取 BlockReference 的长度。我查看了 AutoCad API 但没有成功。也许有人可以告诉我方向。
我做了什么
public static double GetBlockWidthAndHeight(BlockReference blockReference) {
try {
var db = HostApplicationServices.WorkingDatabase;
var blockname = blockReference.Name;
double width = 0;
using (var tr = db.TransactionManager.StartTransaction()) {
var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
if (!bt.Has(blockname)) {
return 0;
}
var btrec = (BlockTableRecord)tr.GetObject(bt[blockname], OpenMode.ForRead, false);
Extents3d? bounds;
bounds = btrec.Bounds;
if (bounds.HasValue) {
var ext = bounds.Value;
width = ext.MaxPoint.X - ext.MinPoint.X;
double height = ext.MaxPoint.Y - ext.MinPoint.Y;
}
else {
var bref = new BlockReference(Point3d.Origin, bt[blockname]);
bounds = bref.Bounds;
var ext = bounds.Value;
width = ext.MaxPoint.X - ext.MinPoint.X;
double height = ext.MaxPoint.Y - ext.MinPoint.Y;
bref.Dispose();
}
tr.Commit();
}
return width;
}
catch (Exception ex) {
Debug.WriteLine(ex.Message);
}
return 0;
}
您的块引用是 3D 对象吗?如果是这样。我注意到您目前沿 X 轴(宽度)和 Y 轴(高度)获得对象的边界,但您没有使用 Z 轴。如果块引用是二维对象,那么您描述的方法将不起作用,因为该信息根本不存在。
您也可以尝试在 AutoCAD 'Properties' 选项板下查看块参照的属性。根据块引用的制作方式,可能已经存在您可以通过 API.
简单访问的维度值
这里是 Kean Wamsley 博客的 link,给出了一些关于如何利用 API 直接访问区块信息的简短示例 - http://through-the-interface.typepad.com/through_the_interface/2009/03/accessing-the-properties-of-a-dynamic-autocad-block-using-net.html
问题
我正在努力从 AutoCAD 中的 BlockReference 获取长度。 我不知何故是一个数学菜鸟得到了宽度和高度但我无法得到长度 到目前为止的 BlockReference。 有没有办法获取 BlockReference 的长度。我查看了 AutoCad API 但没有成功。也许有人可以告诉我方向。
我做了什么
public static double GetBlockWidthAndHeight(BlockReference blockReference) {
try {
var db = HostApplicationServices.WorkingDatabase;
var blockname = blockReference.Name;
double width = 0;
using (var tr = db.TransactionManager.StartTransaction()) {
var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
if (!bt.Has(blockname)) {
return 0;
}
var btrec = (BlockTableRecord)tr.GetObject(bt[blockname], OpenMode.ForRead, false);
Extents3d? bounds;
bounds = btrec.Bounds;
if (bounds.HasValue) {
var ext = bounds.Value;
width = ext.MaxPoint.X - ext.MinPoint.X;
double height = ext.MaxPoint.Y - ext.MinPoint.Y;
}
else {
var bref = new BlockReference(Point3d.Origin, bt[blockname]);
bounds = bref.Bounds;
var ext = bounds.Value;
width = ext.MaxPoint.X - ext.MinPoint.X;
double height = ext.MaxPoint.Y - ext.MinPoint.Y;
bref.Dispose();
}
tr.Commit();
}
return width;
}
catch (Exception ex) {
Debug.WriteLine(ex.Message);
}
return 0;
}
您的块引用是 3D 对象吗?如果是这样。我注意到您目前沿 X 轴(宽度)和 Y 轴(高度)获得对象的边界,但您没有使用 Z 轴。如果块引用是二维对象,那么您描述的方法将不起作用,因为该信息根本不存在。
您也可以尝试在 AutoCAD 'Properties' 选项板下查看块参照的属性。根据块引用的制作方式,可能已经存在您可以通过 API.
简单访问的维度值这里是 Kean Wamsley 博客的 link,给出了一些关于如何利用 API 直接访问区块信息的简短示例 - http://through-the-interface.typepad.com/through_the_interface/2009/03/accessing-the-properties-of-a-dynamic-autocad-block-using-net.html