예제 #1
0
파일: MainForm.cs 프로젝트: batuZ/Samples
        void scaleCalculate(IModelPoint oldMP, IModelPoint newMP,
                            out double scaleX, out double scaleY, out double scaleZ,
                            out double centerX, out double centerY, out double centerZ)
        {
            M0 = oldMP.AsMatrix();
            M1 = newMP.AsMatrix();
            IMatrix M0_Inverse = M0.Clone();

            M0_Inverse.Inverse();
            IMatrix  MS     = MultiplyMatrix(M0_Inverse, M1);
            IVector3 scaleV = MS.GetScale();

            scaleX  = scaleV.X;
            scaleY  = scaleV.Y;
            scaleZ  = scaleV.Z;
            centerX = MS.M41 / (1.0 - scaleV.X);
            centerY = MS.M42 / (1.0 - scaleV.Y);
            centerZ = MS.M43 / (1.0 - scaleV.Z);
            if (scaleV.X == 1)
            {
                centerX = MS.M41;
            }
            if (scaleV.Y == 1)
            {
                centerY = MS.M42;
            }
            if (scaleV.Z == 1)
            {
                centerZ = MS.M43;
            }
        }
예제 #2
0
 /// <summary>
 /// 将当前renderModelPoint所在的位置插入MotionPath中
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void btnInsertWaypoint_Click(object sender, EventArgs e)
 {
     if (renderModelPoint != null)
     {
         IModelPoint modelPoint = renderModelPoint.GetFdeGeometry() as IModelPoint;
         IMatrix     matrix     = new Matrix();
         matrix = modelPoint.AsMatrix();
         motionPath.AddWaypointByMatrix(matrix, motionPath.TotalDuration + 4);
     }
 }
예제 #3
0
파일: MainForm.cs 프로젝트: batuZ/Samples
        private void toolStripButton_CreateRenderModelPoint_Click(object sender, EventArgs e)
        {
            IModel model = CreateModel(1, 1, 1, 0xffffffff);

            RenderControl.ObjectManager.AddModel("model", model);
            t.Stop();
            foreach (IRenderModelPoint m in list)
            {
                RenderControl.ObjectManager.DeleteObject(m.Guid);
            }
            list.Clear();
            MatrixList.Clear();
            int              x = Convert.ToInt32(toolStripTextBox_x.Text.Trim());
            int              y = Convert.ToInt32(toolStripTextBox_y.Text.Trim());
            int              n = Convert.ToInt32(toolStripTextBox_n.Text.Trim());
            double           x1, y1;
            IGeometryFactory gf = new GeometryFactory();

            for (int j = 0; j < x; j++)
            {
                for (int k = 0; k < y; k++)
                {
                    IModelPoint mp = gf.CreateGeometry(gviGeometryType.gviGeometryModelPoint, gviVertexAttribute.gviVertexAttributeZ) as IModelPoint;

                    x1               = n * j;
                    y1               = n * k;
                    mp.X             = x1;
                    mp.Y             = y1;
                    mp.Z             = 0;
                    mp.ModelName     = "model";
                    mp.ModelEnvelope = model.Envelope;
                    IRenderModelPoint rmp = RenderControl.ObjectManager.CreateRenderModelPoint(mp, null, RenderControl.ProjectTree.RootID);
                    rmp.MaxVisibleDistance = 99999999999999;
                    rmp.MinVisiblePixels   = 0;
                    list.Add(rmp);
                    MatrixList.Add(mp.AsMatrix());
                }
            }
        }
예제 #4
0
        private bool MergeModels(IFeatureClass fc, string geometryField, int[] oidList, IResourceManager resMgr, ref IModelPoint desModelPoint)
        {
            bool flag = true;
            bool result;

            try
            {
                if (fc == null || oidList == null)
                {
                    result = false;
                    return(result);
                }
                Gvitech.CityMaker.Resource.IModel model = resMgr.GetModel(desModelPoint.ModelName);
                IMatrix matrix = desModelPoint.AsMatrix().Clone();
                matrix.Inverse();
                int        position = fc.GetFields().IndexOf(geometryField);
                IFdeCursor rows     = fc.GetRows(oidList, false);
                IVector3   src      = new Vector3Class();
                IVector3   vector   = new Vector3Class();
                System.Collections.Generic.Dictionary <IMatrix, string> dictionary = new System.Collections.Generic.Dictionary <IMatrix, string>();
                IRowBuffer rowBuffer;
                while ((rowBuffer = rows.NextRow()) != null)
                {
                    IModelPoint modelPoint = rowBuffer.GetValue(position) as IModelPoint;
                    if (modelPoint != null)
                    {
                        dictionary[modelPoint.AsMatrix().Clone()] = modelPoint.ModelName;
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(modelPoint);
                    }
                }
                foreach (IMatrix current in dictionary.Keys)
                {
                    string name = dictionary[current];
                    Gvitech.CityMaker.Resource.IModel model2 = resMgr.GetModel(name);
                    for (int i = 0; i < model2.GroupCount; i++)
                    {
                        Gvitech.CityMaker.Resource.IDrawGroup drawGroup = new DrawGroupClass();
                        Gvitech.CityMaker.Resource.IDrawGroup group     = model2.GetGroup(i);
                        for (int j = 0; j < group.PrimitiveCount; j++)
                        {
                            Gvitech.CityMaker.Resource.IDrawPrimitive primitive = group.GetPrimitive(j);
                            if (primitive.PrimitiveType == Gvitech.CityMaker.Resource.gviPrimitiveType.gviPrimitiveBillboardZ)
                            {
                                flag   = false;
                                result = flag;
                                return(result);
                            }
                            Gvitech.CityMaker.Resource.IDrawPrimitive drawPrimitive = new DrawPrimitiveClass();
                            IFloatArray vertexArray = primitive.VertexArray;
                            IFloatArray floatArray  = new FloatArrayClass();
                            int         num         = 0;
                            while ((long)num < (long)((ulong)vertexArray.Length))
                            {
                                vector.X = (double)vertexArray.Get(num);
                                vector.Y = (double)vertexArray.Get(num + 1);
                                vector.Z = (double)vertexArray.Get(num + 2);
                                current.MultiplyVector(vector, ref src);
                                matrix.MultiplyVector(src, ref vector);
                                floatArray.Append((float)vector.X);
                                floatArray.Append((float)vector.Y);
                                floatArray.Append((float)vector.Z);
                                num += 3;
                            }
                            drawPrimitive.VertexArray        = floatArray;
                            drawPrimitive.BakedTexcoordArray = primitive.BakedTexcoordArray;
                            drawPrimitive.ColorArray         = primitive.ColorArray;
                            drawPrimitive.IndexArray         = primitive.IndexArray;
                            drawPrimitive.Material           = primitive.Material;
                            drawPrimitive.NormalArray        = primitive.NormalArray;
                            drawPrimitive.PrimitiveMode      = primitive.PrimitiveMode;
                            drawPrimitive.PrimitiveType      = primitive.PrimitiveType;
                            drawPrimitive.TexcoordArray      = primitive.TexcoordArray;
                            drawGroup.AddPrimitive(drawPrimitive);
                        }
                        drawGroup.CompleteMapFactor      = group.CompleteMapFactor;
                        drawGroup.CompleteMapTextureName = group.CompleteMapTextureName;
                        drawGroup.LightMapTextureName    = group.LightMapTextureName;
                        model.AddGroup(drawGroup);
                    }
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(model2);
                }
                System.Runtime.InteropServices.Marshal.ReleaseComObject(rows);
                desModelPoint.ModelEnvelope = model.Envelope.Clone();
                resMgr.UpdateModel(desModelPoint.ModelName, model);
                resMgr.RebuildSimplifiedModel(desModelPoint.ModelName);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(matrix);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(model);
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                flag = false;
                XtraMessageBox.Show(ex.Message);
            }
            catch (System.Exception e)
            {
                flag = false;
                LoggingService.Error(e);
            }
            result = flag;
            return(result);
        }
