首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Revit API镜像剖面视图内的详图

使用Revit API镜像剖面视图内的详图
EN

Stack Overflow用户
提问于 2017-02-27 22:38:23
回答 2查看 253关注 0票数 0

我在剖面视图中有一些详图线,我希望在剖面的CropBox中点上镜像这些详图线。我正在使用ElementTransformUtils.MirrorElements来尝试实现这一点。但是,我还无法找到要在其上镜像详图线的正确平面。我尝试过Plane.CreateByNormalAndOrigin(section.ViewDirection, section.Origin)detailLine.SketchPlane.GetPlane(),但它们都没有反映细节线。

实现这一目标的正确方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-02 06:25:11

我能够将我的详细信息映射到ViewSection.CropBox的中点,但这相当复杂。我发现ViewSection.Origin是项目坐标系中的一个点。另一方面,ViewSection.CropBox不提供其在项目坐标系中的最小和最大值,而是提供CropBox相对于ViewSection.Origin的位置。使用ViewSection.OriginViewSection.CropBox可以计算ViewSection.CropBox在项目坐标系中的最小值和最大值。最后,您需要使用这些最小值和最大值来找到ViewSection.CropBox的中点,然后在该点上进行镜像。

下面是我使用的一些帮助器类,这样我就可以通过一个函数找到Min和Max

代码语言:javascript
运行
复制
public enum PointComponent
{
  Invalid,
  X,
  Y,
  Z
}

public enum MinOrMax
{
  Invalid,
  Min,
  Max
}

下面是查找CropBox的最小值或最大值的X、Y或Z分量的函数:

代码语言:javascript
运行
复制
private double GetSectionCropBoxOrigin(ViewSection section,
  PointComponent pointComponent, MinOrMax minOrMax)
{
  double cropBoxOrigin;

  double sectionOrigin, viewDirection, upDirection, rightDirection;

  switch (pointComponent)
  {
    case PointComponent.X:
      sectionOrigin = section.Origin.X;
      viewDirection = section.ViewDirection.X;
      upDirection = section.UpDirection.X;
      rightDirection = section.RightDirection.X;
      break;
    case PointComponent.Y:
      sectionOrigin = section.Origin.Y;
      viewDirection = section.ViewDirection.Y;
      upDirection = section.UpDirection.Y;
      rightDirection = section.RightDirection.Y;
      break;
    case PointComponent.Z:
      sectionOrigin = section.Origin.Z;
      viewDirection = section.ViewDirection.Z;
      upDirection = section.UpDirection.Z;
      rightDirection = section.RightDirection.Z;
      break;
    default:
      throw new InvalidOperationException();
  }

  double cropX, cropY;

  switch (minOrMax)
  {
    case MinOrMax.Min:
      cropX = section.CropBox.Min.X;
      cropY = section.CropBox.Min.Y;
      break;
    case MinOrMax.Max:
      cropX = section.CropBox.Max.X;
      cropY = section.CropBox.Max.Y;
      break;
    default:
      throw new InvalidOperationException();
  }

  if (Math.Abs(viewDirection) == 1)
    cropBoxOrigin = sectionOrigin;
  else if (Math.Abs(upDirection) == 1)
    cropBoxOrigin = sectionOrigin + (cropY * upDirection);
  else if (Math.Abs(rightDirection) == 1)
    cropBoxOrigin = sectionOrigin + (cropX * rightDirection);
  else
    throw new InvalidOperationException();

  return cropBoxOrigin;
}

请注意,对于PointComponent.Z,我们不使用最小值和最大值之间的中点,而是使用原点。这是因为我们的细节作品只存在于2D中,即使我们指定了CropBox深度,并且细节作品位于与ViewSection.Origin相同的深度。

下面是我用来获取中点的代码:

代码语言:javascript
运行
复制
private XYZ Get3dMidpoint(XYZ start, XYZ end)
{
    double x = (start.X + end.X) / 2.0;
    double y = (start.Y + end.Y) / 2.0;
    double z = (start.Z + end.Z) / 2.0;

    return new XYZ(x, y, z);
}

最后,这里是将所有这些集合在一起并获得镜像平面的代码:

代码语言:javascript
运行
复制
XYZ cropBoxMinInGlobalCoordinates = new XYZ(
    GetSectionCropBoxOrigin(section, PointComponent.X, MinOrMax.Min),
    GetSectionCropBoxOrigin(section, PointComponent.Y, MinOrMax.Min),
    GetSectionCropBoxOrigin(section, PointComponent.Z, MinOrMax.Min)
);
XYZ cropBoxMaxInGlobalCoordinates = new XYZ(
    GetSectionCropBoxOrigin(section, PointComponent.X, MinOrMax.Max),
    GetSectionCropBoxOrigin(section, PointComponent.Y, MinOrMax.Max),
    GetSectionCropBoxOrigin(section, PointComponent.Z, MinOrMax.Max)
);
XYZ cropBoxOriginInGlobalCoordinates = 
  Get3dMidpoint(cropBoxMinInGlobalCoordinates, cropBoxMaxInGlobalCoordinates);

Plane mirrorPlane = 
  Plane.CreateByNormalAndOrigin(section.RightDirection, cropBoxOriginInGlobalCoordinates);
票数 0
EN

Stack Overflow用户

发布于 2017-02-28 22:23:38

是的,你提到的平面不会像你预期的那样镜像。

我假设你需要一个垂直于细节线的平面。

这将镜像一条水平细节线,例如从右到左显示,反之亦然。

可以根据详图线本身确定镜像平面的法线和原点:

代码语言:javascript
运行
复制
  XYZ p = detail line start point
  XYZ q = detail line end point
  XYZ normal = q - p
  Plane plane = Plane.CreateByNormalAndOrigin(p, normal)

或多或少。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42488440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档