Esempio n. 1
0
        private static VisualizationInfo GenerateViewpoint(DrawingControl3D control3D)
        {
            try
            {
                var v = new VisualizationInfo();
                // it is a orthogonal view
                if (control3D.Viewport.Orthographic)
                {
                    // ReSharper disable once RedundantNameQualifier
                    var cam = control3D.Viewport.Camera as System.Windows.Media.Media3D.OrthographicCamera;

                    if (cam != null)
                        v.OrthogonalCamera = new OrthogonalCamera
                        {
                            // todo: this works internally, but we must ensure it's compatible with other bcf viewers
                            CameraViewPoint =
                            {
                                X = cam.Position.X,
                                Y = cam.Position.Y,
                                Z = cam.Position.Z
                            },
                            CameraUpVector =
                            {
                                X = cam.UpDirection.X,
                                Y = cam.UpDirection.Y,
                                Z = cam.UpDirection.Z
                            },
                            CameraDirection =
                            {
                                X = cam.LookDirection.X,
                                Y = cam.LookDirection.Y,
                                Z = cam.LookDirection.Z
                            },
                            ViewToWorldScale = cam.Width
                        };
                }
                // it is a perspective view
                else
                {
                    // todo: this works internally, but we must ensure it's compatible with other bcf viewers
                    var cam = control3D.Viewport.Camera as System.Windows.Media.Media3D.PerspectiveCamera;
                    if (cam != null)
                        v.PerspectiveCamera = new PerspectiveCamera()
                        {
                            CameraViewPoint =
                            {
                                X = cam.Position.X,
                                Y = cam.Position.Y,
                                Z = cam.Position.Z
                            },
                            CameraUpVector =
                            {
                                X = cam.UpDirection.X,
                                Y = cam.UpDirection.Y,
                                Z = cam.UpDirection.Z
                            },
                            CameraDirection =
                            {
                                X = cam.LookDirection.X,
                                Y = cam.LookDirection.Y,
                                Z = cam.LookDirection.Z
                            },
                            FieldOfView = cam.FieldOfView
                        };
                }

                /* todo components list to be implemented

                //COMPONENTS PART
                var versionName = "XbimXplorer BCFIer Plugin";
                v.Components = new List<Component>();

                var visibleElems = new FilteredElementCollector(doc, doc.ActiveView.Id)
                    .WhereElementIsNotElementType()
                    .WhereElementIsViewIndependent()
                    .ToElementIds();
                var hiddenElems = new FilteredElementCollector(doc)
                        .WhereElementIsNotElementType()
                        .WhereElementIsViewIndependent()
                        .Where(x => x.IsHidden(doc.ActiveView)
                                    ||
                                    !doc.ActiveView.IsElementVisibleInTemporaryViewMode(
                                        TemporaryViewMode.TemporaryHideIsolate, x.Id)).ToList();
                    //would need to check how much this is affecting performance

                var selectedElems = uidoc.Selection.GetElementIds();

                //include only hidden elements and selected in the BCF
                if (visibleElems.Count() > hiddenElems.Count())
                {
                    foreach (var elem in hiddenElems)
                    {
                        v.Components.Add(new Component
                        {
                            OriginatingSystem = versionName,
                            IfcGuid = IfcGuid.ToIfcGuid(ExportUtils.GetExportId(doc, elem.Id)),
                            Visible = false,
                            Selected = false,
                            AuthoringToolId = elem.Id.IntegerValue.ToString()
                        });
                    }
                    foreach (var elem in selectedElems)
                    {
                        v.Components.Add(new Component
                        {
                            OriginatingSystem = versionName,
                            IfcGuid = IfcGuid.ToIfcGuid(ExportUtils.GetExportId(doc, elem)),
                            Visible = true,
                            Selected = true,
                            AuthoringToolId = elem.IntegerValue.ToString()
                        });
                    }
                }
                //include only visible elements
                //all the others are hidden
                else
                {
                    foreach (var elem in visibleElems)
                    {
                        v.Components.Add(new Component
                        {
                            OriginatingSystem = versionName,
                            IfcGuid = IfcGuid.ToIfcGuid(ExportUtils.GetExportId(doc, elem)),
                            Visible = true,
                            Selected = selectedElems.Contains(elem),
                            AuthoringToolId = elem.IntegerValue.ToString()
                        });
                    }
                }
                */
                return v;

            }
            catch (Exception ex)
            {
                MessageBox.Show("Error generating viewpoint", "exception: " + ex);
            }
            return null;
        }
