Exemplo n.º 1
0
        private void LoadPlane()
        {
            // 加载直升飞机
            string fileName = (strMediaPath + @"\x\Vehicles\wrj.X");

            if (skinMeshPlane == null)
            {
                // 构造ModelPoint
                IGeometryFactory gf = new GeometryFactory();
                IModelPoint      mp = gf.CreateGeometry(gviGeometryType.gviGeometryModelPoint, gviVertexAttribute.gviVertexAttributeZ) as IModelPoint;
                mp.ModelName  = fileName;
                mp.SpatialCRS = new CRSFactory().CreateFromWKT(wkt) as ISpatialCRS;
                // 设置位置
                IMatrix matrix = new Matrix();
                matrix.MakeIdentity();
                matrix.SetTranslate(line.GetPoint(0).Position);
                mp.FromMatrix(matrix);
                // 创建骨骼动画
                skinMeshPlane = this.axRenderControl1.ObjectManager.CreateSkinnedMesh(mp, rootId);
                if (skinMeshPlane == null)
                {
                    MessageBox.Show("骨骼动画创建失败!");
                    return;
                }
                skinMeshPlane.Loop = true;
                skinMeshPlane.Play();
                skinMeshPlane.MaxVisibleDistance = 1000;
                skinMeshPlane.ViewingDistance    = 100;

                // 绑定到运动路径
                IMotionable m = skinMeshPlane as IMotionable;
                position.Set(0, 0, 0);
                m.Bind2(dynamicObject, position, 0, 0, 0);
            }
        }
Exemplo n.º 2
0
        // 架空
        public bool GetPipeNodeParameterOver(int flag, out Vector[] vtxs, out Vector dir, out IPipeSection section, out int FLAG)
        {
            FLAG    = -1;
            vtxs    = null;
            dir     = null;
            section = null;
            IPolyline polyline = null;

            if ((base._geoGroup[1] == null) || ((polyline = base._geoGroup[1] as IPolyline) == null))
            {
                return(false);
            }
            if (polyline.PointCount < 2)
            {
                return(false);
            }
            ISegment seg     = null;
            Vector   vector  = null;
            Vector   vector2 = null;

            vtxs    = new Vector[2];
            section = new PipeSection(this._dia1, this._dia2, HorizontalPos.Center, this._vPos, 0.02, 0);
            if (flag == 0)
            {
                vector  = new Vector(polyline.GetPoint(0));
                vtxs[0] = vector;
                seg     = polyline.GetSegment(0);
                if (Math.Abs(seg.EndPoint.Z - seg.StartPoint.Z) > 0.4)
                {
                    FLAG = 1;
                }
                dir     = new Vector(seg);
                dir     = dir.UnitVector();
                vector2 = vector + ((Vector)((dir * section.Diameter) / 2.0));
                vtxs[1] = vector2;
            }
            else
            {
                vector  = new Vector(polyline.GetPoint(polyline.PointCount - 1));
                vtxs[0] = vector;
                seg     = polyline.GetSegment(polyline.PointCount - 2);
                if (Math.Abs(seg.EndPoint.Z - seg.StartPoint.Z) > 0.4)
                {
                    FLAG = 1;
                }
                dir     = new Vector(seg);
                dir     = (-dir).UnitVector();
                vector2 = vector + ((Vector)((dir * section.Diameter) / 2.0));
                vtxs[1] = vector2;
            }
            return(true);
        }
Exemplo n.º 3
0
        private double GetInterPointHeight(IPoint interPoint, IPolyline geoShape, IPolyline geo)
        {
            if (interPoint == null || geoShape == null || geoShape == null)
            {
                return(0.0);
            }
            if (geoShape.PointCount == 2)
            {
                return(geoShape.StartPoint.Z + (geoShape.EndPoint.Z - geoShape.StartPoint.Z) * Math.Sqrt((geo.StartPoint.X - interPoint.X) * (geo.StartPoint.X - interPoint.X)
                                                                                                         + (geo.StartPoint.Y - interPoint.Y) * (geo.StartPoint.Y - interPoint.Y)) / geo.Length);
            }
            for (int i = 0; i < geoShape.PointCount - 1; i++)
            {
                IPoint pt1          = geoShape.GetPoint(i);
                IPoint pt2          = geoShape.GetPoint(i + 1);
                IPoint ptFootPrint1 = geo.GetPoint(i);
                IPoint ptFootPrint2 = geo.GetPoint(i + 1);
                double len          = Math.Sqrt((ptFootPrint1.X - ptFootPrint2.X) * (ptFootPrint1.X - ptFootPrint2.X)
                                                + (ptFootPrint1.Y - ptFootPrint2.Y) * (ptFootPrint1.Y - ptFootPrint2.Y));
                double x   = interPoint.X;
                double y   = interPoint.Y;
                double x1  = ptFootPrint1.X;
                double y1  = ptFootPrint1.Y;
                double z1  = pt1.Z;
                double x2  = ptFootPrint2.X;
                double y2  = ptFootPrint2.Y;
                double z2  = pt2.Z;
                double det = 0.5;
                bool   b1  = (x >= x1 || Math.Abs(x - x1) < det) && (x <= x2 || Math.Abs(x - x2) < det) && (y <= y1 || Math.Abs(y - y1) < det) && (y >= y2 || Math.Abs(y - y2) < det);
                bool   b2  = (x <= x1 || Math.Abs(x - x1) < det) && (x >= x2 || Math.Abs(x - x2) < det) && (y >= y1 || Math.Abs(y - y1) < det) && (y <= y2 || Math.Abs(y - y2) < det);
                bool   b3  = (x >= x1 || Math.Abs(x - x1) < det) && (x <= x2 || Math.Abs(x - x2) < det) && (y >= y1 || Math.Abs(y - y1) < det) && (y >= y2 || Math.Abs(y - y2) < det);
                bool   b4  = (x <= x1 || Math.Abs(x - x1) < det) && (x >= x2 || Math.Abs(x - x2) < det) && (y <= y1 || Math.Abs(y - y1) < det) && (y >= y2 || Math.Abs(y - y2) < det);
                if (b1 || b2 || b3 || b4)
                {
                    double res = z1 + (z2 - z1) * Math.Sqrt((x1 - x) * (x1 - x)
                                                            + (y1 - y) * (y1 - y)) / len;
                    return(res);

                    //            var detx1 = x1 - x;
                    //            var dety1 = y1 - y;
                    //            var detx2 = x2 - x;
                    //            var dety2 = y2 - y;
                    //            var temp = dety2 * detx1 + dety1 * detx2;
                    //            if (Math.abs(temp) < 0.00001) {
                    //            }
                }
            }
            return(0.0);
        }
Exemplo n.º 4
0
        void axRenderControl1_RcObjectEditFinish()
        {
            IRenderArrow arrow = this.axRenderControl1.ObjectManager.CreateRenderArrow(rootId);

            if (arrow != null)
            {
                IPolyline line = currentGeometry as IPolyline;
                for (int i = 0; i < line.PointCount; i++)
                {
                    arrow.AddPoint(line.GetPoint(i));
                }

                // 添加节点到界面控件上
                myListNode item = new myListNode(string.Format("RenderArrow_{0}", arrow.Guid), TreeNodeType.NT_RenderArrow, arrow);
                item.Checked = true;
                listView1.Items.Add(item);

                // 添加节点到界面控件上
                item         = new myListNode(string.Format("RenderPolyline_{0}", arrow.Guid), TreeNodeType.NT_RenderGeomtry, currentRenderGeometry);
                item.Checked = true;
                listView1.Items.Add(item);
            }

            // 恢复漫游模式
            this.axRenderControl1.InteractMode = gviInteractMode.gviInteractNormal;
        }
Exemplo n.º 5
0
 public DrawCylinderLine(IMultiPolyline multiLine, IPipeSection section, string tcName, uint color)
 {
     this._tcName      = "";
     this._color       = 0xffff0000;
     base._modeltype   = ModelType.CylinderLine;
     this._pipeSection = section;
     base._cullModel   = gviCullFaceMode.gviCullNone;
     this._tcName      = tcName;
     this._color       = color;
     if (multiLine != null)
     {
         IEnvelope     envelope = null;
         IPolyline     polyline = null;
         List <Vector> item     = null;
         IPoint        point    = null;
         Vector        vector   = null;
         envelope    = multiLine.Envelope;
         base._x     = (envelope.MaxX + envelope.MinX) / 2.0;
         base._y     = (envelope.MaxY + envelope.MinY) / 2.0;
         base._z     = (envelope.MaxZ + envelope.MinZ) / 2.0;
         this._route = new List <List <Vector> >();
         for (int i = 0; i < multiLine.GeometryCount; i++)
         {
             polyline = multiLine.GetPolyline(i);
             item     = new List <Vector>();
             for (int j = 0; j < polyline.PointCount; j++)
             {
                 point  = polyline.GetPoint(j);
                 vector = new Vector(point.X - base._x, point.Y - base._y, point.Z - base._z);
                 item.Add(vector);
             }
             this._route.Add(item);
         }
     }
 }
