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