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

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

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

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

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

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Извини, но я снова ничего не понял.

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

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Извини, но дальше я буду отвечать только на четко поставленные тобой вопросы, так как объяснить что ты хочешь так, чтобы я это понял, ты не можешь. Соответственно я не могу тебе помочь. Увы.

Можно ли использовать ManagementEventWatcher, что бы отследить событие модификации объекта?

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Можно ли использовать ManagementEventWatcher, что бы отследить событие модификации объекта?
Нет. Для этой цели есть другие события в AutoCAD .NET API. Посмотри в ObjectARX SDK Documents: Autodesk.AutoCAD.DatabaseServices Namespace > DBObject Class > DBObject Events
Ну и описание событий класса Database:
Код - C# [Выбрать]
  1. Database.ObjectAppended  
  2. Database.ObjectErased  
  3. Database.ObjectModified  
  4. Database.ObjectOpenedForModify  
  5. Database.ObjectReappended  
  6. Database.ObjectUnappended
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Нет. Для этой цели есть другие события в AutoCAD .NET API. Посмотри в ObjectARX SDK Documents: Autodesk.AutoCAD.DatabaseServices Namespace > DBObject Class > DBObject Events
Ну и описание событий класса Database:

Код - C# [Выбрать]
  1. #region Namespaces
  2.  
  3. using System;
  4. using System.Text;
  5. using System.Linq;
  6. using System.Xml;
  7. using System.Reflection;
  8. using System.ComponentModel;
  9. using System.Collections;
  10. using System.Collections.Generic;
  11. using System.Windows;
  12. using System.Windows.Media.Imaging;
  13. using System.Windows.Forms;
  14. using System.Diagnostics;
  15. using System.Drawing;
  16. using System.IO;
  17. using Autodesk.AutoCAD.ApplicationServices;
  18. using Autodesk.AutoCAD.DatabaseServices;
  19. using Autodesk.AutoCAD.Runtime;
  20. using Autodesk.AutoCAD.EditorInput;
  21. using Autodesk.AutoCAD.Geometry;
  22. using Autodesk.AutoCAD.Windows;
  23. using AcadApplication = Autodesk.AutoCAD.ApplicationServices.Application;
  24. using AcadDocument = Autodesk.AutoCAD.ApplicationServices.Document;
  25. using AcadWindows = Autodesk.AutoCAD.Windows;
  26.  
  27. #endregion
  28.  
  29. namespace AcadNetAddinWizard_Namespace
  30. {
  31.  
  32.     public class TestCommands
  33.     {
  34.         Database db = HostApplicationServices.WorkingDatabase;
  35.         Editor ed = AcadApplication.DocumentManager.MdiActiveDocument.Editor;
  36.         void Dump(DBObject obj)
  37.         {
  38.             string msg = string.Format("Properties of the {0} with handle {1}:\n", obj.GetType().Name, obj.Handle);
  39.  
  40.             PropertyInfo[] piArr = obj.GetType().GetProperties();
  41.             foreach (PropertyInfo pi in piArr)
  42.             {
  43.                 object value = null;
  44.                 try
  45.                 {
  46.                     value = pi.GetValue(obj, null);
  47.                 }
  48.                 catch (System.Exception ex)
  49.                 {
  50.                     if (ex.InnerException is Autodesk.AutoCAD.Runtime.Exception &&
  51.                         (ex.InnerException as Autodesk.AutoCAD.Runtime.Exception).ErrorStatus == ErrorStatus.NotApplicable)
  52.                         continue;
  53.                     else
  54.                         throw;
  55.                 }
  56.  
  57.                 msg += string.Format("\t{0}: {1}\n", pi.Name, value);
  58.             }
  59.  
  60.             ed.WriteMessage("\n" + msg);
  61.             MessageBox.Show(msg, "DBObject/Entity Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
  62.         }
  63.      
  64.  
  65.         [CommandMethod("DumpEntityInfo")]
  66.         public void DumpEntityInfo_Method()
  67.         {
  68.             using (Transaction tr = db.TransactionManager.StartTransaction())
  69.             {
  70.                 //TODO: add your code below.    
  71.                 Debug.WriteLine("DumpEntityInfo ran.");
  72.                 ed.WriteMessage("DumpEntityInfo ran.\n");
  73.  
  74.                 PromptEntityResult selRes = ed.GetEntity("Pick an entity:");
  75.                 if (selRes.Status == PromptStatus.OK)
  76.                 {
  77.                     Entity ent = tr.GetObject(selRes.ObjectId, OpenMode.ForRead) as Entity;
  78.                     Dump(ent);
  79.                 }
  80.  
  81.                 tr.Commit();
  82.             }
  83.         }
  84.  
  85.     }
  86. }

Пример, что Вы давали. Возможно ли в нем использовать событие модификации объекта, вместо команды ?

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

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

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

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

Так будет выглядеть проверка расширенных данных?

Код - C# [Выбрать]
  1. [CommandMethod("FindAppName")]
  2. static public void FindAppName()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Database db = doc.Database;
  6.     Transaction tr = db.TransactionManager.StartTransaction();
  7.     using (tr)
  8.     {
  9.         Editor ed = doc.Editor;
  10.         try
  11.         {
  12.            PromptEntityResult ers = ed.GetEntity("Выберите примитив ");
  13.            Entity ent = (Entity)tr.GetObject(ers.ObjectId,  OpenMode.ForRead);
  14.  
  15.             ResultBuffer buffer =  ent.GetXDataForApplication("ADSK");
  16.  
  17.             // Если null – нет расширенных данных для приложения ADSK
  18.             if (buffer != null)
  19.             {
  20.                 ed.WriteMessage("Есть расширенные данные с именем приложения ADSK");
  21.                 buffer.Dispose();
  22.             }
  23.             else
  24.             {
  25.                 ed.WriteMessage("Нет расширенных данные с именем приложения ADSK");
  26.             }
  27.             tr.Commit();
  28.         }
  29.         catch
  30.         {
  31.             tr.Abort();
  32.         }
  33.     }
  34. }

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Этот код проверяет наличие расширенных данных (Extended Data)

Мне нужно все разобрать.
1. Что бы получить свойства можно использовать Reflection.
2. Для получения расширенных данных необходимо использовать XData и метод GetXDataForApplication.
3. Что бы отследить модификацию объекта необходимо использовать  DBObject Events, Database.ObjectModified.
4. Осталась запись свойств в файл.

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

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

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Сдается мне, что я знаю для чего все это, особенно в купе с вот этой темой http://adn-cis.org/forum/index.php?topic=1029.15
Встречал я на просторах инета упоминание об этом и для чего в конечном итоге это нужно.


Однако у меня другой интерес, для пакетной обработки.
Хотелось бы выбрать некоторые объекты (Довольно много и в разнобой), сохранить их в виде dxf/dwg и при обработке сверяться с этим набором, т.е.
Можно ли получить dxf/dwg представление объекта, сохранить его на диск и потом из этого представления восстановить объект и добавить его в другой чертеж.
Промежуточное сохранение нужно, потому что пакетная сверка будет запускаться не один раз, а выбирать объекты утомительно.
« Последнее редактирование: 13-05-2015, 17:08:42 от Boxa.Shu »

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Можно ли получить dxf/dwg представление объекта, сохранить его на диск и потом ....

Можно Database.Wblock(ObjectId).SaveAs(Path,DwgVersion.Current) - ну или не Current
p.s. Database - это "Ваша" database (экземпляр объекта)
p.p.s Если не 1-го объекта, а все-же набора - то соотв. перегрузка у Wblock так-же есть.

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Хотелось бы выбрать некоторые объекты (Довольно много и в разнобой), сохранить их в виде dxf/dwg и при обработке сверяться с этим набором, т.е.
К тому, что сказал Дима_, добавлю, что я бы предпочел бы использовать метод Database.WblockCloneObjects
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение