Вставка штриховки в ячейку таблицы (или как получить штриховку с новыми гранями)

Автор Тема: Вставка штриховки в ячейку таблицы (или как получить штриховку с новыми гранями)  (Прочитано 9880 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Доброго времени суток.
Нужно вставить штриховку заданного формата (прямоугольник) в ячейку таблицы. В принципе у меня получается это сделать. Но косяк какой-то с транзакциями или с копиями этих штриховок. Вообще я должен создать столько шаблонов штриховок в таблице, сколько у меня есть разных штриховок на чертеже.
В следующем участке кода я получаю эти штриховки (Hatch), создаю копию штриховки заданной формы и записываю. Я нашел решение, что можно штриховку вставить в ячейку таблицы, если штриховка лежит в BlockTableRecord.

Вот пример, как я кладу в ячейку

Код - C# [Выбрать]
  1. var cell = table.Cells[i, j];
  2. using (var tr = targetDocument.TransactionManager.StartTransaction())
  3. {
  4.       //Это я вызываю свой метод. В результате я получаю objectId на BlockTableRecord, в который я добавил hatch
  5.       ObjectId objectId = Utils.GetObjectId(database, AttributeOfItem.GetValueByAttributeId(attributes, Constants.AttributeIsObjectBlockReference) ?? "");
  6.  
  7.       var btr = (BlockTableRecord)tr.GetObject(objectId, OpenMode.ForRead);
  8.                            
  9.       cell.Value = btr.Name;
  10.       cell.BlockTableRecordId = objectId;
  11. }

Вот непосредственно код, в котором я создаю этот hatch на основе существующего и кладу его в BlockTableRecord (и в итоге запоминаю id у нового BlockTableRecord ). За основу я взял пример из это статьи:
https://www.theswamp.org/index.php?PHPSESSID=i2i21go2kftvb1sl2ft8h6htp1&topic=48485.msg538889#msg538889
Ошибка у меня заключается в том, что после обработки первого hatch, у меня приходит в отладки до обработки второй реальной штриховки в это мест:

Код - C# [Выбрать]
  1. hatch = transaction.GetObject(objectId, OpenMode.ForRead) as Hatch;
и выдает ошибку "Операция является недопустимой из-за текущего состояния объекта."}   System.Exception {System.InvalidOperationException}"
Кто знает, почему? ??? ??? ???7

Код - C# [Выбрать]
  1.                         AutocadApplicationGeometry.Point3dCollection ptOneColl = PolyToPoint3dCollection(polyline);
  2.  
  3.                         AutocadApplicatioEditorInput.PromptSelectionResult psr = null;
  4.                         psr = ed.SelectCrossingPolygon(ptOneColl);
  5.  
  6.                         if (psr.Status == AutocadApplicatioEditorInput.PromptStatus.OK)
  7.                         {
  8.                             foreach (ObjectId objectId in psr.Value.GetObjectIds())
  9.                             {
  10.                                 try {
  11.                                     //ToDo изменить as на is
  12.                                     hatch = transaction.GetObject(objectId, OpenMode.ForRead) as Hatch;
  13.                                 } catch(System.Exception ex) {
  14.                                     continue;
  15.                                 }
  16.                                 if (hatch == null)
  17.                                     continue;
  18.                                 try
  19.                                 {
  20.                                     if (targetObjectIds.Keys.Contains(hatch.PatternName))
  21.                                         targetObjectIds[hatch.PatternName].Count = targetObjectIds[hatch.PatternName].Count + hatch.Area;
  22.                                     else
  23.                                     {
  24.                                         BlockTable acBlkTbl;
  25.                                         acBlkTbl = transaction.GetObject(db.BlockTableId,
  26.                                                              OpenMode.ForRead) as BlockTable;
  27.  
  28.                                         BlockTableRecord acBlkTblRec;
  29.                                         acBlkTblRec = transaction.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  30.                                                  OpenMode.ForWrite) as BlockTableRecord;
  31.  
  32.                                         //// Создание круга для замкнутого контура штриховки
  33.                                         Circle acCirc = new Circle();
  34.                                         acCirc.SetDatabaseDefaults();
  35.                                         acCirc.Center = new AutocadApplicationGeometry.Point3d(3, 3, 0);
  36.                                         acCirc.Radius = 1;
  37.  
  38.                                         //// Добавление нового объекта круга в запись таблицы блоков и в транзакцию
  39.                                         acBlkTblRec.AppendEntity(acCirc);
  40.                                         transaction.AddNewlyCreatedDBObject(acCirc, true);
  41.  
  42.                                         //// Добавление круга в массив объектов
  43.                                         ObjectIdCollection acObjIdColl = new ObjectIdCollection();
  44.                                         acObjIdColl.Add(acCirc.ObjectId);
  45.  
  46.                                         //// Создание штриховки и добавление её в запись таблицы блоков и в транзакцию
  47.                                         //Hatch acHatch = (Hatch) hatch.Clone();
  48.  
  49.                                         //Hatch oHatch = new Hatch();
  50.                                         Hatch oHatch = (Hatch)hatch.Clone();
  51.                                         int count  = oHatch.NumberOfLoops;
  52.                                         for (int i = 0; i < count; i++)
  53.                                             oHatch.RemoveLoopAt(0);
  54.                                         //AutocadApplicationGeometry.Vector3d normal = new AutocadApplicationGeometry.Vector3d(0.0, 0.0, 1.0);
  55.                                         //oHatch.Normal = normal;
  56.                                         //oHatch.Elevation = 0.0;
  57.                                         //oHatch.PatternScale = 2.0;
  58.                                         //oHatch.SetHatchPattern(HatchPatternType.PreDefined, "ZIGZAG");
  59.                                         //oHatch.ColorIndex = 1;
  60.  
  61.                                         acBlkTblRec.AppendEntity(oHatch);
  62.                                         transaction.AddNewlyCreatedDBObject(oHatch, true);
  63.                                         //this works ok  
  64.                                         oHatch.Associative = true;
  65.                                         oHatch.AppendLoop((int)HatchLoopTypes.Default, acObjIdColl);
  66.                                         oHatch.EvaluateHatch(true);
  67.  
  68.                                         //acBlkTblRec.AppendEntity(acHatch);
  69.                                         //transaction.AddNewlyCreatedDBObject(acHatch, true);
  70.  
  71.                                         // Установка свойтсв штриховки
  72.                                         // Ассоциативность должна быть установлена после добавления штриховки в запись таблицы блоков и до метода AppendLoop
  73.  
  74.                                        // acHatch.SetDatabaseDefaults();
  75.  
  76.                                         //acHatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID");
  77.                                         //acHatch.Associative = true;
  78.                                         //acHatch.AppendLoop(HatchLoopTypes.Outermost, acObjIdColl);
  79.  
  80.                                        // acHatch.EvaluateHatch(true);
  81.  
  82.                                         // Сохранение нового объекта в базу данных
  83.                                         //transaction.AddNewlyCreatedDBObject(acBlkTblRec, true);
  84.                                         transaction.Commit();
  85.  
  86.                                         //Hatch ha = new Hatch();
  87.                                         //ha.SetHatchPattern(HatchPatternType.PreDefined, "SOLID");
  88.                                         //ha.Normal = AutocadApplicationGeometry.Vector3d.ZAxis;
  89.  
  90.                                         //ha.AppendLoop(HatchLoopTypes.Default, acObjIdColl);
  91.                                         //ha.EvaluateHatch(true);
  92.                                         //transaction.Commit();
  93.  
  94.                                         using (Transaction transaction2 = db.TransactionManager.StartTransaction())
  95.                                         {
  96.                                             //BlockTableRecord hatchBlockTableRecord;
  97.                                             //hatchBlockTableRecord = transaction2.GetObject(acHatch.ObjectId,
  98.                                             //                                OpenMode.ForRead) as BlockTableRecord;
  99.                                             BlockTable bt = (BlockTable)transaction2.GetObject(
  100.                                                 db.BlockTableId, OpenMode.ForWrite);
  101.                                             BlockTableRecord br = new BlockTableRecord();
  102.                                             br.Name = "hatch" + Guid.NewGuid().ToString();
  103.                                             br.Origin = new AutocadApplicationGeometry.Point3d(10.0, 10.0, 10.0);
  104.  
  105.                                             //foreach (var id in ids)
  106.                                             //{
  107.                                                 Entity ent = (Entity)transaction2.GetObject(oHatch.ObjectId, OpenMode.ForRead);
  108.                                                 br.AppendEntity(ent.Clone() as Entity);
  109.                                                // br.AppendEntity(ent);
  110.                                             //if (eraseEntities)
  111.                                             //{
  112.                                             ent.UpgradeOpen();
  113.                                             ent.Erase(true);
  114.                                             //}
  115.                                             //}
  116.  
  117.                                             bt.Add(br);
  118.                                             transaction2.AddNewlyCreatedDBObject(br, true);
  119.  
  120.                                             transaction2.Commit();
  121.  
  122.  
  123.                                             ResultBuffer buf =
  124.                                                 new ResultBuffer(new TypedValue((int)DxfCode.Handle, br.ObjectId.Handle));
  125.                                             //Retrieve the Handle and use it to construct an ObjectId
  126.                                             TypedValue[] arr = buf.AsArray();
  127.                                             long val = Convert.ToInt64(arr[0].Value.ToString(), 16);
  128.  
  129.                                             newItem = new ItemForCalculate();
  130.                                             newItem.Count = hatch.Area;
  131.                                             newItem.ObjectId = Convert.ToString(val);
  132.                                             targetObjectIds.Add(hatch.PatternName, newItem);
  133.                                         }
  134.                                     }
  135.                                 }
  136.                                 catch(Autodesk.AutoCAD.Runtime.Exception ex)
  137.                                 {
  138.                                     Console.Write(ex.Message);
  139.                                 }
  140.                             }
  141.                         }
  142.  

               