Exemplo n.º 6
0
        // Polyline类型  FX 2014.04.08
        public void SetParameter1(IGeometry geometry, double hTop, double hBottom)
        {
            base._hTop    = hTop;
            base._hBottom = hBottom;
            base._minX    = 999999.9;
            base._maxX    = -999999.9;
            base._minY    = 999999.9;
            base._maxY    = -999999.9;
            try
            {
                IPolygon polygon;
                base._z     = hTop;
                this._depth = base._hTop - base._hBottom;
                switch (geometry.GeometryType)
                {
                case gviGeometryType.gviGeometryPoint:
                {
                    IPoint point = geometry as IPoint;
                    base._x = point.X;
                    base._y = point.Y;
                    DrawGeometry.GetRoundVtxs(point, 1.0, 0x18, ref this._vtx, ref this._minX, ref this._maxX, ref this._minY, ref this._maxY);
                    break;
                }

                case gviGeometryType.gviGeometryPolyline:
                    goto Label_00CD;
                }
                return;

Label_00CD:
                // 将polyline转化为polygon
                IPolyline polyline = geometry as IPolyline;
                if (polyline.PointCount < 4)
                {
                    return;
                }
                polygon = geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ) as IPolygon;
                if (polygon != null)
                {
                    for (int i = 0; i < polyline.PointCount; i++)
                    {
                        IPoint point = polyline.GetPoint(i);
                        polygon.ExteriorRing.AppendPoint(point);
                    }
                }
                if (!polygon.IsClosed)
                {
                    polygon.Close();
                }
                if (polygon.QueryNormal().Z > 0.0)
                {
                    ReversePolygon(ref polygon);
                }
                DrawGeometry.GetPolygonVtxs(polygon, ref this._x, ref this._y, ref this._vtx, ref this._minX, ref this._maxX, ref this._minY, ref this._maxY);
            }
            catch (Exception exception)
            {
            }
        }
Exemplo n.º 7
0
        private void LoadSkinMeshAndViewshed()
        {
            string fileName = (strMediaPath + @"\x\Character\QiYeYuanGong.X");

            if (skinMesh == null)
            {
                // 构造ModelPoint
                IGeometryFactory gf = new GeometryFactory();
                IModelPoint      mp = gf.CreateGeometry(gviGeometryType.gviGeometryModelPoint, gviVertexAttribute.gviVertexAttributeZ) as IModelPoint;
                mp.ModelName  = fileName;
                mp.SpatialCRS = new CRSFactory().CreateFromWKT(wkt) as ISpatialCRS;
                // 设置位置
                IMatrix matrix = new Matrix();
                matrix.MakeIdentity();
                matrix.SetTranslate(line.GetPoint(0).Position);
                mp.FromMatrix(matrix);
                // 创建骨骼动画
                skinMesh = this.axRenderControl1.ObjectManager.CreateSkinnedMesh(mp, rootId);
                if (skinMesh == null)
                {
                    MessageBox.Show("骨骼动画创建失败!");
                    return;
                }
                skinMesh.Loop = true;
                skinMesh.Play();
                skinMesh.MaxVisibleDistance = 1000;
                skinMesh.ViewingDistance    = 50;

                // 绑定到运动路径
                IMotionable m = skinMesh as IMotionable;
                position.Set(0, 0, 0);
                m.Bind2(dynamicObject, position, 0, 0, 0);
                this.axRenderControl1.Camera.FlyToObject(skinMesh.Guid, gviActionCode.gviActionFollowBehind);
            }

            if (tv == null)
            {
                tv = this.axRenderControl1.ObjectManager.CreateViewshed(line.GetPoint(0), rootId);
                IMotionable tvm = tv as IMotionable;
                position.Set(0, 0, 0);
                tvm.Bind2(dynamicObject, position, 0, 0, 0);
            }
        }
Exemplo n.º 8
0
 private void ReversePolyline(ref IPolyline ply)
 {
     if ((ply != null) && (ply.PointCount != 0))
     {
         Stack <IPoint> stack = null;
         stack = new Stack <IPoint>();
         for (int i = 0; i < ply.PointCount; i++)
         {
             stack.Push(ply.GetPoint(i));
         }
         ply.RemovePoints(0, ply.PointCount);
         while (stack.Count > 0)
         {
             ply.AppendPoint(stack.Pop());
         }
     }
 }
Exemplo n.º 9
0
 public static bool GetPolylineVtxs(IPolyline polyline, ref double cX, ref double cY, ref double cZ, ref List <Vector> route)
 {
     if (polyline == null)
     {
         return(false);
     }
     cX    = polyline.StartPoint.X;
     cY    = polyline.StartPoint.Y;
     cZ    = polyline.StartPoint.Z;
     route = new List <Vector>();
     for (int i = 0; i < polyline.PointCount; i++)
     {
         IPoint point = polyline.GetPoint(i);
         Vector item  = new Vector(point.X - cX, point.Y - cY, point.Z - cZ);
         route.Add(item);
     }
     return(true);
 }
Exemplo n.º 10
0
 // 根据管线起始点高程计算管线中间点高程,返回多段线对象
 private bool GetPipeLineVertexs(IGeometry geo, out IPolyline route)
 {
     route = null;
     try
     {
         IPolyline polyline = null;
         if ((geo == null) || ((polyline = geo as IPolyline) == null))
         {
             return(false);
         }
         IPoint pointValue = null;
         route = DrawGeometry.geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolyline, gviVertexAttribute.gviVertexAttributeZ) as IPolyline;
         for (int i = 0; i < polyline.PointCount; i++)
         {
             pointValue = polyline.GetPoint(i).Clone2(gviVertexAttribute.gviVertexAttributeZ) as IPoint;
             route.AppendPoint(pointValue);
         }
         return(true);
     }
     catch (Exception exception)
     {
         return(false);
     }
 }
Exemplo n.º 11
0
        public bool GetPipeLineParameter(double thick, out List <Vector> vtxs, out IPipeSection section)
        {
            vtxs    = null;
            section = null;
            IPolyline polyline = null;

            if ((base._geoGroup[1] == null) || ((polyline = base._geoGroup[1] as IPolyline) == null))
            {
                return(false);
            }
            if (polyline.PointCount < 2)
            {
                return(false);
            }
            IPoint p       = null;
            Vector vector  = null;
            Vector vector2 = null;
            Vector item    = null;

            vtxs    = new List <Vector>();
            section = new PipeSection(this._dia1, this._dia2, HorizontalPos.Center, VerticalPos.Center, thick, 0);
            for (int i = 0; i < polyline.PointCount; i++)
            {
                p = polyline.GetPoint(i);
                if (p != null)
                {
                    vector = new Vector(p);
                    if ((this._dia1 > 1.5) || (this._dia2 > 1.5))
                    {
                        item = vector;
                    }
                    else if (i == 0)
                    {
                        // 增加起点退让判断,并对较短管线做处理 FX 2014.04.08
                        vector2 = new Vector(polyline.GetSegment(i));
                        double length = vector2.Length;
                        vector2 = vector2.UnitVector();
                        if (this._isSBackhind)
                        {
                            if (length > (section.Diameter / 1.8))
                            {
                                item = vector + ((Vector)((vector2 * section.Diameter) / 1.8));
                            }
                            else
                            {
                                item = vector + ((Vector)((vector2 * length) / 1.8));
                            }
                        }
                        else
                        {
                            item = vector;
                        }
                    }
                    else if (i == (polyline.PointCount - 1))
                    {
                        // 增加终点退让判断,并对较短管线做处理 FX 2014.04.08
                        vector2 = new Vector(polyline.GetSegment(i - 1));
                        double length = vector2.Length;
                        vector2 = -vector2.UnitVector();
                        if (this._isEBackhind)
                        {
                            if (length > (section.Diameter / 1.8))
                            {
                                item = vector + ((Vector)((vector2 * section.Diameter) / 1.8));
                            }
                            else
                            {
                                item = vector + ((Vector)((vector2 * length) / 1.8));
                            }
                        }
                        else
                        {
                            item = vector;
                        }
                    }
                    else
                    {
                        item = vector;
                    }
                    item.Z += this.OffsetZ;
                    vtxs.Add(item);
                }
            }
            return(true);
        }
