Сохранение свойств (AUTOCAD 2012 на C# Visual Studio.)

Автор Тема: Сохранение свойств (AUTOCAD 2012 на C# Visual Studio.)  (Прочитано 23197 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Доброго времени суток. Возможно ли сохранить свойства примитива и его модификации в отдельный файл с расширением, например, .txt?

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Возможно ли сохранить свойства примитива и его модификации в отдельный файл с расширением, например, .txt?
Возможно. Хотя нужно понимать какие именно свойства. Лучше всего (на мой взгляд) сохранять в формате DXF. Он хранить все свойства примитива.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Возможно. Хотя нужно понимать какие именно свойства. Лучше всего (на мой взгляд) сохранять в формате DXF. Он хранить все свойства примитива.

Отлично, у Вас случайно нет примера как это делается?

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Хотя нужно понимать какие именно свойства.


Свойства примитива, например все что выдается через _LIST, просто я не знаю как выразиться.

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
По тем данным, которые выдаёт команда _LIST, невозможно создать примитив, свойства которого эта команда выдает. Поэтому уточни какова цель записи свойств примитива в текстовый файл.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Отлично, у Вас случайно нет примера как это делается?
А вот это интересный вопрос. В AutoCAD .NET API нет средств работы с DXF. Но много лет назад я делал такой код, использующий вызов P/Invoke acdbEntGet (это функция из ObjectARX):
Код - C# [Выбрать]
  1. //-------------------------------------------------
  2. // В AutoCAD 2005...2006 работать не будет из-за
  3. // ограничений на содержимое ResultBuffer!
  4. //-------------------------------------------------
  5. using System;
  6. using System.Runtime.InteropServices;
  7. using Autodesk.AutoCAD.Runtime;
  8. using Autodesk.AutoCAD.ApplicationServices;
  9. using Autodesk.AutoCAD.DatabaseServices;
  10. using Autodesk.AutoCAD.EditorInput;
  11. using AcRx = Autodesk.AutoCAD.Runtime;
  12. using AcEd = Autodesk.AutoCAD.EditorInput;
  13. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  14. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  15. [assembly: CommandClass(typeof(Rivilis.EntGet))]
  16. namespace Rivilis
  17. {
  18.   public class EntGet
  19.   {
  20.     [System.Security.SuppressUnmanagedCodeSecurity]
  21.     [DllImport("acdb17.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?acdbGetAdsName@@YA?AW4ErrorStatus@Acad@@AAY01JVAcDbObjectId@@@Z")]
  22.     private static extern int acdbGetAdsName(long[] name, ObjectId objId);
  23.     [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acdbEntGet")]
  24.     private static extern System.IntPtr acdbEntGet(long[] name);
  25.     [CommandMethod("DXFGet")]
  26.     static public void DXFGet()
  27.     {
  28.       AcEd.Editor ed = AcAp.Application.DocumentManager.MdiActiveDocument.Editor;
  29.       AcEd.PromptEntityOptions entityOpts = new AcEd.PromptEntityOptions("\nSelect entity: ");
  30.       AcEd.PromptEntityResult rc = ed.GetEntity(entityOpts);
  31.       if (rc.Status == AcEd.PromptStatus.OK)
  32.       {
  33.         long[] ent = new long[] { 0, 0 };
  34.         acdbGetAdsName(ent, rc.ObjectId);
  35.         System.IntPtr rb = acdbEntGet(ent);
  36.         AcDb.ResultBuffer dxflist = AcRx.DisposableWrapper.Create(typeof(AcDb.ResultBuffer), rb, true) as AcDb.ResultBuffer;
  37.         if (dxflist != null)
  38.         {
  39.           foreach (TypedValue val in dxflist)
  40.           {
  41.             ed.WriteMessage("\n({0} . {1})", val.TypeCode, val.Value.ToString());
  42.           }
  43.         }
  44.       }
  45.     }
  46.   }
  47. }
Думаю что без переделок в AutoCAD 2012 (особенно x64) работать не будет. Нужно экспериментировать.
« Последнее редактирование: 10-11-2014, 23:14:50 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Можно пойти и другим путём - использование Reflection: http://spiderinnet1.typepad.com/blog/2012/01/using-c-to-print-out-properties-of-autocad-net-dbobject-or-entity.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Можно пойти и другим путём - использование Reflection

Прочитал про Reflection, но можно ли через него получить все свойства? Можно через Reflection получить расширенные данные?

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
но можно ли через него получить все свойства?
Проблема может возникнуть только для тех свойств, которые реализованы в виде методов. Тут нужно будет знать какие параметры передавать.
Можно через Reflection получить расширенные данные?
Можно. Но как раз для получения расширенных данных Reflection совершенно не нужен. Для получения расширенных данных есть свойство XData и метод GetXDataForApplication (если нужно получить расширенные данные для конкретного имени приложения).
Примеры здесь:
http://adn-cis.org/ispolzovanie-.netapidlya-dobavleniya-i-udaleniya-rasshirennyix-dannyix.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Примеры здесь:
Спасибо.
 
Тут нужно будет знать какие параметры передавать.
Если честно, немного не понимаю.

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Если честно, немного не понимаю.
Самый простой пример. Свойство с именем XData и метод с именем GetXDataForApplication. Свойство вызывается по имени, а методу нужно передать еще и параметр (в данном случае строковый параметр с именем приложения).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Самый простой пример. Свойство с именем XData и метод с именем GetXDataForApplication. Свойство вызывается по имени, а методу нужно передать еще и параметр (в данном случае строковый параметр с именем приложения).
Ну более или менее понятно. Еще вопрос. А возможно ли сделать по типу программы с кругом, который рисовался после действия пользователя?

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Поэтому уточни какова цель записи свойств примитива в текстовый файл.

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

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Переведи.

http://adn-cis.org/forum/index.php?topic=971.msg4262#msg4262

Просто Вы уже приводили пример, когда круг появлялся во время работы пользователя. С этой программой нужно сделать нечто похожее. Что бы не было необходимости каждый раз указывать примитив, свойства которого нужно сохранить.