Вставка большого количества блоков

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

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
День добрый!
Допустим у меня есть карты размерами 50х20км, мне ее нужно представить в виде блоков с атрибутами (15 единиц).
Т.е. 1 контрольная точка это блок с размерами 10* х 10* м со служебной характеристикой в атрибутах.
Сам блок:
Код - C# [Выбрать]
  1.  public void CreatElement(MapPoint _mapPoint)
  2.         {
  3.             //получаем ссылкe на документ
  4.             Document ad = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  5.             if (ad == null) return;
  6.             //получаем ссылкe на БД
  7.             Database db = ad.Database;
  8.             //получаем ссылку на ALayer
  9.             ALayer mapLayer = new ALayer();
  10.             //начинаем транзакцию
  11.             using (Transaction tr = db.TransactionManager.StartTransaction())
  12.             {
  13.                 //
  14.                 Point3d BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y, Point3d.Origin.Z);
  15.                 //
  16.                 Point3d InsPoint = new Point3d(_mapPoint.X, _mapPoint.Y, _mapPoint.Z);
  17.                 //получаем ссылку на таблицу блоков
  18.                 BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
  19.                 //создание определения блока
  20.                 BlockTableRecord btr = new BlockTableRecord() { Name = ElementMap};
  21.                 ObjectId idBlock = bt.Add(btr);
  22.                 tr.AddNewlyCreatedDBObject(btr, true);
  23.                 //Слой берегоукрепление
  24.                 mapLayer.PreparationLayer();
  25.                 mapLayer.ActiveLayerSetup(ALayer.layerMapPoint);
  26.  
  27.                 //Создаем масштабный элемент карты исследования
  28.                 //Создаем полилинию
  29.                 Polyline poly01 = new Polyline();
  30.                 poly01.AddVertexAt(0, new Point2d(BasePoint.X - _mapPoint.A / 2, BasePoint.Y + _mapPoint.B / 2), 0, 0, 0);
  31.                 poly01.AddVertexAt(0, new Point2d(BasePoint.X + _mapPoint.A / 2, BasePoint.Y + _mapPoint.B / 2), 0, 0, 0);
  32.                 poly01.AddVertexAt(0, new Point2d(BasePoint.X + _mapPoint.A / 2, BasePoint.Y - _mapPoint.B / 2), 0, 0, 0);
  33.                 poly01.AddVertexAt(0, new Point2d(BasePoint.X - _mapPoint.A / 2, BasePoint.Y - _mapPoint.B / 2), 0, 0, 0);
  34.                 poly01.Closed = true;
  35.                 btr.AppendEntity(poly01);
  36.                 tr.AddNewlyCreatedDBObject(poly01, true);
  37.  
  38.                 //Слой атрибутов
  39.                 mapLayer.ActiveLayerSetup(ALayer.layerMapPointAtt);
  40.                 //Добавляем атрибут №0
  41.                 BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y - 1 * (TextAttribute + TextAttributeDelta) - TextAttributeDelta, Point3d.Origin.Z);
  42.                 AttributeDefinition AttributeBlock00 = new AttributeDefinition()
  43.                 {
  44.                     Position = BasePoint,
  45.                     Prompt = "",
  46.                     Tag = TagV1,
  47.                     TextString = (_mapPoint.V1).ToString(),
  48.                     Height = TextAttribute,
  49.                     HorizontalMode = TextHorizontalMode.TextLeft,
  50.                     VerticalMode = TextVerticalMode.TextBottom,
  51.                     Visible = true,
  52.                     AlignmentPoint = BasePoint
  53.                 };
  54.                 btr.AppendEntity(AttributeBlock00);
  55.                 tr.AddNewlyCreatedDBObject(AttributeBlock00, true);
  56.  
  57.                 //Добавляем атрибут №1
  58.                 BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y - 2 * (TextAttribute + TextAttributeDelta) - TextAttributeDelta, Point3d.Origin.Z);
  59.                 AttributeDefinition AttributeBlock01 = new AttributeDefinition()
  60.                 {
  61.                     Position = BasePoint,
  62.                     Prompt = "",
  63.                     Tag = TagV2,
  64.                     TextString = (_mapPoint.V2).ToString(),
  65.                     Height = TextAttribute,
  66.                     HorizontalMode = TextHorizontalMode.TextLeft,
  67.                     VerticalMode = TextVerticalMode.TextBottom,
  68.                     Visible = true,
  69.                     AlignmentPoint = BasePoint
  70.                 };
  71.                 btr.AppendEntity(AttributeBlock01);
  72.                 tr.AddNewlyCreatedDBObject(AttributeBlock01, true);
  73.  
  74.                 //Добавляем атрибут №2
  75.                 BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y - 3 * (TextAttribute + TextAttributeDelta), Point3d.Origin.Z);
  76.                 AttributeDefinition AttributeBlock02 = new AttributeDefinition()
  77.                 {
  78.                     Position = BasePoint,
  79.                     Prompt = "",
  80.                     Tag = TagRoad,
  81.                     TextString = _mapPoint.Road,
  82.                     Height = TextAttribute,
  83.                     HorizontalMode = TextHorizontalMode.TextLeft,
  84.                     VerticalMode = TextVerticalMode.TextBottom,
  85.                     Visible = true,
  86.                     AlignmentPoint = BasePoint
  87.                 };
  88.                 btr.AppendEntity(AttributeBlock02);
  89.                 tr.AddNewlyCreatedDBObject(AttributeBlock02, true);
  90.  
  91.                 //Добавляем атрибут №3
  92.                 BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y - 4 * (TextAttribute + TextAttributeDelta), Point3d.Origin.Z);
  93.                 AttributeDefinition AttributeBlock03 = new AttributeDefinition()
  94.                 {
  95.                     Position = BasePoint,
  96.                     Prompt = "",
  97.                     Tag = TagER,
  98.                     TextString = _mapPoint.ExplanationsRoad,
  99.                     Height = TextAttribute,
  100.                     HorizontalMode = TextHorizontalMode.TextLeft,
  101.                     VerticalMode = TextVerticalMode.TextBottom,
  102.                     Visible = true,
  103.                     AlignmentPoint = BasePoint
  104.                 };
  105.                 btr.AppendEntity(AttributeBlock03);
  106.                 tr.AddNewlyCreatedDBObject(AttributeBlock03, true);
  107.  
  108.                 //Добавляем атрибут №4
  109.                 BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y - 5 * (TextAttribute + TextAttributeDelta), Point3d.Origin.Z);
  110.                 AttributeDefinition AttributeBlock04 = new AttributeDefinition()
  111.                 {
  112.                     Position = BasePoint,
  113.                     Prompt = "",
  114.                     Tag = TagZR,
  115.                     TextString = (_mapPoint.RoadZone).ToString(),
  116.                     Height = TextAttribute,
  117.                     HorizontalMode = TextHorizontalMode.TextLeft,
  118.                     VerticalMode = TextVerticalMode.TextBottom,
  119.                     Visible = true,
  120.                     AlignmentPoint = BasePoint
  121.                 };
  122.                 btr.AppendEntity(AttributeBlock04);
  123.                 tr.AddNewlyCreatedDBObject(AttributeBlock04, true);
  124.  
  125.                 //Добавляем атрибут №5
  126.                 BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y - 6 * (TextAttribute + TextAttributeDelta), Point3d.Origin.Z);
  127.                 AttributeDefinition AttributeBlock05 = new AttributeDefinition()
  128.                 {
  129.                     Position = BasePoint,
  130.                     Prompt = "",
  131.                     Tag = TagStc,
  132.                     TextString = _mapPoint.Stc,
  133.                     Height = TextAttribute,
  134.                     HorizontalMode = TextHorizontalMode.TextLeft,
  135.                     VerticalMode = TextVerticalMode.TextBottom,
  136.                     Visible = true,
  137.                     AlignmentPoint = BasePoint
  138.                 };
  139.                 btr.AppendEntity(AttributeBlock05);
  140.                 tr.AddNewlyCreatedDBObject(AttributeBlock05, true);
  141.  
  142.                 //Добавляем атрибут №6
  143.                 BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y - 7 * (TextAttribute + TextAttributeDelta), Point3d.Origin.Z);
  144.                 AttributeDefinition AttributeBlock06 = new AttributeDefinition()
  145.                 {
  146.                     Position = BasePoint,
  147.                     Prompt = "",
  148.                     Tag = TagEStc,
  149.                     TextString = _mapPoint.ExplanationsStc,
  150.                     Height = TextAttribute,
  151.                     HorizontalMode = TextHorizontalMode.TextLeft,
  152.                     VerticalMode = TextVerticalMode.TextBottom,
  153.                     Visible = true,
  154.                     AlignmentPoint = BasePoint
  155.                 };
  156.                 btr.AppendEntity(AttributeBlock06);
  157.                 tr.AddNewlyCreatedDBObject(AttributeBlock06, true);
  158.  
  159.                 //Добавляем атрибут №7
  160.                 BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y - 8 * (TextAttribute + TextAttributeDelta), Point3d.Origin.Z);
  161.                 AttributeDefinition AttributeBlock07 = new AttributeDefinition()
  162.                 {
  163.                     Position = BasePoint,
  164.                     Prompt = "",
  165.                     Tag = TagZStc,
  166.                     TextString = (_mapPoint.StcZone).ToString(),
  167.                     Height = TextAttribute,
  168.                     HorizontalMode = TextHorizontalMode.TextLeft,
  169.                     VerticalMode = TextVerticalMode.TextBottom,
  170.                     Visible = true,
  171.                     AlignmentPoint = BasePoint
  172.                 };
  173.                 btr.AppendEntity(AttributeBlock07);
  174.                 tr.AddNewlyCreatedDBObject(AttributeBlock07, true);
  175.  
  176.                 //Добавляем атрибут №8
  177.                 BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y - 9 * (TextAttribute + TextAttributeDelta), Point3d.Origin.Z);
  178.                 AttributeDefinition AttributeBlock08 = new AttributeDefinition()
  179.                 {
  180.                     Position = BasePoint,
  181.                     Prompt = "",
  182.                     Tag = TagSanitary,
  183.                     TextString = _mapPoint.Sanitary,
  184.                     Height = TextAttribute,
  185.                     HorizontalMode = TextHorizontalMode.TextLeft,
  186.                     VerticalMode = TextVerticalMode.TextBottom,
  187.                     Visible = true,
  188.                     AlignmentPoint = BasePoint
  189.                 };
  190.                 btr.AppendEntity(AttributeBlock08);
  191.                 tr.AddNewlyCreatedDBObject(AttributeBlock08, true);
  192.  
  193.                 //Добавляем атрибут №9
  194.                 BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y - 10 * (TextAttribute + TextAttributeDelta), Point3d.Origin.Z);
  195.                 AttributeDefinition AttributeBlock09 = new AttributeDefinition()
  196.                 {
  197.                     Position = BasePoint,
  198.                     Prompt = "",
  199.                     Tag = TagESanitary,
  200.                     TextString = _mapPoint.ExplanationsSan,
  201.                     Height = TextAttribute,
  202.                     HorizontalMode = TextHorizontalMode.TextLeft,
  203.                     VerticalMode = TextVerticalMode.TextBottom,
  204.                     Visible = true,
  205.                     AlignmentPoint = BasePoint
  206.                 };
  207.                 btr.AppendEntity(AttributeBlock09);
  208.                 tr.AddNewlyCreatedDBObject(AttributeBlock09, true);
  209.  
  210.                 //Добавляем атрибут №10
  211.                 BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y - 11 * (TextAttribute + TextAttributeDelta), Point3d.Origin.Z);
  212.                 AttributeDefinition AttributeBlock10 = new AttributeDefinition()
  213.                 {
  214.                     Position = BasePoint,
  215.                     Prompt = "",
  216.                     Tag = TagZSanitary,
  217.                     TextString = (_mapPoint.SanitaryZone).ToString(),
  218.                     Height = TextAttribute,
  219.                     HorizontalMode = TextHorizontalMode.TextLeft,
  220.                     VerticalMode = TextVerticalMode.TextBottom,
  221.                     Visible = true,
  222.                     AlignmentPoint = BasePoint
  223.                 };
  224.                 btr.AppendEntity(AttributeBlock10);
  225.                 tr.AddNewlyCreatedDBObject(AttributeBlock10, true);
  226.  
  227.                 //Добавляем атрибут №11
  228.                 BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y - 12 * (TextAttribute + TextAttributeDelta), Point3d.Origin.Z);
  229.                 AttributeDefinition AttributeBlock11 = new AttributeDefinition()
  230.                 {
  231.                     Position = BasePoint,
  232.                     Prompt = "",
  233.                     Tag = TagWaterZone,
  234.                     TextString = _mapPoint.WaterZone,
  235.                     Height = TextAttribute,
  236.                     HorizontalMode = TextHorizontalMode.TextLeft,
  237.                     VerticalMode = TextVerticalMode.TextBottom,
  238.                     Visible = true,
  239.                     AlignmentPoint = BasePoint
  240.                 };
  241.                 btr.AppendEntity(AttributeBlock11);
  242.                 tr.AddNewlyCreatedDBObject(AttributeBlock11, true);
  243.  
  244.                 //Добавляем атрибут №12
  245.                 BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y - 13 * (TextAttribute + TextAttributeDelta), Point3d.Origin.Z);
  246.                 AttributeDefinition AttributeBlock12 = new AttributeDefinition()
  247.                 {
  248.                     Position = BasePoint,
  249.                     Prompt = "",
  250.                     Tag = TagPlain,
  251.                     TextString = _mapPoint.Plain,
  252.                     Height = TextAttribute,
  253.                     HorizontalMode = TextHorizontalMode.TextLeft,
  254.                     VerticalMode = TextVerticalMode.TextBottom,
  255.                     Visible = true,
  256.                     AlignmentPoint = BasePoint
  257.                 };
  258.                 btr.AppendEntity(AttributeBlock12);
  259.                 tr.AddNewlyCreatedDBObject(AttributeBlock12, true);
  260.  
  261.                 //Добавляем атрибут №13
  262.                 BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y - 14 * (TextAttribute + TextAttributeDelta), Point3d.Origin.Z);
  263.                 AttributeDefinition AttributeBlock13 = new AttributeDefinition()
  264.                 {
  265.                     Position = BasePoint,
  266.                     Prompt = "",
  267.                     Tag = TagStyling,
  268.                     TextString = _mapPoint.Styling,
  269.                     Height = TextAttribute,
  270.                     HorizontalMode = TextHorizontalMode.TextLeft,
  271.                     VerticalMode = TextVerticalMode.TextBottom,
  272.                     Visible = true,
  273.                     AlignmentPoint = BasePoint
  274.                 };
  275.                 btr.AppendEntity(AttributeBlock13);
  276.                 tr.AddNewlyCreatedDBObject(AttributeBlock13, true);
  277.  
  278.                 //Добавляем атрибут №14
  279.                 BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y - 15 * (TextAttribute + TextAttributeDelta), Point3d.Origin.Z);
  280.                 AttributeDefinition AttributeBlock14 = new AttributeDefinition()
  281.                 {
  282.                     Position = BasePoint,
  283.                     Prompt = "",
  284.                     Tag = TagGrunt,
  285.                     TextString = _mapPoint.Grunt,
  286.                     Height = TextAttribute,
  287.                     HorizontalMode = TextHorizontalMode.TextLeft,
  288.                     VerticalMode = TextVerticalMode.TextBottom,
  289.                     Visible = true,
  290.                     AlignmentPoint = BasePoint
  291.                 };
  292.                 btr.AppendEntity(AttributeBlock14);
  293.                 tr.AddNewlyCreatedDBObject(AttributeBlock14, true);
  294.                
  295.                 //Добавляем атрибут №15
  296.                 BasePoint = new Point3d(Point3d.Origin.X, Point3d.Origin.Y - 16 * (TextAttribute + TextAttributeDelta), Point3d.Origin.Z);
  297.                 AttributeDefinition AttributeBlock15 = new AttributeDefinition()
  298.                 {
  299.                     Position = BasePoint,
  300.                     Prompt = "",
  301.                     Tag = TagGo,
  302.                     TextString = _mapPoint.Go,
  303.                     Height = TextAttribute,
  304.                     HorizontalMode = TextHorizontalMode.TextLeft,
  305.                     VerticalMode = TextVerticalMode.TextBottom,
  306.                     Visible = true,
  307.                     AlignmentPoint = BasePoint
  308.                 };
  309.                 btr.AppendEntity(AttributeBlock15);
  310.                 tr.AddNewlyCreatedDBObject(AttributeBlock15, true);
  311.  
  312.                 //Слой блока точки карты
  313.                 mapLayer.ActiveLayerSetup(ALayer.layerMapPoint);
  314.                 //открываем пространство модели на запись
  315.                 BlockTableRecord ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  316.                 //создаем новое вхождение блока, используя ранее сохраненный ID определения блока
  317.                 BlockReference br = new BlockReference(InsPoint, idBlock);
  318.                 // добавляем созданное вхождение блока на пространство модели и в транзакцию
  319.                 ms.AppendEntity(br);
  320.                 tr.AddNewlyCreatedDBObject(br, true);
  321.                 // добавляем экземпляр ссылки на объект
  322.                 AttributeReference AttributeRef00 = new AttributeReference();
  323.                 AttributeReference AttributeRef01 = new AttributeReference();
  324.                 AttributeReference AttributeRef02 = new AttributeReference();
  325.                 AttributeReference AttributeRef03 = new AttributeReference();
  326.                 AttributeReference AttributeRef04 = new AttributeReference();
  327.                 AttributeReference AttributeRef05 = new AttributeReference();
  328.                 AttributeReference AttributeRef06 = new AttributeReference();
  329.                 AttributeReference AttributeRef07 = new AttributeReference();
  330.                 AttributeReference AttributeRef08 = new AttributeReference();
  331.                 AttributeReference AttributeRef09 = new AttributeReference();
  332.                 AttributeReference AttributeRef10 = new AttributeReference();
  333.                 AttributeReference AttributeRef11 = new AttributeReference();
  334.                 AttributeReference AttributeRef12 = new AttributeReference();
  335.                 AttributeReference AttributeRef13 = new AttributeReference();
  336.                 AttributeReference AttributeRef14 = new AttributeReference();
  337.                 AttributeReference AttributeRef15 = new AttributeReference();
  338.  
  339.                 AttributeRef00.SetAttributeFromBlock(AttributeBlock00, br.BlockTransform);
  340.                 AttributeRef00.TextString = (_mapPoint.V1).ToString();
  341.  
  342.                 AttributeRef01.SetAttributeFromBlock(AttributeBlock01, br.BlockTransform);
  343.                 AttributeRef01.TextString = (_mapPoint.V2).ToString();
  344.  
  345.                 AttributeRef02.SetAttributeFromBlock(AttributeBlock02, br.BlockTransform);
  346.                 AttributeRef02.TextString = _mapPoint.Road;
  347.  
  348.                 AttributeRef03.SetAttributeFromBlock(AttributeBlock03, br.BlockTransform);
  349.                 AttributeRef03.TextString = _mapPoint.ExplanationsRoad;
  350.  
  351.                 AttributeRef04.SetAttributeFromBlock(AttributeBlock04, br.BlockTransform);
  352.                 AttributeRef04.TextString = (_mapPoint.RoadZone).ToString();
  353.  
  354.                 AttributeRef05.SetAttributeFromBlock(AttributeBlock05, br.BlockTransform);
  355.                 AttributeRef05.TextString = _mapPoint.Stc;
  356.  
  357.                 AttributeRef06.SetAttributeFromBlock(AttributeBlock06, br.BlockTransform);
  358.                 AttributeRef06.TextString = _mapPoint.ExplanationsStc;
  359.  
  360.                 AttributeRef07.SetAttributeFromBlock(AttributeBlock07, br.BlockTransform);
  361.                 AttributeRef07.TextString = (_mapPoint.StcZone).ToString();
  362.  
  363.                 AttributeRef08.SetAttributeFromBlock(AttributeBlock08, br.BlockTransform);
  364.                 AttributeRef08.TextString = _mapPoint.Sanitary;
  365.  
  366.                 AttributeRef09.SetAttributeFromBlock(AttributeBlock09, br.BlockTransform);
  367.                 AttributeRef09.TextString = _mapPoint.ExplanationsSan;
  368.  
  369.                 AttributeRef10.SetAttributeFromBlock(AttributeBlock10, br.BlockTransform);
  370.                 AttributeRef10.TextString = (_mapPoint.SanitaryZone).ToString();
  371.  
  372.                 AttributeRef11.SetAttributeFromBlock(AttributeBlock11, br.BlockTransform);
  373.                 AttributeRef11.TextString = _mapPoint.WaterZone;
  374.  
  375.                 AttributeRef12.SetAttributeFromBlock(AttributeBlock12, br.BlockTransform);
  376.                 AttributeRef12.TextString = _mapPoint.Plain;
  377.  
  378.                 AttributeRef13.SetAttributeFromBlock(AttributeBlock13, br.BlockTransform);
  379.                 AttributeRef13.TextString = _mapPoint.Styling;
  380.  
  381.                 AttributeRef14.SetAttributeFromBlock(AttributeBlock14, br.BlockTransform);
  382.                 AttributeRef14.TextString = _mapPoint.Grunt;
  383.  
  384.                 AttributeRef15.SetAttributeFromBlock(AttributeBlock15, br.BlockTransform);
  385.                 AttributeRef15.TextString = _mapPoint.Go;
  386.  
  387.                 // Добавляем AttributeReference к BlockReference
  388.                 br.AttributeCollection.AppendAttribute(AttributeRef00);
  389.                 tr.AddNewlyCreatedDBObject(AttributeRef00, true);
  390.                 br.AttributeCollection.AppendAttribute(AttributeRef01);
  391.                 tr.AddNewlyCreatedDBObject(AttributeRef01, true);
  392.                 br.AttributeCollection.AppendAttribute(AttributeRef02);
  393.                 tr.AddNewlyCreatedDBObject(AttributeRef02, true);
  394.                 br.AttributeCollection.AppendAttribute(AttributeRef03);
  395.                 tr.AddNewlyCreatedDBObject(AttributeRef03, true);
  396.                 br.AttributeCollection.AppendAttribute(AttributeRef04);
  397.                 tr.AddNewlyCreatedDBObject(AttributeRef04, true);
  398.                 br.AttributeCollection.AppendAttribute(AttributeRef05);
  399.                 tr.AddNewlyCreatedDBObject(AttributeRef05, true);
  400.                 br.AttributeCollection.AppendAttribute(AttributeRef06);
  401.                 tr.AddNewlyCreatedDBObject(AttributeRef06, true);
  402.                 br.AttributeCollection.AppendAttribute(AttributeRef07);
  403.                 tr.AddNewlyCreatedDBObject(AttributeRef07, true);
  404.                 br.AttributeCollection.AppendAttribute(AttributeRef08);
  405.                 tr.AddNewlyCreatedDBObject(AttributeRef08, true);
  406.                 br.AttributeCollection.AppendAttribute(AttributeRef09);
  407.                 tr.AddNewlyCreatedDBObject(AttributeRef09, true);
  408.                 br.AttributeCollection.AppendAttribute(AttributeRef10);
  409.                 tr.AddNewlyCreatedDBObject(AttributeRef10, true);
  410.                 br.AttributeCollection.AppendAttribute(AttributeRef11);
  411.                 tr.AddNewlyCreatedDBObject(AttributeRef11, true);
  412.                 br.AttributeCollection.AppendAttribute(AttributeRef12);
  413.                 tr.AddNewlyCreatedDBObject(AttributeRef12, true);
  414.                 br.AttributeCollection.AppendAttribute(AttributeRef13);
  415.                 tr.AddNewlyCreatedDBObject(AttributeRef13, true);
  416.                 br.AttributeCollection.AppendAttribute(AttributeRef14);
  417.                 tr.AddNewlyCreatedDBObject(AttributeRef14, true);
  418.                 br.AttributeCollection.AppendAttribute(AttributeRef15);
  419.                 tr.AddNewlyCreatedDBObject(AttributeRef15, true);
  420.  
  421.  
  422.                 tr.Commit();
  423.             }
  424.         }
  425.  