Exemplo n.º 12
0
        /// <summary>
        /// 参数化建模
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDriveModel_Click(object sender, System.EventArgs e)
        {
            try
            {
                if (polyline != null)
                {
                    center = polyline.Envelope.Center;
                    IModelPoint mp = new GeometryFactory().CreateGeometry(gviGeometryType.gviGeometryModelPoint, gviVertexAttribute.gviVertexAttributeZ) as IModelPoint;
                    mp.SpatialCRS = datasetCRS;
                    mp.Position   = center;

                    IModel         model     = new ResourceFactory().CreateModel();
                    IDrawGroup     group     = new DrawGroup();
                    IDrawPrimitive primitive = new DrawPrimitive();
                    IDrawMaterial  material  = new DrawMaterial();
                    material.TextureName = (strMediaPath + @"\shp\road\textrure.jpg");
                    material.CullMode    = gviCullFaceMode.gviCullNone;
                    material.WrapModeS   = gviTextureWrapMode.gviTextureWrapRepeat;
                    material.WrapModeT   = gviTextureWrapMode.gviTextureWrapRepeat;
                    IFloatArray va = new FloatArray();
                    IFloatArray ta = new FloatArray();
                    // 逐点外扩
                    for (int i = 0; i < polyline.PointCount; i++)
                    {
                        #region 单独处理最后一个点
                        if (i == polyline.PointCount - 1)
                        {
                            curPoint  = polyline.GetPoint(i);
                            vecCurPos = curPoint.Position;
                            // 最后一个点重用最后的方向向量
                            vecTarget = vecDirect.CrossProduct(vecZ);
                            vecTarget.Normalize();
                            vecTarget.MultiplyByScalar(width / 2);
                            vecP = vecCurPos.Add(vecTarget);
                            vecTarget.MultiplyByScalar(-1);
                            vecQ = vecCurPos.Add(vecTarget);
                            // 设置外扩点
                            P          = curPoint.Clone() as IPoint;
                            P.Position = vecP;
                            Q          = curPoint.Clone() as IPoint;
                            Q.Position = vecQ;
                            // 把点坐标加进顶点数组
                            va.Append((float)(vecP.X - center.X));
                            va.Append((float)(vecP.Y - center.Y));
                            va.Append((float)(vecP.Z - center.Z));
                            va.Append((float)(vecQ.X - center.X));
                            va.Append((float)(vecQ.Y - center.Y));
                            va.Append((float)(vecQ.Z - center.Z));
                            // 加纹理坐标
                            ta.Append(0);  //P点纹理
                            if (i == 0)
                            {
                                lastV = 0.0;
                            }
                            else
                            {
                                lastV = lastV + length / 10;  //v方向上每隔10米重复一次
                            }
                            ta.Append((float)lastV);
                            ta.Append(1);  //Q点纹理
                            ta.Append((float)lastV);

                            {
                                ISimplePointSymbol ps = new SimplePointSymbol();
                                ps.FillColor = System.Drawing.Color.Yellow;
                                ps.Size      = 5;
                                rPointToDelList.Add(this.axRenderControl1.ObjectManager.CreateRenderPoint(P, ps, rootId));
                                rPointToDelList.Add(this.axRenderControl1.ObjectManager.CreateRenderPoint(Q, ps, rootId));
                            }

                            break;
                        }
                        #endregion

                        // 当不是最后一个点时:
                        curPoint   = polyline.GetPoint(i);
                        nextPoint  = polyline.GetPoint(i + 1);
                        vecCurPos  = curPoint.Position;
                        vecNextPos = nextPoint.Position;
                        // 运算
                        vecNextPos.MultiplyByScalar(-1);
                        vecDirect = vecCurPos.Add(vecNextPos);  //方向向量
                        vecZ.Set(0, 0, 1);
                        vecTarget = vecDirect.CrossProduct(vecZ);
                        vecTarget.Normalize();
                        vecTarget.MultiplyByScalar(width / 2);
                        vecP = vecCurPos.Add(vecTarget);
                        vecTarget.MultiplyByScalar(-1);
                        vecQ = vecCurPos.Add(vecTarget);
                        // 设置外扩点
                        P          = curPoint.Clone() as IPoint;
                        P.Position = vecP;
                        Q          = curPoint.Clone() as IPoint;
                        Q.Position = vecQ;
                        // 把点坐标加进顶点数组
                        va.Append((float)(vecP.X - center.X));
                        va.Append((float)(vecP.Y - center.Y));
                        va.Append((float)(vecP.Z - center.Z));
                        va.Append((float)(vecQ.X - center.X));
                        va.Append((float)(vecQ.Y - center.Y));
                        va.Append((float)(vecQ.Z - center.Z));
                        // 加纹理坐标
                        ta.Append(0);  //P点纹理
                        if (i == 0)
                        {
                            lastV = 0.0;
                        }
                        else
                        {
                            lastV = lastV + length / 5; //v方向上每隔10米重复一次
                        }
                        length = vecDirect.Length;      //计算长度给奇数点用
                        ta.Append((float)lastV);
                        ta.Append(1);                   //Q点纹理
                        ta.Append((float)lastV);

                        {
                            ISimplePointSymbol ps = new SimplePointSymbol();
                            ps.FillColor = System.Drawing.Color.Yellow;
                            ps.Size      = 5;
                            rPointToDelList.Add(this.axRenderControl1.ObjectManager.CreateRenderPoint(P, ps, rootId));
                            rPointToDelList.Add(this.axRenderControl1.ObjectManager.CreateRenderPoint(Q, ps, rootId));
                        }
                    }
                    // 计算索引坐标
                    IUInt16Array ia = new UInt16Array();
                    for (int i = 0; i < va.Length / 6 - 1; i++)
                    {
                        ia.Append((ushort)(2 * i));
                        ia.Append((ushort)(2 * i + 1));
                        ia.Append((ushort)(2 * i + 2));
                        ia.Append((ushort)(2 * i + 1));
                        ia.Append((ushort)(2 * i + 3));
                        ia.Append((ushort)(2 * i + 2));
                    }
                    primitive.VertexArray   = va;
                    primitive.TexcoordArray = ta;
                    primitive.IndexArray    = ia;
                    primitive.Material      = material;
                    group.AddPrimitive(primitive);
                    model.AddGroup(group);

                    // 在内存中临时存储模型
                    string modelName = fid.ToString();
                    this.axRenderControl1.ObjectManager.AddModel(modelName, model);
                    mp.ModelName     = modelName;
                    mp.ModelEnvelope = model.Envelope;
                    // 可视化临时模型
                    IRenderModelPoint rmp = this.axRenderControl1.ObjectManager.CreateRenderModelPoint(mp, null, rootId);
                    rmp.MaxVisibleDistance = 100000;
                    rmp.MouseSelectMask    = gviViewportMask.gviViewNone;
                    rModelpointToDelList.Add(rmp);
                }
            }
            catch (System.Exception ex)
            {
                if (ex.GetType().Name.Equals("UnauthorizedAccessException"))
                {
                    MessageBox.Show("需要标准runtime授权");
                }
                else
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
Exemplo n.º 13
0
        private void btnNavigate_Click(object sender, EventArgs e)
        {
            if (tour != null)
            {
                //是否相机跟随
                if (cbCameraFollow.Checked)
                {
                    if (renderModelPoint != null)
                    {
                        this.axRenderControl1.Camera.FlyToObject(renderModelPoint.Guid, gviActionCode.gviActionFollowBehindAndAbove);
                    }
                    else if (skinMesh != null)
                    {
                        this.axRenderControl1.Camera.FlyToObject(skinMesh.Guid, gviActionCode.gviActionFollowBehindAndAbove);
                    }
                }
                tour.Play();
                return;
            }

            tour           = this.axRenderControl1.ObjectManager.CreateDynamicObject(rootId);
            tour.CrsWKT    = dataset_Road.SpatialReference.AsWKT();
            tour.TurnSpeed = 100000;

            if (renderLine != null)
            {
                IPolyline line = renderLine.GetFdeGeometry() as IPolyline;
                for (int i = 0; i < line.PointCount; i++)
                {
                    fdepoint = line.GetPoint(i);
                    if (txtLocationNames.Text.Contains("I'm Here!"))
                    {
                        tour.AddWaypoint2(fdepoint, 30);
                    }
                    else
                    {
                        tour.AddWaypoint2(fdepoint, 100);
                    }
                }
            }
            else if (multiRenderLine != null)
            {
                IMultiPolyline mline = multiRenderLine.GetFdeGeometry() as IMultiPolyline;
                for (int i = 0; i < mline.GeometryCount; i++)
                {
                    IPolyline line = mline.GetPolyline(i);
                    for (int j = 0; j < line.PointCount; j++)
                    {
                        fdepoint = line.GetPoint(j);
                        if (txtLocationNames.Text.Contains("I'm Here!"))
                        {
                            tour.AddWaypoint2(fdepoint, 30);
                        }
                        else
                        {
                            tour.AddWaypoint2(fdepoint, 100);
                        }
                    }
                }
            }
            if (txtLocationNames.Text.Contains("I'm Here!"))
            {
                LoadPeople(tour);
            }
            else
            {
                LoadCar(tour);
            }
            //是否相机跟随
            if (cbCameraFollow.Checked)
            {
                if (renderModelPoint != null)
                {
                    this.axRenderControl1.Camera.FlyToObject(renderModelPoint.Guid, gviActionCode.gviActionFollowBehindAndAbove);
                }
                else if (skinMesh != null)
                {
                    this.axRenderControl1.Camera.FlyToObject(skinMesh.Guid, gviActionCode.gviActionFollowBehindAndAbove);
                }
            }
            tour.Play();
        }
Exemplo n.º 14
0
        private void ShowFlowDirect(IFeatureLayerPickResult pr)
        {
            if (pr == null)
            {
                return;
            }
            IRowBuffer row    = null;
            IFdeCursor cursor = null;

            try
            {
                int fid = pr.FeatureId;
                DF3DFeatureClass dffc = DF3DFeatureClassManager.Instance.GetFeatureClassByID(pr.FeatureLayer.FeatureClassId.ToString());
                if (dffc == null)
                {
                    return;
                }
                IFeatureClass fc  = dffc.GetFeatureClass();
                FacilityClass fac = dffc.GetFacilityClass();
                if (fc == null || fac == null || fac.Name != "PipeLine")
                {
                    return;
                }
                DFDataConfig.Class.FieldInfo fi = fac.GetFieldInfoBySystemName("FlowDirect");
                if (fi == null)
                {
                    return;
                }
                IFieldInfoCollection fiCol = fc.GetFields();
                int index = fiCol.IndexOf(fi.Name);
                if (index == -1)
                {
                    return;
                }
                int indexShape = fiCol.IndexOf("Shape");

                IQueryFilter filter = new QueryFilter();
                filter.WhereClause = "oid=" + fid;
                cursor             = fc.Search(filter, false);
                row = cursor.NextRow();
                if (row == null)
                {
                    return;
                }

                IPolyline line = null;
                if (indexShape != -1 && !row.IsNull(indexShape))
                {
                    object obj = row.GetValue(indexShape);
                    if (obj != null && obj is IPolyline)
                    {
                        line = obj as IPolyline;
                    }
                }
                string flowDirectValue = "0";
                int    type            = 1;// 1表示具有流向字段;2表示从高到低
                if (!row.IsNull(index))
                {
                    flowDirectValue = row.GetValue(index).ToString();
                    if (flowDirectValue != "0" && flowDirectValue != "1")
                    {
                        flowDirectValue = "0";
                    }
                    type = 1;
                }
                else if (line != null)
                {
                    if (line.StartPoint.Z > line.EndPoint.Z)
                    {
                        flowDirectValue = "0";
                    }
                    else
                    {
                        flowDirectValue = "1";
                    }
                    type = 2;
                }
                if (line == null)
                {
                    return;
                }

                if (this._isAuth)
                {
                    #region 流向渲染1
                    FacClassReg reg = FacilityInfoService.GetFacClassRegByFeatureClassID(fc.Guid.ToString());
                    if (reg == null)
                    {
                        return;
                    }
                    TopoClass tc = FacilityInfoService.GetTopoClassByFacClassCode(reg.FacClassCode);
                    if (tc == null)
                    {
                        return;
                    }
                    FacStyleClass        style          = null;
                    List <FacStyleClass> facilityStyles = FacilityInfoService.GetFacStyleByFacClassCode(reg.FacClassCode);
                    if ((facilityStyles != null) && (facilityStyles.Count > 0))
                    {
                        style = facilityStyles[0];
                    }
                    PipeLineFac       plfac = new PipeLineFac(reg, style, row, tc);
                    IRenderModelPoint rmp   = null;
                    DrawGeometry.Ocx = DF3DApplication.Application.Current3DMapControl;
                    plfac.ShowFlowDirection(int.Parse(flowDirectValue), out rmp);
                    if (rmp != null)
                    {
                        this._listRender.Add(rmp.Guid);
                    }
                    #endregion
                }
                else
                {
                    #region 流向渲染2
                    IEulerAngle angle    = DF3DApplication.Application.Current3DMapControl.Camera.GetAimingAngles2(line.StartPoint, line.EndPoint);
                    double      dia      = 0.0;
                    string      diaField = fac.GetFieldInfoNameBySystemName("Diameter");
                    int         indexDia = fiCol.IndexOf(diaField);
                    if (indexDia != -1 && !row.IsNull(indexDia))
                    {
                        string diaStr    = row.GetValue(indexDia).ToString();
                        int    indexDia1 = diaStr.ToString().IndexOf('*');
                        if (indexDia1 != -1)
                        {
                            var dia1 = int.Parse(diaStr.ToString().Substring(0, indexDia1));
                            var dia2 = int.Parse(diaStr.ToString().Substring(indexDia1 + 1, diaStr.ToString().Length));
                            dia = ((dia1 > dia2) ? dia1 : dia2) * 0.001;
                        }
                        else
                        {
                            dia = int.Parse(diaStr) * 0.001;
                        }
                    }
                    List <IPoint> points = new List <IPoint>();
                    if (flowDirectValue == "0")
                    {
                        for (int i = 0; i < line.PointCount; i++)
                        {
                            IPoint pt = line.GetPoint(i);
                            pt.Z += dia / 2;
                            points.Add(pt);
                        }
                    }
                    else if (flowDirectValue == "1")
                    {
                        for (int i = line.PointCount - 1; i >= 0; i--)
                        {
                            IPoint pt = line.GetPoint(i);
                            pt.Z += dia / 2;
                            points.Add(pt);
                        }
                    }
                    for (int i = 0; i < points.Count - 1; i++)
                    {
                        IPoint pt1 = points[i];
                        var    pt2 = points[i + 1];

                        double delt = 0;
                        double _rate, _distance;
                        if (!(Math.Abs(dia) < 0.0000001))
                        {
                            delt = 2.0 * dia;
                            if (dia <= 0.5 && dia >= 0.3)
                            {
                                _rate     = 7 * dia;
                                _distance = 3 * dia / 0.4;
                            }
                            else if (dia < 0.3 && dia > 0.1)
                            {
                                _rate     = 12 * dia;
                                _distance = 6 * dia / 0.4;
                            }
                            else if (dia <= 0.1)
                            {
                                _rate     = 22 * dia;
                                _distance = 9 * dia / 0.4;
                            }
                            else
                            {
                                _rate     = 3.5 * dia;
                                _distance = 1.5 * dia / 0.4;
                            }
                        }
                        else
                        {
                            _rate     = 2.0;
                            _distance = 3.0;
                            //z = maxZ + 0.2;
                            delt = 0.2;
                        }
                        List <IPoint> list = DisPerseLine(pt1, pt2, _distance);
                        if (list.Count < 2)
                        {
                            return;
                        }
                        List <IPoint>    list1   = new List <IPoint>();
                        IGeometryFactory geoFact = new GeometryFactoryClass();
                        for (int j = 0; j < list.Count - 1; j++)
                        {
                            IPoint p = geoFact.CreatePoint(gviVertexAttribute.gviVertexAttributeZ);
                            p.X = (list[j].X + list[j + 1].X) / 2;
                            p.Y = (list[j].Y + list[j + 1].Y) / 2;
                            p.Z = (list[j].Z + list[j + 1].Z) / 2;
                            list1.Add(p);
                        }

                        for (var m = 0; m < list1.Count; m++)
                        {
                            IPosition pos = new PositionClass();
                            pos.X            = list1[m].X;
                            pos.Y            = list1[m].Y;
                            pos.Altitude     = list1[m].Z + delt;
                            pos.AltitudeType = gviAltitudeType.gviAltitudeTerrainAbsolute;
                            pos.Heading      = angle.Heading;
                            pos.Tilt         = angle.Tilt;
                            pos.Roll         = angle.Roll;
                            UInt32 color;
                            if (type == 1)
                            {
                                color = 0xFFFFFF00;
                            }
                            else
                            {
                                color = 0xFF00FFFF;
                            }
                            ITerrainArrow rArrow = DF3DApplication.Application.Current3DMapControl.ObjectManager.CreateArrow(pos, 0.8 * _rate, 3, color, color, DF3DApplication.Application.Current3DMapControl.ProjectTree.RootID);
                            this._listRender.Add(rArrow.Guid);
                        }
                    }
                    #endregion
                }
            }
            catch (Exception ex)
            {
            }
            finally
            {
                if (cursor != null)
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(cursor);
                    cursor = null;
                }
                if (row != null)
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(row);
                    row = null;
                }
            }
        }
