ADN Open CIS
Сообщество программистов Autodesk в СНГ

12/11/2014

Координаты точек в примитиве Облако точек

Для примитива PointCloud, созданного с использованием PCG файла, простейший способ для получения координат точек будет вставка пространственного фильтра при помощи метода acdbModifyPointCloudDataView. Для примитива PointCloud созданного из RCP файла, нужно вставить пространственный фильтр при помощи методаAcDbPointCloudEx::addSpatialFilter. Когда пространственный фильтр создан можно получить доступ ко всем координатам. Другой метод – использовать AcDbPointCloudEx::traverseAllPointData.

Вот пример кода, использующий метод traverseAllPointData :

Код - C++: [Выделить]
  1. #include "AcPointCloud.h"
  2. #include "AcDbPointCloudEx.h"
  3. #include "AcDbPointCloudApi.h"
  4.  
  5. class MyPointCloudProcessor : public IAcDbPointCloudPointProcessor
  6. {
  7. public:
  8.     MyPointCloudProcessor(){}
  9.  
  10.     virtual ~MyPointCloudProcessor(){}
  11.  
  12.     virtual ProcessSate process(
  13.                     const IAcDbPointCloudDataBuffer* buffer)
  14.     {
  15.         const AcGePoint3d *pts = buffer->points();
  16.         for(int cnt = 0; cnt < buffer->numPoints(); cnt++)
  17.         {
  18.             AcGePoint3d pt = pts[cnt];
  19.             // Получаем координаты точки
  20.         }
  21.         return ProcessSate::Continue;
  22.     }
  23. };
  24.  
  25. static void AdskMyTestCommand()
  26. {
  27.     ads_point pt;
  28.     ads_name name;
  29.     if (acedEntSel ( L"Укажите облако точек ",  name, pt) != RTNORM)
  30.         return;
  31.  
  32.     AcDbObjectId id;
  33.     if (acdbGetObjectId(id, name) != Acad::eOk)
  34.         return;
  35.  
  36.     AcDbEntityPointer pEntity(id, AcDb::kForWrite);
  37.     if (pEntity.openStatus() != Acad::eOk)
  38.         return;
  39.  
  40.     AcDbPointCloudEx *pPtCloud = AcDbPointCloudEx::cast(pEntity);
  41.     if(pPtCloud == NULL)
  42.         return;
  43.  
  44.     MyPointCloudProcessor *pPCProcessor = new MyPointCloudProcessor();
  45.  
  46.     // Последний параметр – уровень детализации.
  47.     // На данный момент нет возможности получить максимальное
  48.     // значение детализации из примитива PointCloud.
  49.     // Вы можете передать значение от 1 до 100 в зависимости от того
  50.     // какая степень детализации вам требуется.
  51.     pPtCloud->traverseAllPointData(pPCProcessor, NULL,
  52.               IAcDbPointCloudDataBuffer::DataType::kColor, 2);
  53.     if(pPCProcessor != NULL)
  54.     {
  55.         delete pPCProcessor;
  56.         pPCProcessor = NULL;
  57.     }
  58. }

 

Источник: http://adndevblog.typepad.com/autocad/2014/05/coordinates-of-points-in-a-point-cloud-entity.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=1071

Опубликовано 12.11.2014
Отредактировано 12.11.2014 в 22:48:15