public void SetRegionPoint() { try { if (m_workspace.Datasources[0].Datasets.Contains("New_Point3D")) { DatasetVector datasetPoint3D = m_workspace.Datasources[0].Datasets["New_Point3D"] as DatasetVector; if (m_sceneControl.Scene.Layers.Contains("New_Point3D@gongyuan")) { m_sceneControl.Scene.Layers.Remove("New_Point3D@gongyuan"); } { Layer3DSettingVector pointSetting = new Layer3DSettingVector(); pointSetting.Style.AltitudeMode = AltitudeMode.RelativeToGround; pointSetting.Style.MarkerSize = 1; pointSetting.Style.IsMarkerSizeFixed = true; pointSetting.Style.MarkerScale = 1; pointSetting.Style.MarkerSymbolID = m_marker3DIndex; pointSetting.Style.IsMarker3D = true; m_layer3DRegionPoint = m_sceneControl.Scene.Layers.Add(datasetPoint3D, pointSetting, true, "New_Point3D@gongyuan"); } m_layer3DRegionPoint.UpdateData(); m_sceneControl.Scene.Refresh(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
//刷新风格 private void RefreshStyle() { if (m_layer3D == null) { return; } if (m_bSelection) { m_layer3D.Selection.Style = m_style3D; m_layer3D.Selection.UpdateData(); } else { if (m_layer3D.Type == Layer3DType.Dataset) { Layer3DDataset layer3DDataset = m_layer3D as Layer3DDataset; //layer3DDataset.IsEditable = true; Layer3DSettingVector layerSetting = layer3DDataset.AdditionalSetting as Layer3DSettingVector; layerSetting.Style = m_style3D; layer3DDataset.AdditionalSetting = layerSetting; layer3DDataset.UpdateData(); } else if (m_layer3D.Type == Layer3DType.VectorFile) { Layer3DVectorFile layer3DFile = m_layer3D as Layer3DVectorFile; Layer3DSettingVector layerSetting = layer3DFile.AdditionalSetting as Layer3DSettingVector; layerSetting.Style = m_style3D; layer3DFile.AdditionalSetting = layerSetting; layer3DFile.UpdateData(); } this.m_sceneControl.Scene.Refresh(); } }
/// <summary> /// 加载北京地铁数据 /// </summary> public void LoadSubway() { try { if (!m_sceneControl.Scene.Layers.Contains("ditie3")) { //加载北京地铁数据集 DatasetVector dataset_subway = m_workspace.Datasources["Pipeline3D"].Datasets["BeijingSubway"] as DatasetVector; DatasetVector dataset_label = m_workspace.Datasources["Pipeline3D"].Datasets["StopsName"] as DatasetVector; Layer3DSettingVector setvetor = new Layer3DSettingVector(); setvetor.Style.AltitudeMode = AltitudeMode.RelativeToGround; setvetor.Style.BottomAltitude = 5; setvetor.Style.LineWidth = 100; setvetor.Style.LineSymbolID = 962046; //setvetor.Style.MarkerColor = Color.Blue; ; Layer3DSettingVector pointSetting = new Layer3DSettingVector(); pointSetting.Style.AltitudeMode = AltitudeMode.ClampToGround; pointSetting.Style.MarkerSize = 1; pointSetting.Style.MarkerFile = @"..\..\SampleData\Symbol3DDisplay\SubwayMarkerLibrary.png"; pointSetting.Style.IsMarkerSizeFixed = true; pointSetting.Style.MarkerScale = 1; m_sceneControl.Scene.Underground.IsVisible = false; Layer3D layer_ditie = m_sceneControl.Scene.Layers.Add(dataset_subway, setvetor, true, "ditie3"); //标签专题图 Theme3DLabel themeLabel = new Theme3DLabel(); themeLabel.LabelExpression = "Name"; themeLabel.UniformStyle.IsSizeFixed = true; themeLabel.UniformStyle.ForeColor = Color.Yellow; themeLabel.UniformStyle.BackColor = Color.Black; themeLabel.UniformStyle.Outline = true; themeLabel.UniformStyle.FontScale = 1; themeLabel.UniformStyle.Weight = 7; themeLabel.UniformStyle.FontScale = 1.0; themeLabel.UniformStyle.Alignment = TextAlignment.MiddleRight; themeLabel.UniformStyle.IsSizeFixed = true; Layer3D layer1 = m_sceneControl.Scene.Layers.Add(dataset_label, pointSetting, true); Layer3D layer_label = m_sceneControl.Scene.Layers.Add(dataset_label, themeLabel, true); Camera camera = m_sceneControl.Scene.Camera; camera.AltitudeMode = AltitudeMode.RelativeToGround; camera.Altitude = 5508.4005263671279; camera.Latitude = 39.908042501262457; camera.Longitude = 116.39138653936693; camera.Tilt = 45.45877650025642; camera.Heading = 0.016679026847733185; m_sceneControl.Scene.Fly(camera, 2); } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
/// <summary> /// 初始化 /// </summary> /// <param name="sceneControl"></param> /// <param name="layer3D"></param> /// <param name="isSelection"></param> public void Initialize(SceneControl sceneControl, Layer3D layer3D, bool isSelection) { m_sceneControl = sceneControl; m_layer3D = layer3D; m_bSelection = isSelection; this.cb_AltitudeMode.Items.Clear(); //初始化高度模式列表 if (m_bSelection) { this.cb_AltitudeMode.Items.Add("贴地"); this.cb_AltitudeMode.Items.Add("贴对象"); } else { this.cb_AltitudeMode.Items.Add("贴地"); this.cb_AltitudeMode.Items.Add("贴对象"); this.cb_AltitudeMode.Items.Add("相对地面"); this.cb_AltitudeMode.Items.Add("绝对高度"); this.cb_AltitudeMode.Items.Add("相对地下"); } //初始化m_style3D if (m_bSelection) { m_style3D = m_layer3D.Selection.Style; } else { if (m_layer3D.Type == Layer3DType.Dataset) { Layer3DDataset layer3DDataset = m_layer3D as Layer3DDataset; Layer3DSettingVector layerSetting = layer3DDataset.AdditionalSetting as Layer3DSettingVector; m_style3D = layerSetting.Style; } else if (m_layer3D.Type == Layer3DType.VectorFile) { Layer3DVectorFile layer3DFile = m_layer3D as Layer3DVectorFile; Layer3DSettingVector layerSetting = layer3DFile.AdditionalSetting as Layer3DSettingVector; m_style3D = layerSetting.Style; } } this.UpdateData(); }
/// <summary> /// 加载地下管道线 /// </summary> public void LoadPipeLine3D() { try { m_SelectedGeoNetwork = new List <NetworkGeometry>(); DatasetVector dataset_PipeLine = m_workspace.Datasources["Pipeline3D"].Datasets["PipeLine3D"] as DatasetVector; DatasetVector dataset_PipePoint = m_workspace.Datasources["Pipeline3D"].Datasets["PipePoint3D"] as DatasetVector; Layer3DSettingVector setvetor = new Layer3DSettingVector(); setvetor.Style.AltitudeMode = AltitudeMode.RelativeToGround; setvetor.Style.LineSymbolID = 962048; setvetor.Style.LineWidth = 0.35; Layer3DDataset layer_ditie = m_sceneControl.Scene.Layers.Add(dataset_PipeLine, setvetor, true, "PipeLine3D"); Layer3DDataset layer_pipepoint = m_sceneControl.Scene.Layers.Add(dataset_PipePoint, setvetor, true, "PipePoint3D"); if (dataset_PipePoint != null) { Theme3DUnique theme = new Theme3DUnique(); theme.UniqueExpression = "SmID"; GeoStyle3D style3D = new GeoStyle3D(); style3D.AltitudeMode = AltitudeMode.RelativeToGround; style3D.Marker3DScaleX = 2.2; style3D.Marker3DScaleY = 2.2; style3D.Marker3DScaleZ = 2.2; style3D.IsMarker3D = true; theme.DefaultStyle = style3D; Recordset rs = dataset_PipePoint.Query("", CursorType.Static); rs.MoveFirst(); while (!rs.IsEOF) { Theme3DUniqueItem item = new Theme3DUniqueItem(); item.Unique = rs.GetID().ToString(); item.IsModellingStyleEnabled = true; GeoStyle3D tempStyle = new GeoStyle3D(style3D); PickNodeToLine(rs.GetID()); GeoPoint3D geoPoint3D = rs.GetGeometry() as GeoPoint3D; List <Vector3d> arrVector3d = new List <Vector3d>(); for (Int32 curIndex = 0; curIndex < m_SelectedGeoNetwork.Count; curIndex++) { NetworkGeometry geoNetWork = m_SelectedGeoNetwork[curIndex]; if (geoNetWork != null) { Vector3d vec = new Vector3d(); GeoLine3D geoLine = geoNetWork.geometry as GeoLine3D; if (geoNetWork.bIsIn) { if (geoLine != null) { Point3Ds point3D = geoLine[0]; Point3D pntTNode = point3D[1]; Point3D pntFNode = point3D[0]; Vector3d vecTNode = SphericalToCartesian(pntTNode.X * DTOR, pntTNode.Y * DTOR, pntTNode.Z); Vector3d vecFNode = SphericalToCartesian(pntFNode.X * DTOR, pntFNode.Y * DTOR, pntFNode.Z); vec = new Vector3d(vecFNode.x - vecTNode.x, vecFNode.y - vecTNode.y, vecFNode.z - vecTNode.z); vec.Normalize(); } } else { if (geoLine != null) { Point3Ds point3D = geoLine[0]; Point3D pntFNode = point3D[0]; Point3D pntTNode = point3D[1]; Vector3d vecTNode = SphericalToCartesian(pntTNode.X * DTOR, pntTNode.Y * DTOR, pntTNode.Z); Vector3d vecFNode = SphericalToCartesian(pntFNode.X * DTOR, pntFNode.Y * DTOR, pntFNode.Z); vec = new Vector3d(vecTNode.x - vecFNode.x, vecTNode.y - vecFNode.y, vecTNode.z - vecFNode.z); vec.Normalize(); } } vec = FromAngleAxis(vec, -geoPoint3D.X * DTOR, new Vector3d(0, 1, 0)); vec = FromAngleAxis(vec, geoPoint3D.Y * DTOR, new Vector3d(1, 0, 0)); vec.Normalize(); arrVector3d.Add(vec); } } Vector3d vecX = new Vector3d(); Vector3d vecY = new Vector3d(); Vector3d vecZ = new Vector3d(); switch (m_SelectedGeoNetwork.Count) { case 2: //弯头或阀门 { if (arrVector3d.Count == 2) { vecX = arrVector3d[0].Normalize().Sub(); vecY = arrVector3d[1].Normalize(); } double dAngle1_2 = vecX.DotProduct(vecY); if (Math.Abs(dAngle1_2) < 0.3) { tempStyle.MarkerSymbolID = 54441; } else if (-1 < dAngle1_2 && dAngle1_2 < 0.7) { tempStyle.MarkerSymbolID = 54442; } else { vecY.z = 0; Vector3d vec = new Vector3d(0, 0, 1); vecX = vecY.CrossProduct(vec); tempStyle.MarkerSymbolID = 54435; } } break; case 3: //三通 { tempStyle.MarkerSymbolID = 54437; if (arrVector3d.Count == 3) { Vector3d vec1 = arrVector3d[0]; Vector3d vec2 = arrVector3d[1]; Vector3d vec3 = arrVector3d[2]; double dAngle1_2 = vec1.DotProduct(vec2); double dAngle1_3 = vec1.DotProduct(vec3); double dAngle2_3 = vec2.DotProduct(vec3); if (Math.Abs(dAngle1_2) < 0.3) { if (Math.Abs(dAngle1_3) < 0.3) { vecX = vec1.Normalize().Sub(); vecY = vec2.Normalize(); } else { vecX = vec2.Normalize().Sub(); vecY = vec1.Normalize(); } } else { vecX = vec3.Normalize().Sub(); vecY = vec1.Normalize(); } } } break; case 4: //四通 { tempStyle.MarkerSymbolID = 54438; if (arrVector3d.Count == 4) { Vector3d vec1 = arrVector3d[0]; Vector3d vec2 = arrVector3d[1]; Vector3d vec3 = arrVector3d[2]; double dAngle1_2 = vec1.DotProduct(vec2); double dAngle1_3 = vec1.DotProduct(vec3); vecX = vec1; if (Math.Abs(dAngle1_2) < 0.3) { vecY = vec2.Normalize(); } else { vecY = vec3.Normalize(); } } } break; default: //结点 { tempStyle.MarkerSymbolID = 330101; } break; } if (m_SelectedGeoNetwork.Count > 1) { vecZ = vecX.CrossProduct(vecY); vecZ.Normalize(); Vector3d vecRotate = ToEulerAnglesXYZ(vecX, vecY, vecZ); tempStyle.Marker3DRotateX = -vecRotate.x * RTOD; tempStyle.Marker3DRotateY = -vecRotate.y * RTOD; tempStyle.Marker3DRotateZ = -vecRotate.z * RTOD; } item.Style = tempStyle; theme.Add(item); rs.MoveNext(); } rs.Dispose(); Layer3D layer_theme = m_sceneControl.Scene.Layers.Add(dataset_PipePoint, theme, true, "underPipeLine3D"); layer_theme.IsSelectable = false; if (m_sceneControl.Scene.Layers.Contains("PipePoint3D")) { m_sceneControl.Scene.Layers.Remove("PipePoint3D"); } Camera camera = m_sceneControl.Scene.Camera; camera.AltitudeMode = AltitudeMode.RelativeToGround; camera.Altitude = 26.978640816174448; camera.Latitude = 39.992608337161023; camera.Longitude = 116.3898561529368; camera.Tilt = 59.567389444384283; camera.Heading = 300.19323029928478; m_sceneControl.Scene.Fly(camera, 1); } } catch (Exception ex) { MessageBox.Show(ex.Message); } }