Работа с базой данных открытого чертежа

Автор Тема: Работа с базой данных открытого чертежа  (Прочитано 8618 раз)

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

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

Оффлайн sash-2007Автор темы

  • ADN OPEN
  • Сообщений: 21
  • Карма: -1
Здравствуйте друзья :)

Помогите разобратся :)

открываю dxf файл с помощью кода :

Код - C# [Выбрать]
  1. Autodesk.AutoCAD.ApplicationServices.Document doc =
  2. Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.Open(pathDXF, false);
  3. Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument = doc;
далее, мне нужно в этом чертеже пробежаться по всем примитивам и проверить в них Xdata

Код - C# [Выбрать]
  1. Editor ed = doc.Editor;
  2. Database Db = doc.Database;
  3.  
  4.  
  5. using (Transaction acTrans = Db.TransactionManager.StartTransaction())
  6. {
  7. PromptSelectionResult PSR = ed.SelectAll();
  8. if (PSR.Status == PromptStatus.OK)
  9. {
  10. SelectionSet acSSet = PSR.Value;
  11. foreach (SelectedObject acSSObj in acSSet)
  12. {
  13. if (acSSObj != null)
  14. {
  15. Entity ent = acTrans.GetObject(acSSObj.ObjectId,
  16. OpenMode.ForWrite) as Entity;
  17.  
  18. ResultBuffer rb = ent.XData;
  19. if (rb != null)
  20. {
  21. foreach (TypedValue tv in rb)
  22. {
  23. ed.WriteMessage(
  24. "\nTypedValue - type: {1}, value: {2}",
  25.  
  26. tv.TypeCode,
  27. tv.Value
  28. );
  29. }
  30. rb.Dispose();
  31. }
  32. }
  33. }
  34. }
  35. acTrans.Commit();
  36.  
  37. }
  38.  
но ничего не происходит
получается что у меня открыты 2 чертежа в автокаде
в первом я запускаю dll, а потом эта dll открывает мой dxf файл

если например после строки
Database Db = doc.Database;

добавить
ed.WriteMessage("Ура");

то сообщение выходит в первом чертеже, значит и

PromptSelectionResult PSR = ed.SelectAll();

выбирает все в первом чертеже

Как сделать выбор примитивов в DXF - файле ?
Догадываюсь что нужно переключатся между базами чертежей, но как это сделать не нашел.   :(
« Последнее редактирование: 19-07-2017, 12:09:39 от Александр Ривилис »


Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Возможно, что будет достаточно добавить флаг Session команде (CommandFlags.Session): http://help.autodesk.com/view/ACD/2015/ENU/?guid=GUID-F77E8FE0-8034-4704-93BD-F717608F8223

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
sash-2007
1. Прочитай пожалуйста у меня в подписи как следует форматировать код для форума и соблюдай это правило.
2. Если есть необходимость просто прочитать значения XData в dxf-файле, то нет необходимости открывать его в редакторе AutoCAD.
Достаточно создать базу и считать в неё dxf-файл:
Код - C# [Выбрать]
  1. Database db = new Database(false,false);
  2. db.DxfIn("путь к dxf-файлу", "путь к log-файлу");
Дальше открываем пространство модели и выполняем итерацию по всем примитивам в ней:
Код - C# [Выбрать]
  1. using (BlockTable Tbl = db.BlockTableId.Open(OpenMode.ForRead) as BlockTable)
  2. {
  3.     using (BlockTableRecord TblRec =
  4.         Tbl[BlockTableRecord.ModelSpace].Open(OpenMode.ForRead) as BlockTableRecord)
  5.     {
  6.        foreach (ObjectId id in TblRec)
  7.        {
  8.          using (Entity ent = id.Open(OpenMode.ForRead) as Entity)
  9.          {
  10.            using (ResultBuffer rb = ent.XData)
  11.            {
  12.              if (rb != null)
  13.              {
  14.                 foreach (TypedValue tv in rb)
  15.                 {
  16.                    ed.WriteMessage(
  17.                      "\nTypedValue - type: {0}, value: {1}",
  18.                       tv.TypeCode,
  19.                       tv.Value);
  20.                 }
  21.              }
  22.            }
  23.          }
  24.        }
  25.     }
  26. }

Код я не проверял, но идея должна быть понятна.
« Последнее редактирование: 19-07-2017, 19:47:06 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

Оффлайн sash-2007Автор темы

  • ADN OPEN
  • Сообщений: 21
  • Карма: -1
 Спасибо за ответы  :)

Буду разбираться.

На уровне примитивов ,  есть примеры в интернете , как то более менее понятно
а  вот с работой с несколькими чертежами , уже тяжко даётся  , непонятно и примеров нет.

ну может это только для меня не понятно , так что могу задавать глупые вопросы, не бейте сильно :)


Хотел бы уточнить задачу  поставленную перед мной, мной же :)

1)  открыть dxf - файл в Автокаде (именно dxf, и  чтоб его было видно ).   

2)   В этом файле имеются несколько линий и окружности , а у некоторых окружностей точно есть XData.
     прочитать XData у примитивов (окружностей).

3) самое главное  :)   В зависимости от значения XData изменить цвет окружности на чертеже ,  так сказать для лучшей
   визуализации.



Отмечено как Решение sash-2007 20-07-2017, 14:25:22

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В качестве примера:
Код - C# [Выбрать]
  1. using System.Windows.Forms;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  7.  
  8. #pragma warning disable 0618
  9.  
  10. [assembly: CommandClass(typeof(Rivilis.DXFModify))]
  11.  
  12. namespace Rivilis
  13. {
  14.   public class DXFModify
  15.   {
  16.     [CommandMethod("DXFModify", CommandFlags.Session)]
  17.     public void MyCommand()
  18.     {
  19.       Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  20.       if (doc == null) return;
  21.       OpenFileDialog openFileDialog = new OpenFileDialog();
  22.       openFileDialog.Title = "Выберите dxf-файл";
  23.       openFileDialog.Filter = "dxf-файлы|*.dxf";
  24.       DialogResult dr = openFileDialog.ShowDialog();
  25.       if (dr == DialogResult.OK)
  26.       {
  27.         Document dxfDoc = AcAp.Application.DocumentManager.Open(openFileDialog.FileName);
  28.         if (dxfDoc != null)
  29.         {
  30.           // Так как мы работаем в контексте приложения и будем модифицировать документ,
  31.           // то должны его заблокировать
  32.           using (DocumentLock docloc = dxfDoc.LockDocument())
  33.           {
  34.             Database db = dxfDoc.Database;
  35.             using (BlockTable blks = db.BlockTableId.Open(OpenMode.ForRead) as BlockTable)
  36.             {
  37.               using (BlockTableRecord modelSpace =
  38.                   blks[BlockTableRecord.ModelSpace].Open(OpenMode.ForRead) as BlockTableRecord)
  39.               {
  40.                 foreach (ObjectId id in modelSpace)
  41.                 {
  42.                   using (Entity ent = id.Open(OpenMode.ForRead) as Entity)
  43.                   {
  44.                     Circle circ = ent as Circle;
  45.                     if (circ != null)
  46.                     {
  47.                       using (ResultBuffer rb = ent.XData)
  48.                       {
  49.                         if (rb != null)
  50.                         {
  51.                           //foreach (TypedValue tv in rb)
  52.                           //{
  53.                           //  dxfDoc.Editor.WriteMessage(
  54.                           //    "\nTypedValue - type: {0}, value: {1}",
  55.                           //     tv.TypeCode, tv.Value);
  56.                           //}
  57.                           // Будем модифицировать круг
  58.                           circ.UpgradeOpen();
  59.                           // Отметим круги с расширенными данными красным цветом
  60.                           // (тут возможно вставить свою логику проверки xData)
  61.                           circ.ColorIndex = 1;
  62.                         }
  63.                       }
  64.                     }
  65.                   }
  66.                 }
  67.               }
  68.             }
  69.           }
  70.         }
  71.       }
  72.     }
  73.   }
  74. }

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

Оффлайн sash-2007Автор темы

  • ADN OPEN
  • Сообщений: 21
  • Карма: -1
Александр Большое  Спасибо  помогло :)

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

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

Оффлайн sash-2007Автор темы

  • ADN OPEN
  • Сообщений: 21
  • Карма: -1
Здравствуйте  :)

Теперь столкнулся с проблемой сохранения моего dxf - файла  под тем же именем
в Автокаде пишет  что файл открывается только для чтения

замена параметра метода Оpen  (OpenMode.ForRead)    на  (OpenMode.ForWrite)
не помогло

пробовал метод   dxfDoc.CloseAndSave(pathDXF);   не получается.

Подскажите пожалуйста, как сохранить?

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

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

Оффлайн sash-2007Автор темы

  • ADN OPEN
  • Сообщений: 21
  • Карма: -1
Хорошо :)