예제 #5
0
        void aaa(IFeatureClass fc, int index, IResourceManager resourceM)
        {
            //无条件查询,即全选
            IFdeCursor sourceCursor = fc.Update(null);
            IRowBuffer row          = null;

            //遍历feature
            while ((row = sourceCursor.NextRow()) != null)
            {
                //从feature中拿到几何属性
                IGeometry geom = (IGeometry)row.GetValue(index);
                //确定是模型
                if (geom.GeometryType == gviGeometryType.gviGeometryModelPoint)
                {
                    //转换为modelPoint
                    IModelPoint mp = (IModelPoint)geom;

                    //mp 的转换矩阵
                    IMatrix mx = mp.AsMatrix();

                    //获取模型实例
                    //注意:
                    //model可以被不同的modelPoint多次引用,需要修改模型时
                    //需要通过modelName判断一下,这个模型被修改过没有
                    IModel model = resourceM.GetModel(mp.ModelName);

                    //提取模型节点属性
                    if (model != null)
                    {
                        #region modelInside
                        //遍历DrawGroup
                        for (int dgrpi = 0; dgrpi < model.GroupCount; dgrpi++)
                        {
                            IDrawGroup dgrp = model.GetGroup(dgrpi);
                            if (dgrp != null)
                            {
                                //遍历DrawPrimitive
                                for (int dpri = 0; dpri < dgrp.PrimitiveCount; dpri++)
                                {
                                    IDrawPrimitive dpr = dgrp.GetPrimitive(dpri);
                                    if (dpr != null)
                                    {
                                        //获取顶点数组
                                        float[] verArray = dpr.VertexArray.Array;
                                        //创建新的顶点数组,替换原来的
                                        IFloatArray newArr = new FloatArray();

                                        //遍历数组,转为点,三个成员为一组,xyz
                                        for (int veri = 0; veri < verArray.Length; veri += 3)
                                        {
                                            Vector3 vec = new Vector3();
                                            vec.X = verArray[veri];
                                            vec.Y = verArray[veri + 1];
                                            vec.Z = verArray[veri + 2];

                                            //用矩阵转到决对坐标,并修改
                                            IVector3 refVec = mx.MultiplyVector(vec);

                                            //修改部份
                                            refVec.X = 3.3;
                                            refVec.Y = 4.4;
                                            refVec.Z = 5.5;

                                            //修改完,减掉mp中的位移,准备塞回modle
                                            newArr.Append((float)(refVec.X - mp.X));
                                            newArr.Append((float)(refVec.Y - mp.Y));
                                            newArr.Append((float)(refVec.Z - mp.Z));
                                        }
                                        //把新顶点数组塞入Primitive
                                        dpr.VertexArray = newArr;
                                        //再把Primitive更新到当前Group
                                        dgrp.SetPrimitive(dpri, dpr);
                                    }
                                }
                                //把组更新到当前model
                                model.SetGroup(dgrpi, dgrp);
                            }
                        }
                        //更新数据源
                        resourceM.UpdateModel(mp.ModelName, model);
                        resourceM.RebuildSimplifiedModel(mp.ModelName);//重建简模
                        //释放资源
                        model.Dispose();
                        model = null;
                        #endregion
                    }

                    //修改mp
                    mp.SetCoords(3.3, 4.4, 5.5, mp.M, mp.Id);
                    //塞回row
                    row.SetValue(index, mp);
                }
            }
        }
