void t_Tick(object sender, EventArgs e) { Random r = new Random(); int i = 0; foreach (IRenderModelPoint rmp in list) { //System.Threading.Thread.Sleep(2); int n = r.Next(100); if (n > 80) { rmp.Highlight(System.Drawing.Color.Red); } else if (n > 40 && n <= 80) { rmp.Highlight(System.Drawing.Color.Yellow); } else { rmp.Highlight(System.Drawing.Color.Blue); } IModelPoint modelPoint = rmp.GetFdeGeometry() as IModelPoint; modelPoint.FromMatrix(MatrixList[i]); i++; ITransform tf = modelPoint as ITransform; tf.Scale3D(1, 1, n, modelPoint.Envelope.Center.X, modelPoint.Envelope.Center.Y, modelPoint.Envelope.MinZ); IModelPoint newModelPoint = tf as IModelPoint; rmp.SetFdeGeometry(newModelPoint); } }
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); } }
/// <summary> /// 加载直升机骨骼动画 /// </summary> private void LoadXFilePlane() { 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 = datasetCRS; // 设置位置 IMatrix matrix = new Matrix(); matrix.MakeIdentity(); v3.Set(planeX, planeY, planeZ); matrix.SetTranslate(v3); mp.FromMatrix(matrix); // 创建骨骼动画 skinMeshPlane = CommonUnity.RenderHelper.ObjectManager.CreateSkinnedMesh(mp, rootId); if (skinMeshPlane == null) { MessageBox.Show("骨骼动画创建失败!"); return; } skinMeshPlane.Loop = true; skinMeshPlane.Play(); skinMeshPlane.MaxVisibleDistance = 1000; } }
/// <summary> /// 加载人物骨骼动画 /// </summary> private void LoadXFileCharacter() { string fileName = (strMediaPath + @"\x\Character\QiYeYuanGong.X"); if (skinMeshCharacter == null) { // 构造ModelPoint IGeometryFactory gf = new GeometryFactory(); IModelPoint mp = gf.CreateGeometry(gviGeometryType.gviGeometryModelPoint, gviVertexAttribute.gviVertexAttributeZ) as IModelPoint; mp.ModelName = fileName; mp.SpatialCRS = datasetCRS; // 设置位置 IMatrix matrix = new Matrix(); matrix.MakeIdentity(); v3.Set(gugeX, gugeY, gugeZ); matrix.SetTranslate(v3); mp.FromMatrix(matrix); // 创建骨骼动画 skinMeshCharacter = CommonUnity.RenderHelper.ObjectManager.CreateSkinnedMesh(mp, rootId); if (skinMeshCharacter == null) { MessageBox.Show("骨骼动画创建失败!"); return; } skinMeshCharacter.Duration = 1; //人物的那个骨骼动画播放速度调快一倍 skinMeshCharacter.Loop = true; skinMeshCharacter.Play(); skinMeshCharacter.MaxVisibleDistance = 1000; } }
private void LoadPeople(IDynamicObject dynamicObject) { if (skinMesh == null) { // 构造ModelPoint mp = geoFac.CreateGeometry(gviGeometryType.gviGeometryModelPoint, gviVertexAttribute.gviVertexAttributeZ) as IModelPoint; string modelName = (strMediaPath + @"\x\Character\QiYeYuanGong.X"); mp.ModelName = modelName; mp.SpatialCRS = dataset_Road.SpatialReference; // 设置位置 IMatrix matrix = new Matrix(); matrix.MakeIdentity(); IPoint startPoint = null; double speed = 0.0; dynamicObject.GetWaypoint2(0, out startPoint, out speed); matrix.SetTranslate(startPoint.Position); mp.FromMatrix(matrix); mp.SelfScale(5, 5, 5); // 创建骨骼动画 skinMesh = this.axRenderControl1.ObjectManager.CreateSkinnedMesh(mp, rootId); if (skinMesh == null) { MessageBox.Show("骨骼动画创建失败!"); return; } skinMesh.Loop = true; skinMesh.Play(); skinMesh.MaxVisibleDistance = 10000; skinMesh.ViewingDistance = 100; // 绑定到运动路径 IMotionable m = skinMesh as IMotionable; pos.Set(0, 0, 0); m.Bind2(dynamicObject, pos, 0, 0, 0); } }
private void LoadCar(IDynamicObject dynamicObject) { if (renderModelPoint == null) { // 构造ModelPoint mp = geoFac.CreateGeometry(gviGeometryType.gviGeometryModelPoint, gviVertexAttribute.gviVertexAttributeZ) as IModelPoint; string modelName = (strMediaPath + @"\osg\Vehicles\Car\TCJ006.osg"); mp.ModelName = modelName; mp.SpatialCRS = dataset_Road.SpatialReference; // 设置位置 IMatrix matrix = new Matrix(); matrix.MakeIdentity(); IPoint startPoint = null; double speed = 0.0; dynamicObject.GetWaypoint2(0, out startPoint, out speed); matrix.SetTranslate(startPoint.Position); mp.FromMatrix(matrix); mp.SelfScale(0.05, 0.05, 0.05); // 创建骨骼动画 renderModelPoint = this.axRenderControl1.ObjectManager.CreateRenderModelPoint(mp, null, rootId); renderModelPoint.MaxVisibleDistance = 10000; renderModelPoint.ViewingDistance = 200; // 绑定到运动路径 IMotionable m = renderModelPoint as IMotionable; pos.Set(0, 0, 0); m.Bind2(dynamicObject, pos, 90, 0, 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); } }
/// <summary> /// 加载动态树骨骼动画 /// </summary> private void LoadXFileTrees() { { string fileName = (strMediaPath + @"\x\Trees\tree.X"); if (skinMeshTree == null) { // 构造ModelPoint IGeometryFactory gf = new GeometryFactory(); IModelPoint mp = gf.CreateGeometry(gviGeometryType.gviGeometryModelPoint, gviVertexAttribute.gviVertexAttributeZ) as IModelPoint; mp.ModelName = fileName; mp.SpatialCRS = datasetCRS; // 设置位置 IMatrix matrix = new Matrix(); matrix.MakeIdentity(); v3.Set(treeX, treeY, treeZ); matrix.SetTranslate(v3); mp.FromMatrix(matrix); mp.SelfScale(0.75, 0.75, 0.75); // 创建骨骼动画 skinMeshTree = CommonUnity.RenderHelper.ObjectManager.CreateSkinnedMesh(mp, rootId); if (skinMeshTree == null) { MessageBox.Show("骨骼动画创建失败!"); return; } skinMeshTree.Duration = 4; skinMeshTree.Loop = true; skinMeshTree.Play(); skinMeshTree.MaxVisibleDistance = 1000; } } { string fileName = (strMediaPath + @"\x\Trees\tree1.X"); if (skinMeshTree1 == null) { // 构造ModelPoint IGeometryFactory gf = new GeometryFactory(); IModelPoint mp = gf.CreateGeometry(gviGeometryType.gviGeometryModelPoint, gviVertexAttribute.gviVertexAttributeZ) as IModelPoint; mp.ModelName = fileName; mp.SpatialCRS = datasetCRS; // 设置位置 IMatrix matrix = new Matrix(); matrix.MakeIdentity(); v3.Set(tree1X, tree1Y, tree1Z); matrix.SetTranslate(v3); mp.FromMatrix(matrix); mp.SelfScale(0.5, 0.5, 0.5); // 创建骨骼动画 skinMeshTree1 = CommonUnity.RenderHelper.ObjectManager.CreateSkinnedMesh(mp, rootId); if (skinMeshTree == null) { MessageBox.Show("骨骼动画创建失败!"); return; } skinMeshTree1.Duration = 3; skinMeshTree1.Loop = true; skinMeshTree1.Play(); skinMeshTree1.MaxVisibleDistance = 1000; } } { string fileName = (strMediaPath + @"\x\Trees\tree2.X"); if (skinMeshTree2 == null) { // 构造ModelPoint IGeometryFactory gf = new GeometryFactory(); IModelPoint mp = gf.CreateGeometry(gviGeometryType.gviGeometryModelPoint, gviVertexAttribute.gviVertexAttributeZ) as IModelPoint; mp.ModelName = fileName; mp.SpatialCRS = datasetCRS; // 设置位置 IMatrix matrix = new Matrix(); matrix.MakeIdentity(); v3.Set(tree2X, tree2Y, tree2Z); matrix.SetTranslate(v3); mp.FromMatrix(matrix); mp.SelfScale(0.25, 0.25, 0.25); // 创建骨骼动画 skinMeshTree2 = CommonUnity.RenderHelper.ObjectManager.CreateSkinnedMesh(mp, rootId); if (skinMeshTree2 == null) { MessageBox.Show("骨骼动画创建失败!"); return; } skinMeshTree2.Loop = true; skinMeshTree2.Play(); skinMeshTree2.MaxVisibleDistance = 1000; } } }
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(string osgFile) { //try { FileInfo fInfo = new FileInfo(osgFile); string strFilePath = fInfo.DirectoryName; IObjectManager rm = this.axRenderControl1.ObjectManager; IGeometryFactory geoFactory = new GeometryFactory(); IResourceFactory symbolFac = new ResourceFactory(); //mc string modelName = fInfo.Name.Split('.')[0]; string osgFilePath = strFilePath + "\\" + modelName + ".osg"; IPropertySet Images = null; IModel model = null; IMatrix matrix = null; symbolFac.CreateModelAndImageFromFile(osgFilePath, out Images, out model, out matrix); if (model == null || model.GroupCount == 0) { return; } rm.AddModel(modelName, model); //tc int nCount = Images.Count; if (Images != null && nCount > 0) { string[] keys = Images.GetAllKeys(); foreach (string imgName in keys) { IImage img = Images.GetProperty(imgName) as IImage; if (img == null) { continue; } if (string.IsNullOrEmpty(imgName)) { continue; } rm.AddImage(imgName, img); } } //modelpoint IModelPoint modelPoint = null; modelPoint = (IModelPoint)geoFactory.CreateGeometry( gviGeometryType.gviGeometryModelPoint, gviVertexAttribute.gviVertexAttributeZ); modelPoint.FromMatrix(matrix); modelPoint.ModelName = modelName; modelPoint.SpatialCRS = (new CRSFactory()).CreateFromWKT(this.axRenderControl1.GetCurrentCrsWKT()) as ISpatialCRS; if (this.toolStripComboBoxOsgMode.SelectedIndex == 0) { rmp = this.axRenderControl1.ObjectManager.CreateRenderModelPoint(modelPoint, null, rootId); this.axRenderControl1.Camera.FlyToObject(rmp.Guid, gviActionCode.gviActionFlyTo); } else { modelPoint.X = 0.0; modelPoint.Y = 0.0; modelPoint.Z = 0.0; rmp = this.axRenderControl1.ObjectManager.CreateRenderModelPoint(modelPoint, null, rootId); rmp.MouseSelectMask = gviViewportMask.gviViewNone; //设置物体不可拾取,以免总是拾取到自身影响交互 IEulerAngle angle = new EulerAngle(); angle.Set(0, -50, 0); this.axRenderControl1.Camera.LookAt2(modelPoint, 200, angle); this.axRenderControl1.InteractMode = gviInteractMode.gviInteractEdit; this.axRenderControl1.ObjectEditor.StartEditRenderGeometry(rmp, gviGeoEditType.gviGeoEditCreator); } } //catch (System.Exception ex) //{ // if (ex.GetType().Name.Equals("UnauthorizedAccessException")) // MessageBox.Show("需要标准runtime授权"); // else // MessageBox.Show(ex.Message); //} }
private void MainForm_Load(object sender, System.EventArgs e) { if (_geoFactory == null) { _geoFactory = new GeometryFactory(); } if (_gc == null) { _gc = new GeometryConvertor(); } // 初始化RenderControl控件 IPropertySet ps = new PropertySet(); ps.SetProperty("RenderSystem", gviRenderSystem.gviRenderOpenGL); this.axRenderControl1.Initialize(true, ps); this.axRenderControl1.Camera.FlyTime = 1; rootId = this.axRenderControl1.ObjectManager.GetProjectTree().RootID; // 设置天空盒 if (System.IO.Directory.Exists(strMediaPath)) { string tmpSkyboxPath = strMediaPath + @"\skybox"; ISkyBox skybox = this.axRenderControl1.ObjectManager.GetSkyBox(0); skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageBack, tmpSkyboxPath + "\\1_BK.jpg"); skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageBottom, tmpSkyboxPath + "\\1_DN.jpg"); skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageFront, tmpSkyboxPath + "\\1_FR.jpg"); skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageLeft, tmpSkyboxPath + "\\1_LF.jpg"); skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageRight, tmpSkyboxPath + "\\1_RT.jpg"); skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageTop, tmpSkyboxPath + "\\1_UP.jpg"); } else { MessageBox.Show("请不要随意更改SDK目录名"); return; } #region 创建地面模型 Array imgNames = null; try { string osgPath = (strMediaPath + @"\mdb+osg\Ground\00650100agc4001.osg"); IResourceFactory resFac = new ResourceFactory(); IPropertySet imgs = new PropertySet(); resFac.CreateModelAndImageFromFile(osgPath, out imgs, out ModelSrc, out MatrixSrc); this.axRenderControl1.ObjectManager.AddModel("test", ModelSrc); string[] keys = imgs.GetAllKeys(); foreach (string imgName in keys) { IImage img = imgs.GetProperty(imgName) as IImage; this.axRenderControl1.ObjectManager.AddImage(imgName, img); } ModelPointSrc = _geoFactory.CreateGeometry(gviGeometryType.gviGeometryModelPoint, gviVertexAttribute.gviVertexAttributeZ) as IModelPoint; ModelPointSrc.ModelEnvelope = ModelSrc.Envelope; ModelPointSrc.FromMatrix(MatrixSrc); ModelPointSrc.ModelName = "test"; RenderModelPointSrc = this.axRenderControl1.ObjectManager.CreateRenderModelPoint(ModelPointSrc, null, rootId); this.axRenderControl1.Camera.FlyToObject(RenderModelPointSrc.Guid, gviActionCode.gviActionFlyTo); } catch (COMException ex) { System.Diagnostics.Trace.WriteLine(ex.Message); return; } #endregion _geoEditor = this.axRenderControl1.ObjectEditor; _multiPolygon = _geoFactory.CreateGeometry(gviGeometryType.gviGeometryMultiPolygon, gviVertexAttribute.gviVertexAttributeZ) as IMultiPolygon; { this.helpProvider1.SetShowHelp(this.axRenderControl1, true); this.helpProvider1.SetHelpString(this.axRenderControl1, ""); this.helpProvider1.HelpNamespace = "GeometryConvert3.html"; } }
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); } } }