Как избежать затирание информации в Xdata

Автор Тема: Как избежать затирание информации в Xdata  (Прочитано 20551 раз)

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Вот и я полазил по всем интернетам, пытаясь разобраться - пока не смог. Но факт остается фактом, прикладываю скриншот


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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Вот и я полазил по всем интернетам, пытаясь разобраться - пока не смог. Но факт остается фактом, прикладываю скриншот

Какой то глюк - сообщение задвоилось.

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Я вижу, что у тебя в чертеже следы NanoSPDS
А как Вы это увидели? Где можно посмотреть? У нас есть чертежи контрагентов, он рисуют в Нанокаде. Но чертежи на которых исчезают объекты сделаны в Автокадах 2015 и 2010. В Нанокаде они не разрабатывались.

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
он рисуют в Нанокаде
Я не сказал Нанокад. Я сказал NonoSPDS:



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

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

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

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати оба чертежа редактировались не в AutoCAD:


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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Скриншота не вижу.
Картинка почему-то не прикрепляется. Попытаюсь еще раз.




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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
всё снеси и проверяй на чистом AutoCAD со всеми установленными обновлениями
На чистой установке тоже самое.

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Как тогда быть с исчезающими объектами? Можно не пытаться отлаживать мой код или есть какие-то возможности обходного пути? Например пройти по всем элементам и те что не блоки очистить от xdata с AcDbBlockRepETag вручную.
В качестве догадки  - может ли этот AcDbBlockRepETag унаследовть полилиния которая раньше была внутри блока, затем блок разбили, а AcDbBlockRepETag унаследовался линией?

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Например пройти по всем элементам и те что не блоки очистить от xdata с AcDbBlockRepETag вручную.
Попробуй.
В качестве догадки  - может ли этот AcDbBlockRepETag унаследовть полилиния которая раньше была внутри блока, затем блок разбили, а AcDbBlockRepETag унаследовался линией?
Только если это баг или разбивали блок не стандартной командой _EXPLODE, а какими-то сторонними методами.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Цитата: Atomohod от 14-04-2021, 15:22:23

    Например пройти по всем элементам и те что не блоки очистить от xdata с AcDbBlockRepETag вручную.

Попробуй.

Есть ли какая-нибудь особенность обнуления xdata? Я написал простой код, он не срабатывает. Ошибок нет, просто xdata после его работы остаются на своем месте.
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows.Forms;
  4.  
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.Runtime;
  8. using OpenFileDialog = Autodesk.AutoCAD.Windows.OpenFileDialog;
  9.  
  10. namespace Xdata
  11. {
  12.     public static class Class1
  13.     {
  14.         public static List<string> SelectDrawings()
  15.         {
  16.             List<string> fileNames = new List<string>();
  17.             try
  18.             {
  19.                 OpenFileDialog ofd = new OpenFileDialog("Выбрать чертеж", "", "dwg", "did", OpenFileDialog.OpenFileDialogFlags.AllowMultiple);
  20.                 DialogResult yy = ofd.ShowDialog();
  21.                 if (yy == DialogResult.OK)
  22.                 {
  23.                     foreach (string file in ofd.GetFilenames())
  24.                     {
  25.                         fileNames.Add(file);
  26.                     }
  27.                 }
  28.             }
  29.             catch (System.Exception ex)
  30.             {
  31.                 Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
  32.             }
  33.  
  34.             return fileNames;
  35.         }
  36.  
  37.         public static void GetObjects(Database db)
  38.         {
  39.            
  40.             List<Entity> entities = new List<Entity>();
  41.  
  42.             try
  43.             {
  44.                 Transaction tr = db.TransactionManager.StartTransaction();
  45.                 using (tr)
  46.                 {
  47.                     BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead, false, true);
  48.                     BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);
  49.                     foreach (ObjectId item in btr)
  50.                     {
  51.                         Entity ent = (Entity)tr.GetObject(item, OpenMode.ForWrite, false, true);
  52.                         entities.Add(ent);
  53.                     }
  54.  
  55.                     foreach (var ent in entities)
  56.                     {
  57.                         ClearXData(ent);
  58.                     }
  59.  
  60.                    
  61.                     tr.Commit();
  62.                 }
  63.             }
  64.             catch (System.Exception ex)
  65.             {
  66.                 Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
  67.             }
  68.  
  69.            
  70.         }
  71.  
  72.         public static void ClearXData(Entity item)
  73.         {
  74.             ResultBuffer rb = item.XData;
  75.             if (rb != null)
  76.             {
  77.                 item.XData = new ResultBuffer();
  78.          
  79.             }
  80.         }
  81.         [CommandMethod("CXD")]
  82.         public static void SynchronizeDrawings()
  83.         {
  84.             List<string> fileNames = SelectDrawings();
  85.             if (fileNames.Count == 0)
  86.             {
  87.                 return;
  88.             }
  89.  
  90.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  91.             Database destDb = acDoc.Database;
  92.             ObjectId idMSpace = ObjectId.Null;
  93.  
  94.             using (Transaction acTrans = destDb.TransactionManager.StartTransaction())
  95.             {
  96.                 BlockTable acBlkTbl = acTrans.GetObject(destDb.BlockTableId, OpenMode.ForRead, false, true) as BlockTable;
  97.                 idMSpace = acBlkTbl[BlockTableRecord.ModelSpace];
  98.  
  99.                 var startTime = System.Diagnostics.Stopwatch.StartNew();
  100.  
  101.                 foreach (string fileName in fileNames)
  102.                 {
  103.                     using (Database sourceDb = new Database(false, true))
  104.                     {
  105.                         sourceDb.ReadDwgFile(fileName, FileOpenMode.OpenForReadAndAllShare, false, null);
  106.                         GetObjects(sourceDb);
  107.                         sourceDb.SaveAs(fileName, DwgVersion.Current);
  108.                     }
  109.                 }
  110.  
  111.                 acTrans.Commit();
  112.             }
  113.         }
  114.     }
  115. }

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Есть ли какая-нибудь особенность обнуления xdata?
Есть. Во-первых, полностью обнулять XData нельзя. Ты так совсем испортишь чертеж. Во-вторых, чтобы обнулить XData для конкретного приложения, нужно (appName - это имя конкретного приложения, например "AcDbBlockRepETag", только удалять его нужно у всего кроме BlockReference):
Код - C# [Выбрать]
  1. using (ResultBuffer rb = new ResultBuffer())
  2. {
  3.    rb.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));
  4.    Entity ent = tr.GetObject(id, OpenMode.ForWrite) as Entity;
  5.    if (ent != null) ent.XData = rb;
  6. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение