如何像 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,这有助于过滤掉这些实体。