DWG -> Трёхмерная таблица - Страница 2
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > DWG -> Трёхмерная таблица

DWG -> Трёхмерная таблица

Ответ
Поиск в этой теме
Непрочитано 11.07.2010, 00:19
DWG -> Трёхмерная таблица
Lazerus
 
Регистрация: 11.07.2010
Сообщений: 24

Добрый вечер!

Ситуация следующая:

Необходимо привести DWG файл к трёхмерной таблице цветов, чтобы была возможность проходя по осям X, Y и Z считать цвет трёхмерной точки и, следовательно, понимать, что данная точка заполнена чем либо.

Скачал ARX для AutoCAD 2011, но разобраться так и не смог.
Пытался оттолкнуться от типа AcDbDatabase, но без результатно.
Просмотров: 13435
 
Непрочитано 13.07.2010, 00:39
#21
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Эта тема стеб?
zamtmn вне форума  
 
Непрочитано 13.07.2010, 00:42
#22
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Не стебее других тем.
'Как жарить шашлык в центре Москвы' чем лучше?
__________________
...в шее моей жилы железные, и лоб мой - медный...

Последний раз редактировалось Pastor, 13.07.2010 в 00:48.
Pastor вне форума  
 
Автор темы   Непрочитано 13.07.2010, 15:53
#23
Lazerus


 
Регистрация: 11.07.2010
Сообщений: 24


Вцелом, ясно; но это не значит, что не нужно искать пути реализации.

И не стебайтесь. Раз не могу сделать - нужно искать и спрашивать!
Lazerus вне форума  
 
Непрочитано 13.07.2010, 17:07
#24
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,194


Цитата:
Сообщение от Lazerus Посмотреть сообщение
Добрый вечер!

Ситуация следующая:

Необходимо привести DWG файл к трёхмерной таблице цветов, чтобы была возможность проходя по осям X, Y и Z считать цвет трёхмерной точки и, следовательно, понимать, что данная точка заполнена чем либо.

Скачал ARX для AutoCAD 2011, но разобраться так и не смог.
Пытался оттолкнуться от типа AcDbDatabase, но без результатно.
Я так понимаю, надо определенным образом обработать dwg-файл, сгенерированный сторонней прогой?
Тогда неплохо бы пример исходного материала увидеть...

Последний раз редактировалось kp+, 13.07.2010 в 17:24.
kp+ вне форума  
 
Автор темы   Непрочитано 14.07.2010, 10:56
#25
Lazerus


 
Регистрация: 11.07.2010
Сообщений: 24


Цитата:
Сообщение от kp+ Посмотреть сообщение
Я так понимаю, надо определенным образом обработать dwg-файл, сгенерированный сторонней прогой?
Тогда неплохо бы пример исходного материала увидеть...
Любой DWG с любыми фигурами. А, вцелом, интересует здание, построенное в DWG, оно также будет состоять из фигур.
Lazerus вне форума  
 
Непрочитано 14.07.2010, 18:40
#26
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Фигура понятие плоское... а здание - объемное... к слову... Как вы хотите найти точки разных цветов на одной "фигуре"?
gomer вне форума  
 
Автор темы   Непрочитано 14.07.2010, 18:49
#27
Lazerus


 
Регистрация: 11.07.2010
Сообщений: 24


На данный момент мне помогли с кодом.Я смотрю, как он работает. Осталось узнать координаты всех точек из массива, но я не уверен, что этот код сделает то, что мне необходимо. Вобщем, я это сейчас проверяю.
Код:
[Выделить все]
 
#include <axlock.h> // add this header file
 
...
 
AcDbDatabase* pDatabase=new AcDbDatabase(false,false);
 
AcAxDocLock docLock(pDatabase);
 
if ( Acad::eOk != pDatabase->readDwgFile(_T("c:\\Drawing1.dwg") ) ) return;
 
Acad::ErrorStatus es;
 
AcDbEntity * entObj; 
AcDbBlockTable *pBlockTbl;
AcDbBlockTableRecord *pBlockTableRecord;
AcDbBlockTableRecordIterator *pBlockIterator;
pDatabase->getBlockTable(pBlockTbl, AcDb::kForRead);
pBlockTbl->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForRead);
pBlockTbl->close();
pBlockTableRecord->newIterator(pBlockIterator);
AcGeIntArray osnapModes,geomIds;
AcGePoint3dArray gripPoints; // your 3d points will be here
 
for (; !pBlockIterator->done(); pBlockIterator->step())
{
es = pBlockIterator->getEntity(entObj,AcDb::kForRead);
 
geomIds.removeAll();
 
osnapModes.removeAll();
 
gripPoints.removeAll();
 
ACHAR * myBuf; // your material
entObj->material(myBuf); //... do something with myBuf
AcDbObjectId eId = entObj->materialId(); // material objectId. If you want you can get all data opening material with such objectId
entObj->getGripPoints(gripPoints,osnapModes,geomId​s);
 
entObj->close();
 
/*
so, here you have:
"gripPoints" - it contains all grip points of current entity
"myBuf" - contains name of entity's material. don't forget to use acutDelString to free memory
"eId" - contains ObjectId of material "entity". If you want you can open it and get much more data about material
you may fill your data vector here with variables, described above.
*/
 
acutDelString(myBuf); // don't forget to free memory
 
}
pBlockTableRecord->close();
delete pBlockIterator;
delete pDatabase;
На сколько я понимаю, теперь у меня есть массив grip точек объекта. Кстати, как правильно переводится grip points?

Как оказалось, это не совсе то, что мне нужно. Этот код даёт массив спец точек объекта. Для параллелипипеда - 8 точек ( углы ), для конуса - одна ( вершина ). Поиски продолжаются...

Последний раз редактировалось Lazerus, 15.07.2010 в 08:35.
Lazerus вне форума  
 
Непрочитано 15.07.2010, 12:53
#28
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Каждый из AutoCAD'овских типов примитивов имеет свои характерные точки. Поэтому нужно понимать какие именно типы примитивов должны обрабатываться. Судя по последнему сообщению речь идет о твердых телах (3DSOLID - класс AcDb3dSolid). Для получения геометрии 3DSOLID следует использовать BREP - смотри пример ObjectARX 20XX\utils\brep\
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 17.07.2010, 12:21
#29
Lazerus


 
Регистрация: 11.07.2010
Сообщений: 24


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Каждый из AutoCAD'овских типов примитивов имеет свои характерные точки. Поэтому нужно понимать какие именно типы примитивов должны обрабатываться. Судя по последнему сообщению речь идет о твердых телах (3DSOLID - класс AcDb3dSolid). Для получения геометрии 3DSOLID следует использовать BREP - смотри пример ObjectARX 20XX\utils\brep\
Хорошо. Буду разбираться, хоть там и много разных файлов и каждая функция и процедура из них мне в новинку.
Lazerus вне форума  
 
Непрочитано 17.07.2010, 20:45
#30
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


AcBrEntity::getPointContainment должна помочь
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 17.07.2010, 23:27
#31
Lazerus


 
Регистрация: 11.07.2010
Сообщений: 24


А как тогда пройтись по всем Entity в виде AcBrEntity? Или как можно скопировать AcDbEntity в AcBrEntity?
Lazerus вне форума  
 
Непрочитано 18.07.2010, 01:10
#32
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Используя BREP можно узнать находится ли конкретная точка внутри конкретного твердого тела (AcDb3dSolid). Смотри ObjectARX 20XX\utils\brep\samples\brepsamp\brptcnt.cpp, функцию pointContainment. Она использует метод AcBrEntity::getPointContainment для получения этой информации.
Для всех AcDbEntity это не работает - только для AcDb3dSolid и AcDbRegion
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 18.07.2010, 11:32
#33
Lazerus


 
Регистрация: 11.07.2010
Сообщений: 24


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Используя BREP можно узнать находится ли конкретная точка внутри конкретного твердого тела (AcDb3dSolid). Смотри ObjectARX 20XX\utils\brep\samples\brepsamp\brptcnt.cpp, функцию pointContainment. Она использует метод AcBrEntity::getPointContainment для получения этой информации.
Для всех AcDbEntity это не работает - только для AcDb3dSolid и AcDbRegion
Вы не поняли вопрос. Как мне пройтись по всем элементам DWG файла, чтобы запустить pointContainment для каждого элемента?
Lazerus вне форума  
 
Непрочитано 18.07.2010, 12:57
#34
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Lazerus Посмотреть сообщение
Вы не поняли вопрос.
Вопрос я как раз понял. Как пройтись по всем элементам чертежа у тебя (более-менее) есть в http://forum.dwg.ru/showpost.php?p=597586&postcount=27
А как получить AcBrEntity из AcDbEntity можно глянуть здесь: http://www.caduser.ru/forum/index.ph...#message125793
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 18.07.2010, 13:54
#35
Lazerus


 
Регистрация: 11.07.2010
Сообщений: 24


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Вопрос я как раз понял. Как пройтись по всем элементам чертежа у тебя (более-менее) есть в http://forum.dwg.ru/showpost.php?p=597586&postcount=27
А как получить AcBrEntity из AcDbEntity можно глянуть здесь: http://www.caduser.ru/forum/index.ph...#message125793
Спасибо! Такой вопрос, этот метод внутренних точек подойдёт для фигур нестандартной формы? Если нет, то какой способ подойдёт?
Lazerus вне форума  
 
