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); } }
// 架空 public bool GetPipeNodeParameterOver(int flag, out Vector[] vtxs, out Vector dir, out IPipeSection section, out int FLAG) { FLAG = -1; vtxs = null; dir = null; section = null; IPolyline polyline = null; if ((base._geoGroup[1] == null) || ((polyline = base._geoGroup[1] as IPolyline) == null)) { return(false); } if (polyline.PointCount < 2) { return(false); } ISegment seg = null; Vector vector = null; Vector vector2 = null; vtxs = new Vector[2]; section = new PipeSection(this._dia1, this._dia2, HorizontalPos.Center, this._vPos, 0.02, 0); if (flag == 0) { vector = new Vector(polyline.GetPoint(0)); vtxs[0] = vector; seg = polyline.GetSegment(0); if (Math.Abs(seg.EndPoint.Z - seg.StartPoint.Z) > 0.4) { FLAG = 1; } dir = new Vector(seg); dir = dir.UnitVector(); vector2 = vector + ((Vector)((dir * section.Diameter) / 2.0)); vtxs[1] = vector2; } else { vector = new Vector(polyline.GetPoint(polyline.PointCount - 1)); vtxs[0] = vector; seg = polyline.GetSegment(polyline.PointCount - 2); if (Math.Abs(seg.EndPoint.Z - seg.StartPoint.Z) > 0.4) { FLAG = 1; } dir = new Vector(seg); dir = (-dir).UnitVector(); vector2 = vector + ((Vector)((dir * section.Diameter) / 2.0)); vtxs[1] = vector2; } return(true); }
private double GetInterPointHeight(IPoint interPoint, IPolyline geoShape, IPolyline geo) { if (interPoint == null || geoShape == null || geoShape == null) { return(0.0); } if (geoShape.PointCount == 2) { return(geoShape.StartPoint.Z + (geoShape.EndPoint.Z - geoShape.StartPoint.Z) * Math.Sqrt((geo.StartPoint.X - interPoint.X) * (geo.StartPoint.X - interPoint.X) + (geo.StartPoint.Y - interPoint.Y) * (geo.StartPoint.Y - interPoint.Y)) / geo.Length); } for (int i = 0; i < geoShape.PointCount - 1; i++) { IPoint pt1 = geoShape.GetPoint(i); IPoint pt2 = geoShape.GetPoint(i + 1); IPoint ptFootPrint1 = geo.GetPoint(i); IPoint ptFootPrint2 = geo.GetPoint(i + 1); double len = Math.Sqrt((ptFootPrint1.X - ptFootPrint2.X) * (ptFootPrint1.X - ptFootPrint2.X) + (ptFootPrint1.Y - ptFootPrint2.Y) * (ptFootPrint1.Y - ptFootPrint2.Y)); double x = interPoint.X; double y = interPoint.Y; double x1 = ptFootPrint1.X; double y1 = ptFootPrint1.Y; double z1 = pt1.Z; double x2 = ptFootPrint2.X; double y2 = ptFootPrint2.Y; double z2 = pt2.Z; double det = 0.5; bool b1 = (x >= x1 || Math.Abs(x - x1) < det) && (x <= x2 || Math.Abs(x - x2) < det) && (y <= y1 || Math.Abs(y - y1) < det) && (y >= y2 || Math.Abs(y - y2) < det); bool b2 = (x <= x1 || Math.Abs(x - x1) < det) && (x >= x2 || Math.Abs(x - x2) < det) && (y >= y1 || Math.Abs(y - y1) < det) && (y <= y2 || Math.Abs(y - y2) < det); bool b3 = (x >= x1 || Math.Abs(x - x1) < det) && (x <= x2 || Math.Abs(x - x2) < det) && (y >= y1 || Math.Abs(y - y1) < det) && (y >= y2 || Math.Abs(y - y2) < det); bool b4 = (x <= x1 || Math.Abs(x - x1) < det) && (x >= x2 || Math.Abs(x - x2) < det) && (y <= y1 || Math.Abs(y - y1) < det) && (y >= y2 || Math.Abs(y - y2) < det); if (b1 || b2 || b3 || b4) { double res = z1 + (z2 - z1) * Math.Sqrt((x1 - x) * (x1 - x) + (y1 - y) * (y1 - y)) / len; return(res); // var detx1 = x1 - x; // var dety1 = y1 - y; // var detx2 = x2 - x; // var dety2 = y2 - y; // var temp = dety2 * detx1 + dety1 * detx2; // if (Math.abs(temp) < 0.00001) { // } } } return(0.0); }
void axRenderControl1_RcObjectEditFinish() { IRenderArrow arrow = this.axRenderControl1.ObjectManager.CreateRenderArrow(rootId); if (arrow != null) { IPolyline line = currentGeometry as IPolyline; for (int i = 0; i < line.PointCount; i++) { arrow.AddPoint(line.GetPoint(i)); } // 添加节点到界面控件上 myListNode item = new myListNode(string.Format("RenderArrow_{0}", arrow.Guid), TreeNodeType.NT_RenderArrow, arrow); item.Checked = true; listView1.Items.Add(item); // 添加节点到界面控件上 item = new myListNode(string.Format("RenderPolyline_{0}", arrow.Guid), TreeNodeType.NT_RenderGeomtry, currentRenderGeometry); item.Checked = true; listView1.Items.Add(item); } // 恢复漫游模式 this.axRenderControl1.InteractMode = gviInteractMode.gviInteractNormal; }
public DrawCylinderLine(IMultiPolyline multiLine, IPipeSection section, string tcName, uint color) { this._tcName = ""; this._color = 0xffff0000; base._modeltype = ModelType.CylinderLine; this._pipeSection = section; base._cullModel = gviCullFaceMode.gviCullNone; this._tcName = tcName; this._color = color; if (multiLine != null) { IEnvelope envelope = null; IPolyline polyline = null; List <Vector> item = null; IPoint point = null; Vector vector = null; envelope = multiLine.Envelope; base._x = (envelope.MaxX + envelope.MinX) / 2.0; base._y = (envelope.MaxY + envelope.MinY) / 2.0; base._z = (envelope.MaxZ + envelope.MinZ) / 2.0; this._route = new List <List <Vector> >(); for (int i = 0; i < multiLine.GeometryCount; i++) { polyline = multiLine.GetPolyline(i); item = new List <Vector>(); for (int j = 0; j < polyline.PointCount; j++) { point = polyline.GetPoint(j); vector = new Vector(point.X - base._x, point.Y - base._y, point.Z - base._z); item.Add(vector); } this._route.Add(item); } } }
// Polyline类型 FX 2014.04.08 public void SetParameter1(IGeometry geometry, double hTop, double hBottom) { base._hTop = hTop; base._hBottom = hBottom; base._minX = 999999.9; base._maxX = -999999.9; base._minY = 999999.9; base._maxY = -999999.9; try { IPolygon polygon; base._z = hTop; this._depth = base._hTop - base._hBottom; switch (geometry.GeometryType) { case gviGeometryType.gviGeometryPoint: { IPoint point = geometry as IPoint; base._x = point.X; base._y = point.Y; DrawGeometry.GetRoundVtxs(point, 1.0, 0x18, ref this._vtx, ref this._minX, ref this._maxX, ref this._minY, ref this._maxY); break; } case gviGeometryType.gviGeometryPolyline: goto Label_00CD; } return; Label_00CD: // 将polyline转化为polygon IPolyline polyline = geometry as IPolyline; if (polyline.PointCount < 4) { return; } polygon = geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ) as IPolygon; if (polygon != null) { for (int i = 0; i < polyline.PointCount; i++) { IPoint point = polyline.GetPoint(i); polygon.ExteriorRing.AppendPoint(point); } } if (!polygon.IsClosed) { polygon.Close(); } if (polygon.QueryNormal().Z > 0.0) { ReversePolygon(ref polygon); } DrawGeometry.GetPolygonVtxs(polygon, ref this._x, ref this._y, ref this._vtx, ref this._minX, ref this._maxX, ref this._minY, ref this._maxY); } catch (Exception exception) { } }
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); } }
private void ReversePolyline(ref IPolyline ply) { if ((ply != null) && (ply.PointCount != 0)) { Stack <IPoint> stack = null; stack = new Stack <IPoint>(); for (int i = 0; i < ply.PointCount; i++) { stack.Push(ply.GetPoint(i)); } ply.RemovePoints(0, ply.PointCount); while (stack.Count > 0) { ply.AppendPoint(stack.Pop()); } } }
public static bool GetPolylineVtxs(IPolyline polyline, ref double cX, ref double cY, ref double cZ, ref List <Vector> route) { if (polyline == null) { return(false); } cX = polyline.StartPoint.X; cY = polyline.StartPoint.Y; cZ = polyline.StartPoint.Z; route = new List <Vector>(); for (int i = 0; i < polyline.PointCount; i++) { IPoint point = polyline.GetPoint(i); Vector item = new Vector(point.X - cX, point.Y - cY, point.Z - cZ); route.Add(item); } return(true); }
// 根据管线起始点高程计算管线中间点高程,返回多段线对象 private bool GetPipeLineVertexs(IGeometry geo, out IPolyline route) { route = null; try { IPolyline polyline = null; if ((geo == null) || ((polyline = geo as IPolyline) == null)) { return(false); } IPoint pointValue = null; route = DrawGeometry.geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolyline, gviVertexAttribute.gviVertexAttributeZ) as IPolyline; for (int i = 0; i < polyline.PointCount; i++) { pointValue = polyline.GetPoint(i).Clone2(gviVertexAttribute.gviVertexAttributeZ) as IPoint; route.AppendPoint(pointValue); } return(true); } catch (Exception exception) { return(false); } }
public bool GetPipeLineParameter(double thick, out List <Vector> vtxs, out IPipeSection section) { vtxs = null; section = null; IPolyline polyline = null; if ((base._geoGroup[1] == null) || ((polyline = base._geoGroup[1] as IPolyline) == null)) { return(false); } if (polyline.PointCount < 2) { return(false); } IPoint p = null; Vector vector = null; Vector vector2 = null; Vector item = null; vtxs = new List <Vector>(); section = new PipeSection(this._dia1, this._dia2, HorizontalPos.Center, VerticalPos.Center, thick, 0); for (int i = 0; i < polyline.PointCount; i++) { p = polyline.GetPoint(i); if (p != null) { vector = new Vector(p); if ((this._dia1 > 1.5) || (this._dia2 > 1.5)) { item = vector; } else if (i == 0) { // 增加起点退让判断,并对较短管线做处理 FX 2014.04.08 vector2 = new Vector(polyline.GetSegment(i)); double length = vector2.Length; vector2 = vector2.UnitVector(); if (this._isSBackhind) { if (length > (section.Diameter / 1.8)) { item = vector + ((Vector)((vector2 * section.Diameter) / 1.8)); } else { item = vector + ((Vector)((vector2 * length) / 1.8)); } } else { item = vector; } } else if (i == (polyline.PointCount - 1)) { // 增加终点退让判断,并对较短管线做处理 FX 2014.04.08 vector2 = new Vector(polyline.GetSegment(i - 1)); double length = vector2.Length; vector2 = -vector2.UnitVector(); if (this._isEBackhind) { if (length > (section.Diameter / 1.8)) { item = vector + ((Vector)((vector2 * section.Diameter) / 1.8)); } else { item = vector + ((Vector)((vector2 * length) / 1.8)); } } else { item = vector; } } else { item = vector; } item.Z += this.OffsetZ; vtxs.Add(item); } } return(true); }
/// <summary> /// 参数化建模 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnDriveModel_Click(object sender, System.EventArgs e) { try { if (polyline != null) { center = polyline.Envelope.Center; IModelPoint mp = new GeometryFactory().CreateGeometry(gviGeometryType.gviGeometryModelPoint, gviVertexAttribute.gviVertexAttributeZ) as IModelPoint; mp.SpatialCRS = datasetCRS; mp.Position = center; IModel model = new ResourceFactory().CreateModel(); IDrawGroup group = new DrawGroup(); IDrawPrimitive primitive = new DrawPrimitive(); IDrawMaterial material = new DrawMaterial(); material.TextureName = (strMediaPath + @"\shp\road\textrure.jpg"); material.CullMode = gviCullFaceMode.gviCullNone; material.WrapModeS = gviTextureWrapMode.gviTextureWrapRepeat; material.WrapModeT = gviTextureWrapMode.gviTextureWrapRepeat; IFloatArray va = new FloatArray(); IFloatArray ta = new FloatArray(); // 逐点外扩 for (int i = 0; i < polyline.PointCount; i++) { #region 单独处理最后一个点 if (i == polyline.PointCount - 1) { curPoint = polyline.GetPoint(i); vecCurPos = curPoint.Position; // 最后一个点重用最后的方向向量 vecTarget = vecDirect.CrossProduct(vecZ); vecTarget.Normalize(); vecTarget.MultiplyByScalar(width / 2); vecP = vecCurPos.Add(vecTarget); vecTarget.MultiplyByScalar(-1); vecQ = vecCurPos.Add(vecTarget); // 设置外扩点 P = curPoint.Clone() as IPoint; P.Position = vecP; Q = curPoint.Clone() as IPoint; Q.Position = vecQ; // 把点坐标加进顶点数组 va.Append((float)(vecP.X - center.X)); va.Append((float)(vecP.Y - center.Y)); va.Append((float)(vecP.Z - center.Z)); va.Append((float)(vecQ.X - center.X)); va.Append((float)(vecQ.Y - center.Y)); va.Append((float)(vecQ.Z - center.Z)); // 加纹理坐标 ta.Append(0); //P点纹理 if (i == 0) { lastV = 0.0; } else { lastV = lastV + length / 10; //v方向上每隔10米重复一次 } ta.Append((float)lastV); ta.Append(1); //Q点纹理 ta.Append((float)lastV); { ISimplePointSymbol ps = new SimplePointSymbol(); ps.FillColor = System.Drawing.Color.Yellow; ps.Size = 5; rPointToDelList.Add(this.axRenderControl1.ObjectManager.CreateRenderPoint(P, ps, rootId)); rPointToDelList.Add(this.axRenderControl1.ObjectManager.CreateRenderPoint(Q, ps, rootId)); } break; } #endregion // 当不是最后一个点时: curPoint = polyline.GetPoint(i); nextPoint = polyline.GetPoint(i + 1); vecCurPos = curPoint.Position; vecNextPos = nextPoint.Position; // 运算 vecNextPos.MultiplyByScalar(-1); vecDirect = vecCurPos.Add(vecNextPos); //方向向量 vecZ.Set(0, 0, 1); vecTarget = vecDirect.CrossProduct(vecZ); vecTarget.Normalize(); vecTarget.MultiplyByScalar(width / 2); vecP = vecCurPos.Add(vecTarget); vecTarget.MultiplyByScalar(-1); vecQ = vecCurPos.Add(vecTarget); // 设置外扩点 P = curPoint.Clone() as IPoint; P.Position = vecP; Q = curPoint.Clone() as IPoint; Q.Position = vecQ; // 把点坐标加进顶点数组 va.Append((float)(vecP.X - center.X)); va.Append((float)(vecP.Y - center.Y)); va.Append((float)(vecP.Z - center.Z)); va.Append((float)(vecQ.X - center.X)); va.Append((float)(vecQ.Y - center.Y)); va.Append((float)(vecQ.Z - center.Z)); // 加纹理坐标 ta.Append(0); //P点纹理 if (i == 0) { lastV = 0.0; } else { lastV = lastV + length / 5; //v方向上每隔10米重复一次 } length = vecDirect.Length; //计算长度给奇数点用 ta.Append((float)lastV); ta.Append(1); //Q点纹理 ta.Append((float)lastV); { ISimplePointSymbol ps = new SimplePointSymbol(); ps.FillColor = System.Drawing.Color.Yellow; ps.Size = 5; rPointToDelList.Add(this.axRenderControl1.ObjectManager.CreateRenderPoint(P, ps, rootId)); rPointToDelList.Add(this.axRenderControl1.ObjectManager.CreateRenderPoint(Q, ps, rootId)); } } // 计算索引坐标 IUInt16Array ia = new UInt16Array(); for (int i = 0; i < va.Length / 6 - 1; i++) { ia.Append((ushort)(2 * i)); ia.Append((ushort)(2 * i + 1)); ia.Append((ushort)(2 * i + 2)); ia.Append((ushort)(2 * i + 1)); ia.Append((ushort)(2 * i + 3)); ia.Append((ushort)(2 * i + 2)); } primitive.VertexArray = va; primitive.TexcoordArray = ta; primitive.IndexArray = ia; primitive.Material = material; group.AddPrimitive(primitive); model.AddGroup(group); // 在内存中临时存储模型 string modelName = fid.ToString(); this.axRenderControl1.ObjectManager.AddModel(modelName, model); mp.ModelName = modelName; mp.ModelEnvelope = model.Envelope; // 可视化临时模型 IRenderModelPoint rmp = this.axRenderControl1.ObjectManager.CreateRenderModelPoint(mp, null, rootId); rmp.MaxVisibleDistance = 100000; rmp.MouseSelectMask = gviViewportMask.gviViewNone; rModelpointToDelList.Add(rmp); } } catch (System.Exception ex) { if (ex.GetType().Name.Equals("UnauthorizedAccessException")) { MessageBox.Show("需要标准runtime授权"); } else { MessageBox.Show(ex.Message); } } }
private void btnNavigate_Click(object sender, EventArgs e) { if (tour != null) { //是否相机跟随 if (cbCameraFollow.Checked) { if (renderModelPoint != null) { this.axRenderControl1.Camera.FlyToObject(renderModelPoint.Guid, gviActionCode.gviActionFollowBehindAndAbove); } else if (skinMesh != null) { this.axRenderControl1.Camera.FlyToObject(skinMesh.Guid, gviActionCode.gviActionFollowBehindAndAbove); } } tour.Play(); return; } tour = this.axRenderControl1.ObjectManager.CreateDynamicObject(rootId); tour.CrsWKT = dataset_Road.SpatialReference.AsWKT(); tour.TurnSpeed = 100000; if (renderLine != null) { IPolyline line = renderLine.GetFdeGeometry() as IPolyline; for (int i = 0; i < line.PointCount; i++) { fdepoint = line.GetPoint(i); if (txtLocationNames.Text.Contains("I'm Here!")) { tour.AddWaypoint2(fdepoint, 30); } else { tour.AddWaypoint2(fdepoint, 100); } } } else if (multiRenderLine != null) { IMultiPolyline mline = multiRenderLine.GetFdeGeometry() as IMultiPolyline; for (int i = 0; i < mline.GeometryCount; i++) { IPolyline line = mline.GetPolyline(i); for (int j = 0; j < line.PointCount; j++) { fdepoint = line.GetPoint(j); if (txtLocationNames.Text.Contains("I'm Here!")) { tour.AddWaypoint2(fdepoint, 30); } else { tour.AddWaypoint2(fdepoint, 100); } } } } if (txtLocationNames.Text.Contains("I'm Here!")) { LoadPeople(tour); } else { LoadCar(tour); } //是否相机跟随 if (cbCameraFollow.Checked) { if (renderModelPoint != null) { this.axRenderControl1.Camera.FlyToObject(renderModelPoint.Guid, gviActionCode.gviActionFollowBehindAndAbove); } else if (skinMesh != null) { this.axRenderControl1.Camera.FlyToObject(skinMesh.Guid, gviActionCode.gviActionFollowBehindAndAbove); } } tour.Play(); }
private void ShowFlowDirect(IFeatureLayerPickResult pr) { if (pr == null) { return; } IRowBuffer row = null; IFdeCursor cursor = null; try { int fid = pr.FeatureId; DF3DFeatureClass dffc = DF3DFeatureClassManager.Instance.GetFeatureClassByID(pr.FeatureLayer.FeatureClassId.ToString()); if (dffc == null) { return; } IFeatureClass fc = dffc.GetFeatureClass(); FacilityClass fac = dffc.GetFacilityClass(); if (fc == null || fac == null || fac.Name != "PipeLine") { return; } DFDataConfig.Class.FieldInfo fi = fac.GetFieldInfoBySystemName("FlowDirect"); if (fi == null) { return; } IFieldInfoCollection fiCol = fc.GetFields(); int index = fiCol.IndexOf(fi.Name); if (index == -1) { return; } int indexShape = fiCol.IndexOf("Shape"); IQueryFilter filter = new QueryFilter(); filter.WhereClause = "oid=" + fid; cursor = fc.Search(filter, false); row = cursor.NextRow(); if (row == null) { return; } IPolyline line = null; if (indexShape != -1 && !row.IsNull(indexShape)) { object obj = row.GetValue(indexShape); if (obj != null && obj is IPolyline) { line = obj as IPolyline; } } string flowDirectValue = "0"; int type = 1;// 1表示具有流向字段;2表示从高到低 if (!row.IsNull(index)) { flowDirectValue = row.GetValue(index).ToString(); if (flowDirectValue != "0" && flowDirectValue != "1") { flowDirectValue = "0"; } type = 1; } else if (line != null) { if (line.StartPoint.Z > line.EndPoint.Z) { flowDirectValue = "0"; } else { flowDirectValue = "1"; } type = 2; } if (line == null) { return; } if (this._isAuth) { #region 流向渲染1 FacClassReg reg = FacilityInfoService.GetFacClassRegByFeatureClassID(fc.Guid.ToString()); if (reg == null) { return; } TopoClass tc = FacilityInfoService.GetTopoClassByFacClassCode(reg.FacClassCode); if (tc == null) { return; } FacStyleClass style = null; List <FacStyleClass> facilityStyles = FacilityInfoService.GetFacStyleByFacClassCode(reg.FacClassCode); if ((facilityStyles != null) && (facilityStyles.Count > 0)) { style = facilityStyles[0]; } PipeLineFac plfac = new PipeLineFac(reg, style, row, tc); IRenderModelPoint rmp = null; DrawGeometry.Ocx = DF3DApplication.Application.Current3DMapControl; plfac.ShowFlowDirection(int.Parse(flowDirectValue), out rmp); if (rmp != null) { this._listRender.Add(rmp.Guid); } #endregion } else { #region 流向渲染2 IEulerAngle angle = DF3DApplication.Application.Current3DMapControl.Camera.GetAimingAngles2(line.StartPoint, line.EndPoint); double dia = 0.0; string diaField = fac.GetFieldInfoNameBySystemName("Diameter"); int indexDia = fiCol.IndexOf(diaField); if (indexDia != -1 && !row.IsNull(indexDia)) { string diaStr = row.GetValue(indexDia).ToString(); int indexDia1 = diaStr.ToString().IndexOf('*'); if (indexDia1 != -1) { var dia1 = int.Parse(diaStr.ToString().Substring(0, indexDia1)); var dia2 = int.Parse(diaStr.ToString().Substring(indexDia1 + 1, diaStr.ToString().Length)); dia = ((dia1 > dia2) ? dia1 : dia2) * 0.001; } else { dia = int.Parse(diaStr) * 0.001; } } List <IPoint> points = new List <IPoint>(); if (flowDirectValue == "0") { for (int i = 0; i < line.PointCount; i++) { IPoint pt = line.GetPoint(i); pt.Z += dia / 2; points.Add(pt); } } else if (flowDirectValue == "1") { for (int i = line.PointCount - 1; i >= 0; i--) { IPoint pt = line.GetPoint(i); pt.Z += dia / 2; points.Add(pt); } } for (int i = 0; i < points.Count - 1; i++) { IPoint pt1 = points[i]; var pt2 = points[i + 1]; double delt = 0; double _rate, _distance; if (!(Math.Abs(dia) < 0.0000001)) { delt = 2.0 * dia; if (dia <= 0.5 && dia >= 0.3) { _rate = 7 * dia; _distance = 3 * dia / 0.4; } else if (dia < 0.3 && dia > 0.1) { _rate = 12 * dia; _distance = 6 * dia / 0.4; } else if (dia <= 0.1) { _rate = 22 * dia; _distance = 9 * dia / 0.4; } else { _rate = 3.5 * dia; _distance = 1.5 * dia / 0.4; } } else { _rate = 2.0; _distance = 3.0; //z = maxZ + 0.2; delt = 0.2; } List <IPoint> list = DisPerseLine(pt1, pt2, _distance); if (list.Count < 2) { return; } List <IPoint> list1 = new List <IPoint>(); IGeometryFactory geoFact = new GeometryFactoryClass(); for (int j = 0; j < list.Count - 1; j++) { IPoint p = geoFact.CreatePoint(gviVertexAttribute.gviVertexAttributeZ); p.X = (list[j].X + list[j + 1].X) / 2; p.Y = (list[j].Y + list[j + 1].Y) / 2; p.Z = (list[j].Z + list[j + 1].Z) / 2; list1.Add(p); } for (var m = 0; m < list1.Count; m++) { IPosition pos = new PositionClass(); pos.X = list1[m].X; pos.Y = list1[m].Y; pos.Altitude = list1[m].Z + delt; pos.AltitudeType = gviAltitudeType.gviAltitudeTerrainAbsolute; pos.Heading = angle.Heading; pos.Tilt = angle.Tilt; pos.Roll = angle.Roll; UInt32 color; if (type == 1) { color = 0xFFFFFF00; } else { color = 0xFF00FFFF; } ITerrainArrow rArrow = DF3DApplication.Application.Current3DMapControl.ObjectManager.CreateArrow(pos, 0.8 * _rate, 3, color, color, DF3DApplication.Application.Current3DMapControl.ProjectTree.RootID); this._listRender.Add(rArrow.Guid); } } #endregion } } catch (Exception ex) { } finally { if (cursor != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(cursor); cursor = null; } if (row != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(row); row = null; } } }
// Shap数据中含各顶点高程数据 private bool GetPipeLineVertexs(IGeometry geo, double sHeight, double eHeight, out IPolyline route) { route = null; try { IPolyline polyline = null; if ((geo == null) || ((polyline = geo as IPolyline) == null)) { return(false); } IPoint pointValue = null; route = DrawGeometry.geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolyline, gviVertexAttribute.gviVertexAttributeZ) as IPolyline; if (polyline.PointCount == 2) { pointValue = polyline.StartPoint.Clone2(gviVertexAttribute.gviVertexAttributeZ) as IPoint; pointValue.Z = sHeight; route.AppendPoint(pointValue); pointValue = polyline.EndPoint.Clone2(gviVertexAttribute.gviVertexAttributeZ) as IPoint; pointValue.Z = eHeight; route.AppendPoint(pointValue); } else { IPoint point; Stack <int> stack = new Stack <int>(); double num4 = eHeight - sHeight; if (Math.Abs(num4) < 0.0015) { point = null; for (int i = 0; i < polyline.PointCount; i++) { pointValue = polyline.GetPoint(i).Clone2(gviVertexAttribute.gviVertexAttributeZ) as IPoint; if (i < 1) { pointValue.Z = sHeight; route.AppendPoint(pointValue); point = pointValue; } else if (Math.Sqrt(((pointValue.X - point.X) * (pointValue.X - point.X)) + ((pointValue.Y - point.Y) * (pointValue.Y - point.Y))) < (this._dia1 * 1.5)) { stack.Push(i); } else { pointValue.Z = sHeight; route.AppendPoint(pointValue); point = pointValue; } } } else { double num3 = sHeight; IPolyline o = polyline.Clone2(gviVertexAttribute.gviVertexAttributeNone) as IPolyline; double length = o.Length; Marshal.ReleaseComObject(o); point = null; for (int j = 0; j < polyline.PointCount; j++) { pointValue = polyline.GetPoint(j).Clone2(gviVertexAttribute.gviVertexAttributeZ) as IPoint; if (j < 1) { pointValue.Z = sHeight; route.AppendPoint(pointValue); point = pointValue; } else { double num2; if ((num2 = Math.Sqrt(((pointValue.X - point.X) * (pointValue.X - point.X)) + ((pointValue.Y - point.Y) * (pointValue.Y - point.Y)))) < (this._dia1 * 1.5)) { stack.Push(j); } else { num3 += (num2 / length) * num4; pointValue.Z = num3; route.AppendPoint(pointValue); point = pointValue; } } } } while (stack.Count > 0) { polyline.RemovePoints(stack.Pop(), 1); } } return(true); } catch (Exception exception) { return(false); } }
private void AddRecord() { try { this.beforeRowBufferMap.Clear(); SelectCollection.Instance().Clear(); if (reg == null || tc == null) { return; } FacStyleClass style = this.cmbStyle.EditValue as FacStyleClass; if (style == null) { return; } SubClass sc = this.cmbClassify.EditValue as SubClass; DF3DFeatureClass featureClassInfo = CommonUtils.Instance().CurEditLayer; if (featureClassInfo == null) { return; } IFeatureClass fc = featureClassInfo.GetFeatureClass(); if (fc == null) { return; } IResourceManager manager = fc.FeatureDataSet as IResourceManager; if (manager == null) { return; } IFeatureLayer fl = featureClassInfo.GetFeatureLayer(); if (fl == null) { return; } IFieldInfoCollection fields = fc.GetFields(); int indexOid = fields.IndexOf(fc.FidFieldName); if (indexOid == -1) { return; } int mpindex = fields.IndexOf(fl.GeometryFieldName); if (mpindex == -1) { return; } int indexShape = fields.IndexOf("Shape"); if (indexShape == -1) { return; } int indexFootPrint = fields.IndexOf("FootPrint"); if (indexFootPrint == -1) { return; } int indexStyleId = fields.IndexOf("StyleId"); if (indexStyleId == -1) { return; } int indexFacilityId = fields.IndexOf("FacilityId"); if (indexFacilityId == -1) { return; } IFieldInfo fiShape = fields.Get(indexShape); if (fiShape == null || fiShape.GeometryDef == null) { return; } IGeometry geo = this._drawTool.GetGeo(); if (geo.GeometryType != gviGeometryType.gviGeometryPolyline) { return; } IPolyline line = geo as IPolyline; IPolyline geoOut = this._geoFact.CreateGeometry(gviGeometryType.gviGeometryPolyline, fiShape.GeometryDef.VertexAttribute) as IPolyline; for (int i = 0; i < line.PointCount; i++) { IPoint ptGet = line.GetPoint(i); IPoint pttemp = ptGet.Clone2(fiShape.GeometryDef.VertexAttribute) as IPoint; if (fiShape.GeometryDef.HasZ) { pttemp.SetCoords(ptGet.X, ptGet.Y, ptGet.Z, 0, 0); } else { pttemp.SetCoords(ptGet.X, ptGet.Y, 0, 0, 0); } geoOut.AppendPoint(pttemp); } IQueryFilter filter = new QueryFilter(); filter.WhereClause = "1=1"; filter.ResultBeginIndex = 0; filter.ResultLimit = 1; filter.PostfixClause = "ORDER BY " + fc.FidFieldName + " desc"; IFdeCursor cursor = null; cursor = fc.Search(filter, false); IRowBuffer rowtemp = cursor.NextRow(); int oid = 0; if (rowtemp != null) { oid = int.Parse(rowtemp.GetValue(indexOid).ToString()); } if (cursor != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(cursor); cursor = null; } IRowBufferFactory fac = new RowBufferFactory(); IRowBuffer row = fac.CreateRowBuffer(fields); row.SetValue(indexOid, oid + 1); row.SetValue(indexShape, geoOut); row.SetValue(indexFootPrint, geoOut.Clone2(gviVertexAttribute.gviVertexAttributeNone)); row.SetValue(indexStyleId, style.ObjectId); row.SetValue(indexFacilityId, BitConverter.ToString(ObjectIdGenerator.Generate()).Replace("-", string.Empty).ToLowerInvariant()); if (sc != null) { int indexClassify = fields.IndexOf(this._classifyName); int indexGroupId = fields.IndexOf("GroupId"); if (indexClassify != -1 && indexGroupId != -1) { row.SetValue(indexClassify, sc.Name); row.SetValue(indexGroupId, sc.GroupId); } } foreach (DataRow dr in this._dt.Rows) { IFieldInfo fi = dr["F"] as IFieldInfo; if (fi == null) { continue; } string fn = fi.Name; int index = fields.IndexOf(fn); if (index != -1) { if (dr["FV"] == null) { row.SetNull(index); } else { string strobj = dr["FV"].ToString(); bool bRes = false; switch (fi.FieldType) { case gviFieldType.gviFieldBlob: case gviFieldType.gviFieldGeometry: case gviFieldType.gviFieldUnknown: break; case gviFieldType.gviFieldFloat: float f; bRes = float.TryParse(strobj, out f); if (bRes) { row.SetValue(index, f); } else { row.SetNull(index); } break; case gviFieldType.gviFieldDouble: double d; bRes = double.TryParse(strobj, out d); if (bRes) { row.SetValue(index, d); } else { row.SetNull(index); } break; case gviFieldType.gviFieldFID: case gviFieldType.gviFieldUUID: case gviFieldType.gviFieldInt16: Int16 i16; bRes = Int16.TryParse(strobj, out i16); if (bRes) { row.SetValue(index, i16); } else { row.SetNull(index); } break; case gviFieldType.gviFieldInt32: Int32 i32; bRes = Int32.TryParse(strobj, out i32); if (bRes) { row.SetValue(index, i32); } else { row.SetNull(index); } break; case gviFieldType.gviFieldInt64: Int64 i64; bRes = Int64.TryParse(strobj, out i64); if (bRes) { row.SetValue(index, i64); } else { row.SetNull(index); } break; case gviFieldType.gviFieldString: row.SetValue(index, strobj); break; case gviFieldType.gviFieldDate: DateTime dt; bRes = DateTime.TryParse(strobj, out dt); if (bRes) { row.SetValue(index, dt); } else { row.SetNull(index); } break; default: break; } } } } Fac plf = new PipeLineFac(reg, style, row, tc, false, false); IModelPoint mp = null; IModel finemodel = null; IModel simplemodel = null; string name = ""; if (UCAuto3DCreate.RebuildModel(plf, style, out mp, out finemodel, out simplemodel, out name)) { if (finemodel == null || mp == null) { return; } mp.ModelEnvelope = finemodel.Envelope; row.SetValue(mpindex, mp); //if (mc != null) //{ // if (indexClassify != -1 && indexGroupid != -1) // { // } //} bool bRes = false; if (!string.IsNullOrEmpty(mp.ModelName)) { if (!manager.ModelExist(mp.ModelName)) { if (manager.AddModel(mp.ModelName, finemodel, simplemodel)) { bRes = true; } } else { if (manager.UpdateModel(mp.ModelName, finemodel) && manager.UpdateSimplifiedModel(mp.ModelName, simplemodel)) { bRes = true; } } } if (!bRes) { return; } IRowBufferCollection rowCol = new RowBufferCollection(); rowCol.Add(row); beforeRowBufferMap[featureClassInfo] = rowCol; UpdateDatabase(); app.Current3DMapControl.FeatureManager.RefreshFeatureClass(fc); } } catch (Exception ex) { } }
private void AddGeometry() { try { this.beforeRowBufferMap.Clear(); SelectCollection.Instance().Clear(); DF3DFeatureClass featureClassInfo = CommonUtils.Instance().CurEditLayer; if (featureClassInfo == null) { return; } IFeatureClass fc = featureClassInfo.GetFeatureClass(); if (fc == null) { return; } IFieldInfoCollection fields = fc.GetFields(); int indexGeo = fields.IndexOf(this._strGeometryFieldName); if (indexGeo == -1) { return; } IGeometry geo = this._drawTool.GetGeo(); IGeometry geoOut = null; switch (geo.GeometryType) { case gviGeometryType.gviGeometryModelPoint: geoOut = geo; break; case gviGeometryType.gviGeometryPoint: IPoint pt = geo as IPoint; IPoint pt1 = pt.Clone2(gviVertexAttribute.gviVertexAttributeZM) as IPoint; pt1.SetCoords(pt.X, pt.Y, pt.Z, 0, 0); geoOut = pt1; break; case gviGeometryType.gviGeometryPolyline: IPolyline line = geo as IPolyline; IPolyline line1 = this._geoFact.CreateGeometry(gviGeometryType.gviGeometryPolyline, gviVertexAttribute.gviVertexAttributeZM) as IPolyline; for (int i = 0; i < line.PointCount; i++) { IPoint ptGet = line.GetPoint(i); IPoint pttemp = ptGet.Clone2(gviVertexAttribute.gviVertexAttributeZM) as IPoint; pttemp.SetCoords(ptGet.X, ptGet.Y, ptGet.Z, 0, 0); line1.AppendPoint(pttemp); } geoOut = line1; break; case gviGeometryType.gviGeometryPolygon: IPolygon polygon = geo as IPolygon; IPolygon polygon1 = this._geoFact.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZM) as IPolygon; for (int i = 0; i < polygon.ExteriorRing.PointCount; i++) { IPoint ptGet = polygon.ExteriorRing.GetPoint(i); IPoint pttemp = ptGet.Clone2(gviVertexAttribute.gviVertexAttributeZM) as IPoint; pttemp.SetCoords(ptGet.X, ptGet.Y, ptGet.Z, 0, 0); polygon1.ExteriorRing.AppendPoint(pttemp); } geoOut = polygon1; break; } if (geoOut == null) { return; } if (geo.GeometryType == gviGeometryType.gviGeometryModelPoint) { //导入模型到数据库中 string mn = BitConverter.ToString(ObjectIdGenerator.Generate()).Replace("-", string.Empty).ToLowerInvariant(); IModelPoint mp = geoOut as IModelPoint; bool bRes = this.ImportOsg(mn, mp.ModelName); if (!bRes) { return; } mp.ModelName = mn; geoOut = mp; } IRowBufferCollection rowCol = new RowBufferCollection(); IRowBufferFactory fac = new RowBufferFactory(); IRowBuffer row = fac.CreateRowBuffer(fields); row.SetValue(indexGeo, geoOut); rowCol.Add(row); beforeRowBufferMap[featureClassInfo] = rowCol; } catch (Exception ex) { } }
// 抽稀坐标点 private bool SimplifyPolyline(IGeometry geo, out IPolyline route) { route = null; try { IPolyline polyline = null; if ((geo == null) || ((polyline = geo as IPolyline) == null)) { return(false); } List <Vector> list = new List <Vector>(); IPoint p = null; IPoint point = null; route = DrawGeometry.geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolyline, gviVertexAttribute.gviVertexAttributeZ) as IPolyline; int num2 = 0; IPoint pointValue = null; Vector vector = null; Vector vector2 = null; Vector vector3 = null; Vector vector4 = null; if (polyline.PointCount == 2) { list.Add(new Vector(polyline.StartPoint)); route.AppendPoint(polyline.StartPoint); list.Add(new Vector(polyline.EndPoint)); route.AppendPoint(polyline.EndPoint); } else { new Stack <int>(); p = null; for (int i = 0; i < polyline.PointCount; i++) { point = polyline.GetPoint(i); if (i == 0) { //DrawGeometry.Ocx.ObjectManager.CreateRenderPoint(point, null, this._); list.Add(new Vector(point)); route.AppendPoint(point); num2 = i; p = point; } else if (Math.Sqrt((((point.X - p.X) * (point.X - p.X)) + ((point.Y - p.Y) * (point.Y - p.Y))) + ((point.Z - p.Z) * (point.Z - p.Z))) < (this._dia1 / 2.0)) { p = point; } else { vector2 = new Vector(p); vector4 = new Vector(p.X - point.X, p.Y - point.Y, p.Z - point.Z); if ((num2 > 0) && (num2 == (i - 1))) { list.Add(new Vector(p)); route.AppendPoint(p); } else if ((vector != null) && (vector3 != null)) { pointValue = this.RadialIntersect(vector, vector3, vector2, vector4); if (pointValue != null) { route.AppendPoint(pointValue); list.Add(new Vector(pointValue.X, pointValue.Y, pointValue.Z)); } num2 = i; } vector = new Vector(point); vector3 = -vector4; p = point; if (i == (polyline.PointCount - 1)) { list.Add(new Vector(point)); route.AppendPoint(point); } } } } return(true); } catch (Exception exception) { return(false); } }
// 地下—针对管线较短情况 public bool GetPipeNodeParameterUnder(int flag, out Vector[] vtxs, out Vector dir, out IPipeSection section) { vtxs = null; dir = null; section = null; IPolyline polyline = null; if ((base._geoGroup[1] == null) || ((polyline = base._geoGroup[1] as IPolyline) == null)) { return(false); } if (polyline.PointCount < 2) { return(false); } ISegment seg = null; Vector vector = null; Vector vector2 = null; vtxs = new Vector[2]; section = new PipeSection(this._dia1, this._dia2, HorizontalPos.Center, VerticalPos.Center, 0.02, 0); if (flag == 0) { vector = new Vector(polyline.GetPoint(0)); vtxs[0] = new Vector(vector.X, vector.Y, vector.Z + this.OffsetZ); seg = polyline.GetSegment(0); dir = new Vector(seg); dir = dir.UnitVector(); double length = dir.Length; // 针对管线较短情况 if (length > (section.Diameter / 2)) { vector2 = vector + ((Vector)((dir * section.Diameter) / 2.0)); } else { vector2 = vector + ((Vector)((dir * length) / 2.0)); } vtxs[1] = new Vector(vector2.X, vector2.Y, vector2.Z + this.OffsetZ); } else { vector = new Vector(polyline.GetPoint(polyline.PointCount - 1)); vtxs[0] = new Vector(vector.X, vector.Y, vector.Z + this.OffsetZ); seg = polyline.GetSegment(polyline.PointCount - 2); dir = new Vector(seg); double length = dir.Length; dir = -dir.UnitVector(); // 针对管线较短情况 if (length > (section.Diameter / 2)) { vector2 = vector + ((Vector)((dir * section.Diameter) / 2.0)); } else { vector2 = vector + ((Vector)((dir * length) / 2.0)); } vtxs[1] = new Vector(vector2.X, vector2.Y, vector2.Z + this.OffsetZ); } return(true); }
private void AxRenderControl1_RcObjectEditFinish(object sender, EventArgs e) { try { if (polyline != null) { sb.Clear(); var count = polyline.PointCount; totalCount += count; if (count < 2) { return; } UpdateLabelCount(count, totalCount); UpdateStartPointAndEndPointValue(); points.Clear(); for (int i = 0; i < count; i++) { IPoint p = polyline.GetPoint(i); points.Add(p); CreateRenderPoint(p); } AddDataToDic(); if (points.Count > 0) { // 添加到RichTextBox显示 geometry = new Geometry() { coordinates = new List <double[]>() }; points.ForEach(m => geometry.coordinates.Add(new double[] { m.X, m.Y })); source = checkBox1.Checked ? double.Parse(txtSource.Text.Trim()) : source; target = checkBox1.Checked ? double.Parse(txtTarget.Text.Trim()) : target; Property property = new Property() { Gid = gid.ToString(), Class_Id = "DL" + class_id.ToString(), Source = source, Target = target, Oneway = comboBox.SelectedIndex == 0, Priority = float.Parse(txtPriority.Text.Trim()), MaxForwardSpeed = float.Parse(txtMaxForwardSpeed.Text.Trim()), MaxBackwardSpeed = float.Parse(txtMaxBackwardSpeed.Text.Trim()) }; string showTxt = $"Gid={gid}, source={source}, target={target}"; var midPoint = polyline.Midpoint; if (midPoint != null) { mapOperation.CreateLabel(midPoint.X, midPoint.Y, 5, showTxt, mapOperation.RenderPolyline.Guid); } else { mapOperation.CreateLabel(points[0].X, points[0].Y, 5, showTxt, mapOperation.RenderPolyline.Guid); } gid++; class_id++; source = target; target++; UpdateFormView(gid, source, target); roadPoints.features.Add(new Feature() { Id = mapOperation.RenderPolyline.Guid, properties = property, geometry = geometry }); ShowInRichTextBox(); Save(); } } } catch (Exception ex) { MessageBox.Show(ex.InnerException.Message); } // 漫游 SetInteractNormal(); polyline = null; i = 0; }
public bool ShowFlowDirection(int flowDir, out IRenderModelPoint rpt) { rpt = null; if (base._rowInfo == null) { return(false); } string str = Application.StartupPath + @"\..\Resource\Images\FlowDirection"; if (!Directory.Exists(str)) { return(false); } IImage _imgFlowImg = DrawGeometry.resFactory.CreateImageFromFile(str); _imgFlowImg.FrameInterval = 50; IPolyline path = null; IPipeSection pipeSection = null; string name = "FlowDirection"; IDrawDynamicFlow flow = null; IModelPoint mp = null; try { IModel model; IModel model2; IPoint pointValue = null; IPolyline polyline2 = null; polyline2 = base._geoGroup[1] as IPolyline; if ((polyline2 == null) || (polyline2.PointCount < 2)) { return(false); } path = polyline2.Clone() as IPolyline; for (int i = 0; i < path.PointCount; i++) { pointValue = path.GetPoint(i); if (pointValue != null) { pointValue.Z += this.OffsetZ; path.UpdatePoint(i, pointValue); } } pipeSection = new PipeSection(this._dia1, this._dia2, HorizontalPos.Center, VerticalPos.Center, 0.02, 0); flow = ParamModelFactory.Instance.CreateGeometryDraw(ModelType.DynamicFlow, Guid.NewGuid().ToString()) as IDrawDynamicFlow; flow.SetParameter(pipeSection, path, flowDir); flow.SetTextureRender(new string[] { name }); if (!flow.Draw(out mp, out model, out model2)) { return(false); } #region 需要runtime授权 IFeatureDataSet iFeatureDataSet = DF3DPipeCreateApp.App.TempLib.OpenFeatureDataset("FeatureDataSet"); IResourceManager manager = iFeatureDataSet as IResourceManager; if (!manager.ModelExist(mp.ModelName)) { manager.AddModel(mp.ModelName, model, null); } if (!manager.ImageExist(name)) { manager.AddImage(name, _imgFlowImg); } #endregion IModelPointSymbol symbol = new ModelPointSymbolClass(); symbol.SetResourceDataSet(iFeatureDataSet); symbol.Color = uint.MaxValue; symbol.EnableColor = true; mp.ModelEnvelope = model.Envelope; rpt = DrawGeometry.Ocx.ObjectManager.CreateRenderModelPoint(mp, symbol, DrawGeometry.Ocx.ProjectTree.RootID); return(true); } catch (Exception exception) { return(false); } }
void axRenderControl1_RcObjectEditing(IGeometry Geometry) { polyline = Geometry as IPolyline; if (polyline.PointCount == 2) { this.axRenderControl1.ObjectEditor.FinishEdit(); this.axRenderControl1.InteractMode = gviInteractMode.gviInteractNormal; this.axRenderControl1.MouseSelectMode = gviMouseSelectMode.gviMouseSelectDrag; this.axRenderControl1.RcObjectEditing -= new _IRenderControlEvents_RcObjectEditingEventHandler(axRenderControl1_RcObjectEditing); IEulerAngle angle = this.axRenderControl1.Camera.GetAimingAngles2(polyline.GetPoint(0), polyline.GetPoint(1)); IEulerAngle cameraAngle = new EulerAngle(); cameraAngle.Heading = angle.Heading - 90; cameraAngle.Tilt = cameraAngle.Roll = 0; IPoint center = polyline.Midpoint; IEnvelope newEnv = new Envelope(); //newEnv表示相机出图范围 newEnv.MinX = -polyline.Length / 2; //相机出图宽度 newEnv.MaxX = polyline.Length / 2; newEnv.MinY = -10; //相机出图高度 newEnv.MaxY = 100; newEnv.MinZ = -100; //相机出图深度 newEnv.MaxZ = 100; SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "Image Files(*.BMP)|*.BMP|Image Files(*.PNG)|*.PNG|Image Files(*.JPG)|*.JPG"; dlg.DefaultExt = ".bmp"; if (dlg.ShowDialog() == DialogResult.OK) { bool b = this.axRenderControl1.ExportManager.ExportOrthoImage(dlg.FileName, 1024, center, cameraAngle, newEnv, false, System.Drawing.Color.Blue); if (!b) { MessageBox.Show("错误码为:" + this.axRenderControl1.GetLastError().ToString()); } } } }
private void AddRecord() { try { this.beforeRowBufferMap.Clear(); SelectCollection.Instance().Clear(); DF3DFeatureClass featureClassInfo = CommonUtils.Instance().CurEditLayer; if (featureClassInfo == null) { return; } IFeatureClass fc = featureClassInfo.GetFeatureClass(); if (fc == null) { return; } IFeatureLayer fl = featureClassInfo.GetFeatureLayer(); if (fl == null) { return; } IFieldInfoCollection fields = fc.GetFields(); int indexGeo = fields.IndexOf(fl.GeometryFieldName); if (indexGeo == -1) { return; } IFieldInfo fiGeo = fields.Get(indexGeo); if (fiGeo == null || fiGeo.GeometryDef == null) { return; } IGeometry geo = this._drawTool.GetGeo(); if (geo.GeometryType != gviGeometryType.gviGeometryPolyline) { return; } IPolyline line = geo as IPolyline; IPolyline geoOut = this._geoFact.CreateGeometry(gviGeometryType.gviGeometryPolyline, fiGeo.GeometryDef.VertexAttribute) as IPolyline; for (int i = 0; i < line.PointCount; i++) { IPoint ptGet = line.GetPoint(i); IPoint pttemp = ptGet.Clone2(fiGeo.GeometryDef.VertexAttribute) as IPoint; if (fiGeo.GeometryDef.HasZ) { pttemp.SetCoords(ptGet.X, ptGet.Y, ptGet.Z, 0, 0); } else { pttemp.SetCoords(ptGet.X, ptGet.Y, 0, 0, 0); } geoOut.AppendPoint(pttemp); } IRowBufferCollection rowCol = new RowBufferCollection(); IRowBufferFactory fac = new RowBufferFactory(); IRowBuffer row = fac.CreateRowBuffer(fields); row.SetValue(indexGeo, geoOut); foreach (DataRow dr in this._dt.Rows) { IFieldInfo fi = dr["F"] as IFieldInfo; if (fi == null) { continue; } string fn = fi.Name; int index = fields.IndexOf(fn); if (index != -1) { if (dr["FV"] == null) { row.SetNull(index); } else { string strobj = dr["FV"].ToString(); bool bRes = false; switch (fi.FieldType) { case gviFieldType.gviFieldBlob: case gviFieldType.gviFieldGeometry: case gviFieldType.gviFieldUnknown: break; case gviFieldType.gviFieldFloat: float f; bRes = float.TryParse(strobj, out f); if (bRes) { row.SetValue(index, f); } else { row.SetNull(index); } break; case gviFieldType.gviFieldDouble: double d; bRes = double.TryParse(strobj, out d); if (bRes) { row.SetValue(index, d); } else { row.SetNull(index); } break; case gviFieldType.gviFieldFID: case gviFieldType.gviFieldUUID: case gviFieldType.gviFieldInt16: Int16 i16; bRes = Int16.TryParse(strobj, out i16); if (bRes) { row.SetValue(index, i16); } else { row.SetNull(index); } break; case gviFieldType.gviFieldInt32: Int32 i32; bRes = Int32.TryParse(strobj, out i32); if (bRes) { row.SetValue(index, i32); } else { row.SetNull(index); } break; case gviFieldType.gviFieldInt64: Int64 i64; bRes = Int64.TryParse(strobj, out i64); if (bRes) { row.SetValue(index, i64); } else { row.SetNull(index); } break;; case gviFieldType.gviFieldString: row.SetValue(index, strobj); break; case gviFieldType.gviFieldDate: DateTime dt; bRes = DateTime.TryParse(strobj, out dt); if (bRes) { row.SetValue(index, dt); } else { row.SetNull(index); } break; default: break; } } } } rowCol.Add(row); beforeRowBufferMap[featureClassInfo] = rowCol; UpdateDatabase(); } catch (Exception ex) { } }