Exemplo n.º 15
0
 // Shap数据中含各顶点高程数据
 private bool GetPipeLineVertexs(IGeometry geo, double sHeight, double eHeight, out IPolyline route)
 {
     route = null;
     try
     {
         IPolyline polyline = null;
         if ((geo == null) || ((polyline = geo as IPolyline) == null))
         {
             return(false);
         }
         IPoint pointValue = null;
         route = DrawGeometry.geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolyline, gviVertexAttribute.gviVertexAttributeZ) as IPolyline;
         if (polyline.PointCount == 2)
         {
             pointValue   = polyline.StartPoint.Clone2(gviVertexAttribute.gviVertexAttributeZ) as IPoint;
             pointValue.Z = sHeight;
             route.AppendPoint(pointValue);
             pointValue   = polyline.EndPoint.Clone2(gviVertexAttribute.gviVertexAttributeZ) as IPoint;
             pointValue.Z = eHeight;
             route.AppendPoint(pointValue);
         }
         else
         {
             IPoint      point;
             Stack <int> stack = new Stack <int>();
             double      num4  = eHeight - sHeight;
             if (Math.Abs(num4) < 0.0015)
             {
                 point = null;
                 for (int i = 0; i < polyline.PointCount; i++)
                 {
                     pointValue = polyline.GetPoint(i).Clone2(gviVertexAttribute.gviVertexAttributeZ) as IPoint;
                     if (i < 1)
                     {
                         pointValue.Z = sHeight;
                         route.AppendPoint(pointValue);
                         point = pointValue;
                     }
                     else if (Math.Sqrt(((pointValue.X - point.X) * (pointValue.X - point.X)) + ((pointValue.Y - point.Y) * (pointValue.Y - point.Y))) < (this._dia1 * 1.5))
                     {
                         stack.Push(i);
                     }
                     else
                     {
                         pointValue.Z = sHeight;
                         route.AppendPoint(pointValue);
                         point = pointValue;
                     }
                 }
             }
             else
             {
                 double    num3   = sHeight;
                 IPolyline o      = polyline.Clone2(gviVertexAttribute.gviVertexAttributeNone) as IPolyline;
                 double    length = o.Length;
                 Marshal.ReleaseComObject(o);
                 point = null;
                 for (int j = 0; j < polyline.PointCount; j++)
                 {
                     pointValue = polyline.GetPoint(j).Clone2(gviVertexAttribute.gviVertexAttributeZ) as IPoint;
                     if (j < 1)
                     {
                         pointValue.Z = sHeight;
                         route.AppendPoint(pointValue);
                         point = pointValue;
                     }
                     else
                     {
                         double num2;
                         if ((num2 = Math.Sqrt(((pointValue.X - point.X) * (pointValue.X - point.X)) + ((pointValue.Y - point.Y) * (pointValue.Y - point.Y)))) < (this._dia1 * 1.5))
                         {
                             stack.Push(j);
                         }
                         else
                         {
                             num3        += (num2 / length) * num4;
                             pointValue.Z = num3;
                             route.AppendPoint(pointValue);
                             point = pointValue;
                         }
                     }
                 }
             }
             while (stack.Count > 0)
             {
                 polyline.RemovePoints(stack.Pop(), 1);
             }
         }
         return(true);
     }
     catch (Exception exception)
     {
         return(false);
     }
 }
Exemplo n.º 16
0
        private void AddRecord()
        {
            try
            {
                this.beforeRowBufferMap.Clear();
                SelectCollection.Instance().Clear();
                if (reg == null || tc == null)
                {
                    return;
                }
                FacStyleClass style = this.cmbStyle.EditValue as FacStyleClass;
                if (style == null)
                {
                    return;
                }
                SubClass sc = this.cmbClassify.EditValue as SubClass;

                DF3DFeatureClass featureClassInfo = CommonUtils.Instance().CurEditLayer;
                if (featureClassInfo == null)
                {
                    return;
                }
                IFeatureClass fc = featureClassInfo.GetFeatureClass();
                if (fc == null)
                {
                    return;
                }
                IResourceManager manager = fc.FeatureDataSet as IResourceManager;
                if (manager == null)
                {
                    return;
                }
                IFeatureLayer fl = featureClassInfo.GetFeatureLayer();
                if (fl == null)
                {
                    return;
                }
                IFieldInfoCollection fields = fc.GetFields();
                int indexOid = fields.IndexOf(fc.FidFieldName);
                if (indexOid == -1)
                {
                    return;
                }
                int mpindex = fields.IndexOf(fl.GeometryFieldName);
                if (mpindex == -1)
                {
                    return;
                }
                int indexShape = fields.IndexOf("Shape");
                if (indexShape == -1)
                {
                    return;
                }
                int indexFootPrint = fields.IndexOf("FootPrint");
                if (indexFootPrint == -1)
                {
                    return;
                }
                int indexStyleId = fields.IndexOf("StyleId");
                if (indexStyleId == -1)
                {
                    return;
                }
                int indexFacilityId = fields.IndexOf("FacilityId");
                if (indexFacilityId == -1)
                {
                    return;
                }

                IFieldInfo fiShape = fields.Get(indexShape);
                if (fiShape == null || fiShape.GeometryDef == null)
                {
                    return;
                }

                IGeometry geo = this._drawTool.GetGeo();
                if (geo.GeometryType != gviGeometryType.gviGeometryPolyline)
                {
                    return;
                }
                IPolyline line   = geo as IPolyline;
                IPolyline geoOut = this._geoFact.CreateGeometry(gviGeometryType.gviGeometryPolyline, fiShape.GeometryDef.VertexAttribute) as IPolyline;
                for (int i = 0; i < line.PointCount; i++)
                {
                    IPoint ptGet  = line.GetPoint(i);
                    IPoint pttemp = ptGet.Clone2(fiShape.GeometryDef.VertexAttribute) as IPoint;
                    if (fiShape.GeometryDef.HasZ)
                    {
                        pttemp.SetCoords(ptGet.X, ptGet.Y, ptGet.Z, 0, 0);
                    }
                    else
                    {
                        pttemp.SetCoords(ptGet.X, ptGet.Y, 0, 0, 0);
                    }
                    geoOut.AppendPoint(pttemp);
                }

                IQueryFilter filter = new QueryFilter();
                filter.WhereClause      = "1=1";
                filter.ResultBeginIndex = 0;
                filter.ResultLimit      = 1;
                filter.PostfixClause    = "ORDER BY " + fc.FidFieldName + " desc";
                IFdeCursor cursor = null;
                cursor = fc.Search(filter, false);
                IRowBuffer rowtemp = cursor.NextRow();
                int        oid     = 0;
                if (rowtemp != null)
                {
                    oid = int.Parse(rowtemp.GetValue(indexOid).ToString());
                }
                if (cursor != null)
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(cursor);
                    cursor = null;
                }

                IRowBufferFactory fac = new RowBufferFactory();
                IRowBuffer        row = fac.CreateRowBuffer(fields);
                row.SetValue(indexOid, oid + 1);
                row.SetValue(indexShape, geoOut);
                row.SetValue(indexFootPrint, geoOut.Clone2(gviVertexAttribute.gviVertexAttributeNone));
                row.SetValue(indexStyleId, style.ObjectId);
                row.SetValue(indexFacilityId, BitConverter.ToString(ObjectIdGenerator.Generate()).Replace("-", string.Empty).ToLowerInvariant());
                if (sc != null)
                {
                    int indexClassify = fields.IndexOf(this._classifyName);
                    int indexGroupId  = fields.IndexOf("GroupId");
                    if (indexClassify != -1 && indexGroupId != -1)
                    {
                        row.SetValue(indexClassify, sc.Name);
                        row.SetValue(indexGroupId, sc.GroupId);
                    }
                }
                foreach (DataRow dr in this._dt.Rows)
                {
                    IFieldInfo fi = dr["F"] as IFieldInfo;
                    if (fi == null)
                    {
                        continue;
                    }
                    string fn    = fi.Name;
                    int    index = fields.IndexOf(fn);
                    if (index != -1)
                    {
                        if (dr["FV"] == null)
                        {
                            row.SetNull(index);
                        }
                        else
                        {
                            string strobj = dr["FV"].ToString();
                            bool   bRes   = false;
                            switch (fi.FieldType)
                            {
                            case gviFieldType.gviFieldBlob:
                            case gviFieldType.gviFieldGeometry:
                            case gviFieldType.gviFieldUnknown:
                                break;

                            case gviFieldType.gviFieldFloat:
                                float f;
                                bRes = float.TryParse(strobj, out f);
                                if (bRes)
                                {
                                    row.SetValue(index, f);
                                }
                                else
                                {
                                    row.SetNull(index);
                                }
                                break;

                            case gviFieldType.gviFieldDouble:
                                double d;
                                bRes = double.TryParse(strobj, out d);
                                if (bRes)
                                {
                                    row.SetValue(index, d);
                                }
                                else
                                {
                                    row.SetNull(index);
                                }
                                break;

                            case gviFieldType.gviFieldFID:
                            case gviFieldType.gviFieldUUID:
                            case gviFieldType.gviFieldInt16:
                                Int16 i16;
                                bRes = Int16.TryParse(strobj, out i16);
                                if (bRes)
                                {
                                    row.SetValue(index, i16);
                                }
                                else
                                {
                                    row.SetNull(index);
                                }
                                break;

                            case gviFieldType.gviFieldInt32:
                                Int32 i32;
                                bRes = Int32.TryParse(strobj, out i32);
                                if (bRes)
                                {
                                    row.SetValue(index, i32);
                                }
                                else
                                {
                                    row.SetNull(index);
                                }
                                break;

                            case gviFieldType.gviFieldInt64:
                                Int64 i64;
                                bRes = Int64.TryParse(strobj, out i64);
                                if (bRes)
                                {
                                    row.SetValue(index, i64);
                                }
                                else
                                {
                                    row.SetNull(index);
                                }
                                break;

                            case gviFieldType.gviFieldString:
                                row.SetValue(index, strobj);
                                break;

                            case gviFieldType.gviFieldDate:
                                DateTime dt;
                                bRes = DateTime.TryParse(strobj, out dt);
                                if (bRes)
                                {
                                    row.SetValue(index, dt);
                                }
                                else
                                {
                                    row.SetNull(index);
                                }
                                break;

                            default:
                                break;
                            }
                        }
                    }
                }

                Fac plf = new PipeLineFac(reg, style, row, tc, false, false);

                IModelPoint mp          = null;
                IModel      finemodel   = null;
                IModel      simplemodel = null;
                string      name        = "";
                if (UCAuto3DCreate.RebuildModel(plf, style, out mp, out finemodel, out simplemodel, out name))
                {
                    if (finemodel == null || mp == null)
                    {
                        return;
                    }
                    mp.ModelEnvelope = finemodel.Envelope;
                    row.SetValue(mpindex, mp);
                    //if (mc != null)
                    //{
                    //    if (indexClassify != -1 && indexGroupid != -1)
                    //    {

                    //    }
                    //}
                    bool bRes = false;
                    if (!string.IsNullOrEmpty(mp.ModelName))
                    {
                        if (!manager.ModelExist(mp.ModelName))
                        {
                            if (manager.AddModel(mp.ModelName, finemodel, simplemodel))
                            {
                                bRes = true;
                            }
                        }
                        else
                        {
                            if (manager.UpdateModel(mp.ModelName, finemodel) && manager.UpdateSimplifiedModel(mp.ModelName, simplemodel))
                            {
                                bRes = true;
                            }
                        }
                    }
                    if (!bRes)
                    {
                        return;
                    }
                    IRowBufferCollection rowCol = new RowBufferCollection();
                    rowCol.Add(row);
                    beforeRowBufferMap[featureClassInfo] = rowCol;
                    UpdateDatabase();
                    app.Current3DMapControl.FeatureManager.RefreshFeatureClass(fc);
                }
            }
            catch (Exception ex)
            {
            }
        }
Exemplo n.º 17
0
        private void AddGeometry()
        {
            try
            {
                this.beforeRowBufferMap.Clear();
                SelectCollection.Instance().Clear();
                DF3DFeatureClass featureClassInfo = CommonUtils.Instance().CurEditLayer;
                if (featureClassInfo == null)
                {
                    return;
                }
                IFeatureClass fc = featureClassInfo.GetFeatureClass();
                if (fc == null)
                {
                    return;
                }
                IFieldInfoCollection fields = fc.GetFields();
                int indexGeo = fields.IndexOf(this._strGeometryFieldName);
                if (indexGeo == -1)
                {
                    return;
                }

                IGeometry geo    = this._drawTool.GetGeo();
                IGeometry geoOut = null;
                switch (geo.GeometryType)
                {
                case gviGeometryType.gviGeometryModelPoint:
                    geoOut = geo;
                    break;

                case gviGeometryType.gviGeometryPoint:
                    IPoint pt  = geo as IPoint;
                    IPoint pt1 = pt.Clone2(gviVertexAttribute.gviVertexAttributeZM) as IPoint;
                    pt1.SetCoords(pt.X, pt.Y, pt.Z, 0, 0);
                    geoOut = pt1;
                    break;

                case gviGeometryType.gviGeometryPolyline:
                    IPolyline line  = geo as IPolyline;
                    IPolyline line1 = this._geoFact.CreateGeometry(gviGeometryType.gviGeometryPolyline, gviVertexAttribute.gviVertexAttributeZM) as IPolyline;
                    for (int i = 0; i < line.PointCount; i++)
                    {
                        IPoint ptGet  = line.GetPoint(i);
                        IPoint pttemp = ptGet.Clone2(gviVertexAttribute.gviVertexAttributeZM) as IPoint;
                        pttemp.SetCoords(ptGet.X, ptGet.Y, ptGet.Z, 0, 0);
                        line1.AppendPoint(pttemp);
                    }
                    geoOut = line1;
                    break;

                case gviGeometryType.gviGeometryPolygon:
                    IPolygon polygon  = geo as IPolygon;
                    IPolygon polygon1 = this._geoFact.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZM) as IPolygon;
                    for (int i = 0; i < polygon.ExteriorRing.PointCount; i++)
                    {
                        IPoint ptGet  = polygon.ExteriorRing.GetPoint(i);
                        IPoint pttemp = ptGet.Clone2(gviVertexAttribute.gviVertexAttributeZM) as IPoint;
                        pttemp.SetCoords(ptGet.X, ptGet.Y, ptGet.Z, 0, 0);
                        polygon1.ExteriorRing.AppendPoint(pttemp);
                    }
                    geoOut = polygon1;
                    break;
                }
                if (geoOut == null)
                {
                    return;
                }
                if (geo.GeometryType == gviGeometryType.gviGeometryModelPoint)
                {
                    //导入模型到数据库中
                    string      mn   = BitConverter.ToString(ObjectIdGenerator.Generate()).Replace("-", string.Empty).ToLowerInvariant();
                    IModelPoint mp   = geoOut as IModelPoint;
                    bool        bRes = this.ImportOsg(mn, mp.ModelName);
                    if (!bRes)
                    {
                        return;
                    }
                    mp.ModelName = mn;
                    geoOut       = mp;
                }
                IRowBufferCollection rowCol = new RowBufferCollection();
                IRowBufferFactory    fac    = new RowBufferFactory();
                IRowBuffer           row    = fac.CreateRowBuffer(fields);
                row.SetValue(indexGeo, geoOut);
                rowCol.Add(row);
                beforeRowBufferMap[featureClassInfo] = rowCol;
            }
            catch (Exception ex)
            {
            }
        }
