在类内设置参数,Null 对象

Posted

技术标签:

【中文标题】在类内设置参数,Null 对象【英文标题】:Setting parameters inside the class, Null object 【发布时间】:2020-07-24 16:48:03 【问题描述】:

我正在做的是尝试在 Revit 中的工作表上放置视图,无论是中心页面还是四个象限之一的中心。但是我没有建立课程的经验,而且我很挣扎。 我想在初始化时设置我的所有属性,一旦绘制了选择框轮廓,它们就不应更改。

我可以使用 ViewPortOutline(UIDocument UIDoc) 绘制选择框,如果我使用 taskDialog,pickBox.Min.X 将返回其值

但是当我到达“setXYZParameter”时,这会将我锁定在选择框中,并且不会移动到对话框中

如果我注释掉“setXYZParameter”,代码会向前移动到对话框,但 ReturnOutline() pickBox.Min.X 为空,因为“setXYZParameter”被注释掉了。

公共类 ViewPortOutline 公共静态 XYZ VP_CenterPoint 获取;放; 公共静态 XYZ VP_CenterPoint_Q1 获取;放; 公共静态 XYZ VP_CenterPoint_Q2 获取;放; 公共静态 XYZ VP_CenterPoint_Q3 获取;放; 公共静态 XYZ VP_CenterPoint_Q4 获取;放; 私有静态 UIDocument _UIDoc 获取;放; 公共静态 PickedBox pickBox 获取;放;

  public ViewPortOutline(UIDocument UIDoc)
  
      _UIDoc = UIDoc;
      PickBox();
  

  public static void PickBox()
  
      Selection selection = _UIDoc.Selection;
      PickedBox pickBox = selection.PickBox(PickBoxStyle.Directional);//<<<  Problem Here

      setXYZParameters();
  

  public static Outline ReturnOutline()
  
      double minX = pickBox.Min.X;//<<<  Null
      double minY = pickBox.Min.Y;

      double maxX = pickBox.Max.X;
      double maxY = pickBox.Max.Y;

      double sminX = Math.Min(minX, maxX);
      double sminY = Math.Min(minY, maxY);

      double smaxX = Math.Max(minX, maxX);
      double smaxY = Math.Max(minY, maxY);

      Outline outline = new Outline(new XYZ(sminX, sminY, 0), new XYZ(smaxX, smaxY, 0));

      return outline;
  

  public static void ReturnCenterPoints(UIDocument uidoc, Outline outline,
      out XYZ midpoint, out XYZ q1c, out XYZ q2c, out XYZ q3c, out XYZ q4c)
  
      double outlineDiagonal = outline.GetDiagonalLength();
      double outlineCenter = outline.GetDiagonalLength() / 2;

      XYZ bottomleft = (outline.MinimumPoint);
      XYZ topleft = new XYZ(outline.MinimumPoint[0], outline.MaximumPoint[1], 0);

      XYZ topright = (outline.MaximumPoint);
      XYZ bottomright = new XYZ(outline.MaximumPoint[0], outline.MinimumPoint[1], 0);

      midpoint = new XYZ((outline.MaximumPoint[0]) / 2, (outline.MaximumPoint[1]) / 2, 0);

      XYZ midleft = new XYZ(outline.MinimumPoint[0], outline.MaximumPoint[1] / 2, 0);
      XYZ midtop = new XYZ(outline.MaximumPoint[0] / 2, outline.MaximumPoint[1], 0);
      XYZ midright = new XYZ(outline.MaximumPoint[0], outline.MaximumPoint[1] / 2, 0);
      XYZ midbottom = new XYZ(outline.MaximumPoint[0] / 2, outline.MinimumPoint[1], 0);

      Outline q1 = new Outline(midpoint, topright);
      q1c = new XYZ(
          q1.MaximumPoint[0] / 2,
          q1.MaximumPoint[1] / 2, 0);

      Outline q2 = new Outline(midleft, midtop);
      q2c = new XYZ(
          q2.MaximumPoint[0] / 2,
          q2.MaximumPoint[1] / 2, 0);

      Outline q3 = new Outline(bottomleft, midpoint);
      q3c = new XYZ(
          q3.MaximumPoint[0] / 2,
          q3.MaximumPoint[1] / 2, 0);

      Outline q4 = new Outline(midbottom, midright);
      q4c = new XYZ(
          q4.MaximumPoint[0] / 2,
          q4.MaximumPoint[1] / 2, 0);
  

  public static void setXYZParameters()
  
      XYZ mp; XYZ q1c; XYZ q2c; XYZ q3c; XYZ q4c;

      ReturnCenterPoints(_UIDoc, ReturnOutline(),
          out mp, out q1c, out q2c, out q3c, out q4c);

      VP_CenterPoint = mp;
      VP_CenterPoint_Q1 = q1c;
      VP_CenterPoint_Q2 = q2c;
      VP_CenterPoint_Q3 = q3c;
      VP_CenterPoint_Q4 = q4c;
  

      ViewPortOutline outline = new ViewPortOutline(uidoc);


      UnitSetup_Form form = new UnitSetup_Form(commandData);
      form.ShowDialog();

【问题讨论】:

【参考方案1】:

我没有通过我的论点...

setXYZParameters(pickBox);
public static Outline ReturnOutline(PickedBox pickBox)
public static void setXYZParameters(PickedBox pickBox)
ReturnCenterPoints(_UIDoc, ReturnOutline(pickBox),
            out midpoint, out q1c, out q2c, out q3c, out q4c);

编程压力很大,我花更多时间调试然后创建...

【讨论】:

调试是编程的一部分。即使是专业人士。很少写东西并且第一次就让它工作。坚持下去! =)

以上是关于在类内设置参数,Null 对象的主要内容,如果未能解决你的问题,请参考以下文章

静态成员不能在类内初始化

MFC 线程的创建,线程函数在类内类外

C#面向对象

C++中静态成员变量的可以在类内初始化吗?

c++

1.类中数据成员的声明与初始化总结