Запуск на расстановку:
Код - C# [Выбрать]
  1.   [CommandMethod("CreatMapPoint", CommandFlags.UsePickSet)]
  2.         public void CreatMapPoint()
  3.         {
  4.             //Элементов карты
  5.             List<MapPoint> localListMapPoint = ListMapPoint();
  6.  
  7.             foreach (MapPoint _mapPoint in localListMapPoint)
  8.             {
  9.                 if (IfExistBlock(ElementMap) == false)
  10.                 {
  11.                     CreatElement(_mapPoint);
  12.                 }
  13.                 else
  14.                 {
  15.                     CreatElementIfExist(_mapPoint);
  16.                 }
  17.             }
  18.  
  19.         }

Вопрос, а как-то можно это ускорить?
Может есть алгоритмические проблемы или, что-то может проще можно сделать?



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

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

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

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
Александр,
1. Понимаю, что можно размерами блоков по играться, найти что-то более-менее, но для протяженных трасс 50-100 км, это не даст ту оценку к которую надо. Пока тренируемся на 10000.
В принципе если нет "ускорения", будем курить бамбук пока она строит карту.
2. Блок один (в текущей версии), можно сделать и разные, и так и так пробывал. Полагая если это вхождение блока, то якобы быстрее будет - увы.
3. Пройденый этап - что бы после меня никто ничего не менял, я про ползователей...они такие разные.

А если "Transaction" передавать как параметр?

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
Вставка вхождения
Код - C# [Выбрать]
  1.  public void CreatElementIfExist(MapPoint _mapPoint)
  2.         {
  3.             //получаем ссылкe на документ
  4.             Document ad = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  5.             if (ad == null) return;
  6.             //получаем ссылкe на БД
  7.             Database db = ad.Database;
  8.             // получаем ссылкe на редактор
  9.             Editor ed = ad.Editor;
  10.             //получаем ссылкe на слои
  11.             ALayer mapLayer = new ALayer();
  12.             // начинаем транзакцию
  13.             using (Transaction tr = db.TransactionManager.StartTransaction())
  14.             {
  15.                 //Получаем таблицу блоков текущего чертежа
  16.                 BlockTable blocktable = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
  17.                 //Получаем пррямую ссылку на блок
  18.                 BlockTableRecord LocalBlockRef = blocktable[ElementMap].GetObject(OpenMode.ForRead) as BlockTableRecord;
  19.                 // Открываем пространство модели – мы добавляем наш BlockReference к нему
  20.                 BlockTableRecord ms = blocktable[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite) as BlockTableRecord;
  21.                 //Включаем слои
  22.                 mapLayer.PreparationLayer();
  23.                 mapLayer.ActiveLayerSetup(ALayer.layerMapPoint);
  24.                 // получаем координаты точки вставки и вставляем экземпляр блока
  25.                 Point3d InsPoint = new Point3d(_mapPoint.X, _mapPoint.Y, _mapPoint.Z);
  26.                 BlockReference br = new BlockReference(InsPoint, LocalBlockRef.ObjectId);
  27.                 ms.AppendEntity(br);
  28.                 tr.AddNewlyCreatedDBObject(br, true);
  29.                 //Перебираем все атрибуты блока
  30.                 foreach (ObjectId id in LocalBlockRef)
  31.                 {
  32.                     DBObject obj = id.GetObject(OpenMode.ForRead);
  33.                     if ((obj is AttributeDefinition attDef) && (!attDef.Constant))
  34.                     {
  35.                         using (AttributeReference attRef = new AttributeReference())
  36.                         {
  37.                             attRef.SetAttributeFromBlock(attDef, br.BlockTransform);
  38.                             if (attRef.Tag == TagV1) { attRef.TextString = (_mapPoint.V1).ToString(); }
  39.                             if (attRef.Tag == TagV2) { attRef.TextString = (_mapPoint.V2).ToString(); }
  40.                             if (attRef.Tag == TagRoad) { attRef.TextString = _mapPoint.Road; }
  41.                             if (attRef.Tag == TagER) { attRef.TextString = _mapPoint.ExplanationsRoad; }
  42.                             if (attRef.Tag == TagZR) { attRef.TextString = (_mapPoint.RoadZone).ToString(); }
  43.                             if (attRef.Tag == TagStc) { attRef.TextString = _mapPoint.Stc; }
  44.                             if (attRef.Tag == TagEStc) { attRef.TextString = _mapPoint.ExplanationsStc; }
  45.                             if (attRef.Tag == TagZStc) { attRef.TextString = (_mapPoint.StcZone).ToString(); }
  46.                             if (attRef.Tag == TagSanitary) { attRef.TextString = _mapPoint.Sanitary; }
  47.                             if (attRef.Tag == TagESanitary) { attRef.TextString = _mapPoint.ExplanationsSan; }
  48.                             if (attRef.Tag == TagZSanitary) { attRef.TextString = (_mapPoint.SanitaryZone).ToString(); }
  49.                             if (attRef.Tag == TagWaterZone) { attRef.TextString = _mapPoint.WaterZone; }
  50.                             if (attRef.Tag == TagPlain) { attRef.TextString = _mapPoint.Plain; }
  51.                             if (attRef.Tag == TagStyling) { attRef.TextString = _mapPoint.Styling; }
  52.                             if (attRef.Tag == TagGrunt) { attRef.TextString = _mapPoint.Grunt; }
  53.                             if (attRef.Tag == TagGo) { attRef.TextString = _mapPoint.Go; }
  54.                             // Добавляем AttributeReference к BlockReference
  55.                             br.AttributeCollection.AppendAttribute(attRef);
  56.                             tr.AddNewlyCreatedDBObject(attRef, true);
  57.                         }
  58.                     }
  59.                 }
  60.                 tr.Commit();
  61.             }
  62.         }
  63.  

Проверка на существующий блок
Код - C# [Выбрать]
  1.         public Boolean IfExistBlock(string _LocalNameBlock)
  2.         {
  3.             // получаем ссылкe на документ
  4.             Document AcadDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  5.             if (AcadDoc == null) return false;
  6.             // получаем ссылкe на БД
  7.             Database db = AcadDoc.Database;
  8.             // начинаем транзакцию
  9.             using (Transaction tr = db.TransactionManager.StartTransaction())
  10.             {
  11.                 // открываем таблицу блоков на запись
  12.                 BlockTable blocktable = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite);
  13.                 // вначале проверяем, нет ли в таблице блока с таким именем если есть - выводим сообщение об ошибке и заканчиваем выполнение команды
  14.                 if (blocktable.Has(_LocalNameBlock))
  15.                 {
  16.                     //MessageBox.Show("Блок с именем (" + _LocalNameSignBlock + ") уже существует", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  17.                     return true;
  18.                 }
  19.                 tr.Commit();
  20.             }
  21.             return false;
  22.         }
  23.  
  24.  
« Последнее редактирование: 08-07-2019, 21:28:10 от Александр Ривилис »

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

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
Например открывать Transaction при вызове вставок блока и держать ее открытую пока проходиться список объектов и вставляются блоки.

Отмечено как Решение Judas 28-07-2019, 05:59:05

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

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

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Например открывать Transaction при вызове вставок блока и держать ее открытую пока проходиться список объектов и вставляются блоки.
А также не стоит получать в цикле одни и те же объекты:
Document
Database
Editor
BlockTable
BlockTableRecord
и т.д.

а также если блок (BlockTableRecord LocalBlockRef) уже существует, не надо каждый раз извлекать его из  BlockTable, а потом извлекать его атрибуты для создания каждой вставки бока(BlockReference).

Умножай количество лишних повторов действий на количество вставок блоков (....Пока тренируемся на 10000) вот тебе и время на отдых :-)  (будем курить бамбук пока она строит карту.)

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63

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

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
Планирую тестить рекомендации к выходным...
О результатах сообщу...

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

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
Re: Вставка большого количества блоков
« Ответ #10 : 28-07-2019, 05:59:35 »
Благодарю всех!
В целом сейчас приемлемо стало.
область 2км на 30 км разбивается секунд за 15-20.
Отдельно спасибо!
Александр Ривилис.
Привалов Дмитрий.