« Последнее редактирование: 03-08-2016, 22:18:36 от alexeyOMG »

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Я переделал вот в такой формат (код ниже), но тогда после всех операций у меня ругается на строчке:

Код - C# [Выбрать]
  1. var btr = (BlockTableRecord)tr.GetObject(objectId, OpenMode.ForRead);

с инфой типа "isErased". И не дает получить id на BlockTableRecord.

Я могу написать так

Код - C# [Выбрать]
  1. var btr = (BlockTableRecord)tr.GetObject(objectId, OpenMode.ForRead, true);
и он возвращать id, даже если он erased, но в итоге у меня ничего не отрисуется.
Мб в этом ключе можете помочь, если в первым постом непонятно будет, что делать.

Вот, собственно, изначальный код, в котором я в этом варианте получаю новые штриховки:

Код - C# [Выбрать]
  1. foreach (ObjectId objectId in psr.Value.GetObjectIds())
  2.                             {
  3.                                 Hatch hatch;
  4.                                 Hatch newHatch = new Hatch();
  5.                                 try
  6.                                 {
  7.                                     //ToDo изменить as на is
  8.                                     hatch = transaction.GetObject(objectId, OpenMode.ForRead) as Hatch;
  9.                                 }
  10.                                 catch (System.Exception ex)
  11.                                 {
  12.                                     continue;
  13.                                 }
  14.  
  15.                                 if (hatch == null)
  16.                                     continue;
  17.                                 //newHatch.Normal = hatch.Normal;
  18.                                 //newHatch.Elevation = hatch.Elevation;
  19.                                 //newHatch.PatternScale = hatch.PatternScale;
  20.                                 //newHatch.SetHatchPattern(hatch.PatternType, hatch.PatternName);
  21.                                 //newHatch.ColorIndex = hatch.ColorIndex;
  22.                                 hatchs.Add(hatch);
  23.  
  24.                             }
  25.                             foreach (Hatch hatch in hatchs)
  26.                             {
  27.                                 using (Transaction transaction2 = db.TransactionManager.StartTransaction())
  28.                                 {
  29.                                     try
  30.                                     {
  31.  
  32.                                         if (targetObjectIds.Keys.Contains(hatch.PatternName))
  33.                                             targetObjectIds[hatch.PatternName].Count = targetObjectIds[hatch.PatternName].Count + hatch.Area;
  34.                                         else
  35.                                         {
  36.                                             BlockTable acBlkTbl;
  37.                                             acBlkTbl = transaction2.GetObject(db.BlockTableId,
  38.                                                                  OpenMode.ForRead) as BlockTable;
  39.  
  40.                                             BlockTableRecord acBlkTblRec;
  41.                                             acBlkTblRec = transaction2.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  42.                                                      OpenMode.ForWrite) as BlockTableRecord;
  43.  
  44.                                             // Создание круга для замкнутого контура штриховки
  45.  
  46.                                             AutocadApplicationGeometry.Point2d pt = new AutocadApplicationGeometry.Point2d(0.0, 0.0);
  47.                                             Autodesk.AutoCAD.DatabaseServices.Polyline plBox =
  48.                                                 new Autodesk.AutoCAD.DatabaseServices.Polyline(4);
  49.  
  50.                                             plBox.Normal = AutocadApplicationGeometry.Vector3d.ZAxis;
  51.                                             plBox.AddVertexAt(0, pt, 0.0, -1.0, -1.0);
  52.                                             plBox.AddVertexAt(1,
  53.                                                          new AutocadApplicationGeometry.Point2d(pt.X + 10, pt.Y), 0.0, -1.0, -1.0);
  54.                                             plBox.AddVertexAt(2,
  55.                                                       new AutocadApplicationGeometry.Point2d(pt.X + 10, pt.Y + 5), 0.0, -1.0, -1.0);
  56.                                             plBox.AddVertexAt(3,
  57.                                                           new AutocadApplicationGeometry.Point2d(pt.X, pt.Y + 5), 0.0, -1.0, -1.0);
  58.                                             plBox.Closed = true;
  59.                                             acBlkTblRec.AppendEntity(plBox);
  60.                                             transaction2.AddNewlyCreatedDBObject(plBox, true);
  61.                                             ObjectIdCollection acObjIdColl = new ObjectIdCollection();
  62.                                             acObjIdColl.Add(plBox.ObjectId);
  63.  
  64.                                             // Добавление нового объекта круга в запись таблицы блоков и в транзакцию
  65.                                             //acBlkTblRec.AppendEntity(acCirc);
  66.                                             //transaction.AddNewlyCreatedDBObject(acCirc, true);
  67.  
  68.                                             // Добавление круга в массив объектов
  69.                                             //ObjectIdCollection acObjIdColl = new ObjectIdCollection();
  70.                                             //acObjIdColl.Add(acCirc.ObjectId);
  71.  
  72.                                             //Создание штриховки и добавление её в запись таблицы блоков и в транзакцию
  73.                                             // Hatch oHatch = (Hatch)hatch.Clone();
  74.                                             Hatch oHatch = new Hatch();
  75.                                             oHatch.Normal = hatch.Normal;
  76.                                             oHatch.Elevation = hatch.Elevation;
  77.                                             oHatch.PatternScale = hatch.PatternScale;
  78.                                             oHatch.SetHatchPattern(hatch.PatternType, hatch.PatternName);
  79.                                             oHatch.ColorIndex = hatch.ColorIndex;
  80.                                             int count = oHatch.NumberOfLoops;
  81.                                             //for (int i = 0; i < count; i++)
  82.                                             //    oHatch.RemoveLoopAt(0);
  83.  
  84.                                             acBlkTblRec.AppendEntity(oHatch);
  85.                                             transaction2.AddNewlyCreatedDBObject(oHatch, true);
  86.                                             oHatch.Associative = true;
  87.                                             oHatch.AppendLoop((int)HatchLoopTypes.Default, acObjIdColl);
  88.                                             oHatch.EvaluateHatch(true);
  89.                                            
  90.                                             transaction2.Commit();
  91.  
  92.                                             using (Transaction transaction3 = db.TransactionManager.StartTransaction())
  93.                                             {
  94.                                                 BlockTable bt = (BlockTable)transaction3.GetObject(
  95.                                                         db.BlockTableId, OpenMode.ForWrite);
  96.                                                 BlockTableRecord br = new BlockTableRecord();
  97.                                                 br.Name = "hatch" + Guid.NewGuid().ToString();
  98.                                                 br.Origin = new AutocadApplicationGeometry.Point3d(10.0, 10.0, 10.0);
  99.  
  100.                                                 Entity ent = (Entity)transaction3.GetObject(oHatch.ObjectId, OpenMode.ForRead);
  101.                                                 br.AppendEntity(ent.Clone() as Entity);
  102.                                                // br.AppendEntity(ent);
  103.                                                 ent.UpgradeOpen();
  104.                                                 ent.Erase(false);
  105.  
  106.                                                 bt.Add(br);
  107.                                                 transaction3.AddNewlyCreatedDBObject(br, true);
  108.  
  109.                                                 transaction3.Commit();
  110.  
  111.                                                 ResultBuffer buf =
  112.                                                         new ResultBuffer(new TypedValue((int)DxfCode.Handle, br.ObjectId.Handle));
  113.                                                 //Retrieve the Handle and use it to construct an ObjectId
  114.                                                 TypedValue[] arr = buf.AsArray();
  115.                                                 long val = Convert.ToInt64(arr[0].Value.ToString(), 16);
  116.  
  117.                                                 newItem = new ItemForCalculate();
  118.                                                 newItem.Count = hatch.Area;
  119.                                                 newItem.ObjectId = Convert.ToString(val);
  120.                                                 targetObjectIds.Add(hatch.PatternName, newItem);
  121.                                             }
  122.  
  123.                                         }
  124.                                     }
  125.                                     catch (System.Exception ex)
  126.                                     {
  127.                                         Console.Write(ex.Message);
  128.                                     }
  129.                                 }
  130.                             }
  131.                         }
