Добавить полилинию в блок?

Автор Тема: Добавить полилинию в блок?  (Прочитано 8307 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 2
Добрый день! У меня проблема с тем чтобы добавить полилинию в блок. Код срабатывает, но полилиния не отображается.

Код - C# [Выбрать]
  1.                         //Start trasaction
  2.                         using (Transaction acTrans = db.TransactionManager.StartTransaction()) {
  3.  
  4.                                 // Open the Block table for read
  5.                                 BlockTable acBlkTbl;
  6.                                 acBlkTbl = acTrans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  7.  
  8.                                 ObjectId blkRecId = ObjectId.Null;
  9.  
  10.                                 BlockTableRecord acBlkTblRecord;
  11.                                 acBlkTblRecord = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],OpenMode.ForWrite) as BlockTableRecord;
  12.  
  13.                                 //Check if block with this name exists in database
  14.                                 if (acBlkTbl.Has(blkName)) {
  15.                                         blkRecId = acBlkTbl[blkName];
  16.  
  17.                                 } else {
  18.  
  19.                                         //Create contour
  20.                                         Polyline acPoly = new Polyline();
  21.                                         acPoly.SetDatabaseDefaults();
  22.                                         //Create rectangular polyline
  23.                                         Point2dCollection points = new Point2dCollection() {
  24.                                                 new Point2d(0, 0),
  25.                                                 new Point2d(trackerWidth, 0),
  26.                                                 new Point2d(trackerWidth, trackerLength),
  27.                                                 new Point2d(0, trackerLength)
  28.                                                 };
  29.  
  30.                                        
  31.  
  32.                                         for (int i = 0; i < points.Count; i++) {
  33.                                                 acPoly.AddVertexAt(i, points[i], 0, 0, 0);
  34.                                         }
  35.                                         acPoly.Closed = true;
  36.  
  37.                                         //Create attribute
  38.                                         AttributeDefinition adAttr = new AttributeDefinition();
  39.                                         adAttr.Position = new Point3d(0, 0, 0);
  40.                                         adAttr.Tag = "Attribute";
  41.  
  42.                                         //Creating new block
  43.                                         using (BlockTableRecord acBlkTblRec = new BlockTableRecord()) {
  44.                                                 acBlkTblRec.Name = blkName;
  45.                                                 // Set the insertion point for the block
  46.                                                 acBlkTblRec.Origin = Point3d.Origin;
  47.  
  48.                                                 acBlkTbl.UpgradeOpen();
  49.  
  50.                                                 //Add block to blocktable
  51.                                                 ObjectId btrId = acBlkTbl.Add(acBlkTblRec);
  52.                                                 acTrans.AddNewlyCreatedDBObject(acBlkTblRec, true);
  53.  
  54.                                                 //Add elements to block
  55.                                                 acBlkTblRec.AppendEntity(acPoly);
  56.                                                 acTrans.AddNewlyCreatedDBObject(acPoly, true);
  57.  
  58.                                                 //Add attribute
  59.                                                 acBlkTblRec.AppendEntity(adAttr);
  60.                                                 acTrans.AddNewlyCreatedDBObject(adAttr, true);
  61.  
  62.                                                 //Get model space
  63.                                                 BlockTableRecord btrModelSpace =
  64.                                                         (BlockTableRecord) acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  65.  
  66.                                                 //Create block instance
  67.                                                 BlockReference brRefBlock = new BlockReference(Point3d.Origin, btrId);
  68.  
  69.                                                 //add instance to modelspace database
  70.                                                 btrModelSpace.AppendEntity(brRefBlock);
  71.                                                 acTrans.AddNewlyCreatedDBObject(brRefBlock, true);
  72.  
  73.                                                 //Set attribut
  74.                                                 AttributeReference arAttr = new AttributeReference();
  75.                                                 arAttr.SetAttributeFromBlock(adAttr, brRefBlock.BlockTransform);
  76.                                                 arAttr.TextString = "Tracker";
  77.                                                 brRefBlock.AttributeCollection.AppendAttribute(arAttr);
  78.                                                 acTrans.AddNewlyCreatedDBObject(arAttr, true);
  79.  
  80.                                         }
  81.  
  82.                                 }
  83.  
  84.                                 acTrans.Commit();
  85.  
« Последнее редактирование: 24-01-2022, 07:43:28 от Ihar »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавить полилинию в блок?
« Ответ #1 : 23-01-2022, 16:12:31 »
Подумай что будет если блок с таким именем уже есть.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 2
Re: Добавить полилинию в блок?
« Ответ #2 : 23-01-2022, 20:50:20 »
Ну там же в ифе берется блок с тем же именем

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавить полилинию в блок?
« Ответ #3 : 23-01-2022, 21:00:48 »
Ну там же в ифе берется блок с тем же именем
Этой фразы я не понял. Если блок с таким именем уже есть, то не нужно его создавать по новой, а нужно открыть его BlockTableRecord и добавлять полилинию в него.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 2
Re: Добавить полилинию в блок?
« Ответ #4 : 24-01-2022, 07:41:04 »
Не, полилинию в блок с тем же именем добавлять не нужно, в этом случае берётся этот блок целиком, как есть. Проблема у меня с созданием нового блока. Я проверил на других примитивах, и линия, круг по тому же алгоритму строятся и добавляются в блок, как надо. Не могу понять, что не так с этой полилинией.

Отмечено как Решение Александр Ривилис 24-01-2022, 15:44:45

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 2
Re: Добавить полилинию в блок?
« Ответ #5 : 24-01-2022, 12:42:46 »
Пардон, стыдно, аж до глубины души:( У меня все вершины полилинии оказались в одной точке:/ Всё работает теперь)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавить полилинию в блок?
« Ответ #6 : 24-01-2022, 15:47:00 »
Ihar,
Очень рекомендую использовать ARXDBG и MGDDBG для анализа чертежа: https://adn-cis.org/forum/index.php?topic=7274.0
Если бы использовал их, то факт того что полилиния в блоке есть, но вершины у неё совпадают, ты бы увидел за пару минут.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение