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; }
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"); } }
//<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; }
//<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; }