Исключить из сериализации содержимое блока

Автор Тема: Исключить из сериализации содержимое блока  (Прочитано 12427 раз)

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!
Как исключить из сериализации содержимое BlockReference с учетом того, что их несколько для каждого блока? Написал такой код, но он все равно достает полилинии из вставок блока.
Код - C# [Выбрать]
  1.  public class PolylineSerializer
  2.     {
  3.         [CommandMethod("2SerializePolylines")]
  4.         public void SerializePolylines()
  5.         {
  6.             //--------------------------------------------------------------------Mandatory variables
  7.             Document doc = Application.DocumentManager.MdiActiveDocument;
  8.             Database db = doc.Database;
  9.             Editor ed = doc.Editor;
  10.             Transaction tr = db.TransactionManager.StartTransaction();
  11.             //--------------------------------------------------------------------Mandatory variables
  12.             List < Polyline > polylines = new List < Polyline >();
  13.             using ( tr )
  14.             {
  15.                 BlockTable bt = (BlockTable) tr.GetObject(db.BlockTableId, OpenMode.ForWrite);
  16.                 BlockTableRecord mainBtr = (BlockTableRecord) tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  17.                 List < SerializablePolyline > serializablePolylines = new List < SerializablePolyline >();
  18.  
  19.                 foreach ( ObjectId btrId in bt )
  20.                 {
  21.                     BlockTableRecord btr = (BlockTableRecord) tr.GetObject(btrId, OpenMode.ForWrite);
  22.  
  23.                     foreach ( ObjectId id in btr )
  24.                     {
  25.                         if ( id.ObjectClass.IsDerivedFrom(RXObject.GetClass(typeof(BlockReference))) )
  26.                         {
  27.                             continue;
  28.                         }
  29.  
  30.                         Entity ent = (Entity) tr.GetObject(id, OpenMode.ForWrite, false, true);
  31.  
  32.                         if ( (ent != null) && (ent is Polyline) )
  33.                         {
  34.                             polylines.Add((Polyline) ent);
  35.                         }
  36.                     }
  37.                 }
  38.  
  39.                 Vertex vertex;
  40.  
  41.                 foreach ( var pline in polylines )
  42.                 {
  43.                     var plHandle = pline.Handle.Value;
  44.                     SerializablePolyline sp = new SerializablePolyline(plHandle, new List < Vertex >(), pline.Linetype, pline.Closed);
  45.                     for ( int i = 0; i < pline.NumberOfVertices; i++ )
  46.                     {
  47.                         vertex = new Vertex(pline.GetPoint2dAt(i).X, pline.GetPoint2dAt(i).Y, pline.GetBulgeAt(i));
  48.                         sp.VerticesCollection.Add(vertex);
  49.                     }
  50.  
  51.                     serializablePolylines.Add(sp);
  52.                 }
  53.  
  54.                 var currentDate = DateTime.Now.ToLongDateString();
  55.                 AutocadSerializer.PolylineToJson(serializablePolylines, $"D:\\{currentDate}.json");
  56.                 var list2 = AutocadSerializer.GetPolylineListFromJson($"D:\\{currentDate}.json");
  57.  
  58.                 for ( int i = 0; i < list2.Count; i++ )
  59.                 {
  60.                     SerializablePolyline item = list2[ i ];
  61.                     Polyline polyline = new Polyline();
  62.                     polyline.SetDatabaseDefaults();
  63.                     for ( int j = 0; j < item.VerticesCollection.Count; j++ )
  64.                     {
  65.                         polyline.AddVertexAt(j, new Point2d(item.VerticesCollection[ j ].X, item.VerticesCollection[ j ].Y), item.VerticesCollection[ j ].Bulge, 0, 0);
  66.                     }
  67.  
  68.                     polyline.LineWeight = LineWeight.LineWeight060;
  69.                     polyline.Layer = "0";
  70.                     polyline.ColorIndex = 10;
  71.                     polyline.Closed = item.Contour;
  72.                     try
  73.                     {
  74.                         polyline.Linetype = item.Linetype;
  75.                     }
  76.                     catch ( System.Exception ex )
  77.                     {
  78.                         //Application.ShowAlertDialog("The following exception was caught:\n" + ex.Message);
  79.                     }
  80.                     finally
  81.                     {
  82.                         polyline.Linetype = "ByLayer";
  83.                     }
  84.  
  85.                     mainBtr.AppendEntity(polyline);
  86.                     tr.AddNewlyCreatedDBObject(polyline, true);
  87.                 }
  88.  
  89.                 tr.Commit();
  90.             }
  91.         }
  92.  
  93.         public static Point2dCollection VerticesToCollection(Polyline polyline)
  94.         {
  95.             Point2dCollection vertices = new Point2dCollection();
  96.             for ( int i = 0; i < polyline.NumberOfVertices; i++ )
  97.             {
  98.                 vertices.Add(polyline.GetPoint2dAt(i));
  99.             }
  100.  
  101.             return vertices;
  102.         }
  103.  
  104.     }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Как исключить из сериализации содержимое BlockReference с учетом того, что их несколько для каждого блока?
