private IModelPoint Polygon2ModelPoint(IPolygon polygon, out Gvitech.CityMaker.Resource.IModel gvModel) { if (polygon == null || !polygon.IsValid) { gvModel = null; return(null); } IVector3 vector = polygon.QueryNormal(); if (vector.Z < 0.0) { polygon.ExteriorRing.ReverseOrientation(); } IModelPoint result = null; IGeometryConvertor geometryConvertor = new GeometryConvertorClass(); ITriMesh triMesh = geometryConvertor.PolygonToTriMesh(polygon); if (triMesh != null) { IMultiTriMesh multiTriMesh = ((IGeometryFactory) new GeometryFactoryClass()).CreateGeometry(gviGeometryType.gviGeometryMultiTrimesh, polygon.VertexAttribute) as IMultiTriMesh; multiTriMesh.AddTriMesh(triMesh); bool flag = geometryConvertor.TriMeshToModelPoint(multiTriMesh, out gvModel, out result); if (flag && gvModel != null) { this.Model2Water(ref gvModel); } } else { result = null; gvModel = null; } return(result); }
public void Init(Form window) { m_Window = window; InitDevice(m_NumSamples); InitShaders(); m_TextureMgr = new SharpDXTextureMgr(this); m_TriMeshMgr = new SharpDXTriMeshMgr(this); var desc = new D3D11.BufferDescription(64, D3D11.ResourceUsage.Default, D3D11.BindFlags.ConstantBuffer, D3D11.CpuAccessFlags.None, D3D11.ResourceOptionFlags.None, 0); var o = Matrix4x4.Identity(); m_ShaderParams = D3D11.Buffer.Create(Device, ref o, desc); m_DeviceContext.VertexShader.SetConstantBuffer(0, m_ShaderParams); m_Quad = m_TriMeshMgr.CreateQuad(2.0f, 2.0f); }
public void DrawTriMesh(ITriMesh triMesh, Matrix4x4 transform) { var context = Device.ImmediateContext; var inputAssembler = context.InputAssembler; var indexBuffer = ((SharpDXTriMesh)triMesh).IndexBuffer; var vertexBuffer = ((SharpDXTriMesh)triMesh).VertexBuffer; inputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; inputAssembler.SetIndexBuffer(indexBuffer, Format.R32_UInt, 0); inputAssembler.SetVertexBuffers(0, new D3D11.VertexBufferBinding(vertexBuffer, Marshal.SizeOf <Vertex>(), 0)); context.UpdateSubresource(ref transform, m_ShaderParams); if (m_PixelShader.HasTextures) { m_DeviceContext.PixelShader.SetShaderResources(0, m_PixelShader.GetShaderResources()); } context.DrawIndexed(triMesh.NumTris, 0, 0); }
private void btnConstructMultiTriMesh_Click(object sender, EventArgs e) { try { if (gfactory == null) gfactory = new GeometryFactory(); multiTriMesh = gfactory.CreateGeometry(gviGeometryType.gviGeometryMultiTrimesh, gviVertexAttribute.gviVertexAttributeZ) as IMultiTriMesh; if (multiTriMesh == null) return; triMesh = gfactory.CreateGeometry(gviGeometryType.gviGeometryTriMesh, gviVertexAttribute.gviVertexAttributeZ) as ITriMesh; if (triMesh == null) return; ArrayList vertices = new ArrayList(); //ITopoNode数组 point = gfactory.CreatePoint(gviVertexAttribute.gviVertexAttributeZ); for (int i = 0; i < 17; ++i) { point.SetCoords(i, i, i, 0, 0); vertices.Add(triMesh.AddPoint(point)); } triMesh.AddTriangle(vertices[0] as ITopoNode, vertices[1] as ITopoNode, vertices[2] as ITopoNode); triMesh.AddTriangle(vertices[2] as ITopoNode, vertices[1] as ITopoNode, vertices[3] as ITopoNode); triMesh.AddTriangle(vertices[3] as ITopoNode, vertices[1] as ITopoNode, vertices[4] as ITopoNode); triMesh.AddTriangle(vertices[3] as ITopoNode, vertices[4] as ITopoNode, vertices[5] as ITopoNode); triMesh.AddTriangle(vertices[5] as ITopoNode, vertices[4] as ITopoNode, vertices[6] as ITopoNode); triMesh.AddTriangle(vertices[5] as ITopoNode, vertices[6] as ITopoNode, vertices[7] as ITopoNode); triMesh.AddTriangle(vertices[7] as ITopoNode, vertices[6] as ITopoNode, vertices[8] as ITopoNode); triMesh.AddTriangle(vertices[7] as ITopoNode, vertices[8] as ITopoNode, vertices[9] as ITopoNode); triMesh.AddTriangle(vertices[7] as ITopoNode, vertices[9] as ITopoNode, vertices[10] as ITopoNode); triMesh.AddTriangle(vertices[10] as ITopoNode, vertices[9] as ITopoNode, vertices[11] as ITopoNode); triMesh.AddTriangle(vertices[10] as ITopoNode, vertices[11] as ITopoNode, vertices[12] as ITopoNode); triMesh.AddTriangle(vertices[13] as ITopoNode, vertices[10] as ITopoNode, vertices[12] as ITopoNode); triMesh.AddTriangle(vertices[13] as ITopoNode, vertices[14] as ITopoNode, vertices[10] as ITopoNode); triMesh.AddTriangle(vertices[13] as ITopoNode, vertices[15] as ITopoNode, vertices[14] as ITopoNode); triMesh.AddTriangle(vertices[15] as ITopoNode, vertices[16] as ITopoNode, vertices[14] as ITopoNode); triMesh.AddTriangle(vertices[16] as ITopoNode, vertices[5] as ITopoNode, vertices[14] as ITopoNode); triMesh.AddTriangle(vertices[3] as ITopoNode, vertices[5] as ITopoNode, vertices[16] as ITopoNode); triMesh.AddTriangle(vertices[2] as ITopoNode, vertices[3] as ITopoNode, vertices[16] as ITopoNode); multiTriMesh.AddGeometry(triMesh); MultiSurface geo = new MultiSurface(); // Geometry属性 geo.Dimension = multiTriMesh.Dimension; if (multiTriMesh.Envelope != null) { geo.MaxX = multiTriMesh.Envelope.MaxX; geo.MaxY = multiTriMesh.Envelope.MaxY; geo.MaxZ = multiTriMesh.Envelope.MaxZ; geo.MinX = multiTriMesh.Envelope.MinX; geo.MinY = multiTriMesh.Envelope.MinY; geo.MinZ = multiTriMesh.Envelope.MinZ; } geo.GeometryType = multiTriMesh.GeometryType; geo.IsEmpty = multiTriMesh.IsEmpty; geo.IsValid = multiTriMesh.IsValid; geo.VertexAttribute = multiTriMesh.VertexAttribute; geo.HasId = multiTriMesh.HasId(); geo.HasM = multiTriMesh.HasM(); geo.HasZ = multiTriMesh.HasZ(); // GeometryCollection属性 geo.GeometryCount = multiTriMesh.GeometryCount; geo.IsOverlap = multiTriMesh.IsOverlap; // MultiSurface属性 geo.Area = multiTriMesh.GetArea(); this.propertyGrid1.SelectedObject = geo; } catch (System.Exception ex) { System.Diagnostics.Trace.WriteLine(ex.Message); } }
private void btnConstructTriMesh_Click(object sender, EventArgs e) { if (gfactory == null) gfactory = new GeometryFactory(); triMesh = gfactory.CreateGeometry(gviGeometryType.gviGeometryTriMesh, gviVertexAttribute.gviVertexAttributeZ) as ITriMesh; if (triMesh == null) return; ArrayList vertices = new ArrayList(); //ITopoNode数组 point = gfactory.CreatePoint(gviVertexAttribute.gviVertexAttributeZ); for (int i = 0; i < 17; ++i) { point.SetCoords(i, i, i, 0, 0); vertices.Add(triMesh.AddPoint(point)); } point.SetCoords(100, 100, 100, 0, 0); triMesh.AddPoint(point); ArrayList facets = new ArrayList(); //ITopoFacet数组 facets.Add(triMesh.AddTriangle(vertices[0] as ITopoNode, vertices[1] as ITopoNode, vertices[2] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[2] as ITopoNode, vertices[1] as ITopoNode, vertices[3] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[3] as ITopoNode, vertices[1] as ITopoNode, vertices[4] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[3] as ITopoNode, vertices[4] as ITopoNode, vertices[5] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[5] as ITopoNode, vertices[4] as ITopoNode, vertices[6] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[5] as ITopoNode, vertices[6] as ITopoNode, vertices[7] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[7] as ITopoNode, vertices[6] as ITopoNode, vertices[8] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[7] as ITopoNode, vertices[8] as ITopoNode, vertices[9] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[7] as ITopoNode, vertices[9] as ITopoNode, vertices[10] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[10] as ITopoNode, vertices[9] as ITopoNode, vertices[11] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[10] as ITopoNode, vertices[11] as ITopoNode, vertices[12] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[13] as ITopoNode, vertices[10] as ITopoNode, vertices[12] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[13] as ITopoNode, vertices[14] as ITopoNode, vertices[10] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[13] as ITopoNode, vertices[15] as ITopoNode, vertices[14] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[15] as ITopoNode, vertices[16] as ITopoNode, vertices[14] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[16] as ITopoNode, vertices[5] as ITopoNode, vertices[14] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[3] as ITopoNode, vertices[5] as ITopoNode, vertices[16] as ITopoNode)); facets.Add(triMesh.AddTriangle(vertices[2] as ITopoNode, vertices[3] as ITopoNode, vertices[16] as ITopoNode)); TriMesh geo = new TriMesh(); // Geometry属性 geo.Dimension = triMesh.Dimension; if (triMesh.Envelope != null) { geo.MaxX = triMesh.Envelope.MaxX; geo.MaxY = triMesh.Envelope.MaxY; geo.MaxZ = triMesh.Envelope.MaxZ; geo.MinX = triMesh.Envelope.MinX; geo.MinY = triMesh.Envelope.MinY; geo.MinZ = triMesh.Envelope.MinZ; } geo.GeometryType = triMesh.GeometryType; geo.IsEmpty = triMesh.IsEmpty; geo.IsValid = triMesh.IsValid; geo.VertexAttribute = triMesh.VertexAttribute; geo.HasId = triMesh.HasId(); geo.HasM = triMesh.HasM(); geo.HasZ = triMesh.HasZ(); // Surface属性 if (triMesh.Centroid != null) { geo.CentroidX = triMesh.Centroid.X; geo.CentroidY = triMesh.Centroid.Y; geo.CentroidZ = triMesh.Centroid.Z; } geo.IsClosed = triMesh.IsClosed; if (triMesh.PointOnSurface != null) { geo.PointOnSurfaceX = triMesh.PointOnSurface.X; geo.PointOnSurfaceY = triMesh.PointOnSurface.Y; geo.PointOnSurfaceZ = triMesh.PointOnSurface.Z; } // TriMesh属性 geo.DirectedEdgeCount = triMesh.DirectedEdgeCount; geo.FacetCount = triMesh.FacetCount; geo.VertexCount = triMesh.VertexCount; this.propertyGrid1.SelectedObject = geo; }
public static bool ConvertPolygon(double[] vtx, double height, int flag, out IDoubleArray VArray, out IUInt16Array IndexArray, out IFloatArray TextureArrayU1V1, out IDoubleArray Norms) { bool flag2; VArray = new DoubleArrayClass(); IndexArray = new UInt16ArrayClass(); TextureArrayU1V1 = new FloatArrayClass(); IFloatArray array = null; Norms = new DoubleArrayClass(); IPolygon polygon = null; ITriMesh o = null; try { if (((vtx == null) || ((vtx.Length % 2) != 0)) || (vtx.Length < 8)) { return(false); } polygon = geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ) as IPolygon; if (polygon == null) { return(false); } int num = vtx.Length / 2; for (int i = 0; i < num; i++) { IPoint pointValue = geoFactory.CreatePoint(gviVertexAttribute.gviVertexAttributeZ); if (flag == 1) { pointValue.X = vtx[i * 2]; pointValue.Y = vtx[(i * 2) + 1]; pointValue.Z = height; } else { pointValue.X = vtx[((num - i) - 1) * 2]; pointValue.Y = vtx[(((num - i) - 1) * 2) + 1]; pointValue.Z = height; } polygon.ExteriorRing.AppendPoint(pointValue); } if (!polygon.IsClosed) { polygon.Close(); } o = geoConvertor.PolygonToTriMesh(polygon); if (o == null) { return(false); } if (!o.BatchExport(ref VArray, ref IndexArray, ref TextureArrayU1V1, ref array, ref Norms)) { return(false); } flag2 = true; } catch (Exception) { flag2 = false; } finally { if (polygon != null) { Marshal.ReleaseComObject(polygon); } if (o != null) { Marshal.ReleaseComObject(o); } } return(flag2); }
void axRenderControl1_RcMouseClickSelect(IPickResult PickResult, IPoint IntersectPoint, gviModKeyMask Mask, gviMouseSelectMode EventSender) { try { this.axRenderControl1.FeatureManager.UnhighlightAll(); if (PickResult != null) { if (PickResult.Type == gviObjectType.gviObjectFeatureLayer) { IFeatureLayerPickResult flpr = PickResult as IFeatureLayerPickResult; int fid = flpr.FeatureId; this.axRenderControl1.FeatureManager.HighlightFeature(_featureClass, fid, System.Drawing.Color.Yellow); ////////////////////////////////////////////////////////////////////////// // // GeometryConvert的代码添加在这里 // ////////////////////////////////////////////////////////////////////////// fidList.Clear(); fidList.Add(fid); IRowBuffer rowGC = _featureClass.GetRow(fidList[0]); int nPose = rowGC.FieldIndex("Geometry"); if (nPose == -1) { MessageBox.Show("不存在Geometry列"); return; } // 获取ModelPoint IModelPoint modelPointGC = null; if (rowGC != null) { nPose = rowGC.FieldIndex("Geometry"); IGeometry geo = rowGC.GetValue(nPose) as IGeometry; if (geo.GeometryType == gviGeometryType.gviGeometryModelPoint) { modelPointGC = geo as IModelPoint; } } this.Text = "拾取成功"; // 获取Model string modelName = modelPointGC.ModelName; IModel modelGC = (_featureClass.FeatureDataSet as IResourceManager).GetModel(modelName); // 1、获取MultiTriMesh IGeometryConvertor gc = new GeometryConvertor(); IMultiTriMesh multiTM = gc.ModelPointToTriMesh(modelGC, modelPointGC, false); this.Text = "ModelToTriMesh完成"; if (this.cbCreateRenderTriMesh.Checked) { // 创建RenderTriMesh在三维上显示 for (int i = 0; i < multiTM.GeometryCount; i++) { ITriMesh tm = multiTM.GetGeometry(i) as ITriMesh; IRenderTriMesh rtm = this.axRenderControl1.ObjectManager.CreateRenderTriMesh(tm, null, rootId); //随机颜色填充TriMesh Random randObj = new Random(i); int aColor = randObj.Next(0, 255); int gColor = randObj.Next(0, 255); int rColor = randObj.Next(0, 255); ISurfaceSymbol ss = new SurfaceSymbol(); ss.Color = System.Drawing.Color.FromArgb(rColor, gColor, aColor); rtm.Symbol = ss; rTMeshList.Add(rtm); } } if (this.cbCreateRenderPolygon.Checked) { // 2、获取投影MultiPolygon IMultiPolygon multiPolygon = gc.ProjectTriMeshToPolygon(multiTM, 1.0); this.Text = "MultiTriMeshToFootprint完成。面积:" + multiPolygon.GetArea(); // 创建RenderPolygon在三维上显示 for (int i = 0; i < multiPolygon.GeometryCount; i++) { IPolygon polygon = multiPolygon.GetGeometry(i) as IPolygon; IRenderPolygon rpolygon = this.axRenderControl1.ObjectManager.CreateRenderPolygon(polygon, null, rootId); rPolygonList.Add(rpolygon); } } if (this.cbCreateRenderPolygon2.Checked) { // 3、获取切割MultiPolygon double heightSpec = 0.0, heightIntersect = 0.0; Double.TryParse(IntersectPoint.Z.ToString(), out heightIntersect); fidList.Clear(); fidList.Add(fid); IEnvelope box = _featureClass.GetFeaturesEnvelope(fidList.ToArray(), "Geometry"); heightSpec = System.Math.Abs(heightIntersect - box.MinZ); // 注意:CutTriMeshToPolygon方法的第三个参数为空间分辨率,应该选择合适值。 // 值过大会导致结果不精确,值过小会导致转换时间过长。使用时应设置大小合适的值来平衡精度和效率问题。 IMultiPolygon multiPolygon2 = gc.CutTriMeshToPolygon(multiTM, heightSpec, 0.5); this.Text = "MultiTriMeshToFootprint2完成。面积:" + multiPolygon2.GetArea(); // 创建RenderPolygon在三维上显示 for (int i = 0; i < multiPolygon2.GeometryCount; i++) { IPolygon polygon2 = multiPolygon2.GetGeometry(i) as IPolygon; IRenderPolygon rpolygon2 = this.axRenderControl1.ObjectManager.CreateRenderPolygon(polygon2, null, rootId); rPolygonList2.Add(rpolygon2); } } if (this.cbCreateRenderMulPoint.Checked) { // 4、获取MultiPoint IMultiPoint multiPoint = gc.MultiTriMeshToMultiPoint(multiTM, 3.0); this.Text = "MultiTriMeshToMultiPoint完成。MultiPoint个数为:" + multiPoint.GeometryCount; //创建RenderPoint在三维上显示 IRenderMultiPoint rpoint = this.axRenderControl1.ObjectManager.CreateRenderMultiPoint(multiPoint, null, rootId); rPointList.Add(rpoint); } } } } catch (System.Exception ex) { if (ex.GetType().Name.Equals("UnauthorizedAccessException")) { MessageBox.Show("需要标准runtime授权"); } else { MessageBox.Show(ex.Message); } } }
void axRenderControl1_RcObjectEditFinish() { this.axRenderControl1.InteractMode = gviInteractMode.gviInteractNormal; polygonDraw = currentGeometry as IPolygon; //抬高一点 for (int i = 0; i < polygonDraw.ExteriorRing.PointCount; i++) { IPoint pointOnExr = polygonDraw.ExteriorRing.GetPoint(i).Clone() as IPoint; pointOnExr.Z += 1; polygonDraw.ExteriorRing.UpdatePoint(i, pointOnExr); } renderpolygonDraw.SetFdeGeometry(polygonDraw); renderpolygonDraw.VisibleMask = gviViewportMask.gviViewNone; double height = 0.0; try { height = double.Parse(this.numHeight.Value.ToString()); } catch (System.Exception ex) { MessageBox.Show("请检查挖洞高度"); return; } //构造底面polygon IPolygon polygonBottom = geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ) as IPolygon; for (int i = 0; i < polygonDraw.ExteriorRing.PointCount; i++) { IPoint pointOnExr = polygonDraw.ExteriorRing.GetPoint(i).Clone() as IPoint; maxZ = pointOnExr.Z; pointOnExr.Z -= height; minZ = pointOnExr.Z; polygonBottom.ExteriorRing.AppendPoint(pointOnExr); } polygonBottom.Close(); PolygonList.Add(polygonBottom); //CreateRenderPolygon(polygonBottom); //构造侧面polygon for (int i = 0; i < polygonDraw.ExteriorRing.PointCount; i++) { IPoint pointOnExr = polygonDraw.ExteriorRing.GetPoint(i).Clone() as IPoint; pointOnExr.Z -= height; IPoint pointOnExr2 = null; if (i == polygonDraw.ExteriorRing.PointCount - 1) { pointOnExr2 = polygonDraw.ExteriorRing.GetPoint(0).Clone() as IPoint; } else { pointOnExr2 = polygonDraw.ExteriorRing.GetPoint(i + 1).Clone() as IPoint; } pointOnExr2.Z -= height; IPolygon polygonTemp = geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ) as IPolygon; polygonTemp.ExteriorRing.AppendPoint(polygonDraw.ExteriorRing.GetPoint(i)); polygonTemp.ExteriorRing.AppendPoint(pointOnExr); polygonTemp.ExteriorRing.AppendPoint(pointOnExr2); if (i == polygonDraw.ExteriorRing.PointCount - 1) { polygonTemp.ExteriorRing.AppendPoint(polygonDraw.ExteriorRing.GetPoint(0)); } else { polygonTemp.ExteriorRing.AppendPoint(polygonDraw.ExteriorRing.GetPoint(i + 1)); } polygonTemp.Close(); PolygonList.Add(polygonTemp); //CreateRenderPolygon(polygonTemp); } List <IRowBuffer> list = new List <IRowBuffer>(); ISpatialFilter filter = new SpatialFilter(); filter.Geometry = polygonDraw; filter.SpatialRel = gviSpatialRel.gviSpatialRelEnvelope; filter.GeometryField = "Geometry"; IRowBuffer row = null; IFdeCursor cursor = __fc.Search(filter, false); while ((row = cursor.NextRow()) != null) { list.Add(row); } foreach (IRowBuffer r in list) { __fid = (Int32)r.GetValue(0); int geometryIndex = -1; geometryIndex = r.FieldIndex("Geometry"); int nameIndex = -1; nameIndex = r.FieldIndex("Name"); if (geometryIndex != -1) { // 获取ModelPoint IModelPoint mp = r.GetValue(geometryIndex) as IModelPoint; // 获取Model string modelName = mp.ModelName; IModel m = (__fc.FeatureDataSet as IResourceManager).GetModel(modelName); Logger.WriteMsg(LogLevel.Message, "---------开始ModelPointToTriMesh----------", DateTime.Now); // 获取MultiTriMesh IMultiTriMesh multiTM = gc.ModelPointToTriMesh(m, mp, false); Logger.WriteMsg(LogLevel.Message, string.Format("---------完成ModelPointToTriMesh:{0}----------", multiTM.GeometryCount), DateTime.Now); // 获取Name string strName = r.GetValue(nameIndex).ToString(); for (int i = 0; i < multiTM.GeometryCount; i++) { ITriMesh tm = multiTM.GetGeometry(i) as ITriMesh; //if (!tm.IsClosed) // continue; // 生成剖面 for (int p = 0; p < PolygonList.Count; p++) { IPolygon curPolygon = PolygonList[p]; Logger.WriteMsg(LogLevel.Message, string.Format("TM:{0} PG:{1}", i, p), DateTime.Now); if (gc.GetSolidProfile(tm, curPolygon, out multiPolygon)) { Logger.WriteMsg(LogLevel.Message, string.Format("TM:{0} PG:{1} TRUE", i, p), DateTime.Now); if (multiPolygon != null && multiPolygon.GeometryCount > 0) { for (int j = 0; j < multiPolygon.GeometryCount; j++) { IPolygon tm2 = multiPolygon.GetGeometry(j) as IPolygon; //RenderPolygonList.Add(CreateRenderPolygon(tm2)); ICurveSymbol cs = new CurveSymbol(); cs.Color = Color.FromArgb(0, Color.White); ISurfaceSymbol ss = new SurfaceSymbol(); ss.BoundarySymbol = cs; ss.Color = m.GetGroup(0).GetPrimitive(0).Material.DiffuseColor; IRenderPolygon tmPolygon = this.axRenderControl1.ObjectManager.CreateRenderPolygon(tm2, ss, rootId); tmPolygon.SetClientData("Name", strName); RenderPolygonList.Add(tmPolygon); #region 用当前选中的模型材质,生成截面模型 /* * IModel outModel = null; * IModelPoint outMP = null; * gc.PolygonToModelPoint(tm2, out outModel, out outMP); * * if (outModel != null && outMP != null) * { * * IDrawGroup dgroup = outModel.GetGroup(0); * IDrawPrimitive dpri = dgroup.GetPrimitive(0); * IDrawMaterial dmar = dpri.Material; * dmar.CullMode = gviCullFaceMode.gviCullNone; * * //处理贴图 * //IPropertySet psOut = new PropertySet(); * string imgName = m.GetGroup(0).GetPrimitive(0).Material.TextureName; * if (imgName != "") * { * dmar.WrapModeS = gviTextureWrapMode.gviTextureWrapRepeat; * dmar.WrapModeT = gviTextureWrapMode.gviTextureWrapRepeat; * * //string tmpImgPath = (strMediaPath + @"\1\") + imgName + ".dds"; * //IImage imageOut = (__fc.FeatureDataSet as IResourceManager).GetImage(imgName); * //imageOut.WriteFile(tmpImgPath); * //psOut.SetProperty(imgName, imageOut); * //dmar.TextureName = imgName; * * IImage image = (__fc.FeatureDataSet as IResourceManager).GetImage(imgName); * this.axRenderControl1.ObjectManager.AddImage(imgName, image); * dmar.TextureName = imgName; * * if (dpri.VertexArray.Length == 12) * { * IFloatArray texcoords = new FloatArray(); * texcoords.Append(0); * texcoords.Append(0); * texcoords.Append(1.0f); * texcoords.Append(0); * texcoords.Append(1.0f); * texcoords.Append(1.0f); * texcoords.Append(0); * texcoords.Append(1.0f); * dpri.TexcoordArray = texcoords; * } * else * { * IFloatArray texcoords = new FloatArray(); * texcoords.Append(0); * texcoords.Append(0); * for (int v = 3; v < dpri.VertexArray.Length - 2; ) * { * texcoords.Append(Math.Abs(dpri.VertexArray.Get(v) - dpri.VertexArray.Get(0))); * texcoords.Append(Math.Abs(dpri.VertexArray.Get(v+2) - dpri.VertexArray.Get(2))); * v += 3; * } * dpri.TexcoordArray = texcoords; * } * } * else * { * dmar.DepthBias = m.GetGroup(0).GetPrimitive(0).Material.DepthBias; * dmar.DiffuseColor = m.GetGroup(0).GetPrimitive(0).Material.DiffuseColor; * dmar.EnableBlend = m.GetGroup(0).GetPrimitive(0).Material.EnableBlend; * dmar.EnableLight = m.GetGroup(0).GetPrimitive(0).Material.EnableLight; * dmar.SpecularColor = m.GetGroup(0).GetPrimitive(0).Material.SpecularColor; * dmar.WrapModeS = m.GetGroup(0).GetPrimitive(0).Material.WrapModeS; * dmar.WrapModeT = m.GetGroup(0).GetPrimitive(0).Material.WrapModeT; * } * * dpri.Material = dmar; * dgroup.SetPrimitive(0, dpri); * outModel.SetGroup(0, dgroup); * * //处理模型 * //string osgNameOut = __fid + "_" + p + "_" + j; * //string tmpOSGPath = (strMediaPath + @"\1\" + osgNameOut + ".osg"); * //outModel.WriteFile(tmpOSGPath, psOut); * //outMP.ModelName = tmpOSGPath; * * * string osgName = __fid + "_" + p + "_" + j; * this.axRenderControl1.ObjectManager.AddModel(osgName, outModel); * outMP.ModelName = osgName; * * //可视化 * outMP.ModelEnvelope = outModel.Envelope; * IRenderModelPoint outRenderMP = this.axRenderControl1.ObjectManager.CreateRenderModelPoint(outMP, null, rootId); * //this.axRenderControl1.RefreshModel(null, tmpOSGPath); * outRenderMP.ShowOutline = true; * //outRenderMP.VisibleMask = gviViewportMask.gviViewNone; * RenderMPProfileList.Add(outRenderMP); * } */ #endregion } } } } //遍历PolygonList结束 } //遍历multiTM结束 //去掉内环模型 __fl.VisibleMask = gviViewportMask.gviViewNone; IModel modelInterior = null; IModelPoint mpInterior = null; IRenderModelPoint rmpInterior = null; IModel modelExterior = null; IModelPoint mpExterior = null; IRenderModelPoint rmpExterior = null; IMultiPolygon mltiPolygon = geoFactory.CreateGeometry(gviGeometryType.gviGeometryMultiPolygon, gviVertexAttribute.gviVertexAttributeZ) as IMultiPolygon; mltiPolygon.AddGeometry(polygonDraw); Logger.WriteMsg(LogLevel.Message, "---------开始SplitModelPointByPolygon2DWithZ----------", DateTime.Now); if (gc.SplitModelPointByPolygon2DWithZ(mltiPolygon, m, mp, minZ, maxZ, out modelInterior, out mpInterior, out modelExterior, out mpExterior)) { Logger.WriteMsg(LogLevel.Message, "SplitModelPointByPolygon2DWithZ返回值为TRUE", DateTime.Now); if (modelExterior != null && mpExterior != null) { this.axRenderControl1.ObjectManager.AddModel(mpExterior.ModelName, modelExterior); string[] imagenames = modelExterior.GetImageNames(); for (int q = 0; q < imagenames.Length; q++) { IImage image = (__fc.FeatureDataSet as IResourceManager).GetImage(imagenames[q]); this.axRenderControl1.ObjectManager.AddImage(imagenames[q], image); } rmpExterior = this.axRenderControl1.ObjectManager.CreateRenderModelPoint(mpExterior, null, rootId); RenderMPExteriorList.Add(rmpExterior); } if (modelInterior != null && mpInterior != null) { this.axRenderControl1.ObjectManager.AddModel(mpInterior.ModelName, modelInterior); string[] imagenames = modelInterior.GetImageNames(); for (int q = 0; q < imagenames.Length; q++) { IImage image = (__fc.FeatureDataSet as IResourceManager).GetImage(imagenames[q]); this.axRenderControl1.ObjectManager.AddImage(imagenames[q], image); } rmpInterior = this.axRenderControl1.ObjectManager.CreateRenderModelPoint(mpInterior, null, rootId); rmpInterior.VisibleMask = gviViewportMask.gviViewNone; RenderMPInteriorList.Add(rmpInterior); } } } }//遍历RowBufferList结束 //MessageBox.Show("执行成功"); }
public override bool Draw(out IModelPoint mp, out IModel fmodel, out IModel smodel) { List <ushort> list2 = new List <ushort>(); IPolygon polygon = null; IPolygon polygon2 = null; IPolygon polygon3 = null; IPoint pointValue = null; ITriMesh mesh = null; IDoubleArray vArray = null; IUInt16Array indexArray = null; IFloatArray array3 = null; IFloatArray array4 = null; IDoubleArray norms = null; IDrawGroup group = null; IDrawPrimitive primitive = null; IDrawPrimitive primitive2 = null; IDrawPrimitive primitive3 = null; double naN = double.NaN; double ty = double.NaN; base.Draw(out mp, out fmodel, out smodel); try { int num; int num2; List <Vector> list; polygon = DrawGeometry.geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ) as IPolygon; polygon2 = DrawGeometry.geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ) as IPolygon; polygon3 = DrawGeometry.geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ) as IPolygon; if (this._route.Count > 2) { list = Maths.DisperseLine(this._route, this._pillarSection.Diameter); } else { list = this._route; } double[] vtxs = this._pillarSection.GetVtxs(); SystemLog.Instance.Log("顶点个数:" + vtxs.Length); double[] numArray = new double[list.Count]; for (num = 0; num < list.Count; num++) { if (num == 0) { numArray[num] = 0.0; } else { numArray[num] = (list[num] - list[num - 1]).Length + numArray[num - 1]; } } object renderInfo = (this._renderType == RenderType.Texture) ? ((object)this._tcNames) : ((object)this._colors); int[] index = new int[3]; index[1] = 1; index[2] = 2; if (!base.NewEmptyModel(index, this._renderType, renderInfo, out fmodel)) { return(false); } group = fmodel.GetGroup(0); SystemLog.Instance.Log("开始计算正交向量:" + DateTime.Now.ToLongTimeString()); primitive = group.GetPrimitive(0); for (num = 0; num < list.Count; num++) { Vector vector; Vector vector2; Vector vector3; if (num == 0) { vector = list[num + 1] - list[num]; } else if (num == (list.Count - 1)) { vector = list[num] - list[num - 1]; } else { vector = ((list[num] - list[num - 1])).UnitVector() + ((list[num + 1] - list[num])).UnitVector(); } Maths.GenerateComplementBasis(vector, out vector2, out vector3); vector2 = -vector2; num2 = 0; while (num2 <= this._pillarSection.SegCount) { Vector vector6; Vector vector7; (((vtxs[num2 * 2] - this._pillarSection.OffsetX) * vector2) + ((vtxs[(num2 * 2) + 1] - this._pillarSection.OffsetY) * vector3)).UnitVector(); Vector vector4 = list[num] + ((Vector)((vtxs[num2 * 2] * vector2) + (vtxs[(num2 * 2) + 1] * vector3))); Vector vector5 = (Vector)(vector4 * 1.01); if (num == 0) { pointValue = DrawGeometry.geoFactory.CreatePoint(gviVertexAttribute.gviVertexAttributeZ); pointValue.SetCoords(vector4.X, vector4.Y, vector4.Z, 0.0, 0); polygon.ExteriorRing.AppendPoint(pointValue); pointValue = DrawGeometry.geoFactory.CreatePoint(gviVertexAttribute.gviVertexAttributeZ); pointValue.SetCoords(vector5.X, vector5.Y, vector5.Z, 0.0, 0); polygon3.ExteriorRing.AppendPoint(pointValue); } else if (num == (list.Count - 1)) { pointValue = DrawGeometry.geoFactory.CreatePoint(gviVertexAttribute.gviVertexAttributeZ); pointValue.SetCoords(vector4.X, vector4.Y, vector4.Z, 0.0, 0); polygon2.ExteriorRing.AppendPoint(pointValue); } primitive.VertexArray.Append((float)vector4.X); primitive.VertexArray.Append((float)vector4.Y); primitive.VertexArray.Append((float)vector4.Z); list2.Add((ushort)((primitive.VertexArray.Length / 3) - 1)); primitive.VertexArray.Append((float)vector4.X); primitive.VertexArray.Append((float)vector4.Y); primitive.VertexArray.Append((float)vector4.Z); list2.Add((ushort)((primitive.VertexArray.Length / 3) - 1)); if (this._renderType == RenderType.Texture) { primitive.TexcoordArray.Append((float)(num2 * 1.0)); primitive.TexcoordArray.Append((float)(num * 1.0)); primitive.TexcoordArray.Append((float)(num2 * 1.0)); primitive.TexcoordArray.Append((float)(num * 1.0)); } if (num2 == 0) { vector6 = new Vector(vtxs[num2 * 2] - vtxs[(this._pillarSection.SegCount - 1) * 2], vtxs[(num2 * 2) + 1] - vtxs[((this._pillarSection.SegCount - 1) * 2) + 1], 0.0).UnitVector(); vector7 = new Vector(vtxs[(num2 + 1) * 2] - vtxs[num2 * 2], vtxs[((num2 + 1) * 2) + 1] - vtxs[(num2 * 2) + 1], 0.0).UnitVector(); } else if (num2 == this._pillarSection.SegCount) { vector6 = new Vector(vtxs[num2 * 2] - vtxs[(num2 - 1) * 2], vtxs[(num2 * 2) + 1] - vtxs[((num2 - 1) * 2) + 1], 0.0).UnitVector(); vector7 = new Vector(vtxs[2] - vtxs[num2 * 2], vtxs[3] - vtxs[(num2 * 2) + 1], 0.0).UnitVector(); } else { vector6 = new Vector(vtxs[num2 * 2] - vtxs[(num2 - 1) * 2], vtxs[(num2 * 2) + 1] - vtxs[((num2 - 1) * 2) + 1], 0.0).UnitVector(); vector7 = new Vector(vtxs[(num2 + 1) * 2] - vtxs[num2 * 2], vtxs[((num2 + 1) * 2) + 1] - vtxs[(num2 * 2) + 1], 0.0).UnitVector(); } Vector vector8 = new Vector(vector6.Y, -vector6.X, vector6.Z); primitive.NormalArray.Append((float)vector8.X); primitive.NormalArray.Append((float)vector8.Y); primitive.NormalArray.Append((float)vector8.Z); vector8 = new Vector(vector7.Y, -vector7.X, vector7.Z); primitive.NormalArray.Append((float)vector8.X); primitive.NormalArray.Append((float)vector8.Y); primitive.NormalArray.Append((float)vector8.Z); num2++; } } SystemLog.Instance.Log("结束计算正交向量:" + DateTime.Now.ToLongTimeString()); SystemLog.Instance.Log("开始添加索引数组:" + DateTime.Now.ToLongTimeString()); for (num = 0; num < (list.Count - 1); num++) { for (num2 = 0; num2 < this._pillarSection.SegCount; num2++) { primitive.IndexArray.Append(list2[((num * ((this._pillarSection.SegCount + 1) * 2)) + (num2 * 2)) + 1]); primitive.IndexArray.Append(list2[((num + 1) * ((this._pillarSection.SegCount + 1) * 2)) + ((num2 + 1) * 2)]); primitive.IndexArray.Append(list2[(((num + 1) * ((this._pillarSection.SegCount + 1) * 2)) + (num2 * 2)) + 1]); primitive.IndexArray.Append(list2[((num * ((this._pillarSection.SegCount + 1) * 2)) + (num2 * 2)) + 1]); primitive.IndexArray.Append(list2[(num * ((this._pillarSection.SegCount + 1) * 2)) + ((num2 + 1) * 2)]); primitive.IndexArray.Append(list2[((num + 1) * ((this._pillarSection.SegCount + 1) * 2)) + ((num2 + 1) * 2)]); } } SystemLog.Instance.Log("结束添加索引数组:" + DateTime.Now.ToLongTimeString()); SystemLog.Instance.Log("开始画底面顶面和线框:" + DateTime.Now.ToLongTimeString()); vArray = new DoubleArrayClass(); indexArray = new UInt16ArrayClass(); array3 = new FloatArrayClass(); norms = new DoubleArrayClass(); primitive2 = group.GetPrimitive(1); polygon.ExteriorRing.ReverseOrientation(); mesh = DrawGeometry.geoConvertor.PolygonToTriMesh(polygon); if ((mesh != null) && mesh.BatchExport(ref vArray, ref indexArray, ref array3, ref array4, ref norms)) { for (num = 0; num < vArray.Length; num++) { primitive2.VertexArray.Append((float)vArray.Array[num]); } for (num = 0; num < indexArray.Length; num++) { primitive2.IndexArray.Append(indexArray.Array[num]); } for (num = 0; num < norms.Length; num++) { primitive2.NormalArray.Append((float)norms.Array[num]); } if (this._renderType == RenderType.Texture) { for (num = 0; num < (vArray.Length / 3); num++) { this.GetTexcoord(vArray.Array[num * 3], vArray.Array[(num * 3) + 1], out naN, out ty); primitive2.TexcoordArray.Append((float)naN); primitive2.TexcoordArray.Append((float)ty); } } } vArray = new DoubleArrayClass(); indexArray = new UInt16ArrayClass(); array3 = new FloatArrayClass(); norms = new DoubleArrayClass(); primitive3 = group.GetPrimitive(2); mesh = DrawGeometry.geoConvertor.PolygonToTriMesh(polygon2); if ((mesh != null) && mesh.BatchExport(ref vArray, ref indexArray, ref array3, ref array4, ref norms)) { for (num = 0; num < vArray.Length; num++) { primitive3.VertexArray.Append((float)vArray.Array[num]); } for (num = 0; num < indexArray.Length; num++) { primitive3.IndexArray.Append(indexArray.Array[num]); } for (num = 0; num < norms.Length; num++) { primitive3.NormalArray.Append((float)norms.Array[num]); } if (this._renderType == RenderType.Texture) { for (num = 0; num < (vArray.Length / 3); num++) { this.GetTexcoord(vArray.Array[num * 3], vArray.Array[(num * 3) + 1], out naN, out ty); primitive3.TexcoordArray.Append((float)naN); primitive3.TexcoordArray.Append((float)ty); } } } SystemLog.Instance.Log("结束画底面顶面和线框:" + DateTime.Now.ToLongTimeString()); SystemLog.Instance.Log("结束调用Draw:" + DateTime.Now.ToLongTimeString()); return(true); } catch (Exception exception) { SystemLog.Instance.Log(exception); return(false); } }
void axRenderControl1_RcMouseClickSelect(IPickResult PickResult, IPoint IntersectPoint, gviModKeyMask Mask, gviMouseSelectMode EventSender) { try { if (PickResult != null) { if (PickResult.Type == gviObjectType.gviObjectFeatureLayer) { IFeatureLayerPickResult flpr = PickResult as IFeatureLayerPickResult; int fid = flpr.FeatureId; this.axRenderControl1.FeatureManager.HighlightFeature(_featureClass, fid, System.Drawing.Color.Yellow); ////////////////////////////////////////////////////////////////////////// // // GeometryConvert的代码添加在这里 // ////////////////////////////////////////////////////////////////////////// fidList.Clear(); fidList.Add(fid); IRowBuffer rowGC = _featureClass.GetRow(fidList[0]); int nPose = rowGC.FieldIndex("Geometry"); if (nPose == -1) { MessageBox.Show("不存在Geometry列"); return; } // 获取polygon IPolygon polygonGC = null; if (rowGC != null) { nPose = rowGC.FieldIndex("Geometry"); IGeometry geo = rowGC.GetValue(nPose) as IGeometry; if (geo.GeometryType == gviGeometryType.gviGeometryPolygon) { polygonGC = geo as IPolygon; } } this.Text = "拾取成功"; //第一个Tab页:ExtrudePolygonToModel if (this.tabControl1.SelectedIndex == 0) { // 1.调接口构造模型 IGeometryConvertor gc = new GeometryConvertor(); gviRoofType rooftype = gviRoofType.gviRoofFlat; switch (this.comboxRoofType.Text) { case "Flat": rooftype = gviRoofType.gviRoofFlat; break; case "Gable": rooftype = gviRoofType.gviRoofGable; break; case "Hip": rooftype = gviRoofType.gviRoofHip; break; } string imgPath = (strMediaPath + @"\dds"); string roof = this.comboBoxRoofTexture.Text; string facade = this.comboBoxFacadeTexture.Text; IModelPoint mp = null; IModel model = null; if (!gc.ExtrudePolygonToModel(polygonGC, int.Parse(this.numFloorNumber.Value.ToString()), double.Parse(this.numFloorHeight.Value.ToString()), double.Parse(this.numSlopeAngle.Value.ToString()), rooftype, facade, roof, out mp, out model)) { MessageBox.Show("拉体块出错!"); return; } //2、将模型及贴图写入osg文件 string modelName = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + ".osg");//输出osg文件路径 IResourceFactory resFactory = new ResourceFactory(); string[] imageNames = model.GetImageNames(); IPropertySet ps = new PropertySet(); for (int i = 0; i < imageNames.Length; i++) { string imgName = imageNames[i]; IImage img = resFactory.CreateImageFromFile(string.Format(@"{0}\{1}", imgPath + @"\facade", imgName)); if (img == null) { img = resFactory.CreateImageFromFile(string.Format(@"{0}\{1}", imgPath + @"\roof", imgName)); } ps.SetProperty(imgName, img); } model.WriteFile(modelName, ps); //3、测试显示模型 mp.ModelName = modelName; IRenderModelPoint rmp = this.axRenderControl1.ObjectManager.CreateRenderModelPoint(mp, null, rootId); rmp.MouseSelectMask = gviViewportMask.gviViewNone; rmp.MaxVisibleDistance = 100000; this.axRenderControl1.Camera.LookAtEnvelope(mp.Envelope);//飞入 mpList.Add(rmp); } //第二个tab页:ExtrudePolygonToTriMesh else { // 1.调接口构造模型 IGeometryConvertor gc = new GeometryConvertor(); ITriMesh tm = gc.ExtrudePolygonToTriMesh(polygonGC, double.Parse(this.numHeight.Value.ToString()), true); if (tm == null) { MessageBox.Show("拉体块出错!"); return; } //2、显示三角面 //---- 渲染样式不是必须的 ----- ISurfaceSymbol surfaceSym = new SurfaceSymbol(); surfaceSym.Color = System.Drawing.Color.Red; surfaceSym.EnableLight = true; ICurveSymbol curveSym = new CurveSymbol(); curveSym.Color = System.Drawing.Color.Yellow; curveSym.Width = 10; surfaceSym.BoundarySymbol = curveSym; //---- ------------------ ----- IRenderTriMesh rmp = this.axRenderControl1.ObjectManager.CreateRenderTriMesh(tm, surfaceSym, rootId); rmp.MouseSelectMask = gviViewportMask.gviViewNone; rmp.MaxVisibleDistance = 100000; this.axRenderControl1.Camera.LookAtEnvelope(rmp.Envelope);//飞入 tmList.Add(rmp); } } } } catch (System.Exception ex) { if (ex.GetType().Name.Equals("UnauthorizedAccessException")) { MessageBox.Show("需要标准runtime授权"); } else { MessageBox.Show(ex.Message); } } }