« Последнее редактирование: 03-08-2016, 22:18:03 от alexeyOMG »

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

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

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0

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

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

Отмечено как Решение alexeyOMG 04-08-2016, 09:15:18

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Посмотри. Думаю это должно тебе помочь:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. // This line is not mandatory, but improves loading performances
  9. [assembly: CommandClass(typeof(Rivilis.HatchClone))]
  10.  
  11. namespace Rivilis
  12. {
  13.   public class HatchClone
  14.   {
  15.     [CommandMethod("HatchClone")]
  16.     public void MyCommand()
  17.     {
  18.       Document doc = Application.DocumentManager.MdiActiveDocument;
  19.       if (doc == null) return;
  20.       Editor ed = doc.Editor;
  21.       Database db = doc.Database;
  22.       PromptEntityOptions prEnt = new PromptEntityOptions("\nВыберите штриховку: ");
  23.       prEnt.SetRejectMessage("\nЭто не штриховка! ");
  24.       prEnt.AddAllowedClass(typeof(Hatch), true);
  25.       PromptEntityResult rsEnt = ed.GetEntity(prEnt);
  26.       if (rsEnt.Status != PromptStatus.OK) return;
  27.       ObjectId idHatch = rsEnt.ObjectId;
  28.       ObjectId idBtr = ObjectId.Null;
  29.       //////////////////////////////////////////////////////////////////////////
  30.       //          Создаём блок со штриховкой
  31.       //////////////////////////////////////////////////////////////////////////
  32.       using (Transaction tr = doc.TransactionManager.StartTransaction())
  33.       {
  34.         BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
  35.         // Создаем новый блок
  36.         BlockTableRecord btr = new BlockTableRecord();
  37.         btr.Name = Guid.NewGuid().ToString("");
  38.         idBtr = bt.Add(btr);
  39.         tr.AddNewlyCreatedDBObject(btr, true);
  40.         btr.UpgradeOpen();
  41.         // Создаем прямоугольник заданной величины сразу в новом блоке
  42.         Polyline poly = new Polyline();
  43.         poly.SetDatabaseDefaults(db);
  44.         poly.AddVertexAt(0, new Point2d(0, 0), 0, 0, 0);
  45.         poly.AddVertexAt(1, new Point2d(0, 100), 0, 0, 0);
  46.         poly.AddVertexAt(2, new Point2d(100, 100), 0, 0, 0);
  47.         poly.AddVertexAt(3, new Point2d(100, 0), 0, 0, 0);
  48.         poly.Closed = true;
  49.         ObjectId idPoly = btr.AppendEntity(poly);
  50.         tr.AddNewlyCreatedDBObject(poly, true);
  51.         ObjectIdCollection ids = new ObjectIdCollection();
  52.         ids.Add(idPoly);
  53.         Hatch h1 = tr.GetObject(idHatch, OpenMode.ForRead) as Hatch;
  54.         //////////////////////////////////////////////////////////////////////////
  55.         // Создаём штриховку в нужном блоке. При этом копируем все свойства из
  56.         // исходной штриховки. Различаем обычную и градиентную штриховку
  57.         //////////////////////////////////////////////////////////////////////////
  58.         Hatch h2 = new Hatch();
  59.         btr.AppendEntity(h2);
  60.         tr.AddNewlyCreatedDBObject(h2, true);
  61.         h2.HatchObjectType = h1.HatchObjectType;
  62.         if (h1.IsGradient) {
  63.           h2.SetGradient(h1.GradientType, h1.GradientName);
  64.           h2.SetGradientColors(h1.GetGradientColors());
  65.           h2.GradientOneColorMode = h1.GradientOneColorMode;
  66.           h2.GradientShift = h1.GradientShift;
  67.           h2.GradientAngle = h1.GradientAngle;
  68.         }
  69.         else
  70.         {
  71.           try { h2.PatternAngle    = h1.PatternAngle;     }   catch { }
  72.           try { h2.PatternScale    = h1.PatternScale;     }   catch { }
  73.           try { h2.PatternSpace    = h1.PatternSpace;     }   catch { }
  74.           try { h2.PatternDouble   = h1.PatternDouble;    }   catch { }
  75.           try { h2.BackgroundColor = h1.BackgroundColor;  }   catch { }
  76.           h2.SetHatchPattern(h1.PatternType, h1.PatternName);
  77.         }
  78.         h2.Associative = true;
  79.         h2.AppendLoop(HatchLoopTypes.External, ids);
  80.         h2.EvaluateHatch(false);
  81.         tr.Commit();
  82.       }
  83.       //////////////////////////////////////////////////////////////////////////
  84.       //                   Вставляем для проверки созданный блок
  85.       //////////////////////////////////////////////////////////////////////////
  86.       PromptPointOptions prPnt =
  87.         new PromptPointOptions("\nУкажите точку вставки блока: ");
  88.       PromptPointResult rsPnt = ed.GetPoint(prPnt);
  89.       Matrix3d mat = ed.CurrentUserCoordinateSystem;
  90.       if (rsPnt.Status != PromptStatus.OK) return;
  91.       using (Transaction tr = doc.TransactionManager.StartTransaction())
  92.       {
  93.         BlockTableRecord btr =
  94.           tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  95.         BlockReference br = new BlockReference(rsPnt.Value.TransformBy(mat), idBtr);
  96.         btr.AppendEntity(br);
  97.         tr.AddNewlyCreatedDBObject(br, true);
  98.         tr.Commit();
  99.       }
  100.  
  101.     }
  102.   }
  103. }

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

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Я делаю все так, но не вывожу в конкретную точку. Я просто запоминаю id у blockTableRecord, а потом делаю вот это:
Код - C# [Выбрать]
  1. var btr = (BlockTableRecord)tr.GetObject(objectId, OpenMode.ForRead);


