ADN Open CIS
Сообщество программистов Autodesk в СНГ

10/10/2014

Как создать мультивыноску в .NET?

Ниже два примера, которые иллюстрируют создание мультивыноски (MLeader) в C#.

Первый создает мультивыноску, содержащую MText:

 

Код - C#: [Выделить]
  1. [CommandMethod("netTextMLeader")]
  2. public static void netTextMLeader()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Database db = doc.Database;
  6.     Editor ed = doc.Editor;
  7.  
  8.     using (Transaction Tx = db.TransactionManager.StartTransaction())
  9.     {
  10.         BlockTable table = Tx.GetObject(
  11.             db.BlockTableId,
  12.             OpenMode.ForRead)
  13.                 as BlockTable;
  14.  
  15.         BlockTableRecord model = Tx.GetObject(
  16.             table[BlockTableRecord.ModelSpace],
  17.             OpenMode.ForWrite)
  18.                 as BlockTableRecord;
  19.  
  20.         MLeader leader = new MLeader();
  21.         leader.SetDatabaseDefaults();
  22.  
  23.         leader.ContentType = ContentType.MTextContent;
  24.  
  25.         MText mText = new MText();
  26.         mText.SetDatabaseDefaults();
  27.         mText.Width = 100;
  28.         mText.Height = 50;
  29.         mText.SetContentsRtf("MLeader");
  30.         mText.Location = new Point3d(4, 2, 0);
  31.  
  32.         leader.MText = mText;
  33.  
  34.         int idx = leader.AddLeaderLine(new Point3d(1, 1, 0));
  35.         leader.AddFirstVertex(idx, new Point3d(0, 0, 0));
  36.  
  37.         model.AppendEntity(leader);
  38.         Tx.AddNewlyCreatedDBObject(leader, true);
  39.  
  40.         Tx.Commit();
  41.     }
  42. }

 

Второй создает мультивыноску, содержащую блок. Он так же работает в случае если блок содержит атрибуты и устанавливает их в значение по-умолчанию:

 

Код - C#: [Выделить]
  1. [CommandMethod("netBlockMLeader")]
  2. public static void netBlockMLeader()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Database db = doc.Database;
  6.     Editor ed = doc.Editor;
  7.  
  8.     using (Transaction Tx = db.TransactionManager.StartTransaction())
  9.     {
  10.         BlockTable table = Tx.GetObject(
  11.             db.BlockTableId,
  12.             OpenMode.ForRead)
  13.                 as BlockTable;
  14.  
  15.         BlockTableRecord model = Tx.GetObject(
  16.             table[BlockTableRecord.ModelSpace],
  17.             OpenMode.ForWrite)
  18.                 as BlockTableRecord;
  19.  
  20.         if (!table.Has("BlkLeader"))
  21.         {
  22.             ed.WriteMessage(
  23.                 "\nНужно сначала создать блок с именем \"BlkLeader\"...");
  24.             return;
  25.         }
  26.  
  27.         MLeader leader = new MLeader();
  28.         leader.SetDatabaseDefaults();
  29.  
  30.         leader.ContentType = ContentType.BlockContent;
  31.  
  32.         leader.BlockContentId = table["BlkLeader"];
  33.         leader.BlockPosition = new Point3d(4, 2, 0);
  34.  
  35.         int idx = leader.AddLeaderLine(new Point3d(1, 1, 0));
  36.         leader.AddFirstVertex(idx, new Point3d(0, 0, 0));
  37.  
  38.         // Обрабатываем атрибуты блока
  39.         int AttNumber = 0;
  40.         BlockTableRecord blkLeader = Tx.GetObject(
  41.             leader.BlockContentId,
  42.             OpenMode.ForRead)
  43.                 as BlockTableRecord;
  44.  
  45.         // Учитываем oLeader.BlockRotation
  46.         Matrix3d Transfo = Matrix3d.Displacement(
  47.             leader.BlockPosition.GetAsVector());
  48.  
  49.         foreach (ObjectId blkEntId in blkLeader)
  50.         {
  51.             AttributeDefinition AttributeDef = Tx.GetObject(
  52.                 blkEntId,
  53.                 OpenMode.ForRead)
  54.                     as AttributeDefinition;
  55.  
  56.             if (AttributeDef != null)
  57.             {
  58.                 AttributeReference AttributeRef =
  59.                     new AttributeReference();
  60.  
  61.                 AttributeRef.SetAttributeFromBlock(
  62.                     AttributeDef,
  63.                     Transfo);
  64.  
  65.                 AttributeRef.Position =
  66.                     AttributeDef.Position.TransformBy(Transfo);
  67.  
  68.                 AttributeRef.TextString = "Attrib #" + (++AttNumber);
  69.  
  70.                 leader.SetBlockAttribute(blkEntId, AttributeRef);
  71.             }
  72.         }
  73.  
  74.         model.AppendEntity(leader);
  75.         Tx.AddNewlyCreatedDBObject(leader, true);
  76.  
  77.         Tx.Commit();
  78.     }
  79. }

 

Источник: http://adndevblog.typepad.com/autocad/2012/05/how-to-create-mleader-objects-in-net.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=1013

Опубликовано 10.10.2014
Отредактировано 10.10.2014 в 08:57:04