Непрочитано 18.07.2010, 16:42
#36
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Lazerus Посмотреть сообщение
Такой вопрос, этот метод внутренних точек подойдёт для фигур нестандартной формы?
Этот метод должен работать для любых 3DSOLID.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 18.07.2010, 23:13
#37
Lazerus


 
Регистрация: 11.07.2010
Сообщений: 24


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Вопрос я как раз понял. Как пройтись по всем элементам чертежа у тебя (более-менее) есть в http://forum.dwg.ru/showpost.php?p=597586&postcount=27
А как получить AcBrEntity из AcDbEntity можно глянуть здесь: http://www.caduser.ru/forum/index.ph...#message125793
Не получается получить AcBrEntity. Выдаёт ошибки.

Код:
[Выделить все]
AcBr::ErrorStatus ebr;
ads_name en;
ads_point pt;
AcDbObjectPointer <AcDbCurve> pline(entObj->objectId(),AcDb::kForRead) ;
AcDbVoidPtrArray ar, regions;
ar.append(pline.object());
AcDbRegion reg; 
reg.copyFrom((AcDbRegion *)regions[0]);
for (int i=0; i<regions.length();i++) 
	delete regions[i];
AcBrBrep brEnt;
ebr = brEnt.set(reg);
Lazerus вне форума  
 
Непрочитано 18.07.2010, 23:46
#38
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Извини, но я дал уже такое количество подсказок и ссылок, что можно было бы уже самостоятельно решить поставленную задачу.
В коде написана полная ерунда - какой-то бессвязный набор.
Александр Ривилис вне форума  
 
Непрочитано 19.07.2010, 15:08
#39
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Цитата:
В коде написана полная ерунда - какой-то бессвязный набор.
А ничего другого и быть не может. См. пост №19. Человек первый раз видит автокад и, тем более, ObjectARX.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Автор темы   Непрочитано 19.07.2010, 17:15
#40
Lazerus


 
Регистрация: 11.07.2010
Сообщений: 24


Думаю, что этот код должен выполняться, но выдаёт ошибку:
Код:
[Выделить все]
AcDbEntity *entObj;
//Далее доступ ко всем Entity по уже известному алгоритму.
AcBrEntity *pEnt;
((AcBrBrep*)pEnt)->set((const AcDbEntity&)*entObj);




На данный момент вот, что вышло:
Код:
[Выделить все]
AcBrEntity* pBrEnt = new AcBrBrep();
AcDbObjectIdArray objIdList;
AcDb::SubentType subType = AcDb::kNullSubentType;
AcDbFullSubentPath subPath;
AcDb3dSolid* pSolid = NULL;
AcBr::ErrorStatus returnValue = AcBr::eOk;
objIdList.append(entObj->objectId());
if ((pSolid = AcDb3dSolid::cast(entObj)) != NULL) 
{
subPath = kNullSubent;
subPath.objectIds() = objIdList;
} 
returnValue = ((AcBrBrep*)pBrEnt)->set(subPath);
if (returnValue != AcBr::eOk) 
{
acutPrintf(ACRX_T("\n Error in AcBrEntity::set:"));
acutPrintf(ACRX_T(" AutoCAD Error Code: %d\n"), returnValue);
delete pBrEnt;
//return false;
}

Класс тёмного объекта AcDbSubDMesh, он был солидом, но я сгладил его. Если пытаюсь вбить его в pBrEnt возникает ошибка.

Последний раз редактировалось Lazerus, 19.07.2010 в 17:38.
Lazerus вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > DWG -> Трёхмерная таблица



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
формат Corel'a -> dxf или dwg. Как? the_sun Прочее. Программное обеспечение 15 07.02.2013 15:10
Сконвертируйте пожалуйста CDW (версию не знаю) -> DWG 2006 vama Прочее. Программное обеспечение 1 22.10.2009 12:50
Пакетный перегон dxf -> dwg возможно ли ? bdfy AutoCAD 4 15.11.2006 21:41
Хороший конвертер DWG -> JPG solegs AutoCAD 15 09.12.2004 18:24
dwg 2005 -> dwg 2002. нужна программа Torero AutoCAD 5 22.09.2004 14:20