У BlockReference нет содержимого (если не считать атрибутов). Содержимое есть у BlockTableRecord (в том числе, могут быть и Polyline)
P.S.: Если не модифицируешь объект ни в коем случае не открывай его OpenMode.ForWrite - только OpenMode.ForRead.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
У BlockReference нет содержимого (если не считать атрибутов). Содержимое есть у BlockTableRecord (в том числе, могут быть и Polyline)
Можно мне пояснить один момент - существует определение блока, то есть BlockTableRecord с содержащимися в нем полилиниями. Далее на основе определения создаются вставки блока то есть BlockReference, получается, что внутри них не создаются свои полилинии? Тупой вопрос, но все же - что за полилинии мы видим во вставках, они же как-то содержатся в базе чертежа?

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

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

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Надо сериализовать полилинии не входящие в блоки для того, чтобы загрузить json в нашу самописную систему контроля разработки чертежа - то есть наблюдать, что происходит в чертеже каждый день, иметь возможность восстановить графику на определенный момент времени и дать пользователю возможность визуального сравнения изменений по сравнению с текущим чертежом и десериализованным из json. Похожая вещь появилась в Автокаде последних версий, но у нас только 2015 поэтому пишем сами. Это вкратце.

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Мы видим те полилинии, которые в BlockTableRecord, на которую ссылается BlockReference.
То есть handle, например, у этих линий для всех BlockReference одинаковые и мы видим линии внутри вставок. но они не хранятся внутри чертежа, создаются "на лету" лишь для визуального отображения?

Отмечено как Решение Atomohod 09-12-2019, 21:53:02

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Надо сериализовать полилинии не входящие в блоки
Но ведь это глупость, так как в этом случае
иметь возможность восстановить графику на определенный момент времени
не получится. Представьте себе ситуацию, если чертеж состоит только из блоков. Значит графики никакой не будет вообще.
Но если даже делать так, как по твоей постановке, то не нужно лазить во все BlockTableRecord. Достаточно входить только в те BlockTableRecord, у которых свойство IsLayout == true.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
IsLayout == true.
А почему только Layout? Если наоборот - нужно только то, что в пространстве модели?

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

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

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
не получится. Представьте себе ситуацию, если чертеж состоит только из блоков. Значит графики никакой не будет вообще.
Чертеж рисуем сами, блоки там как раз стороннее оборудование и оно из базы поставщика и никогда не меняется. Наблюдение за ним не требуется

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Наблюдение за ним не требуется
И даже их расположение в чертеже???
P.S.: И конечно у вас никто не использует копирование через буфер обмена, которое приводит к появлению блоков вида A$XXXXXXXX в чертеже??? Не верю...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
И даже их расположение в чертеже???
Я чуть-чуть непродумал- положение блока в целом (Position базовой точки) интересует, его содержимое совсем нет.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
И даже их расположение в чертеже???
Я чуть-чуть непродумал- положение блока в целом (Position базовой точки) интересует, его содержимое совсем нет.
Что-то мне подсказывает, что это далеко не единственное "непродуманное" в этой задаче.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение