Получение доступа к свойствам примитивов чертежа, Interop

Автор Тема: Получение доступа к свойствам примитивов чертежа, Interop  (Прочитано 6315 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 3
  • Карма: 1
Доброго времени суток.

Пишу внешнее приложение, которое должно открывать AutoCAD, открывать чертеж *.dwg, получать доступ к свойствам примитивов этого чертежа и менять эти свойства.
Конкретно меня интересуют размеры примитивов (радиус, длина, если это отрезок, высота выдавливания и тд.)

Пишу вот такой код ("F:\Чертеж1.dwg" - нарисован круг с каким-то радиусом, к которому нужно получить доступ и менять его программно):

Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Diagnostics;
  5. using CADAutomation;
  6. using Autodesk.AutoCAD.ApplicationServices;
  7. using Autodesk.AutoCAD.DatabaseServices;
  8. using Autodesk.AutoCAD.EditorInput;
  9. using Autodesk.AutoCAD.Geometry;
  10. using Autodesk.AutoCAD.Interop.Common;
  11.    
  12. namespace CADAutomation
  13. {
  14.     public static class PF
  15.     {
  16.         public static AcadApplication gbl_app;
  17.         public static AcadDocument gbl_doc;
  18.  
  19.         #region PublicFunctions
  20.         public static void CloseAllInstance()
  21.         {
  22.             Process[] aCAD =  Process.GetProcessesByName("acad");
  23.             foreach (Process aCADPro in aCAD) {
  24.                 aCADPro.CloseMainWindow();
  25.             }
  26.         }
  27.         public static void CreateAutoCADObject()
  28.         {
  29.                CloseAllInstance();
  30.                 gbl_app = new AcadApplication();
  31.                 var v_file = gbl_app.Documents.Open(@"F:\Чертеж1.dwg", false);
  32.                 var v_item = v_file.ModelSpace.Item(0);
  33.                 var v_block = v_file.Blocks.Item(0);
  34.         }
  35.     }
  36. }
  37.  

То, что я получаю в v_item и  v_block, не дает мне возможности менять размеры.
Подскажите, что я делаю не так или как лучше справиться с подобной задачей.
Спасибо.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Приветствую на форуме. Начнём с того, что вот это нельзя использовать во внешнем приложении - только в том, которое загружается внутрь AutoCAD:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Geometry;
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 3
  • Карма: 1
Приветствую на форуме. Начнём с того, что вот это нельзя использовать во внешнем приложении - только в том, которое загружается внутрь AutoCAD:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Geometry;

Да, спасибо, осталось от старых экспериментов - так как я делаю тоже самое для SolidWorks и Компас, то решил, что должно быть однотипно - внешнее приложение

Отмечено как Решение coopper 03-05-2015, 02:15:05

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
v_block - это скорее всего ModelSpace - первый блок в таблице блоков чертежа.
v_item - это первый примитив в ModelSpace. Если в чертеже только один примитив, и он - окружность (AcadCircle), то ты можешь изменить её радиус (точнее диаметр - свойство Diameter) и другие свойства, которые есть у этого примитива. Какие именно у него есть свойства можешь узнать через Reflection.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 3
  • Карма: 1
v_block - это скорее всего ModelSpace - первый блок в таблице блоков чертежа.
v_item - это первый примитив в ModelSpace. Если в чертеже только один примитив, и он - окружность (AcadCircle), то ты можешь изменить её радиус (точнее диаметр - свойство Diameter) и другие свойства, которые есть у этого примитива. Какие именно у него есть свойства можешь узнать через Reflection.


Спасибо, получилось.
Оказывается я в v_item получал общий экземпляр класса для всех типов, после того как явно преобразовал к AcadCircle, все появилось.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Использование acad.exe из внешнего приложения считаю самым плохим способом работы с dwg. Использование accoreconsole.exe является более предпочтительным (хотя по прежнему не самым лучшим вариантом). Если постановка задачи такова, что обработка чертежей из внешнего приложения должна производиться именно продуктами компании Autodesk, то стоит попробовать  accoreconsole.exe. Если такой привязки нет - пиши в личку, посоветую третий вариант.