Exemplo n.º 18
0
 // 抽稀坐标点
 private bool SimplifyPolyline(IGeometry geo, out IPolyline route)
 {
     route = null;
     try
     {
         IPolyline polyline = null;
         if ((geo == null) || ((polyline = geo as IPolyline) == null))
         {
             return(false);
         }
         List <Vector> list  = new List <Vector>();
         IPoint        p     = null;
         IPoint        point = null;
         route = DrawGeometry.geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolyline, gviVertexAttribute.gviVertexAttributeZ) as IPolyline;
         int    num2       = 0;
         IPoint pointValue = null;
         Vector vector     = null;
         Vector vector2    = null;
         Vector vector3    = null;
         Vector vector4    = null;
         if (polyline.PointCount == 2)
         {
             list.Add(new Vector(polyline.StartPoint));
             route.AppendPoint(polyline.StartPoint);
             list.Add(new Vector(polyline.EndPoint));
             route.AppendPoint(polyline.EndPoint);
         }
         else
         {
             new Stack <int>();
             p = null;
             for (int i = 0; i < polyline.PointCount; i++)
             {
                 point = polyline.GetPoint(i);
                 if (i == 0)
                 {
                     //DrawGeometry.Ocx.ObjectManager.CreateRenderPoint(point, null, this._);
                     list.Add(new Vector(point));
                     route.AppendPoint(point);
                     num2 = i;
                     p    = point;
                 }
                 else if (Math.Sqrt((((point.X - p.X) * (point.X - p.X)) + ((point.Y - p.Y) * (point.Y - p.Y))) + ((point.Z - p.Z) * (point.Z - p.Z))) < (this._dia1 / 2.0))
                 {
                     p = point;
                 }
                 else
                 {
                     vector2 = new Vector(p);
                     vector4 = new Vector(p.X - point.X, p.Y - point.Y, p.Z - point.Z);
                     if ((num2 > 0) && (num2 == (i - 1)))
                     {
                         list.Add(new Vector(p));
                         route.AppendPoint(p);
                     }
                     else if ((vector != null) && (vector3 != null))
                     {
                         pointValue = this.RadialIntersect(vector, vector3, vector2, vector4);
                         if (pointValue != null)
                         {
                             route.AppendPoint(pointValue);
                             list.Add(new Vector(pointValue.X, pointValue.Y, pointValue.Z));
                         }
                         num2 = i;
                     }
                     vector  = new Vector(point);
                     vector3 = -vector4;
                     p       = point;
                     if (i == (polyline.PointCount - 1))
                     {
                         list.Add(new Vector(point));
                         route.AppendPoint(point);
                     }
                 }
             }
         }
         return(true);
     }
     catch (Exception exception)
     {
         return(false);
     }
 }
Exemplo n.º 19
0
        // 地下—针对管线较短情况
        public bool GetPipeNodeParameterUnder(int flag, out Vector[] vtxs, out Vector dir, out IPipeSection section)
        {
            vtxs    = null;
            dir     = null;
            section = null;
            IPolyline polyline = null;

            if ((base._geoGroup[1] == null) || ((polyline = base._geoGroup[1] as IPolyline) == null))
            {
                return(false);
            }
            if (polyline.PointCount < 2)
            {
                return(false);
            }
            ISegment seg     = null;
            Vector   vector  = null;
            Vector   vector2 = null;

            vtxs    = new Vector[2];
            section = new PipeSection(this._dia1, this._dia2, HorizontalPos.Center, VerticalPos.Center, 0.02, 0);
            if (flag == 0)
            {
                vector  = new Vector(polyline.GetPoint(0));
                vtxs[0] = new Vector(vector.X, vector.Y, vector.Z + this.OffsetZ);
                seg     = polyline.GetSegment(0);
                dir     = new Vector(seg);
                dir     = dir.UnitVector();
                double length = dir.Length;
                // 针对管线较短情况
                if (length > (section.Diameter / 2))
                {
                    vector2 = vector + ((Vector)((dir * section.Diameter) / 2.0));
                }
                else
                {
                    vector2 = vector + ((Vector)((dir * length) / 2.0));
                }
                vtxs[1] = new Vector(vector2.X, vector2.Y, vector2.Z + this.OffsetZ);
            }
            else
            {
                vector  = new Vector(polyline.GetPoint(polyline.PointCount - 1));
                vtxs[0] = new Vector(vector.X, vector.Y, vector.Z + this.OffsetZ);
                seg     = polyline.GetSegment(polyline.PointCount - 2);
                dir     = new Vector(seg);
                double length = dir.Length;
                dir = -dir.UnitVector();
                // 针对管线较短情况
                if (length > (section.Diameter / 2))
                {
                    vector2 = vector + ((Vector)((dir * section.Diameter) / 2.0));
                }
                else
                {
                    vector2 = vector + ((Vector)((dir * length) / 2.0));
                }
                vtxs[1] = new Vector(vector2.X, vector2.Y, vector2.Z + this.OffsetZ);
            }
            return(true);
        }
Exemplo n.º 20
0
        private void AxRenderControl1_RcObjectEditFinish(object sender, EventArgs e)
        {
            try
            {
                if (polyline != null)
                {
                    sb.Clear();
                    var count = polyline.PointCount;
                    totalCount += count;

                    if (count < 2)
                    {
                        return;
                    }

                    UpdateLabelCount(count, totalCount);
                    UpdateStartPointAndEndPointValue();

                    points.Clear();

                    for (int i = 0; i < count; i++)
                    {
                        IPoint p = polyline.GetPoint(i);
                        points.Add(p);
                        CreateRenderPoint(p);
                    }

                    AddDataToDic();

                    if (points.Count > 0)
                    {
                        // 添加到RichTextBox显示
                        geometry = new Geometry()
                        {
                            coordinates = new List <double[]>()
                        };
                        points.ForEach(m => geometry.coordinates.Add(new double[] { m.X, m.Y }));

                        source = checkBox1.Checked ? double.Parse(txtSource.Text.Trim()) : source;
                        target = checkBox1.Checked ? double.Parse(txtTarget.Text.Trim()) : target;
                        Property property = new Property()
                        {
                            Gid              = gid.ToString(),
                            Class_Id         = "DL" + class_id.ToString(),
                            Source           = source,
                            Target           = target,
                            Oneway           = comboBox.SelectedIndex == 0,
                            Priority         = float.Parse(txtPriority.Text.Trim()),
                            MaxForwardSpeed  = float.Parse(txtMaxForwardSpeed.Text.Trim()),
                            MaxBackwardSpeed = float.Parse(txtMaxBackwardSpeed.Text.Trim())
                        };

                        string showTxt = $"Gid={gid}, source={source}, target={target}";

                        var midPoint = polyline.Midpoint;
                        if (midPoint != null)
                        {
                            mapOperation.CreateLabel(midPoint.X, midPoint.Y, 5, showTxt, mapOperation.RenderPolyline.Guid);
                        }
                        else
                        {
                            mapOperation.CreateLabel(points[0].X, points[0].Y, 5, showTxt, mapOperation.RenderPolyline.Guid);
                        }

                        gid++;
                        class_id++;
                        source = target;
                        target++;

                        UpdateFormView(gid, source, target);

                        roadPoints.features.Add(new Feature()
                        {
                            Id = mapOperation.RenderPolyline.Guid, properties = property, geometry = geometry
                        });
                        ShowInRichTextBox();

                        Save();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException.Message);
            }

            // 漫游
            SetInteractNormal();
            polyline = null;
            i        = 0;
        }
Exemplo n.º 21
0
        public bool ShowFlowDirection(int flowDir, out IRenderModelPoint rpt)
        {
            rpt = null;
            if (base._rowInfo == null)
            {
                return(false);
            }

            string str = Application.StartupPath + @"\..\Resource\Images\FlowDirection";

            if (!Directory.Exists(str))
            {
                return(false);
            }
            IImage _imgFlowImg = DrawGeometry.resFactory.CreateImageFromFile(str);

            _imgFlowImg.FrameInterval = 50;

            IPolyline        path        = null;
            IPipeSection     pipeSection = null;
            string           name        = "FlowDirection";
            IDrawDynamicFlow flow        = null;
            IModelPoint      mp          = null;

            try
            {
                IModel    model;
                IModel    model2;
                IPoint    pointValue = null;
                IPolyline polyline2  = null;
                polyline2 = base._geoGroup[1] as IPolyline;
                if ((polyline2 == null) || (polyline2.PointCount < 2))
                {
                    return(false);
                }
                path = polyline2.Clone() as IPolyline;
                for (int i = 0; i < path.PointCount; i++)
                {
                    pointValue = path.GetPoint(i);
                    if (pointValue != null)
                    {
                        pointValue.Z += this.OffsetZ;
                        path.UpdatePoint(i, pointValue);
                    }
                }

                pipeSection = new PipeSection(this._dia1, this._dia2, HorizontalPos.Center, VerticalPos.Center, 0.02, 0);

                flow = ParamModelFactory.Instance.CreateGeometryDraw(ModelType.DynamicFlow, Guid.NewGuid().ToString()) as IDrawDynamicFlow;
                flow.SetParameter(pipeSection, path, flowDir);
                flow.SetTextureRender(new string[] { name });
                if (!flow.Draw(out mp, out model, out model2))
                {
                    return(false);
                }

                #region 需要runtime授权
                IFeatureDataSet  iFeatureDataSet = DF3DPipeCreateApp.App.TempLib.OpenFeatureDataset("FeatureDataSet");
                IResourceManager manager         = iFeatureDataSet as IResourceManager;
                if (!manager.ModelExist(mp.ModelName))
                {
                    manager.AddModel(mp.ModelName, model, null);
                }
                if (!manager.ImageExist(name))
                {
                    manager.AddImage(name, _imgFlowImg);
                }
                #endregion

                IModelPointSymbol symbol = new ModelPointSymbolClass();
                symbol.SetResourceDataSet(iFeatureDataSet);
                symbol.Color       = uint.MaxValue;
                symbol.EnableColor = true;
                mp.ModelEnvelope   = model.Envelope;
                rpt = DrawGeometry.Ocx.ObjectManager.CreateRenderModelPoint(mp, symbol, DrawGeometry.Ocx.ProjectTree.RootID);

                return(true);
            }
            catch (Exception exception)
            {
                return(false);
            }
        }
Exemplo n.º 22
0
        void axRenderControl1_RcObjectEditing(IGeometry Geometry)
        {
            polyline = Geometry as IPolyline;
            if (polyline.PointCount == 2)
            {
                this.axRenderControl1.ObjectEditor.FinishEdit();
                this.axRenderControl1.InteractMode     = gviInteractMode.gviInteractNormal;
                this.axRenderControl1.MouseSelectMode  = gviMouseSelectMode.gviMouseSelectDrag;
                this.axRenderControl1.RcObjectEditing -= new _IRenderControlEvents_RcObjectEditingEventHandler(axRenderControl1_RcObjectEditing);


                IEulerAngle angle       = this.axRenderControl1.Camera.GetAimingAngles2(polyline.GetPoint(0), polyline.GetPoint(1));
                IEulerAngle cameraAngle = new EulerAngle();
                cameraAngle.Heading = angle.Heading - 90;
                cameraAngle.Tilt    = cameraAngle.Roll = 0;
                IPoint center = polyline.Midpoint;

                IEnvelope newEnv = new Envelope();  //newEnv表示相机出图范围
                newEnv.MinX = -polyline.Length / 2; //相机出图宽度
                newEnv.MaxX = polyline.Length / 2;
                newEnv.MinY = -10;                  //相机出图高度
                newEnv.MaxY = 100;
                newEnv.MinZ = -100;                 //相机出图深度
                newEnv.MaxZ = 100;

                SaveFileDialog dlg = new SaveFileDialog();
                dlg.Filter     = "Image Files(*.BMP)|*.BMP|Image Files(*.PNG)|*.PNG|Image Files(*.JPG)|*.JPG";
                dlg.DefaultExt = ".bmp";
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    bool b = this.axRenderControl1.ExportManager.ExportOrthoImage(dlg.FileName, 1024, center, cameraAngle, newEnv, false, System.Drawing.Color.Blue);
                    if (!b)
                    {
                        MessageBox.Show("错误码为:" + this.axRenderControl1.GetLastError().ToString());
                    }
                }
            }
        }