예제 #6
0
        private void btnAnalyse_Click(object sender, EventArgs e)
        {
            try
            {
                this._dt.Rows.Clear();
                DF3DApplication app = DF3DApplication.Application;
                if (app == null || app.Current3DMapControl == null || !app.Current3DMapControl.Terrain.IsRegistered)
                {
                    return;
                }
                foreach (Guid g in this._listRender)
                {
                    app.Current3DMapControl.ObjectManager.DeleteObject(g);
                }
                this._listRender.Clear();

                WaitForm.Start("正在分析...", "请稍后");

                if (this._drawTool == null)
                {
                    return;
                }
                IGeometry geo = this._drawTool.GetGeo();
                if (geo == null || geo.GeometryType != gviGeometryType.gviGeometryPolygon)
                {
                    return;
                }
                IPolygon polygon = geo as IPolygon;
                IPoint   pt      = polygon.ExteriorRing.Midpoint;
                double   height  = double.Parse(this.seLimitHeight.Value.ToString());

                List <DF3DFeatureClass> list = Dictionary3DTable.Instance.GetFeatureClassByFacilityClassName(new string[] { "Building", "Structure" });
                if (list != null && list.Count != 0)
                {
                    foreach (DF3DFeatureClass dffc in list)
                    {
                        IFeatureClass fc  = dffc.GetFeatureClass();
                        IFeatureLayer fl  = dffc.GetFeatureLayer();
                        FacilityClass fac = dffc.GetFacilityClass();
                        if (fl != null)
                        {
                            if (fl.VisibleMask == gviViewportMask.gviViewNone)
                            {
                                continue;
                            }
                        }
                        if (fc != null)
                        {
                            IFieldInfoCollection fiCol = fc.GetFields();
                            int indexGeo = fiCol.IndexOf("Geometry");
                            if (indexGeo == -1)
                            {
                                continue;
                            }
                            int indexFid = fiCol.IndexOf(fc.FidFieldName);
                            if (indexFid == -1)
                            {
                                continue;
                            }
                            int indexName    = -1;
                            int indexAddress = -1;
                            int indexContact = -1;
                            if (fac != null)
                            {
                                indexName    = fiCol.IndexOf(fac.GetFieldInfoNameBySystemName("Name"));
                                indexAddress = fiCol.IndexOf(fac.GetFieldInfoNameBySystemName("Address"));
                                indexContact = fiCol.IndexOf(fac.GetFieldInfoNameBySystemName("Contact"));
                            }

                            IResourceManager resManager = fc.FeatureDataSet as IResourceManager;
                            if (resManager == null)
                            {
                                continue;
                            }

                            IRowBuffer row    = null;
                            IFdeCursor cursor = null;
                            try
                            {
                                ISpatialFilter filter = new SpatialFilter();
                                filter.Geometry      = geo;
                                filter.GeometryField = "Geometry";
                                filter.SpatialRel    = gviSpatialRel.gviSpatialRelIntersects;
                                cursor = fc.Search(filter, true);
                                while ((row = cursor.NextRow()) != null)
                                {
                                    IGeometry geoRow = row.GetValue(indexGeo) as IGeometry;
                                    if (geoRow != null && geoRow.GeometryType == gviGeometryType.gviGeometryModelPoint)
                                    {
                                        IModelPoint mp = geoRow as IModelPoint;
                                        IVector3    v3 = mp.AsMatrix().GetScale();
                                        //string name = mp.ModelName;
                                        //IModel m = resManager.GetModel(name);
                                        IEnvelope env           = mp.ModelEnvelope;
                                        double    terrainHeight = 0.0;
                                        if (app.Current3DMapControl.Terrain.IsRegistered)
                                        {
                                            terrainHeight = app.Current3DMapControl.Terrain.GetElevation(mp.X, mp.Y, gviGetElevationType.gviGetElevationFromDatabase);
                                        }
                                        double mpHeigth = env.Depth * v3.Z;
                                        if (mpHeigth > height)
                                        {
                                            DataRow dr = this._dt.NewRow();
                                            if (indexName != -1)
                                            {
                                                dr["Name"] = row.GetValue(indexName);
                                            }
                                            dr["fcName"] = string.IsNullOrEmpty(fc.AliasName) ? fc.Name : fc.AliasName;
                                            dr["fid"]    = row.GetValue(indexFid);
                                            dr["Geo"]    = row.GetValue(indexGeo);
                                            if (indexAddress != -1)
                                            {
                                                dr["Address"] = row.GetValue(indexAddress);
                                            }
                                            if (indexContact != -1)
                                            {
                                                dr["Contact"] = row.GetValue(indexContact);
                                            }
                                            dr["TerrainHeight"] = terrainHeight.ToString("0.00");
                                            dr["Height"]        = env.MaxZ.ToString("0.00");
                                            dr["OverHeight"]    = (mpHeigth - height).ToString("0.00");
                                            dr["fc"]            = fc;
                                            this._dt.Rows.Add(dr);
                                        }
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                            }
                            finally
                            {
                                if (row != null)
                                {
                                    System.Runtime.InteropServices.Marshal.ReleaseComObject(row);
                                    row = null;
                                }
                                if (cursor != null)
                                {
                                    System.Runtime.InteropServices.Marshal.ReleaseComObject(cursor);
                                    cursor = null;
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex) { }
            finally
            {
                WaitForm.Stop();
            }
        }