Beispiel #1
0
        /// <summary>
        /// Open a 3D View
        /// </summary>
        /// <param name="v"></param>
        private void doOpen3DView(VisualizationInfo v)
        {
            try
            {
                if (MSApp.ActiveModelReference.Type != MsdModelType.Normal)
                {
                    MessageBox.Show("This operation is not allowed in paper space.\nPlease go to model space and retry.",
                                    "Warning!", MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }

                Point3d cameraPos, viewDirection, upVector;
                double  zoomValue;

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

                    cameraPos     = MSApp.Point3dFromXYZ(v.OrthogonalCamera.CameraViewPoint.X, v.OrthogonalCamera.CameraViewPoint.Y, v.OrthogonalCamera.CameraViewPoint.Z);
                    viewDirection = MSApp.Point3dNormalize(MSApp.Point3dFromXYZ(v.OrthogonalCamera.CameraDirection.X, v.OrthogonalCamera.CameraDirection.Y, v.OrthogonalCamera.CameraDirection.Z));
                    upVector      = MSApp.Point3dNormalize(MSApp.Point3dFromXYZ(v.OrthogonalCamera.CameraUpVector.X, v.OrthogonalCamera.CameraUpVector.Y, v.OrthogonalCamera.CameraUpVector.Z));
                    zoomValue     = v.OrthogonalCamera.ViewToWorldScale;
                }
                else if (v.PerspectiveCamera != null)
                {
                    if (v.PerspectiveCamera.CameraViewPoint == null || v.PerspectiveCamera.CameraUpVector == null || v.PerspectiveCamera.CameraDirection == null)
                    {
                        return;
                    }

                    cameraPos     = MSApp.Point3dFromXYZ(v.PerspectiveCamera.CameraViewPoint.X, v.PerspectiveCamera.CameraViewPoint.Y, v.PerspectiveCamera.CameraViewPoint.Z);
                    viewDirection = MSApp.Point3dNormalize(MSApp.Point3dFromXYZ(v.PerspectiveCamera.CameraDirection.X, v.PerspectiveCamera.CameraDirection.Y, v.PerspectiveCamera.CameraDirection.Z));
                    upVector      = MSApp.Point3dNormalize(MSApp.Point3dFromXYZ(v.PerspectiveCamera.CameraUpVector.X, v.PerspectiveCamera.CameraUpVector.Y, v.PerspectiveCamera.CameraUpVector.Z));
                    zoomValue     = v.PerspectiveCamera.FieldOfView;
                }
                else
                {
                    MessageBox.Show("No camera information was found within this viewpoint.",
                                    "Warning!", MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }

                // get current view
                int    activeViewNum = getActiveViewNumber();
                View   currentView   = MSApp.ActiveDesignFile.Views[activeViewNum];
                double unitFactor    = GetGunits();

                // set camera properties
                Point3d scaledCameraPos    = MSApp.Point3dScale(cameraPos, unitFactor);
                Point3d scaledCameraTarget = MSApp.Point3dAdd(scaledCameraPos, MSApp.Point3dScale(viewDirection, unitFactor));
                currentView.set_CameraPosition(scaledCameraPos);
                currentView.set_CameraTarget(scaledCameraTarget);
                currentView.set_Center(scaledCameraTarget);
                currentView.set_CameraUpVector(upVector);
                MSApp.CadInputQueue.SendKeyin("MDL KEYIN BENTLEY.VIEWATTRIBUTESDIALOG,VAD VIEWATTRIBUTESDIALOG SETATTRIBUTE 0 Camera False");
                if (v.PerspectiveCamera != null)
                {
                    currentView.CameraAngle = zoomValue * unitFactor;
                }
                else if (v.OrthogonalCamera != null)
                {
                    Point3d currentExtent = currentView.get_Extents();
                    double  zoomLevel     = zoomValue * unitFactor * customZoomLevel / currentExtent.Y;
                    currentView.Zoom(zoomLevel);
                }

                // disable and clear previous clip volume
                ulong previousClipVolumeId = 0;
                try
                {
                    int status = mdlView_getClipBoundaryElement(ref previousClipVolumeId, activeViewNum - 1).ToInt32();
                    if (status == 0)
                    {
                        Element previousClipVolume = MSApp.ActiveModelReference.GetElementByID((long)previousClipVolumeId);
                        MSApp.ActiveModelReference.RemoveElement(previousClipVolume);
                    }
                }
                catch (Exception ex)
                {
                    // do nothing just for catching the exception when clip volume not found
                }
                currentView.ClipVolume = false;

                // handle model view clipping
                if (v.ClippingPlanes != null)
                {
                    List <Plane3d> clippingPlanes = new List <Plane3d>();
                    foreach (var clippingPlane in v.ClippingPlanes)
                    {
                        clippingPlanes.Add(new Plane3d()
                        {
                            Origin = MSApp.Point3dFromXYZ(clippingPlane.Location.X, clippingPlane.Location.Y, clippingPlane.Location.Z),
                            Normal = MSApp.Point3dFromXYZ(clippingPlane.Direction.X, clippingPlane.Direction.Y, clippingPlane.Direction.Z)
                        });
                    }
                    List <Point3d> intersectionPoints = getIntersectionPointsOfClippingPlanes(clippingPlanes);
                    if (intersectionPoints != null)
                    {
                        double maxZ         = intersectionPoints.Max(p => p.Z);
                        double minZ         = intersectionPoints.Min(p => p.Z);
                        double midZ         = (maxZ + minZ) / 2;
                        double halfOfHeight = (maxZ - minZ) / 2;
                        // find XY projection points
                        List <Vector2d> planeVertices = new List <Vector2d>();
                        foreach (Point3d p in intersectionPoints)
                        {
                            bool uniqueProjectionPoint = true;
                            foreach (Vector2d vertex in planeVertices)
                            {
                                if (MSApp.Point2dDistance(new Point2d()
                                {
                                    X = vertex.X, Y = vertex.Y
                                }, new Point2d()
                                {
                                    X = p.X, Y = p.Y
                                }) < distancePrecision)                                                                                                          // arbitrary precision for now
                                {
                                    uniqueProjectionPoint = false;
                                    break;
                                }
                            }

                            if (uniqueProjectionPoint)
                            {
                                planeVertices.Add(new Vector2d(p.X, p.Y));
                            }
                        }
                        // determine convex hull points
                        var convexNullPoints = ConvexHullHelper.MonotoneChainConvexHull(planeVertices.ToArray()).Select(p => new Point3d()
                        {
                            X = p.X, Y = p.Y, Z = midZ
                        });
                        ShapeElement planeShape = MSApp.CreateShapeElement1(null, convexNullPoints.ToArray(), MsdFillMode.UseActive);
                        MSApp.ActiveModelReference.AddElement(planeShape);

                        // produce solid
                        Point3d firstVertex = planeShape.get_Vertex(1);
#if connect
                        MSApp.CadInputQueue.SendKeyin("CONSTRUCT SURFACE PROJECTIONSOLID ");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrude.nonParametric", 1, "SOLIDMODELING");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrude.solidSkewed", 0, "SOLIDMODELING");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrude.solidIsDist", 1, "SOLIDMODELING");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrudeSolidDistance", (MSApp.ActiveModelReference.UORsPerMasterUnit * halfOfHeight), "SOLIDMODELING");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrude.solidBothWays", 1, "SOLIDMODELING");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrudeSolidYScale", 1, "SOLIDMODELING");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrudeSolidXScale", 1, "SOLIDMODELING");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrude.solidActiveAttib", 0, "SOLIDMODELING");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrude.solidKeepOriginal", 0, "SOLIDMODELING");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrudeSolidSpinAng", 0, "SOLIDMODELING");
                        MSApp.CadInputQueue.SendKeyin("CONSTRUCT SURFACE PROJECTIONSOLID ");
#elif select
                        MSApp.CadInputQueue.SendCommand("CONSTRUCT SURFACE PROJECTIONSOLID");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrude.solidSkewed", 0, "3DTOOLS");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrude.solidIsDist", 1, "3DTOOLS");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrudeSolidDistance", (MSApp.ActiveModelReference.UORsPerMasterUnit * halfOfHeight), "3DTOOLS");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrude.solidBothWays", 1, "3DTOOLS");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrudeSolidYScale", 1, "3DTOOLS");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrudeSolidXScale", 1, "3DTOOLS");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrude.solidActiveAttib", 0, "3DTOOLS");
                        MSApp.SetCExpressionValue("tcb->ms3DToolSettings.extrude.solidKeepOriginal", 0, "3DTOOLS");
                        MSApp.CadInputQueue.SendDataPoint(firstVertex, activeViewNum);
                        MSApp.CadInputQueue.SendDataPoint(firstVertex, activeViewNum);
#endif
                        MSApp.CadInputQueue.SendDataPoint(firstVertex, activeViewNum);
                        MSApp.CadInputQueue.SendDataPoint(firstVertex, activeViewNum);

                        // clip volume
                        MSApp.CadInputQueue.SendCommand("VIEW CLIP SINGLE");
                        MSApp.SetCExpressionValue("tcb->msToolSettings.clipViewTools.hideClipElement", 1, "CLIPVIEW");
                        MSApp.CadInputQueue.SendDataPoint(firstVertex, activeViewNum);
                        MSApp.CadInputQueue.SendDataPoint(firstVertex, activeViewNum);
                    }
                }

                // handle BCF components
                MSApp.ActiveModelReference.UnselectAllElements();
                selectElements(v.Components);

                // redraw current view
                currentView.Redraw();
                MSApp.CommandState.StartDefaultCommand();
            }
            catch (System.Exception ex1)
            {
                MessageBox.Show("exception: " + ex1, "Error!");
            }
        }