Esempio n. 2
0
    public static void Open(Document doc, VisualizationInfo v)
    {
      try
      {

        NavisUtils.GetGunits(doc);
        Viewpoint viewpoint = new Viewpoint();

        //orthogonal
        if (v.OrthogonalCamera != null)
        {
          if (v.OrthogonalCamera.CameraViewPoint == null || v.OrthogonalCamera.CameraUpVector == null ||
              v.OrthogonalCamera.CameraDirection == null)
            return;

          var zoom = v.OrthogonalCamera.ViewToWorldScale.ToInternal();
          var cameraDirection = NavisUtils.GetNavisVector(v.OrthogonalCamera.CameraDirection);
          var cameraUpVector = NavisUtils.GetNavisVector(v.OrthogonalCamera.CameraUpVector);
          var cameraViewPoint = NavisUtils.GetNavisXYZ(v.OrthogonalCamera.CameraViewPoint);

          viewpoint.Position = cameraViewPoint;
          viewpoint.AlignUp(cameraUpVector);
          viewpoint.AlignDirection(cameraDirection);
          viewpoint.Projection = ViewpointProjection.Orthographic;
          viewpoint.FocalDistance = 1;

          //TODO
          //for better zooming from revit should use > zoom * 1.25
          //for better zooming from tekla should use > zoom / 1.25
          //still not sure why
          Point3D xyzTL = cameraViewPoint.Add(cameraUpVector.Multiply(zoom));
          var dist = xyzTL.DistanceTo(cameraViewPoint);
          viewpoint.SetExtentsAtFocalDistance(1, dist);
        }
        //perspective
        else if (v.PerspectiveCamera != null)
        {
          if (v.PerspectiveCamera.CameraViewPoint == null || v.PerspectiveCamera.CameraUpVector == null ||
              v.PerspectiveCamera.CameraDirection == null)
            return;

          var zoom = v.PerspectiveCamera.FieldOfView;
          var cameraDirection = NavisUtils.GetNavisVector(v.PerspectiveCamera.CameraDirection);
          var cameraUpVector = NavisUtils.GetNavisVector(v.PerspectiveCamera.CameraUpVector);
          var cameraViewPoint = NavisUtils.GetNavisXYZ(v.PerspectiveCamera.CameraViewPoint);

          viewpoint.Position = cameraViewPoint;
          viewpoint.AlignUp(cameraUpVector);
          viewpoint.AlignDirection(cameraDirection);
          viewpoint.Projection = ViewpointProjection.Perspective;
          viewpoint.FocalDistance = zoom;
        }

        doc.CurrentViewpoint.CopyFrom(viewpoint);


        //show/hide elements
        //todo: needs improvement
        //todo: add settings
        if (v.Components != null && v.Components.Any())
        {
          List<ModelItem> attachedElems = new List<ModelItem>();
          List<ModelItem> elems = doc.Models.First.RootItem.DescendantsAndSelf.ToList<ModelItem>();


          foreach (var item in elems.Where(o => o.InstanceGuid != Guid.Empty))
          {
            string ifcguid = IfcGuid.ToIfcGuid(item.InstanceGuid).ToString();
            if (v.Components.Any(o => o.IfcGuid == ifcguid))
              attachedElems.Add(item);

          }
          if (attachedElems.Any()) //avoid to hide everything if no elements matches
          {
            if (UserSettings.Get("selattachedelems") == "0")
            {
              List<ModelItem> elemsVisible = new List<ModelItem>();
              foreach (var item in attachedElems)
              {
                elemsVisible.AddRange(item.AncestorsAndSelf);
              }
              foreach (var item in elemsVisible)
                elems.Remove(item);

              doc.Models.ResetAllHidden();
              doc.Models.SetHidden(elems, true);
            }
            else
            {
              doc.CurrentSelection.Clear();
              doc.CurrentSelection.AddRange(attachedElems);
            }
          }
        }
      }

      catch (System.Exception ex1)
      {
        MessageBox.Show("exception: " + ex1, "Error opening view");
      }
    }