Exemplo n.º 23
0
        private void AddRecord()
        {
            try
            {
                this.beforeRowBufferMap.Clear();
                SelectCollection.Instance().Clear();
                DF3DFeatureClass featureClassInfo = CommonUtils.Instance().CurEditLayer;
                if (featureClassInfo == null)
                {
                    return;
                }
                IFeatureClass fc = featureClassInfo.GetFeatureClass();
                if (fc == null)
                {
                    return;
                }
                IFeatureLayer fl = featureClassInfo.GetFeatureLayer();
                if (fl == null)
                {
                    return;
                }
                IFieldInfoCollection fields = fc.GetFields();
                int indexGeo = fields.IndexOf(fl.GeometryFieldName);
                if (indexGeo == -1)
                {
                    return;
                }
                IFieldInfo fiGeo = fields.Get(indexGeo);
                if (fiGeo == null || fiGeo.GeometryDef == null)
                {
                    return;
                }

                IGeometry geo = this._drawTool.GetGeo();
                if (geo.GeometryType != gviGeometryType.gviGeometryPolyline)
                {
                    return;
                }
                IPolyline line   = geo as IPolyline;
                IPolyline geoOut = this._geoFact.CreateGeometry(gviGeometryType.gviGeometryPolyline, fiGeo.GeometryDef.VertexAttribute) as IPolyline;
                for (int i = 0; i < line.PointCount; i++)
                {
                    IPoint ptGet  = line.GetPoint(i);
                    IPoint pttemp = ptGet.Clone2(fiGeo.GeometryDef.VertexAttribute) as IPoint;
                    if (fiGeo.GeometryDef.HasZ)
                    {
                        pttemp.SetCoords(ptGet.X, ptGet.Y, ptGet.Z, 0, 0);
                    }
                    else
                    {
                        pttemp.SetCoords(ptGet.X, ptGet.Y, 0, 0, 0);
                    }
                    geoOut.AppendPoint(pttemp);
                }

                IRowBufferCollection rowCol = new RowBufferCollection();
                IRowBufferFactory    fac    = new RowBufferFactory();
                IRowBuffer           row    = fac.CreateRowBuffer(fields);
                row.SetValue(indexGeo, geoOut);
                foreach (DataRow dr in this._dt.Rows)
                {
                    IFieldInfo fi = dr["F"] as IFieldInfo;
                    if (fi == null)
                    {
                        continue;
                    }
                    string fn    = fi.Name;
                    int    index = fields.IndexOf(fn);
                    if (index != -1)
                    {
                        if (dr["FV"] == null)
                        {
                            row.SetNull(index);
                        }
                        else
                        {
                            string strobj = dr["FV"].ToString();
                            bool   bRes   = false;
                            switch (fi.FieldType)
                            {
                            case gviFieldType.gviFieldBlob:
                            case gviFieldType.gviFieldGeometry:
                            case gviFieldType.gviFieldUnknown:
                                break;

                            case gviFieldType.gviFieldFloat:
                                float f;
                                bRes = float.TryParse(strobj, out f);
                                if (bRes)
                                {
                                    row.SetValue(index, f);
                                }
                                else
                                {
                                    row.SetNull(index);
                                }
                                break;

                            case gviFieldType.gviFieldDouble:
                                double d;
                                bRes = double.TryParse(strobj, out d);
                                if (bRes)
                                {
                                    row.SetValue(index, d);
                                }
                                else
                                {
                                    row.SetNull(index);
                                }
                                break;

                            case gviFieldType.gviFieldFID:
                            case gviFieldType.gviFieldUUID:
                            case gviFieldType.gviFieldInt16:
                                Int16 i16;
                                bRes = Int16.TryParse(strobj, out i16);
                                if (bRes)
                                {
                                    row.SetValue(index, i16);
                                }
                                else
                                {
                                    row.SetNull(index);
                                }
                                break;

                            case gviFieldType.gviFieldInt32:
                                Int32 i32;
                                bRes = Int32.TryParse(strobj, out i32);
                                if (bRes)
                                {
                                    row.SetValue(index, i32);
                                }
                                else
                                {
                                    row.SetNull(index);
                                }
                                break;

                            case gviFieldType.gviFieldInt64:
                                Int64 i64;
                                bRes = Int64.TryParse(strobj, out i64);
                                if (bRes)
                                {
                                    row.SetValue(index, i64);
                                }
                                else
                                {
                                    row.SetNull(index);
                                }
                                break;;

                            case gviFieldType.gviFieldString:
                                row.SetValue(index, strobj);
                                break;

                            case gviFieldType.gviFieldDate:
                                DateTime dt;
                                bRes = DateTime.TryParse(strobj, out dt);
                                if (bRes)
                                {
                                    row.SetValue(index, dt);
                                }
                                else
                                {
                                    row.SetNull(index);
                                }
                                break;

                            default:
                                break;
                            }
                        }
                    }
                }
                rowCol.Add(row);
                beforeRowBufferMap[featureClassInfo] = rowCol;
                UpdateDatabase();
            }
            catch (Exception ex)
            {
            }
        }