如何像Civil3D一样从API获取AutoCAD Civil3D绘图范围?

问题描述

我想使用Design Automation从Civil3D dwg提取工程图范围。

如果我使用以下代码

n = 1000
beta0 = 2.1; beta1 = 0.7
set.seed(12345)
X = runif(n,10,20)
Y = beta0 + beta1*X + .4*X*rnorm(n)

library(quantreg)
fit.05 = rq(Y ~ X,tau = .05)
fit.95 = rq(Y ~ X,tau = .95)

Lower = fit.05$fitted.values
Upper = fit.95$fitted.values

plot(X,Y,main = "Scatterplot with 90% Prediction Limits")
points(X,Lower,pch=".",col="red")
points(X,Upper,col="red")

然后我得到以下正确的结果:

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)

输出

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();
  }
}

也可以在AutoCAD vanilla中打开dwg并进行缩放范围将使用此巨大/无效范围。因此,我认为Civil知道在计算范围时不应该包括某些实体吗?还是其他的东西?

我希望能够使用第二种方法(至少是它的修改后的工作版本)来计算范围,因为如果稍后我们有一些更高级的要求,它可以为我们要考虑的实体提供更多的粒度。

解决方法

在迭代实体以计算扩展时,可以不包含实体AeccDbNetworkPartConnector。您可以使用API​​ entity.GetRXClass().Name来获取名称AeccDbNetworkPartConnector,这可以帮助过滤掉这些实体。