Schöck
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Создание и редактирование 3Д объектов с использованием .NET

Создание и редактирование 3Д объектов с использованием .NET

Ответ
Поиск в этой теме
Непрочитано 25.01.2010, 23:28
Создание и редактирование 3Д объектов с использованием .NET
NR4TR
 
Регистрация: 06.01.2010
Сообщений: 17

Постановка задачи.
Есть трёхмерная модель помещения/этажа/здания, непосредственно открытая в AutoCAD (год выпуска не важен, положим 2008 и выше).
Необходимо реализовать модуль, подгружаемый из самого автокада (именно из автокада, о внешнем приложении речь не идёт), который позволял бы анализировать геометрию (выделять вершины, грани, в идеале - блоки, затем, например, сохранять координаты в файл).

Вопрос.
На каком языке удобнее всего будет осуществлять программирование такого модуля? Первоначально выбор пал на C#, которым более-менее уверенно владею, но специалист, сведущий в смежной области, заверил, что программировать нужно исключительно на VBA. Или я недостаточно хорошо владею .net, или действительно есть колоссальная разница?
п.с.: для подгрузки модуля планирую использовать netload, я на правильном пути?)

/Оригинальное название: программирование на C# под AutoCAD (через NETLOAD)
kpblc/

Последний раз редактировалось Кулик Алексей aka kpblc, 01.02.2010 в 10:30.
Просмотров: 6472
 
Непрочитано 02.02.2010, 01:15
#21
Pastor

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


Судя по переписке с обозначенного форума Сеньор Менеджер там поначалу накосячил с освобождением объектов. Потом исправлял. Видать это больное место .NET, а .NET под автокад - в особенности. Микрософт велит для детерминированного освобождения native-ресурсов, стоящих за .NET классами-оболочками юзать паттерн Dispose. Применительно к автокаду - это если ума хватит. Где, например, в документации ObjectArx AutoCAD Managed Class Reference сказано, что класс Transaction реализует IDisposable. Я не нашел. Поправьте, если ошибаюсь. Фраза, типа "you must actively call Dispose on the managed wrappers" меня в принципе не устраивает. Что, я должен ко всему подряд применять Dispose() или хватит через раз. Ладно, с Transaction - кто то первый догадался и рассказал всем. А как быть с морем других классов. В конце концов есть же MSDN - образец того, как подобает документировать библиотеки классов. Что, автодеску западло было сделать нормальную документацию по образу и подобию.
Не знаю, "на каком языке удобнее всего" , но надежнее и естественнее всего писать на С++. ObjectARX мощное и хорошо изученное "средство доступа" к AutoCAD. А ежели чего, то всегда есть у кого спросить . А вот UI и все остальное можно и нужно писать на .NET и связывать одно с другим либо через экспортируемые в документ внешние функции, либо используя С++/CLI и смешанный код.
ИМХО.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 02.02.2010, 15:45
#22
hwd

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


Цитата:
Сообщение от Pastor Посмотреть сообщение
паттерн Dispose
Dispose - это не паттерн, а метод в составе интерфейса IDisposable.

Цитата:
Сообщение от Pastor Посмотреть сообщение
Судя по переписке с обозначенного форума Сеньор Менеджер там поначалу накосячил с освобождением объектов. Потом исправлял. Видать это больное место .NET, а .NET под автокад - в особенности.
Вывод не верный.

Цитата:
Сообщение от Pastor Посмотреть сообщение
Где, например, в документации ObjectArx AutoCAD Managed Class Reference сказано, что класс Transaction реализует IDisposable. Я не нашел. Поправьте, если ошибаюсь. Фраза, типа "you must actively call Dispose on the managed wrappers" меня в принципе не устраивает. Что, я должен ко всему подряд применять Dispose() или хватит через раз. Ладно, с Transaction - кто то первый догадался и рассказал всем. А как быть с морем других классов. В конце концов есть же MSDN - образец того, как подобает документировать библиотеки классов. Что, автодеску западло было сделать нормальную документацию по образу и подобию.
Обнаружить метод Dispose() в составе экземпляра класса не составляет труда.
В .Net API AutoCAD полно примеров, в которых класс Transaction инициализируется в блоке using. Учитывая это, любому программирующему на .Net даже без проверки становится ясно, что Transaction реализует IDisposable. То, что для неуправляемых объектов нужно вызывать Dispose - требование, о котором программисты .Net так же знают. Нужно только не забывать, что Dispose() следует вызывать только для тех объектов, которые ты создал сам и НЕ вызывать его для объектов, созданных самим AutoCAD, а не твоим плагином (и это логично). В том же MSDN на эту тему полно информации, так что незачем воду мутить.