Esempio n. 3
0
        //<summary>
        //Generate a VisualizationInfo of the current view
        //</summary>
        //<returns></returns>
        private VisualizationInfo GenerateViewpoint()
        {
            try
              {
            var uidoc = uiapp.ActiveUIDocument;
            var doc = uidoc.Document;

            var v = new VisualizationInfo();

            //Corners of the active UI view
            var topLeft = uidoc.GetOpenUIViews()[0].GetZoomCorners()[0];
            var bottomRight = uidoc.GetOpenUIViews()[0].GetZoomCorners()[1];

            //It's a 2D view
            //not supported by BCF, but I store it under a custom
            //fields using 2D coordinates and sheet id
            if (uidoc.ActiveView.ViewType != ViewType.ThreeD)
            {
              v.SheetCamera = new SheetCamera
              {
            SheetID = uidoc.ActiveView.Id.IntegerValue,
            TopLeft = new Point { X = topLeft.X, Y = topLeft.Y, Z = topLeft.Z },
            BottomRight = new Point { X = bottomRight.X, Y = bottomRight.Y, Z = bottomRight.Z }
              };
            }
            //It's a 3d view
            else
            {
              var viewCenter = new XYZ();
              var view3D = (View3D)uidoc.ActiveView;
              double zoomValue = 1;
              // it is a orthogonal view
              if (!view3D.IsPerspective)
              {
            double x = (topLeft.X + bottomRight.X) / 2;
            double y = (topLeft.Y + bottomRight.Y) / 2;
            double z = (topLeft.Z + bottomRight.Z) / 2;
            //center of the UI view
            viewCenter = new XYZ(x, y, z);

            //vector going from BR to TL
            XYZ diagVector = topLeft.Subtract(bottomRight);
            //lenght of the vector
            double dist = topLeft.DistanceTo(bottomRight) / 2;

            //ViewToWorldScale value
            zoomValue = dist * Math.Sin(diagVector.AngleTo(view3D.RightDirection)).ToMeters();

            // **** CUSTOM VALUE FOR TEKLA **** //
            // calculated sperimentally, not sure why but it works
            //if (UserSettings.Get("optTekla") == "1")
            //  zoomValue = zoomValue * 2.5;
            // **** CUSTOM VALUE FOR TEKLA **** //

            ViewOrientation3D t = RevitUtils.ConvertBasePoint(doc, viewCenter, uidoc.ActiveView.ViewDirection,
            uidoc.ActiveView.UpDirection, false);

            XYZ c = t.EyePosition;
            XYZ vi = t.ForwardDirection;
            XYZ up = t.UpDirection;

            v.OrthogonalCamera = new OrthogonalCamera
            {
              CameraViewPoint =
              {
                X = c.X.ToMeters(),
                Y = c.Y.ToMeters(),
                Z = c.Z.ToMeters()
              },
              CameraUpVector =
              {
                X = up.X.ToMeters(),
                Y = up.Y.ToMeters(),
                Z = up.Z.ToMeters()
              },
              CameraDirection =
              {
                X = vi.X.ToMeters() * -1,
                Y = vi.Y.ToMeters() * -1,
                Z = vi.Z.ToMeters() * -1
              },
              ViewToWorldScale = zoomValue
            };
              }
              // it is a perspective view
              else
              {
            viewCenter = uidoc.ActiveView.Origin;
            //revit default value
            zoomValue = 45;

            ViewOrientation3D t = RevitUtils.ConvertBasePoint(doc, viewCenter, uidoc.ActiveView.ViewDirection,
             uidoc.ActiveView.UpDirection, false);

            XYZ c = t.EyePosition;
            XYZ vi = t.ForwardDirection;
            XYZ up = t.UpDirection;

            v.PerspectiveCamera = new PerspectiveCamera
            {
              CameraViewPoint =
              {
                X = c.X.ToMeters(),
                Y = c.Y.ToMeters(),
                Z = c.Z.ToMeters()
              },
              CameraUpVector =
              {
                X = up.X.ToMeters(),
                Y = up.Y.ToMeters(),
                Z = up.Z.ToMeters()
              },
              CameraDirection =
              {
                X = vi.X.ToMeters() * -1,
                Y = vi.Y.ToMeters() * -1,
                Z = vi.Z.ToMeters() * -1
              },
              FieldOfView = zoomValue
            };
              }

            }
            //COMPONENTS PART
            string versionName = doc.Application.VersionName;
            v.Components = new List<Component>();

            var visibleElems = new FilteredElementCollector(doc, doc.ActiveView.Id)
              .WhereElementIsNotElementType()
              .WhereElementIsViewIndependent()
            .ToElementIds();
            var hiddenElems = new FilteredElementCollector(doc)
              .WhereElementIsNotElementType()
              .WhereElementIsViewIndependent()
              .Where(x => x.IsHidden(doc.ActiveView)
            || !doc.ActiveView.IsElementVisibleInTemporaryViewMode(TemporaryViewMode.TemporaryHideIsolate, x.Id)).ToList();//would need to check how much this is affecting performance

            var selectedElems = uidoc.Selection.GetElementIds();

            //include only hidden elements and selected in the BCF
            if (visibleElems.Count() > hiddenElems.Count())
            {
            foreach (var elem in hiddenElems)
            {
              v.Components.Add(new Component
            {
              OriginatingSystem = versionName,
              IfcGuid = IfcGuid.ToIfcGuid(ExportUtils.GetExportId(doc, elem.Id)),
              Visible = false,
              Selected = false,
              AuthoringToolId = elem.Id.IntegerValue.ToString()
            });
            }
            foreach (var elem in selectedElems)
            {
              v.Components.Add(new Component
              {
            OriginatingSystem = versionName,
            IfcGuid = IfcGuid.ToIfcGuid(ExportUtils.GetExportId(doc, elem)),
            Visible = true,
            Selected = true,
            AuthoringToolId = elem.IntegerValue.ToString()
              });
            }
            }
            //include only visigle elements
            //all the others are hidden
            else
            {
              foreach (var elem in visibleElems)
              {
            v.Components.Add(new Component
            {
              OriginatingSystem = versionName,
              IfcGuid = IfcGuid.ToIfcGuid(ExportUtils.GetExportId(doc, elem)),
              Visible = true,
              Selected = selectedElems.Contains(elem),
              AuthoringToolId = elem.IntegerValue.ToString()
            });
              }
            }
            return v;

              }
              catch (System.Exception ex1)
              {
            TaskDialog.Show("Error generating viewpoint", "exception: " + ex1);
              }
              return null;
        }
