29/10/2018
Вставка формы (SHAPE) в чертеж AutoCAD при помощи .NET API
Вопрос: Как при помощи AutoCAD .NET API вставить в чертеж форму, как это делает команда ФОРМА (_SHAPE)?
Ответ: Как оказалось эта информация нигде не освещена. Для того чтобы вставить форму в чертеж необходимо:
- Создать текстовый стиль, указывающий на файл содержащий форму
- Создать примитив Shape, который имеет соответствующий стиль и имя соответствующее имени формы. Имеются определённые особенности, которые отражены в коде ниже:
Код - C#: [Выделить]
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.EditorInput;
- using Autodesk.AutoCAD.Runtime;
- // This line is not mandatory, but improves loading performances
- [assembly: CommandClass(typeof(InsertShape.MyCommands))]
- namespace InsertShape
- {
- public class MyCommands
- {
- [CommandMethod("InsertShape")]
- public void MyCommand()
- {
- // Put your command code here
- Document doc = Application.DocumentManager.MdiActiveDocument;
- if (doc == null)
- return;
- Editor ed = doc.Editor;
- Database db = doc.Database;
- PromptStringOptions prStr =
- new PromptStringOptions("\nИмя shx-файла: ");
- prStr.AllowSpaces = true;
- prStr.DefaultValue = "ltypeshp.shx";
- PromptResult rsStr = ed.GetString(prStr);
- if (rsStr.Status != PromptStatus.OK)
- return;
- string shxFilename = rsStr.StringResult;
- try
- {
- HostApplicationServices.Current
- .FindFile(shxFilename, db, FindFileHint.FontFile);
- } catch
- {
- ed.WriteMessage("\nshx-файл с таким именем не найден!");
- return;
- }
- prStr.DefaultValue = "BOX";
- prStr.Message = "\nИмя формы: ";
- rsStr = ed.GetString(prStr);
- if (rsStr.Status != PromptStatus.OK)
- return;
- string shapeName = rsStr.StringResult;
- PromptPointResult rsPnt =
- ed.GetPoint("\nТочка вставки: ");
- if (rsPnt.Status != PromptStatus.OK)
- return;
- using (Transaction tr = doc.TransactionManager.StartTransaction())
- {
- TextStyleTable tst = tr.GetObject(db.TextStyleTableId, OpenMode.ForWrite) as TextStyleTable;
- // Проверяем нет ли еще подходящего текстового стиля с нужным файлом формы
- // в таблице стилей
- ObjectId styleId =
- GetObjectIdOfTextStyleWithFileName(tst, shxFilename, tr);
- // Если нет - создаём его и добавляем в базу
- if (styleId.IsNull)
- {
- TextStyleTableRecord tstr = new TextStyleTableRecord();
- tstr.IsShapeFile = true;
- tstr.FileName = shxFilename;
- styleId = tst.Add(tstr);
- tr.AddNewlyCreatedDBObject(tstr, true);
- }
- // Создаём форму с единичным масштабом, нулевым углом
- // поворота и единичным коэффициентом сжатия
- Shape shape = new Shape(rsPnt.Value, 1.0, 0.0, 1.0);
- shape.SetDatabaseDefaults(db);
- shape.StyleId = styleId;
- BlockTableRecord btr =
- tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
- btr.AppendEntity(shape);
- // Имя форме можно назначать только после её добавления в базу
- shape.Name = shapeName;
- tr.AddNewlyCreatedDBObject(shape, true);
- tr.Commit();
- }
- }
- /// <summary>
- /// Функция позволяет найти текстовый стиль по строке пути к файлу форм
- /// и вернуть его ObjectId или NULL если не нашелся
- /// </summary>
- /// <param name="tst">Таблица текстовых стилей</param>
- /// <param name="shxFileName">имя файла форм</param>
- /// <param name="tr">транзакция</param>
- /// <returns></returns>
- public static ObjectId GetObjectIdOfTextStyleWithFileName(TextStyleTable tst, string shxFileName, Transaction tr)
- {
- string FullShxFileName = HostApplicationServices.Current
- .FindFile(shxFileName, tst.Database, FindFileHint.FontFile).ToLower();
- foreach (ObjectId idtsr in tst)
- {
- TextStyleTableRecord tstr =
- tr.GetObject(idtsr, OpenMode.ForRead) as TextStyleTableRecord;
- if (!tstr.IsShapeFile)
- continue;
- string filename = tstr.FileName.ToLower();
- try {
- filename = HostApplicationServices.Current
- .FindFile(filename, tst.Database, FindFileHint.FontFile).ToLower();
- } catch { }
- if (FullShxFileName == filename)
- return tstr.ObjectId;
- }
- return ObjectId.Null;
- }
- }
- }
Автор: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=
Опубликовано 29.10.2018