Вставка блока

Автор Тема: Вставка блока  (Прочитано 9046 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
Вставка блока
« : 10-04-2022, 19:29:11 »
Всем привет. Вроде все как обычно, дорабатываем старое, но не могу найти проблему.
Есть чертеж, в нем блок(и) получаю точку вставки и потом в эту же точку надо вставить другой блок не важно какой.
Вроде все понятно, делал не раз, но тут чего-то не понял, почему от отражается.
Ищу блок с именем:

Код - C# [Выбрать]
  1. public class Pos : SignBase
  2.     {
  3.         public Pos()
  4.         {
  5.  
  6.         }
  7.  
  8.         //Командный метод для знака
  9.         [CommandMethod("PosSign", CommandFlags.UsePickSet)]
  10.         public static void PosSing()
  11.         {
  12.             //Получаем ссылку на документ
  13.             AccessToDocument AcadDoc = new AccessToDocument();
  14.             //получаем ссылку на БД
  15.             Database AcadDB = AcadDoc.DBase;
  16.             //Экземпляр объекта класса SignBase
  17.             SignBase SB = new SignBase();
  18.  
  19.             using (Transaction tr = AcadDB.TransactionManager.StartTransaction())
  20.             {
  21.                 //получаем таблицу блоков и проходим по всем записям таблицы блоков
  22.                 BlockTable blockTable = (BlockTable)tr.GetObject(AcadDB.BlockTableId, OpenMode.ForWrite);
  23.                 for (int i = 0; i <= SB.CountSignBaseRow - 1; i++)
  24.                 {
  25.                     if (blockTable.Has(SB.GetParametrSign(i, 0))) //0 - индекс имя в базе
  26.                     {
  27.                         //получения переменной  - таблицы блоков чертежа
  28.                         BlockTableRecord LocalBlockRef = blockTable[SB.GetParametrSign(i, 0)].GetObject(OpenMode.ForWrite) as BlockTableRecord;
  29.                         //выбираем все объекты
  30.                         ObjectIdCollection C = LocalBlockRef.GetBlockReferenceIds(true, true);
  31.                         foreach (ObjectId id in C)
  32.                         {
  33.                             BlockReference LocalBlockRefSign = (BlockReference)tr.GetObject(id, OpenMode.ForWrite);
  34.                            
  35.                             double PX = LocalBlockRefSign.Position.X;
  36.                             double PY = LocalBlockRefSign.Position.Y;
  37.  
  38.                             double PZ = LocalBlockRefSign.Position.Z;
  39.  
  40.                             double AngleBlock = LocalBlockRefSign.Rotation;
  41.                            
  42.                            /* if (IfExistBlock(posNameSign))
  43.                             {
  44.                                 CreateBlockPodSignIdenIfExist(PX, PY, PZ, AngleBlock);
  45.                             }
  46.                             else
  47.                             {*/
  48.                                 CreateBlockPodSignIden(PX, PY, PZ, AngleBlock);
  49.                             //}
  50.                         }
  51.                     }
  52.                 }
  53.             }
  54.         }
  55.  

Потом по координатам вставляю  новый блок (не важно, что сейчас у коде):

Код - C# [Выбрать]
  1. public static void CreateBlockPodSignIden(double PX, double PY, double PZ, double AngleBlock)
  2.         {
  3.             AccessToDocument AcToDraw = new AccessToDocument();
  4.             //получаем ссылку на БД
  5.             Database AcadDB = AcToDraw.DBase;
  6.  
  7.             using (Transaction tr = AcadDB.TransactionManager.StartTransaction())
  8.             {
  9.                 //ссылка на слои
  10.                 //MyWorkLayer layer = new MyWorkLayer();
  11.                 // открываем таблицу блоков на запись
  12.                 BlockTable blocktable = (BlockTable)tr.GetObject(AcadDB.BlockTableId, OpenMode.ForWrite);
  13.                 if (blocktable.Has(posNameSign))
  14.                 {
  15.                     MessageBox.Show("Блок с именем (" + posNameSign + ") уже существует", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  16.                     return;
  17.                 }
  18.  
  19.                 // создаем новое определение блока, задаем ему имя
  20.                 BlockTableRecord block = new BlockTableRecord() { Name = posNameSign };
  21.  
  22.                 // запоминаем ID созданного определения блока
  23.                 ObjectId blockId = blocktable.Add(block);
  24.                 tr.AddNewlyCreatedDBObject(block, true);
  25.  
  26.                 if (blocktable.Has(posNameSign))
  27.                 {
  28.                     MessageBox.Show("Cjpolfy", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  29.  
  30.                 }
  31.  
  32.  
  33.                 //Подготавливаем слои
  34.                 //layer.PreparationLayer();
  35.                 //Слой знака
  36.                 //layer.ActiveLayerSetup(MyWorkLayer.layerPOS);
  37.  
  38.                 //Базовые координаты
  39.                 Point3d BasePoint = new Point3d(0, 0, 0);
  40.                 Point3d InsPoint = new Point3d(PX, PY, PZ);
  41.  
  42.  
  43.                 //Создаем полилинию
  44.                
  45.                 Polyline poly = new Polyline();
  46.                 poly.AddVertexAt(0, new Point2d(BasePoint.X - posLengthOne / 2, BasePoint.Y + posLengthOne / 2), 0, 0, 0);
  47.                 poly.AddVertexAt(0, new Point2d(BasePoint.X + posLengthOne / 2, BasePoint.Y + posLengthOne / 2), 0, 0, 0);
  48.                 poly.AddVertexAt(0, new Point2d(BasePoint.X + posLengthOne / 2, BasePoint.Y - posLengthOne / 2), 0, 0, 0);
  49.                 poly.AddVertexAt(0, new Point2d(BasePoint.X - posLengthOne / 2, BasePoint.Y - posLengthOne / 2), 0, 0, 0);
  50.  
  51.                 poly.ConstantWidth = 0.5;
  52.                 poly.Closed = true;
  53.                 block.AppendEntity(poly);
  54.                 tr.AddNewlyCreatedDBObject(poly, true);
  55.  
  56.                 Line line = new Line();
  57.  
  58.                 line = new Line(new Point3d(BasePoint.X, BasePoint.Y, BasePoint.Z), new Point3d(BasePoint.X+ posLengthOne * 2, BasePoint.Y + posLengthOne * 2, BasePoint.Z));
  59.                 block.AppendEntity(line);
  60.                 tr.AddNewlyCreatedDBObject(line, true);
  61.  
  62.  
  63.                 // открываем пространство модели на запись
  64.                 BlockTableRecord ms = (BlockTableRecord)tr.GetObject(blocktable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  65.  
  66.                 // создаем новое вхождение блока, используя ранее сохраненный ID определения блока
  67.                 BlockReference br = new BlockReference(InsPoint, blockId);
  68.  
  69.                 MessageBox.Show(blockId.ToString(), "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  70.  
  71.                 //Разворот ссылки блока на заданный радиус
  72.                 br.TransformBy(Matrix3d.Rotation(AngleBlock, Vector3d.ZAxis, InsPoint));
  73.  
  74.                 // добавляем созданное вхождение блока на пространство модели и в транзакцию
  75.                 ms.AppendEntity(br);
  76.  
  77.                 tr.AddNewlyCreatedDBObject(br, true);
  78.  
  79.  
  80.                 MessageBox.Show(PX.ToString(), "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  81.                 MessageBox.Show(PY.ToString(), "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  82.                 MessageBox.Show(PZ.ToString(), "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  83.                 MessageBox.Show(tr.ToString(), "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  84.  
  85.                 tr.Commit();
  86.            
  87.             }
  88.  
  89.         }
  90.  

Отрабатывает без ошибок и без нового блока .

Подскажите может, что бросится в глаза, где тут проблема?!
« Последнее редактирование: 10-04-2022, 20:06:37 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блока
« Ответ #1 : 10-04-2022, 20:06:14 »
Judas,
Правило форматирования кода у нас на форуме никто не отменял!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 11-04-2022, 18:18:48

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блока
« Ответ #2 : 10-04-2022, 20:07:48 »
Judas,
В методе PosSing нет tr.Commit()
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блока
« Ответ #3 : 10-04-2022, 20:11:12 »
Judas,
И на будущее. Каким образом можно догадаться что у тебя за классы используются и как они работают (типа AccessToDocument, SignBase и  т.д.)? Если нужна помощь - переделывай в стандартные классы/методы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
Re: Вставка блока
« Ответ #4 : 11-04-2022, 17:59:06 »
Благодарю.
Подскажите, что имеется ввиду "Если нужна помощь - переделывай в стандартные классы/методы.". Можете пример, я просто, чтобы не флудить следующий раз.

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блока
« Ответ #5 : 11-04-2022, 18:18:07 »
"Если нужна помощь - переделывай в стандартные классы/методы."
В твоём коде используются твои (т.е. нестандартные) классы и методы, часть которых я перечислил выше. Для того чтобы проверить код их все нужно иметь, а для того чтобы понять код - нужно понимать что они делают. Поэтому для того, чтобы тебе могли помочь или предоставляй весь код этих классов/методов (это худший вариант, т.к. тогда нужно еще отвлекаться на их логику) или заменяй их на стандартные классы/методы из AutoCAD .NET API (что значительно лучше для тестирования).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение