Пример #1
0
        public void ImportModelXml(IFeatureClass fc, string mdbFile, int groupId, int _nCount)
        {
            try
            {
                //2、获取基本信息
                FileInfo         fInfo       = new FileInfo(mdbFile);
                string           strFilePath = fInfo.DirectoryName;
                IResourceManager rm          = fc.FeatureDataSet as IResourceManager;
                Dictionary <string, IEnvelope> cacheModeInfos = new Dictionary <string, IEnvelope>();
                List <string> cacheImageNames = new List <string>();

                IGeometryFactory geoFactory = new GeometryFactory();
                IResourceFactory symbolFac  = new ResourceFactory();

                IRowBufferCollection fcRows = new RowBufferCollection();
                IRowBuffer           fcRow  = null;

                //4、解析xml
                string      strConn    = "" + mdbFile + "\'";
                int         index      = 0;
                int         totalCount = _nCount;
                IModelPoint modePoint  = null;
                for (int i = 0; i < _nCount; ++i)
                {
                    int    percent = ++index * 100 / totalCount;
                    string toolTip = string.Format("已完成{0}条/总共{1}条 {2}%", index, totalCount, percent);
                    CommonEntity.FormEntity.Text = toolTip;

                    //fc
                    fcRow = fc.CreateRowBuffer();
                    int nPose = fcRow.FieldIndex("name");
                    if (nPose == -1)
                    {
                        continue;
                    }
                    string modelName = _dataTable.Rows[i]["ModelName"].ToString();
                    fcRow.SetValue(nPose, modelName);

                    nPose = fcRow.FieldIndex("groupId");
                    if (nPose == -1)
                    {
                        continue;
                    }
                    fcRow.SetValue(nPose, groupId);

                    modePoint = (IModelPoint)geoFactory.CreateGeometry(
                        gviGeometryType.gviGeometryModelPoint,
                        gviVertexAttribute.gviVertexAttributeZ);
                    modePoint.ModelName = modelName;

                    double dModePointX = double.Parse(_dataTable.Rows[i]["LocationX"].ToString()) + 0;  // CoorX = 0
                    double dModePointY = double.Parse(_dataTable.Rows[i]["LocationY"].ToString()) + 0;  // CoorY = 0
                    double dModePointZ = double.Parse(_dataTable.Rows[i]["LocationZ"].ToString()) + 0;  // CoorZ = 0

                    string  strMatrix = _dataTable.Rows[i]["Matrix3"].ToString();
                    float[] Matrix    = null;
                    if (!string.IsNullOrEmpty(strMatrix))
                    {
                        string[] strArray = strMatrix.Split(',');
                        if (strArray.Length == 9)
                        {
                            Matrix    = new float[9];
                            Matrix[0] = float.Parse(strArray[0]);
                            Matrix[1] = float.Parse(strArray[1]);
                            Matrix[2] = float.Parse(strArray[2]);
                            Matrix[3] = float.Parse(strArray[3]);
                            Matrix[4] = float.Parse(strArray[4]);
                            Matrix[5] = float.Parse(strArray[5]);
                            Matrix[6] = float.Parse(strArray[6]);
                            Matrix[7] = float.Parse(strArray[7]);
                            Matrix[8] = float.Parse(strArray[8]);
                        }
                    }
                    modePoint.X        = dModePointX;
                    modePoint.Y        = dModePointY;
                    modePoint.Z        = dModePointZ;
                    modePoint.Matrix33 = Matrix;


                    //mc
                    IPropertySet Images = null;

                    //如果内存中不包含
                    if (!cacheModeInfos.Keys.Contains(modelName))
                    {
                        //数据库中包含
                        if (rm.ModelExist(modelName))
                        {
                            //重名即跳过
                            IEnvelope ev = rm.GetModel(modelName).Envelope;
                            modePoint.ModelEnvelope = ev;
                        }
                        else
                        {
                            IModel  simpleModel = null;
                            string  osgFilePath = strFilePath + "\\" + modelName + ".osg";
                            IModel  fineModel   = null;
                            IMatrix matrix      = null;
                            symbolFac.CreateModelAndImageFromFileEx(osgFilePath,
                                                                    out Images, out simpleModel, out fineModel, out matrix);
                            if (fineModel == null || fineModel.GroupCount == 0)
                            {
                                continue;
                            }

                            cacheModeInfos[modelName] = modePoint.ModelEnvelope = Clone(fineModel.Envelope);

                            rm.AddModel(modelName, fineModel, simpleModel);
                            //Marshal.ReleaseComObject(simpleModel);
                            //Marshal.ReleaseComObject(fineModel);
                        }
                    }
                    else
                    {
                        modePoint.ModelEnvelope = cacheModeInfos[modelName];
                    }

                    nPose = fcRow.FieldIndex("Geometry");
                    fcRow.SetValue(nPose, modePoint);
                    fcRows.Add(fcRow);

                    //tc
                    int nCount = Images.Count;
                    if (Images != null && nCount > 0)
                    {
                        Hashtable htImages = Images.AsHashtable();
                        foreach (DictionaryEntry item in htImages)
                        {
                            string imgName = item.Key.ToString();
                            IImage img     = item.Value as IImage;
                            if (img == null)
                            {
                                continue;
                            }
                            if (string.IsNullOrEmpty(imgName))
                            {
                                continue;
                            }

                            //如果内存中不包含
                            if (!cacheImageNames.Contains(imgName))
                            {
                                //数据库中包含
                                if (rm.ImageExist(imgName))
                                {
                                    //重名即跳过
                                }
                            }

                            //如果内存中不包含,数据库中也不包含
                            if (!rm.ImageExist(imgName) &&
                                !cacheImageNames.Contains(imgName))
                            {
                                cacheImageNames.Add(imgName);

                                rm.AddImage(imgName, img);
                            }
                        }
                    }
                    //end

                    if (fcRows.Count >= 10)
                    {
                        InsertFeatures(fc as IObjectClass, fcRows);
                        fcRows.Clear();
                    }
                }
                if (fcRows.Count > 0)
                {
                    InsertFeatures(fc as IObjectClass, fcRows);
                    fcRows.Clear();
                }
            }
            catch (System.Exception ex)
            {
                if (ex.GetType().Name.Equals("UnauthorizedAccessException"))
                {
                    MessageBox.Show("需要标准runtime授权");
                }
                else
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
Пример #2
0
        public void ImportModelMdb(IFeatureClass fc, string mdbFile, int groupId)
        {
            try
            {
                //2、获取基本信息
                FileInfo fInfo       = new FileInfo(mdbFile);
                string   strFilePath = fInfo.DirectoryName;

                Gvitech.CityMaker.Resource.IResourceFactory rf = new Gvitech.CityMaker.Resource.ResourceFactory();
                IResourceManager rm = fc.FeatureDataSet as IResourceManager;
                Dictionary <string, IEnvelope> cacheModeInfos = new Dictionary <string, IEnvelope>();
                List <string> cacheImageNames = new List <string>();

                IGeometryFactory geoFactory = new GeometryFactory();
                IResourceFactory symbolFac  = new ResourceFactory();

                IRowBufferCollection fcRows = new RowBufferCollection();
                IRowBuffer           fcRow  = null;

                //4、解析mdb
                string strConn    = _ConnStr + mdbFile + "\'";
                int    index      = 0;
                int    totalCount = 0;
                using (OleDbConnection oleConn = new OleDbConnection(strConn))
                {
                    oleConn.Open();
                    string          strSql      = "select count(*)  from Attribute_Table_CityManager";
                    OleDbCommand    countCmd    = new OleDbCommand(strSql, oleConn);
                    OleDbDataReader countReader = countCmd.ExecuteReader();
                    countReader.Read();
                    totalCount = countReader.GetInt32(0);
                    countReader.Close();

                    OleDbCommand    command   = new OleDbCommand(_QueryModelStr, oleConn);
                    OleDbDataReader reader    = command.ExecuteReader();
                    IModelPoint     modePoint = null;
                    while (reader.Read())
                    {
                        int    percent = ++index * 100 / totalCount;
                        string toolTip = string.Format("已完成{0}条/总共{1}条 {2}%", index, totalCount, percent);
                        CommonEntity.FormEntity.Text = toolTip;

                        double dScaleX = 0.0;
                        double dScaleY = 0.0;
                        double dScaleZ = 0.0;

                        double.TryParse(reader.GetString(9), out dScaleX);
                        double.TryParse(reader.GetString(10), out dScaleY);
                        double.TryParse(reader.GetString(11), out dScaleZ);

                        //if (dScaleX < 0 || dScaleY < 0 || dScaleZ < 0)
                        //    continue;

                        //fc
                        fcRow = fc.CreateRowBuffer();
                        int nPose = fcRow.FieldIndex("name");
                        if (nPose == -1)
                        {
                            continue;
                        }
                        string modelName = reader.GetString(0);
                        fcRow.SetValue(nPose, modelName);

                        nPose = fcRow.FieldIndex("groupId");
                        if (nPose == -1)
                        {
                            continue;
                        }
                        fcRow.SetValue(nPose, groupId);

                        modePoint = (IModelPoint)geoFactory.CreateGeometry(
                            gviGeometryType.gviGeometryModelPoint,
                            gviVertexAttribute.gviVertexAttributeZ);
                        modePoint.ModelName = modelName;

                        double dModePointX = double.Parse(reader.GetString(2)) + 0;  // CoorX = 0
                        double dModePointY = double.Parse(reader.GetString(3)) + 0;  // CoorY = 0
                        double dModePointZ = double.Parse(reader.GetString(4)) + 0;  // CoorZ = 0

                        double dRotationAngle = double.Parse(reader.GetString(5));
                        double dAxisX         = double.Parse(reader.GetString(6));
                        double dAxisY         = double.Parse(reader.GetString(7));
                        double dAxisZ         = double.Parse(reader.GetString(8));

                        double dUTransAngel = double.Parse(reader.GetString(12));
                        double dUTransX     = double.Parse(reader.GetString(13));
                        double dUTransY     = double.Parse(reader.GetString(14));
                        double dUTransZ     = double.Parse(reader.GetString(15));

                        modePoint.X = dModePointX;
                        modePoint.Y = dModePointY;
                        modePoint.Z = dModePointZ;

                        IMatrix matrix = new Matrix();

                        IVector3 pointVec = new Vector3();
                        pointVec.X = dModePointX;
                        pointVec.Y = dModePointY;
                        pointVec.Z = dModePointZ;

                        IVector3 Scale = new Vector3();
                        Scale.X = dScaleX;
                        Scale.Y = dScaleY;
                        Scale.Z = dScaleZ;

                        IVector3 Rotation = new Vector3();
                        Rotation.X = dAxisX;
                        Rotation.Y = dAxisY;
                        Rotation.Z = dAxisZ;

                        IVector3 Shear = new Vector3();
                        Shear.X = dUTransX;
                        Shear.Y = dUTransY;
                        Shear.Z = dUTransZ;

                        matrix.Compose2(pointVec, Scale, dRotationAngle, Rotation, dUTransAngel, Shear);
                        modePoint.FromMatrix(matrix);

                        //mc
                        IPropertySet Images = null;

                        //如果内存中不包含
                        if (!cacheModeInfos.Keys.Contains(modelName))
                        {
                            //数据库中包含
                            if (rm.ModelExist(modelName))
                            {
                                //重名即跳过
                                IEnvelope ev = rm.GetModel(modelName).Envelope;
                                modePoint.ModelEnvelope = ev;
                            }
                            else
                            {
                                IModel  simpleModel = null;
                                string  osgFilePath = strFilePath + "\\" + modelName + ".osg";
                                IModel  fineModel   = null;
                                IMatrix m           = null;
                                symbolFac.CreateModelAndImageFromFileEx(osgFilePath,
                                                                        out Images, out simpleModel, out fineModel, out m);
                                if (fineModel == null || fineModel.GroupCount == 0)
                                {
                                    continue;
                                }

                                cacheModeInfos[modelName] = modePoint.ModelEnvelope = Clone(fineModel.Envelope);

                                rm.AddModel(modelName, fineModel, simpleModel);
                            }
                        }
                        else
                        {
                            modePoint.ModelEnvelope = cacheModeInfos[modelName];
                        }

                        nPose = fcRow.FieldIndex("Geometry");
                        fcRow.SetValue(nPose, modePoint);
                        fcRows.Add(fcRow);

                        //tc
                        if (Images != null)
                        {
                            int nCount = Images.Count;
                            if (nCount > 0)
                            {
                                Hashtable htImages = Images.AsHashtable();
                                foreach (DictionaryEntry item in htImages)
                                {
                                    string imgName = item.Key.ToString();
                                    IImage img     = item.Value as IImage;
                                    if (img == null)
                                    {
                                        continue;
                                    }
                                    if (string.IsNullOrEmpty(imgName))
                                    {
                                        continue;
                                    }

                                    //如果内存中不包含
                                    if (!cacheImageNames.Contains(imgName))
                                    {
                                        //数据库中包含
                                        if (rm.ImageExist(imgName))
                                        {
                                            //重名即跳过
                                        }
                                    }

                                    //如果内存中不包含,数据库中也不包含
                                    if (!rm.ImageExist(imgName) &&
                                        !cacheImageNames.Contains(imgName))
                                    {
                                        cacheImageNames.Add(imgName);
                                        rm.AddImage(imgName, img);
                                    }
                                }
                            }
                        }
                        //end

                        if (fcRows.Count >= 10)
                        {
                            InsertFeatures(fc as IObjectClass, fcRows);
                            fcRows.Clear();
                        }
                    }
                    reader.Close();
                    oleConn.Close();
                }

                if (fcRows.Count > 0)
                {
                    InsertFeatures(fc as IObjectClass, fcRows);
                    fcRows.Clear();
                }
            }
            catch (System.Exception ex)
            {
                if (ex.GetType().Name.Equals("UnauthorizedAccessException"))
                {
                    MessageBox.Show("需要标准runtime授权");
                }
                else
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
Пример #3
0
        public void ImportModelOsg(IFeatureClass fc, string osgFile, int groupId)
        {
            try
            {
                FileInfo         fInfo       = new FileInfo(osgFile);
                string           strFilePath = fInfo.DirectoryName;
                IResourceManager rm          = fc.FeatureDataSet as IResourceManager;
                IGeometryFactory geoFactory  = new GeometryFactory();
                IResourceFactory symbolFac   = new ResourceFactory();
                IRowBuffer       fcRow       = null;

                //fc
                string modelName = fInfo.Name.Split('.')[0];
                fcRow = fc.CreateRowBuffer();
                int nPose = fcRow.FieldIndex("name");
                if (nPose != -1)
                {
                    fcRow.SetValue(nPose, modelName);
                }
                nPose = fcRow.FieldIndex("groupId");
                if (nPose != -1)
                {
                    fcRow.SetValue(nPose, groupId);
                }

                //mc
                IPropertySet Images      = null;
                IModel       simpleModel = null;
                string       osgFilePath = strFilePath + "\\" + modelName + ".osg";
                IModel       fineModel   = null;
                IMatrix      matrix      = null;
                symbolFac.CreateModelAndImageFromFileEx(osgFilePath,
                                                        out Images, out simpleModel, out fineModel, out matrix);
                if (fineModel == null || fineModel.GroupCount == 0)
                {
                    return;
                }
                rm.AddModel(modelName, fineModel, simpleModel);
                //Marshal.ReleaseComObject(simpleModel);
                //Marshal.ReleaseComObject(fineModel);

                //tc
                int nCount = Images.Count;
                if (Images != null && nCount > 0)
                {
                    Hashtable htImages = Images.AsHashtable();
                    foreach (DictionaryEntry item in htImages)
                    {
                        String imgName = item.Key.ToString();
                        IImage img     = item.Value as IImage;
                        rm.AddImage(imgName, img);
                    }
                }

                //modelpoint
                IModelPoint modePoint = null;
                modePoint = (IModelPoint)geoFactory.CreateGeometry(
                    gviGeometryType.gviGeometryModelPoint,
                    gviVertexAttribute.gviVertexAttributeZ);
                modePoint.FromMatrix(matrix);
                modePoint.ModelName = modelName;
                double dModePointX = 0.0;
                double dModePointY = 0.0;
                double dModePointZ = 0.0;
                modePoint.X += dModePointX;
                modePoint.Y += dModePointY;
                modePoint.Z += dModePointZ;
                nPose        = fcRow.FieldIndex("Geometry");
                fcRow.SetValue(nPose, modePoint);

                if (fc.HasTemporal())
                {
                    ITemporalManager mgr = fc.TemporalManager;
                    mgr.Insert(DateTime.Now, fcRow);
                    //Marshal.ReleaseComObject(mgr);
                }
                else
                {
                    IRowBufferCollection fcRows = new RowBufferCollection();
                    fcRows.Add(fcRow);
                    InsertFeatures(fc as IObjectClass, fcRows);
                    fcRows.Clear();
                }
            }
            catch (System.Exception ex)
            {
                if (ex.GetType().Name.Equals("UnauthorizedAccessException"))
                {
                    MessageBox.Show("需要标准runtime授权");
                }
                else
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }