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

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

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

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

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

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

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

Скачал ARX для AutoCAD 2011, но разобраться так и не смог.
Пытался оттолкнуться от типа AcDbDatabase, но без результатно.
Просмотров: 13407
 
Непрочитано 11.07.2010, 11:39
#2
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Lazerus Посмотреть сообщение
Необходимо привести DWG файл к трёхмерной таблице цветов, чтобы была возможность проходя по осям X, Y и Z считать цвет трёхмерной точки и, следовательно, понимать, что данная точка заполнена чем либо.
Не знаю как другие, но лично я не смог понять что за "трёхмерная таблица цветов" (цвета всех пикселов в плоскости XY для каждого уровня Z что-ли...) и зачем такое может понадобиться.
hwd вне форума  
 
Автор темы   Непрочитано 11.07.2010, 11:54
#3
Lazerus


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


Цитата:
Сообщение от hwd Посмотреть сообщение
Не знаю как другие, но лично я не смог понять что за "трёхмерная таблица цветов" (цвета всех пикселов в плоскости XY для каждого уровня Z что-ли...) и зачем такое может понадобиться.
Да. Хоть даже если в списке параметров каждого пункта ( или точки ) будет не только цвет.

Грубо говоря, необходимо обойти все точки по осям X, Y, Z, собрав их информацию.
Lazerus вне форума  
 
Непрочитано 11.07.2010, 12:22
#4
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Lazerus Посмотреть сообщение
Да. Хоть даже если в списке параметров каждого пункта ( или точки ) будет не только цвет.

Грубо говоря, необходимо обойти все точки по осям X, Y, Z, собрав их информацию.
и зачем это нужно? информация какого рода?
hwd вне форума  
 
Непрочитано 11.07.2010, 12:27
#5
gomer

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


