一般而言,当知道墙的底部的z轴坐标,就可以用以下代码,来调整墙在Z轴上的位置以达到生成的z轴位置正确

Wall w; //墙
double baseOffset; //底部偏移值(z轴坐标值)
w.get_Parameter(BuiltInParameter.WALL_BASE_OFFSET).Set(baseOffset);

但是,还有一个坑,那就是墙有一个属性是“底部约束”

Revit生成墙的坑_二次开发

如上图,是一个标高。在平常,我们新建一个项目,会有标高1,而这个标高1的Elevation,也就是高度就是0,这样的话,我们上面的代码运行出来生成的墙位置是对的。

但很多项目,生成出来的墙,它的底部约束会是一个高度不为0的标高,这时上面的代码生成的墙,在z轴上的位置就不对了

那怎么解决呢

首先要获取到这个底部约束所对应的标高元素

var bc = w.get_Parameter(BuiltInParameter.WALL_BASE_CONSTRAINT);

这个元素是一个ElementId对象,即标高元素的id

通过这个id就可以获取到对应的标高元素,再通过属性就能获取到标高的Elevation

Level l = m_doc.GetElement(bc.AsElementId()) as Level;
double elevation=l.Elevation;

然后,在设置墙的底部偏移代码中,要把这个高度也减去,最后出来的结果才是正确的

Wall w; //墙
double baseOffset; //底部偏移值(z轴坐标值)
var bc = w.get_Parameter(BuiltInParameter.WALL_BASE_CONSTRAINT);
Level l = m_doc.GetElement(bc.AsElementId()) as Level;
double elevation=l.Elevation; //标高高度
baseOffset-=elevation;
w.get_Parameter(BuiltInParameter.WALL_BASE_OFFSET).Set(baseOffset);