今天介绍下超图三维模型批量旋转
先看一下绕某一点旋转180度的效果,右边旋转前,左边旋转后:
该demo主要涉及两个知识点
1. 临时数据源的创建
2. 批量旋转的实现
界面如下:
可以选场景中的模型图层(仅支持地理坐标系),可以自定义旋转衷心,也可以以数据集中心点为旋转中心。
可以另存,也可以保存至源数据。
临时数据源的创建
创建临时数据源
临时数据源主要保存一些中间数据,在关闭工作空间时不会保存临时数据源的数据。
主要代码:
private void CreateTempDatasource()
{
foreach (Datasource item in m_sceneControl.Scene.Workspace.Datasources)
{
//存在临时数据源时就不需要创建
if (item.ConnectionInfo.Server.Contains(m_datasrouceName))
{
m_tempDatasource = item;
break;
}
}
if (m_tempDatasource == null)
{
DatasourceConnectionInfo info = new DatasourceConnectionInfo();
//string m_datasrouceName = "临时数据源"
info.Alias = m_datasrouceName;
// string m_server=":memory:"
info.Server = m_server;
m_tempDatasource = m_sceneControl.Scene.Workspace.Datasources.Create(info);
}
}
创建的临时数据源如下(tempData_为创建的临时数据集):
值得注意的是,当临时数据源过大时会在本地(指定路径,具体路径记不清楚了)创建一个文本型数据原,但是关闭工作空间会自动删除该文件。故在判断数据源是不是临时数据源不能只判断server。
创建临时数据集
//创建临时数据集
private DatasetVector CreateDatasetVector(Datasource desDatasource, string datasetName, bool isTemp)
{
DatasetVector dataset = null;
if (isTemp)
{
desDatasource.Datasets.Delete(datasetName);
}
DatasetVectorInfo info = new DatasetVectorInfo();
info.Name = datasetName;
info.Type = DatasetType.Model;
dataset = m_tempDatasource.Datasets.Create(info);
dataset.PrjCoordSys = new PrjCoordSys(PrjCoordSysType.EarthLongitudeLatitude);
return dataset;
}
new PrjCoordSys(PrjCoordSysType.EarthLongitudeLatitude)表示wgs84地理坐标系,单位为度。
批量旋转的实现
模型批量旋转的实现实际上分为三步:
- 1.记录模型初始位置并将模型移动到旋转中心
- 2.旋转模型(RotationZ)
- 3.旋转模型原始点(绕旋转中心)并将模型移动到旋转后的点
主要代码:
private void ModelRotate(DatasetVector selectedDataset, DatasetVector desDataset)
{
//旋转角度
double rorationAngle = (double)m_numericUpDownAngle.Value;
//目标数据集
Recordset srcRecordset = selectedDataset.GetRecordset(false, CursorType.Static);
//desDataset临时数据集
Recordset desRecordset = desDataset.GetRecordset(false, CursorType.Dynamic);
desRecordset.Batch.Begin();
m_progressBar.Maximum = srcRecordset.RecordCount;
m_progressBar.Value = 0;
while (!srcRecordset.IsEOF)
{
GeoModel3D model3D = srcRecordset.GetGeometry() as GeoModel3D;
if (model3D == null)
{
srcRecordset.MoveNext();
m_progressBar.Value++;
continue;
}
// 1.记录模型初始位置并将模型移动到旋转中心
Point3D originalPos = model3D.Position;
model3D.Position = new Point3D(m_rotateCenter.X, m_rotateCenter.Y, 0);
// 2.旋转模型(RotationX)
model3D.RotationZ += rorationAngle;
// 3.旋转模型原始点(绕旋转中心)并将模型移动到旋转后的点
GeoPoint newPos = new GeoPoint(originalPos.X, originalPos.Y);
newPos.Rotate(m_rotateCenter, rorationAngle);
model3D.Position = new Point3D(newPos.X, newPos.Y, originalPos.Z);
desRecordset.AddNew(model3D);
m_progressBar.Value++;
srcRecordset.MoveNext();
}
desRecordset.Batch.Update();
desRecordset.Dispose();
desRecordset = null;
srcRecordset.Dispose();
srcRecordset = null;
}
由于三维没有绕某一点旋转,所以需要将点转成二维点(GeoPoint2D)再旋转。
好了,就介绍这么多了。