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