模型批量旋转

来源:互联网 发布:开淘宝店一个月能赚多少钱 编辑:程序博客网 时间:2024/05/29 13:15

今天介绍下超图三维模型批量旋转

先看一下绕某一点旋转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)再旋转。

好了,就介绍这么多了。