"Нормальной" (в смысле такой же детальной как ObjectARX) документации по .Net пока нет, однако при желании можно читать ObjectARX - проблем в понимании не возникает. В случае отсутствия управляемой оболочки под тот или иной класс всегда можно самому её написать - тоже не проблема.
Цитата:
Сообщение от Pastor Посмотреть сообщение
Не знаю, "на каком языке удобнее всего" , но надежнее и естественнее всего писать на С++.
Под такими фразами нужно дописывать слово "ИМХО", поскольку это не есть абсолютная истина. Сколько людей - столько мнений. После C# язык C++ кажется мне не таким гармоничным. Однако я ведь не утверждаю, что С++ плох.

Цитата:
Сообщение от Pastor Посмотреть сообщение
ObjectARX мощное и хорошо изученное "средство доступа" к AutoCAD.
Эта библиотека собственно и является самим AutoCAD, его ядром, а не просто "средством".

Цитата:
Сообщение от Pastor Посмотреть сообщение
А вот UI и все остальное можно и нужно писать на .NET и связывать одно с другим либо через экспортируемые в документ внешние функции, либо используя С++/CLI и смешанный код.
ИМХО.
Вообще-то грамотная реализация GIU с основным кодом осуществляется посредством заранее продуманного набора интерфейсов (interfaces), без всяких извращений (Стив Макконнелл "Идеальный код" - рекомендую).

_____________________________________________________
п.с. ИМХО .Net давно рулит (за счет удобства, скорости разработки, богатого набора библиотек и наличия новых современных технологий таких как ADO.NET, WPF, LINQ) и будет рулить впредь. AutoCAD написан на неуправляемом С++ ранее, чем появился .Net Framework. У текущей реализации ядра AutoCAD есть такой минус, как отсутствие поддержки многопоточности, что является весьма неприятным моментом реализации ObjectARX.

п.с.2 Я не знаю ни одного программиста, перешедшего с C# на С++, но я регулярно вижу на форумах людей, переходящих с С++ на C#. Это о чём-то говорит...
п.с.3 Касательно "надёжности" - надёжней .Net,-язык т.к. его код полностью управляемый.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 02.02.2010 в 16:08.
hwd вне форума  
 
Непрочитано 02.02.2010, 18:54
#23
Александр Ривилис

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


Что-то вы забрались слишком в offtopic...
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 02.02.2010, 20:26
#24
NR4TR


 
Регистрация: 06.01.2010
Сообщений: 17
Отправить сообщение для NR4TR с помощью Skype™


напомню, про UI речь не идёт, планирую разработать плагин, подгружаемый netload'ом. про создания и редактирование 3D-объектов также речь не идёт.

вопрос на данный момент состоит в следующем:
по какому закону хранятся в памяти координаты вершин трёхмерных объектов, созданных Extrude'ами и Presspool'ами из контуров с прямыми углами и как наиболее эффективно и безошибочно собрать координаты вершин в удобоваримую структуру а-ля xml?

Последний раз редактировалось NR4TR, 02.02.2010 в 20:34.
NR4TR вне форума  
 
Непрочитано 02.02.2010, 20:27
#25
Pastor

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


1. По поводу паттерна, выдержка из MSDN:
Цитата:
....this is how a Visual C++ finalizer and a destructor that calls the finalizer maps to the Dispose pattern.

// C++ code
ref class T {
~T() { this->!T(); } // destructor calls finalizer
!T() {} // finalizer
};

// equivalent Dispose pattern
void Dispose(bool disposing) {
if (disposing) {
~T();
} else {
!T();
}
}
2.
Цитата:
В случае отсутствия управляемой оболочки под тот или иной класс всегда можно самому её написать - тоже не проблема.
Насколько я в курсе, такое возможно только на С++/CLI, что обязательно будет проблемой для программиста, не владеющего этим языком и что главнее - техникой написания подобных оболочек. И учебной литературы на эту тему крайне мало (мне пока встречалась только пара достойных внимания книг на английском языке).

3.
Цитата:
Однако я ведь не утверждаю, что С++ плох.
И я не утверждаю. Я утверждаю что собственно автокад нужно программировать на С++ и не пользоваться мутными ( отвратительно документированными) оболочками-посредниками. Зрить нужно в корень, а ObjectARX - и есть этот корень.

4.
Цитата:
Вообще-то грамотная реализация GIU с основным кодом осуществляется посредством заранее продуманного набора интерфейсов (interfaces), без всяких извращений
Если одно приложение экспортирует набор функций, а другое пользуется этим набором - это и есть их взаимодействие через интерфейс. Где тут извращение?

5. По поводу многопоточности.
Хотелось бы пример увидеть, как именно однопоточность автокада доставляет неприятности.

6.
Цитата:
Что-то вы забрались слишком в offtopic...
А вот и нет. Человек спрашивал на каком языке писать приложение к автокаду. Я высказал свое мнение (и ИМХО, кстати, в конце добавил), что функционал писать нужно на C++, а взаимодействие со сем остальным миром - на любом .NET языке (например С#). А взаимодействие этих двух частей осуществлять "посредством заранее продуманного набора интерфейсов", в частности с помощью внешних функций, экспортируемых в документ взаимодействующими ARX и .NET модулями.

И еще. Уважаемый гуру Kean Walmsley сделал таки ошибку, связянную с Dispose. Программируя на С++ тоже можно забыть вызвать delete. И чем одно лучше другого? И где тут ".NET надежней"?
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 02.02.2010, 21:51
#26
Александр Ривилис

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


Цитата:
Сообщение от NR4TR Посмотреть сообщение
вопрос на данный момент состоит в следующем:
по какому закону хранятся в памяти координаты вершин трёхмерных объектов, созданных Extrude'ами и Presspool'ами из контуров с прямыми углами и как наиболее эффективно и безошибочно собрать координаты вершин в удобоваримую структуру а-ля xml?
Мой пост: http://forum.dwg.ru/showpost.php?p=514210&postcount=16 принципиально проигнорировал? Или не заметил?

Pastor и hwd - кончайте холивар. Предлагаю вопрос о том, что круче C++ или .NET вынести в отдельную тему. Возможно в контексте работы с AutoCAD.

По большому счету я согласен с Pastor. В данном же конкретном случае работа с 3DSOLID в .NET (BREP .NET) появилась то ли в AutoCAD 2009, то ли в 2010, а в чистом ObjectARX она была как минимум с AutoCAD R14, т.е. уже 13 лет и "вычищена" в значительно большей степени. Если же автор темы не знает C++, но знает C# и собирается работать только с последними версиями AutoCAD, то можно и на C#.

Последний раз редактировалось Александр Ривилис, 02.02.2010 в 22:32.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 02.02.2010, 22:41
#27
NR4TR


 
Регистрация: 06.01.2010
Сообщений: 17
Отправить сообщение для NR4TR с помощью Skype™


Александр Ривилис, точно: упустил из виду полезный совет за разговорами о плюсах и дотнет. спасибо!
NR4TR вне форума  
 
Автор темы   Непрочитано 09.02.2010, 23:42
#28
NR4TR


 
Регистрация: 06.01.2010
Сообщений: 17
Отправить сообщение для NR4TR с помощью Skype™


в AutoCAD доступно автоматическое разбиение solid-объектов на элементы?
конечные элементы, конечно, хорошо, но в данном конкретном случае это сродни забиванию гвоздей микроскопом. интересует разбиение сложного солида с прямыми углами на параллелепипеды.
NR4TR вне форума  
 
Автор темы   Непрочитано 24.02.2010, 10:07
#29
NR4TR


 
Регистрация: 06.01.2010
Сообщений: 17
Отправить сообщение для NR4TR с помощью Skype™


есть ещё один смежный вопрос знатокам BREP:

есть ли в нём встроенная функция, проверяющая, принадлежит ли данная точка телу или нет?
NR4TR вне форума  
 
Непрочитано 24.02.2010, 10:52
1 | #30
Александр Ривилис

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


Цитата:
Сообщение от NR4TR Посмотреть сообщение
есть ещё один смежный вопрос знатокам BREP:

есть ли в нём встроенная функция, проверяющая, принадлежит ли данная точка телу или нет?
Есть. В чистом ObjectARX: AcBrEntity::getPointContainment
В Brep.NET ищи аналог сам.
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Создание и редактирование 3Д объектов с использованием .NET

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со словарями AutoCAD через .Net API hwd .NET 3 02.02.2018 15:55
Программирование под вертикальные решения автокада Mazai Программирование 11 26.06.2008 14:55
Программирование в VBA. Не AutoCAD. mmax Программирование 1 14.03.2007 08:30
Постановка задачи и программирование под AutoCAD kos Программирование 11 20.12.2004 13:44