【问题标题】:Setting parameters inside the class, Null object在类内设置参数,Null 对象
【发布时间】: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();
    

【问题讨论】:

    标签: c# class constructor revit


    【解决方案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);
    

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

    【讨论】:

    • 调试是编程的一部分。即使是专业人士。很少写东西并且第一次就让它工作。坚持下去! =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多