如何像 Civil3D 一样从 API 获取 AutoCAD Civil3D 绘图范围?
How to get AutoCAD Civil3D drawing extents from API like Civil3D does?
我想使用 Design Automation 从 Civil3D dwg 中提取绘图范围。
如果我使用下面的代码:
static public Extents3d GetExtents(Database db) {
try {
//db.UpdateExt(true);
return new Extents3d(db.Extmin, db.Extmax);
} catch {
return new Extents3d();
}
}
然后我得到以下正确的结果:
Min: [2538909.32, 330601.59, 0.00]
Max: [2540326.77, 331107.96, 0.00]
但是,如果我之前调用 db.UpdateExt(true)
,或者如果我只是使用下面的代码迭代模型 space 中的所有实体,我会得到一个位于原点的最小界限:
static public Extents3d GetExtents(Database db) {
try {
var TxMng = db.TransactionManager;
using(var Tx = TxMng.StartTransaction()) {
var btr = Tx.GetObject(
db.CurrentSpaceId, OpenMode.ForRead)
as BlockTableRecord;
foreach(var id in btr) {
var entity = Tx.GetObject(id, OpenMode.ForRead)
as Entity;
extents.AddExtents(entity.GeometricExtents);
}
Tx.Commit();
}
return extents;
} catch {
return new Extents3d();
}
}
输出:
Min: [0.00, 0.00, 0.00]
Max: [2540326.77, 331107.96, 0.00]
同时在 AutoCAD vanilla 中打开 dwg 并进行缩放范围将使用此 huge/invalid 范围。所以我认为 Civil 知道在计算范围时不应包括某些实体还是其他东西?
我希望能够使用第二种方法(至少是它的修改后的工作版本)来计算范围,因为如果以后我们有一些更高级的要求,它可以更细化我们要考虑的实体。
在迭代实体以计算扩展时,我们可以不包括实体 AeccDbNetworkPartConnector。您可以使用 API entity.GetRXClass().Name
来获取名称 AeccDbNetworkPartConnector
,这有助于过滤掉这些实体。
我想使用 Design Automation 从 Civil3D dwg 中提取绘图范围。
如果我使用下面的代码:
static public Extents3d GetExtents(Database db) {
try {
//db.UpdateExt(true);
return new Extents3d(db.Extmin, db.Extmax);
} catch {
return new Extents3d();
}
}
然后我得到以下正确的结果:
Min: [2538909.32, 330601.59, 0.00]
Max: [2540326.77, 331107.96, 0.00]
但是,如果我之前调用 db.UpdateExt(true)
,或者如果我只是使用下面的代码迭代模型 space 中的所有实体,我会得到一个位于原点的最小界限:
static public Extents3d GetExtents(Database db) {
try {
var TxMng = db.TransactionManager;
using(var Tx = TxMng.StartTransaction()) {
var btr = Tx.GetObject(
db.CurrentSpaceId, OpenMode.ForRead)
as BlockTableRecord;
foreach(var id in btr) {
var entity = Tx.GetObject(id, OpenMode.ForRead)
as Entity;
extents.AddExtents(entity.GeometricExtents);
}
Tx.Commit();
}
return extents;
} catch {
return new Extents3d();
}
}
输出:
Min: [0.00, 0.00, 0.00]
Max: [2540326.77, 331107.96, 0.00]
同时在 AutoCAD vanilla 中打开 dwg 并进行缩放范围将使用此 huge/invalid 范围。所以我认为 Civil 知道在计算范围时不应包括某些实体还是其他东西?
我希望能够使用第二种方法(至少是它的修改后的工作版本)来计算范围,因为如果以后我们有一些更高级的要求,它可以更细化我们要考虑的实体。
在迭代实体以计算扩展时,我们可以不包括实体 AeccDbNetworkPartConnector。您可以使用 API entity.GetRXClass().Name
来获取名称 AeccDbNetworkPartConnector
,这有助于过滤掉这些实体。