Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: coopper от 03-05-2015, 00:49:59

Название: Получение доступа к свойствам примитивов чертежа, Interop
Отправлено: coopper от 03-05-2015, 00:49:59
Доброго времени суток.

Пишу внешнее приложение, которое должно открывать 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, не дает мне возможности менять размеры.
Подскажите, что я делаю не так или как лучше справиться с подобной задачей.
Спасибо.
Название: Re: Получение доступа к свойствам примитивов чертежа, Interop
Отправлено: Александр Ривилис от 03-05-2015, 00:56:58
Приветствую на форуме. Начнём с того, что вот это нельзя использовать во внешнем приложении - только в том, которое загружается внутрь AutoCAD:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Geometry;
Название: Re: Получение доступа к свойствам примитивов чертежа, Interop
Отправлено: coopper от 03-05-2015, 01:02:55
Приветствую на форуме. Начнём с того, что вот это нельзя использовать во внешнем приложении - только в том, которое загружается внутрь AutoCAD:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Geometry;

Да, спасибо, осталось от старых экспериментов - так как я делаю тоже самое для SolidWorks и Компас, то решил, что должно быть однотипно - внешнее приложение
Название: Re: Получение доступа к свойствам примитивов чертежа, Interop
Отправлено: Александр Ривилис от 03-05-2015, 01:18:10
v_block - это скорее всего ModelSpace - первый блок в таблице блоков чертежа.
v_item - это первый примитив в ModelSpace. Если в чертеже только один примитив, и он - окружность (AcadCircle), то ты можешь изменить её радиус (точнее диаметр - свойство Diameter) и другие свойства, которые есть у этого примитива. Какие именно у него есть свойства можешь узнать через Reflection.
Название: Re: Получение доступа к свойствам примитивов чертежа, Interop
Отправлено: Александр Ривилис от 03-05-2015, 01:26:15
Возможно это тебе тоже поможет:
Получение свойств и методов класса ActiveX/COM из .NET (http://adn-cis.org/poluchenie-svojstv-metodov-klassa-activex/com-iz-.net.html)
Название: Re: Получение доступа к свойствам примитивов чертежа, Interop
Отправлено: coopper от 03-05-2015, 02:16:53
v_block - это скорее всего ModelSpace - первый блок в таблице блоков чертежа.
v_item - это первый примитив в ModelSpace. Если в чертеже только один примитив, и он - окружность (AcadCircle), то ты можешь изменить её радиус (точнее диаметр - свойство Diameter) и другие свойства, которые есть у этого примитива. Какие именно у него есть свойства можешь узнать через Reflection.


Спасибо, получилось.
Оказывается я в v_item получал общий экземпляр класса для всех типов, после того как явно преобразовал к AcadCircle, все появилось.
Название: Re: Получение доступа к свойствам примитивов чертежа, Interop
Отправлено: Андрей Бушман от 03-05-2015, 10:23:25
Использование acad.exe из внешнего приложения считаю самым плохим способом работы с dwg. Использование accoreconsole.exe является более предпочтительным (хотя по прежнему не самым лучшим вариантом). Если постановка задачи такова, что обработка чертежей из внешнего приложения должна производиться именно продуктами компании Autodesk, то стоит попробовать  accoreconsole.exe. Если такой привязки нет - пиши в личку, посоветую третий вариант.