Esempio n. 4
0
    //<summary>
    //Generate a VisualizationInfo of the current view
    //</summary>
    //<returns></returns>
    public static VisualizationInfo GenerateViewpoint(Document doc, Viewpoint viewpoint)
    {
      try
      {
        NavisUtils.GetGunits(doc);
        var v = new VisualizationInfo();

        Vector3D vi = GetViewDirection(viewpoint);
        Vector3D up = GetViewUp(viewpoint);
        Point3D c = new Point3D(viewpoint.Position.X, viewpoint.Position.Y, viewpoint.Position.Z);
        double zoomValue = 1;

        //prepare view
        viewpoint = viewpoint.CreateCopy();
        if (!viewpoint.HasFocalDistance)
          viewpoint.FocalDistance = 1;

        // it is a orthogonal view
        if (viewpoint.Projection == ViewpointProjection.Orthographic)
        {
          //TODO: needs checking!!!
          double dist = viewpoint.VerticalExtentAtFocalDistance / 2;
          zoomValue = 3.125 * dist / (up.Length * 1.25);


          v.OrthogonalCamera = new OrthogonalCamera
          {
            CameraViewPoint =
              {
                X = c.X.FromInternal(),
                Y = c.Y.FromInternal(),
                Z = c.Z.FromInternal()
              },
            CameraUpVector =
              {
                X = up.X.FromInternal(),
                Y = up.Y.FromInternal(),
                Z = up.Z.FromInternal()
              },
            CameraDirection =
              {
                X = vi.X.FromInternal(),
                Y = vi.Y.FromInternal(),
                Z = vi.Z.FromInternal()
              },
            ViewToWorldScale = zoomValue.FromInternal()
          };
        }
        else
        {
          zoomValue = viewpoint.FocalDistance;

          v.PerspectiveCamera = new PerspectiveCamera
          {
            CameraViewPoint =
              {
                X = c.X.FromInternal(),
                Y = c.Y.FromInternal(),
                Z = c.Z.FromInternal()
              },
            CameraUpVector =
              {
                X = up.X.FromInternal(),
                Y = up.Y.FromInternal(),
                Z = up.Z.FromInternal()
              },
            CameraDirection =
              {
                X = vi.X.FromInternal(),
                Y = vi.Y.FromInternal(),
                Z = vi.Z.FromInternal()
              },
            FieldOfView = zoomValue
          };

        }
        //COMPONENTS PART

        //if (elemCheck == 0)//visible (0)
        //  _elementList = _oDoc.Models.First.RootItem.DescendantsAndSelf.Where(o => o.InstanceGuid != Guid.Empty && ChechHidden(o.AncestorsAndSelf) && o.FindFirstGeometry() != null && !o.FindFirstGeometry().Item.IsHidden).ToList<ModelItem>();

        //if (null != _elementList && _elementList.Any() && elemCheck != 2)//not if none (2)
        //{
        //  v.Components = new Data.Component[_elementList.Count];
        //  string appname = Autodesk.Navisworks.Api.Application.Title;
        //  for (var i = 0; i < _elementList.Count; i++)
        //  {
        //    string ifcguid = IfcGuid.ToIfcGuid(_elementList.ElementAt(i).InstanceGuid).ToString();
        //    v.Components[i] = new Case.IssueTracker.Data.Component(appname, "", ifcguid);

        //  }
        //}
        return v;
      }

      catch (System.Exception ex1)
      {
        MessageBox.Show("exception: " + ex1, "Error generating viewpoint");
      }
      return null;

    }