Так подойдет? Это эскиз, так что можно развить идею...
Код:
[Выделить все]
(defun c:test ( / dummy ss i tmp result)
  (vl-load-com)
  (if (setq ss (ssget "_X" (list '(0 . "POINT"))))
	(setq
	  i 0 result '() dummy
	  (repeat (sslength ss)
		(setq
		  result
		  (cons
			(cons
			  (vla-get-Coordinates (setq tmp (vlax-ename->vla-object (ssname ss i))))
			  (vla-get-Color tmp)
			)
			result
		  )
		  i (1+ i)
		)
	  )
	)
  )
  result
)
gomer вне форума  
 
Автор темы   Непрочитано 11.07.2010, 12:57
#6
Lazerus


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


Цитата:
Сообщение от hwd Посмотреть сообщение
и зачем это нужно? информация какого рода?
Для рассчёта теплообмена здания, и учётом объектов внутри здания. Главная проблема с обходом DWG файла по осям.

Цитата:
Сообщение от hwd Посмотреть сообщение
Так подойдет? Это эскиз, так что можно развить идею...
Ой, я вобще новичёк в AutoCAD, но постараюсь разобраться. Дело в том, что я ещё не разобрался как такие скрипты запускать. Насколько я понял, Вы написали макрос для AutoCAD.

Последний раз редактировалось Lazerus, 11.07.2010 в 13:05.
Lazerus вне форума  
 
Непрочитано 11.07.2010, 13:40
#7
gomer

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


>Lazerus: В таком случае читайте справку, чтоб различать, что такое скрипт(сценарий), программа на autolisp или макрос VBA... и как этим пользоваться!
в данном случае скопируйте код в командную строку, затем в ней же наберите: test... если в рисунке есть точки различных цветов, то получите список точек и их цветов!
gomer вне форума  
 
Непрочитано 11.07.2010, 13:43
#8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


Раздел публикации -> как использовать лисп, опубликованный на форуме
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.07.2010, 21:54
#9
lene-caress


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


я бы решала Вашу задачу примерно так (ObjectARX):

1. определить какие объекты нужно подвергнуть преобразованию (выделение)

2. определить границы (диапозоны координат по каждой из осей) трехмерной области

3. определить разрешающую способность результирующей таблицы
ТЕ какой объем векторного пространства будет отображатся на одну ячейку таблицы-результата.
чем больше ячейка - тем проще считать, но хуже детализация,
чем меньше ячейки - тем больше операций счета и памяти требуется, но детализация лучше.

4. выделить память под таблицу, определить функции для преобразования координат
из векторного пространства в дискретные координаты таблицы.
каждая ячейка таблицы работает по принципу аккомулятора(накопителя):
она хранит значения("цвета") объектов пересекающихся с ней
и вес - долю объема ячейки которую занимает объект.

4. а вот самое интересное тут.
нужно пройти по списку объектов полученных в пункте 1,
найти ячейки таблицы которые содержат этот объект и вычислить "влияние"
объекта на эти ячейки.
ТЕ если стена дома имеет "цвет" C1 и занимает половину объема ячейки,
то добавляем в аккомулятор ячейки значения цвета и долю объема, в данном случае 0.1
-
подробности этого пункта зависят от того какие типы объектов Вы используете,
и других подробностей.
здесь потребуется привлечь достаточно много математики.

5. по окончании сканирования объектов
в ячейках будут данные о влиянии объектов на них,
можно вычислить средне-весовое этих данных
и сохранить массив данных в любом

по информации:

как получить список объектов, как получить доступ к ним:
http://arxdummies.blogspot.com/2005/...tion-sets.html

метод луча, для определения принадлежности точки многоугольнику (может помочь с пунктом 4):
http://ru.wikipedia.org/wiki/%D0%90%...B8.D1.82.D0.BC
lene-caress вне форума  
 
Автор темы   Непрочитано 11.07.2010, 22:05
#10
Lazerus


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


Цитата:
Сообщение от gomer Посмотреть сообщение
>Lazerus: В таком случае читайте справку, чтоб различать, что такое скрипт(сценарий), программа на autolisp или макрос VBA... и как этим пользоваться!
в данном случае скопируйте код в командную строку, затем в ней же наберите: test... если в рисунке есть точки различных цветов, то получите список точек и их цветов!
Разукрасил материалами, но результат лисп скрипта - nil.

lene-caress, спасибо! Я так понимаю, что невозможно просто пройтись по осям и узнать значения каждой точки через Object ARX. Впринципе, мне без разницы что использовать: ARX или что-либо ещё. В любом случае, постораюсь разобраться по предоставленному Вами плану.

Последний раз редактировалось Lazerus, 11.07.2010 в 22:13.
Lazerus вне форума  
 
Непрочитано 11.07.2010, 22:17
#11
gomer

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


хватит стебаться... автор, пример в студию
gomer вне форума  
 
Непрочитано 11.07.2010, 22:46
#12
lene-caress


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


Цитата:
Сообщение от Lazerus Посмотреть сообщение
lene-caress, спасибо! Я так понимаю, что невозможно просто пройтись по осям и узнать значения каждой точки через Object ARX. Впринципе, мне без разницы что использовать: ARX или что-либо ещё. В любом случае, постораюсь разобраться по предоставленному Вами плану.
да - невозможно
дело, однако, не в ObjectARX а в том, что acad оперирует векторными данными, в то время как Вам требуются данные по структуре похожие на растр, только трехмерные.
lene-caress вне форума  
 
Автор темы   Непрочитано 11.07.2010, 23:10
#13
Lazerus


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


Цитата:
Сообщение от lene-caress Посмотреть сообщение
да - невозможно
дело, однако, не в ObjectARX а в том, что acad оперирует векторными данными, в то время как Вам требуются данные по структуре похожие на растр, только трехмерные.
А Вы занимаетесь с ARX? Если "Да", то не моглибы привести пример? Конкретно интересуют координаты объекта, размер, расположение. Я в любом случае буду пытаться разобраться сам, но всёже при наличии примера былобы быстрее.
Lazerus вне форума  
 
Непрочитано 11.07.2010, 23:21
#14
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Lazerus Посмотреть сообщение
моглибы... всёже... былобы...
Offtop: Чем-то напоминает манеру письма Павла Лукьянченко...
hwd вне форума  
 
Автор темы   Непрочитано 11.07.2010, 23:27
#15
Lazerus


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


Цитата:
Сообщение от hwd Посмотреть сообщение
Offtop: Чем-то напоминает манеру письма Павла Лукьянченко...
Понравилась фраза "Лучше день потерять за то за пол часа долететь". Но я не он. Хотя возможно, не понял соль фразы.
Lazerus вне форума  
 
Непрочитано 12.07.2010, 02:18
#16
lene-caress


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


как я уже говорила, вот тут описан способ получения списка объектов.
http://arxdummies.blogspot.com/2005/...tion-sets.html

в самом конце заметки дан исходный код, который по полученному ads_name
получает сначала AcDbObjectId, а потом получает сам объект (AcDbEntity*) с помощью функции acdbOpenAcDbEntity

если проводить аналогии (немного кривые) AcDbObjectId похож на первичный ключ (primary key) в реляционных СУБД.
а функция acdbOpenAcDbEntity позволяет получить доступ к объекту идентифицируемому ключем.

полученный AcDbEntity можно преобразовать к нужному типу объекта,
но поскольку тип зарание не известен, то получается:
* либо пробовать преобразовать для каждого обрабатываемого нашей программой типа,
* либо как-то идентифировать что за объект у нас есть.

в предках AcDbEntity есть класс AcRxObject у него есть метод desc()
этот метод возвращает AcRxClass, у него есть метод name(),
который возвращает строковый идентификатор типа объекта
для объекта AcDbLine это будет строчка "AcDbLine"

в любом случае, если нам нужно попробовать привести AcDbEntity к типу пригодному для обработки.

пусть наш объект в переменной:
AcDbEntity *ent ...


либо воспользовавшись данными ent->desc()->name() либо методом "квазинаучного тыка"
пробуем преобразовать объект к типу AcDbLine:
Код:
[Выделить все]
AcDbLine *line = AcDbLine::cast( ent );
if ( line != NULL )
	{
	// если у нас это получилось
	// значит наш ent совместим (является или унаследован) с AcDbLine
	// значит мы можем чтото делать, например получить координаты начальной точки:
	// line->startPoint(); // тип результата AcGePoint3d
	}
аналогично для других типов...

что касается функций из AcDb* здесь проблем быть не должно
они описаны в документации (ObjectARX Reference) и достаточно понятны.

лично у меня вечные проблемы с написанием пользовательского интерфейса и т.п.

Последний раз редактировалось Кулик Алексей aka kpblc, 12.07.2010 в 07:01.
lene-caress вне форума  
 
Автор темы   Непрочитано 12.07.2010, 09:03
#17
Lazerus


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


lene-caress, спасибо! Кстати, а что нужно будет делать, если рёбра объекта деформированны, где хранитмя информация о деформации? Не знаю, можно ли так сделать, но уверен, что AutoCAD представляет такую возможность.
Lazerus вне форума  
 
Непрочитано 12.07.2010, 12:21
#18
Pastor

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


Вы говорили, что все затевается для "рассчёта теплообмена здания, и учётом объектов внутри здания."
Может имеет смысл рассказать вкратце, что за программа будет делать этот расчет и какие входные данные её требуются?
Просто невозможно просмотреть все точки трехмерного пространства в принципе, поскольку их бесконечное множество. Тут дискретизация требуется ( о чем говорила lene-caress). Но можно ведь и по другому подойти. Собрать все объекты в набор и проанализировать каждый из них. Ведь получить сведения о характерных точках, ребрах и гранях можно непосредственно из объектов не сканируя вдоль и поперек трехмерное пространство. Есть шанс, что вам предложат иной подход к решению, если будет достаточно информации о входных требованиях программы теплового расчета.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Автор темы   Непрочитано 12.07.2010, 23:40
#19
Lazerus


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


Цитата:
Сообщение от Pastor Посмотреть сообщение
Вы говорили, что все затевается для "рассчёта теплообмена здания, и учётом объектов внутри здания."
Может имеет смысл рассказать вкратце, что за программа будет делать этот расчет и какие входные данные её требуются?
Просто невозможно просмотреть все точки трехмерного пространства в принципе, поскольку их бесконечное множество. Тут дискретизация требуется ( о чем говорила lene-caress). Но можно ведь и по другому подойти. Собрать все объекты в набор и проанализировать каждый из них. Ведь получить сведения о характерных точках, ребрах и гранях можно непосредственно из объектов не сканируя вдоль и поперек трехмерное пространство. Есть шанс, что вам предложат иной подход к решению, если будет достаточно информации о входных требованиях программы теплового расчета.
Главное знать все заполненные материалом пункты и сам материал. Если не возможно пробежаться по осям всей системы координат, тогда буду рассматривать каждый объект отдельно и заносить инфу в свой трёхмерный массив; но тогда возникает проблема реализации, которую я пытаюсь решить. Я никогда ARX не использовал, ровным счётом, как и AutoCAD.
Lazerus вне форума  
 
Непрочитано 13.07.2010, 00:35
#20
Pastor

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


Цитата:
Я никогда ARX не использовал, ровным счётом, как и AutoCAD.
Ну тогда нужно научиться работе в AutoCAD и программированию в нем одним из трех способов - LISP, ObjectARX или .NET. Причем, научиться программировать, не имея навыков обычного пользователя, не получится.
Научится работать - это книжка страниц на 800 (какая нибудь "библия").
Научиться программировать на LISP - книжка Н.Н.Полещука (~ 500 стр.) + форум на этом сайте.
Научитья ObjectARX - это учебник по языку С++ и год жизни (если с учебником повезет) + справка по ObjectARX и ещё год жизни (если умеете читать по английски) + форум по ObjectARX на сайте caduser.ru.
И, наконец, .NET программирование в AutuCAD - требует знаний языка С# (или VB.NET) и самой платформы .NET, знаний классического ObjectARX (поскольку является оболочкой вокруг ObjectARX) и железных нервов, поскольку отвратительно документирована.
Вот такие перспективы. С наскоку не решить.
Можно ещё нанять программиста...
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
Ответ
Вернуться   Форум 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