Подсчет периметра детали AutoCAD 2010

Автор Тема: Подсчет периметра детали AutoCAD 2010  (Прочитано 18670 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Tatiana85Автор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Я никогда раньше не сталкивалась с AutoCADом, но появилась задача написать приложение С#.net, которое будет из текущего чертежа вытаскивать периметр детали.
На чертеже обычно одна деталь,  что то типа длинного прямоугольника или 2х соединенных под углом. В детали присутствуют сквозные отверстия. Надо сложить все ее длины, и если в ней есть отверстия - то и их тоже.  Грубо говоря надо узнать длину распила при изготовлении этой детали.
Пока что я смогла только создать простенькую dll, которую можно подгрузить в AutoCAD. Что делать дальше непонятно.

Мне хотелось бы чтобы эта dll подгружалась в AutoCAD при старте и отзывалась на горячие клавиши. Например, выделили деталь, нажали ctr+A -> вызвался метод ddl, который считает периметр.

Но самое главное, абсолютно непонятно как вытаскивать длины детали. Надо обращаться к самому документу чертежа или в базе данных? Может кто встречал примеры? Как проходить по внутренним частям детали? 

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Подсчет периметра детали AutoCAD 2010
« Ответ #1 : 25-10-2014, 22:08:39 »
В автокаде нет "деталей", есть линии, полилинии, области, окружности, дуги элипсы, 3dтела и пр. - надо для начала определиться что есть ваша "деталь".

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Подсчет периметра детали AutoCAD 2010
« Ответ #2 : 26-10-2014, 00:48:02 »
Приветствую на форуме.
Абсолютно согласен с Димой. Без знания того, что такое есть "деталь" решить поставленную задачу не получится. Поэтому ждём пример такой детали (dwg-файл).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Tatiana85Автор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Подсчет периметра детали AutoCAD 2010
« Ответ #3 : 26-10-2014, 10:28:38 »
Пока у меня есть  4  типа  деталей
Заказчику надо узнать длину распила, которая потребуется, чтобы изготовить эту деталь. Т.е. сумма всех внешних линий + длина внутренних  окружностей и эллипсов.
 

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Подсчет периметра детали AutoCAD 2010
« Ответ #4 : 26-10-2014, 12:52:51 »
Я не очень ухватываю что такое "длинна распила", судя по всему Вы хотите посчитать ход фрезы, но это не будет длинная всех линий - т.к. фреза ваша вряд-ли диаметром 0.1 мм, то есть окружности она вырезает простым сверлением, а продольне фрезеровки того-же диаметра - за один проход, а не за два (вдоль периметра). Но это только мои фантазии - быть может у Вас все совсем не так.
По существу вопроса - получить длины линейных объектов достаточно просто - все они наследуются от класса Curve? То есть Вам надо "пробежать" по всем примитивам (выбранным пользователем, или которые есть в модели - в зависимости от задачи) и к тем которые преобразуются в класс Curve применить curve.GetDistanceAtParameter(curve.EndParam) где curve - объект класса Curve. После чего их сложить и выдать результат в необходимой форме.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Подсчет периметра детали AutoCAD 2010
« Ответ #5 : 26-10-2014, 13:51:14 »
Пример подсчета полной длины всех линий в Пространстве Модели:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using AcRx = Autodesk.AutoCAD.Runtime;
  8. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  9. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  10. using AcGe = Autodesk.AutoCAD.Geometry;
  11. using AcEd = Autodesk.AutoCAD.EditorInput;
  12.  
  13. [assembly: CommandClass(typeof(TestLength.Commands))]
  14.  
  15. namespace TestLength
  16. {
  17.   public class Commands
  18.   {
  19.     [CommandMethod("TLen")]
  20.     static public void TLen()
  21.     {
  22.       AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  23.       AcEd.Editor ed = doc.Editor;
  24.       AcDb.Database db = doc.Database;
  25.       double nTotalLength = 0;
  26.       using (AcDb.BlockTable bt = db.BlockTableId.Open(AcDb.OpenMode.ForRead) as AcDb.BlockTable) {
  27.         AcDb.ObjectId modelId = bt[AcDb.BlockTableRecord.ModelSpace];
  28.         using (AcDb.BlockTableRecord btr = modelId.Open(AcDb.OpenMode.ForRead) as AcDb.BlockTableRecord) {
  29.           foreach (AcDb.ObjectId id in btr) {
  30.             if (id.ObjectClass.IsDerivedFrom(AcRx.RXObject.GetClass(typeof(AcDb.Curve)))) {
  31.               using (AcDb.Curve curve = id.Open(AcDb.OpenMode.ForRead) as AcDb.Curve) {
  32.                 nTotalLength += curve.GetDistanceAtParameter(curve.EndParam);
  33.               }
  34.             }
  35.           }
  36.         }
  37.       }
  38.       ed.WriteMessage("\nСуммарная длина: {0}", nTotalLength);
  39.     }
  40.   }
  41. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Tatiana85Автор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Подсчет периметра детали AutoCAD 2010
« Ответ #6 : 26-10-2014, 18:31:17 »
Круто, спасибо!  Завтра попробую.  А возможно подключаться к AutoCAD  из приложения без создания плагина?


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Подсчет периметра детали AutoCAD 2010
« Ответ #7 : 26-10-2014, 19:56:33 »
А возможно подключаться к AutoCAD  из приложения без создания плагина?
Можно. Но не нужно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Подсчет периметра детали AutoCAD 2010
« Ответ #8 : 27-10-2014, 00:15:01 »
До кучи - Вашу задачу можно решить и без программирования вообще. Честно говоря меня несколько пугают Ваши строки
Я никогда раньше не сталкивалась с AutoCADом, но появилась задача написать приложение С#.net, которое будет ...
да и насчет "распила детали" тут "явно не все явно".

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Подсчет периметра детали AutoCAD 2010
« Ответ #9 : 27-10-2014, 00:18:21 »
До кучи - Вашу задачу можно решить и без программирования вообще.
Кстати, как вариант мой GeomProps. Нажал Ctrl+A и смотришь результат в Панели свойств.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Tatiana85Автор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Подсчет периметра детали AutoCAD 2010
« Ответ #10 : 27-10-2014, 17:48:36 »
все работает, но теперь не понятно как получить полученные значения назад в  .net приложение.
Если вызываю TLen из приложения  - ругаются библиотеки Autocada.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Подсчет периметра детали AutoCAD 2010
« Ответ #11 : 27-10-2014, 18:11:44 »
не понятно как получить полученные значения назад в  .net приложение.
Что имеется в виду под ".net приложение." ? Это внешний exe-файл? Тогда этот код нельзя никак вызвать из него. В таком виде и с этими библиотеками его можно использовать только в сборке, загружаемой внутрь AutoCAD.

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Tatiana85Автор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Подсчет периметра детали AutoCAD 2010
« Ответ #12 : 27-10-2014, 18:16:09 »
Да, .exe файл должен вытащить этот периметр для дальнейших подсчетов
Т.е. плагин мне не подходит? А тогда как?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Подсчет периметра детали AutoCAD 2010
« Ответ #13 : 27-10-2014, 18:22:35 »
Детали всегда в формате dxf-файла? Может тогда AutoCAD вообще не нужен и поискать готовую библиотеку для чтения dxf-файлов. Например, http://www.codeproject.com/Articles/156522/DXF-Import-NET-Read-and-View-AutoCAD-Format-Files
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Tatiana85Автор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Подсчет периметра детали AutoCAD 2010
« Ответ #14 : 27-10-2014, 18:28:39 »
похоже что нужен, т.к. они хотят получать данные в процессе рисования. Т.е. похоже могут еще и не сохранить чертеж. 
Мне надо как то достучаться до объектной модели autocad. Я видела примеры на VBA через comObject. А вот как это сделать в C# и какие библиотеки для autocad 2010 нужны - что то не могу найти.