в итоге у меня в документе появляется уведомление, что есть ошибки, перезагрузите чертеж.

Сейчас у меня получилось так (я кладу в массив blockTableRef у BlockRef):
Код - C# [Выбрать]
  1. {
  2.                         AutocadApplicationGeometry.Point3dCollection ptOneColl = PolyToPoint3dCollection(polyline);
  3.  
  4.                         AutocadApplicatioEditorInput.PromptSelectionResult psr = null;
  5.                         psr = ed.SelectCrossingPolygon(ptOneColl);
  6.  
  7.                         if (psr.Status == AutocadApplicatioEditorInput.PromptStatus.OK)
  8.                         {
  9.                             foreach (ObjectId objectId in psr.Value.GetObjectIds())
  10.                             {
  11.                                 try {
  12.                                     hatch = transaction.GetObject(objectId, OpenMode.ForRead) as Hatch;
  13.                                 } catch(System.Exception ex) {
  14.                                     continue;
  15.                                 }
  16.                                 if (hatch == null)
  17.                                     continue;
  18.                                 try
  19.                                 {
  20.  
  21.                                     ObjectId idBlockTableRecord = ObjectId.Null;
  22.                                     if (targetObjectIds.Keys.Contains(hatch.PatternName))
  23.                                         targetObjectIds[hatch.PatternName].Count = targetObjectIds[hatch.PatternName].Count + hatch.Area;
  24.                                     else
  25.                                     {
  26.                                         using (Transaction transaction2 = db.TransactionManager.StartTransaction())
  27.                                         {
  28.  
  29.                                             BlockTable acBlkTbl;
  30.                                             acBlkTbl = transaction2.GetObject(db.BlockTableId,
  31.                                                                  OpenMode.ForWrite) as BlockTable;
  32.  
  33.                                             BlockTableRecord blockTableRecord = new BlockTableRecord();
  34.                                             blockTableRecord.Name = Guid.NewGuid().ToString("");
  35.                                             idBlockTableRecord = acBlkTbl.Add(blockTableRecord);
  36.                                             transaction2.AddNewlyCreatedDBObject(blockTableRecord, true);
  37.                                             blockTableRecord.UpgradeOpen();
  38.  
  39.                                             Polyline poly = new Polyline();
  40.                                             poly.SetDatabaseDefaults(db);
  41.                                             poly.AddVertexAt(0, new AutocadApplicationGeometry.Point2d(0, 0), 0, 0, 0);
  42.                                             poly.AddVertexAt(1, new AutocadApplicationGeometry.Point2d(0, 100), 0, 0, 0);
  43.                                             poly.AddVertexAt(2, new AutocadApplicationGeometry.Point2d(100, 100), 0, 0, 0);
  44.                                             poly.AddVertexAt(3, new AutocadApplicationGeometry.Point2d(100, 0), 0, 0, 0);
  45.                                             poly.Closed = true;
  46.  
  47.                                             //// Добавление нового объекта круга в запись таблицы блоков и в транзакцию
  48.                                             ObjectId polylineId = blockTableRecord.AppendEntity(poly);
  49.                                             transaction2.AddNewlyCreatedDBObject(poly, true);
  50.  
  51.                                             // Добавление круга в массив объектов
  52.                                             ObjectIdCollection acObjIdColl = new ObjectIdCollection();
  53.                                             acObjIdColl.Add(polylineId);
  54.  
  55.                                             Hatch newHatch = new Hatch();
  56.                                             blockTableRecord.AppendEntity(newHatch);
  57.                                             transaction2.AddNewlyCreatedDBObject(newHatch, true);
  58.                                             newHatch.HatchObjectType = hatch.HatchObjectType;
  59.                                             if (hatch.IsGradient)
  60.                                             {
  61.                                                 newHatch.SetGradient(hatch.GradientType, hatch.GradientName);
  62.                                                 newHatch.SetGradientColors(hatch.GetGradientColors());
  63.                                                 newHatch.GradientOneColorMode = hatch.GradientOneColorMode;
  64.                                                 newHatch.GradientShift = hatch.GradientShift;
  65.                                                 newHatch.GradientAngle = hatch.GradientAngle;
  66.                                             }
  67.                                             else
  68.                                             {
  69.                                                 try { newHatch.PatternAngle = hatch.PatternAngle; } catch { }
  70.                                                 try { newHatch.PatternScale = hatch.PatternScale; } catch { }
  71.                                                 try { newHatch.PatternSpace = hatch.PatternSpace; } catch { }
  72.                                                 try { newHatch.PatternDouble = hatch.PatternDouble; } catch { }
  73.                                                 try { newHatch.BackgroundColor = hatch.BackgroundColor; } catch { }
  74.                                                 newHatch.SetHatchPattern(hatch.PatternType, hatch.PatternName);
  75.                                             }
  76.                                             newHatch.Associative = true;
  77.                                             newHatch.AppendLoop(HatchLoopTypes.External, acObjIdColl);
  78.                                             newHatch.EvaluateHatch(false);
  79.  
  80.                                             BlockTableRecord blockTableRecord2 = new BlockTableRecord();
  81.                                             blockTableRecord2.Name = Guid.NewGuid().ToString("");
  82.                                             ObjectId idBlockTableRecord2 = acBlkTbl.Add(blockTableRecord2);
  83.                                             transaction2.AddNewlyCreatedDBObject(blockTableRecord2, true);
  84.                                             blockTableRecord2.UpgradeOpen();
  85.  
  86.                                             AutocadApplicationGeometry.Point3d point = new AutocadApplicationGeometry.Point3d(2.0, 4.0, 6.0);
  87.                                             BlockReference blockRef = new BlockReference(point, blockTableRecord.ObjectId);
  88.                                            
  89.                                             blockTableRecord2.AppendEntity(blockRef);
  90.                                             transaction2.AddNewlyCreatedDBObject(blockRef, true);
  91.  
  92.                                             transaction2.Commit();
  93.  
  94.                                             ResultBuffer buf =
  95.                                                     new ResultBuffer(new TypedValue((int)DxfCode.Handle, blockRef.BlockTableRecord.Handle));
  96.  
  97.                                             TypedValue[] arr = buf.AsArray();
  98.                                             long val = Convert.ToInt64(arr[0].Value.ToString(), 16);
  99.  
  100.                                             newItem = new ItemForCalculate();
  101.                                             newItem.Count = hatch.Area;
  102.                                             newItem.ObjectId = Convert.ToString(val);
  103.                                             targetObjectIds.Add(hatch.PatternName, newItem);
  104.  
  105.                                         }
  106.                                     }
  107.                                 }
  108.                                 catch(Autodesk.AutoCAD.Runtime.Exception ex)
  109.                                 {
  110.                                     doc.Editor.WriteMessage(ex.Message);
  111.                                 }
  112.                                 catch (System.Exception ex)
  113.                                 {
  114.                                     doc.Editor.WriteMessage(ex.Message);
  115.                                 }
  116.                             }
  117.                         }
  118.                     }
« Последнее редактирование: 04-08-2016, 08:34:51 от alexeyOMG »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Это очередной обрывок кода из которого я не могу понять что ты делаешь.
Вот объясни мне чего ты добиваешься этим кодом:
Код - C# [Выбрать]
  1. ResultBuffer buf =
  2.         new ResultBuffer(new TypedValue((int)DxfCode.Handle, blockRef.BlockTableRecord.Handle));
  3. TypedValue[] arr = buf.AsArray();
  4. long val = Convert.ToInt64(arr[0].Value.ToString(), 16);
???
А как ты можешь обращаться к blockRef.BlockTableRecord после того как выполнил transaction2.Commit(); ???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение