30/01/2018
Как сделать объекты AutoCAD аннотативными в .NET
В этой статье мы решим два вопроса:- Как создать и добавить к чертежу новый масштаб аннотации?
- Как сделать примитивы аннотативными и присвоить им допустимые масштабы аннотаций?
Ниже приведен код, в котором содержатся два метода – команды:
Команда ADS позволит нам создать новый масштаб аннотации с именем "МойМасштаб 1:28", а команда ATS позволит сделать выбранный примитив аннотативным и назначить ему масштабы аннотаций:
Код - C#: [Выделить]
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.EditorInput;
- using Autodesk.AutoCAD.Runtime;
- namespace AnnotationScaling
- {
- public class Commands
- {
- [CommandMethod("ADS")]
- static public void addScale()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- try
- {
- ObjectContextManager ocm = db.ObjectContextManager;
- if (ocm != null)
- {
- // Теперь получим коллекцию контекстов Масштабов Аннотаций
- // (с именем ACDB_ANNOTATIONSCALES_COLLECTION)
- ObjectContextCollection occ =
- ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
- if (occ != null)
- {
- // Создадим новый масштаб аннотаций
- AnnotationScale asc = new AnnotationScale();
- asc.Name = "МойМасштаб 1:28";
- asc.PaperUnits = 1;
- asc.DrawingUnits = 28;
- // Добавляем его к коллекции контекстов
- occ.AddContext(asc);
- }
- }
- }
- catch (System.Exception ex)
- {
- ed.WriteMessage(ex.ToString());
- }
- }
- [CommandMethod("ATS")]
- static public void attachScale()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- ObjectContextManager ocm = db.ObjectContextManager;
- ObjectContextCollection occ =
- ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
- Transaction tr = doc.TransactionManager.StartTransaction();
- using (tr)
- {
- PromptEntityOptions opts =
- new PromptEntityOptions("\nВыберите примитив: ");
- opts.SetRejectMessage(
- "\nПримитив должен поддерживать аннотативное масштабирование."
- );
- //////////////////////////////////////////////////////////////////////////
- // Классы примитивов поддерживающих аннотативность
- //////////////////////////////////////////////////////////////////////////
- opts.AddAllowedClass(typeof(DBText), false);
- opts.AddAllowedClass(typeof(MText), false);
- opts.AddAllowedClass(typeof(Dimension), false);
- opts.AddAllowedClass(typeof(Leader), false);
- opts.AddAllowedClass(typeof(Table), false);
- opts.AddAllowedClass(typeof(Hatch), false);
- PromptEntityResult per = ed.GetEntity(opts);
- if (per.ObjectId != ObjectId.Null)
- {
- DBObject obj = tr.GetObject(per.ObjectId, OpenMode.ForRead);
- if (obj != null)
- {
- obj.UpgradeOpen();
- // Устанавливаем примитив аннотативным
- obj.Annotative = AnnotativeStates.True;
- // Добавляем допустимые масштабы аннотаций
- // obj.AddContext(occ.GetContext("1:1"));
- // obj.AddContext(occ.GetContext("1:2"));
- // obj.AddContext(occ.GetContext("1:10"));
- // Добавляем текущий масштаб
- string cannoscale = Application.GetSystemVariable("CANNOSCALE") as string;
- obj.AddContext(occ.GetContext(cannoscale));
- ObjectContext oc = occ.GetContext("МойМасштаб 1:28");
- if (oc != null)
- {
- obj.AddContext(oc);
- }
- }
- }
- tr.Commit();
- }
- }
- }
- }
По мотивам: http://through-the-interface.typepad.com/through_the_interface/2007/04/making_autocad_.html
Автор перевода: Александр Ривилис
Отредактировано 30.01.2018 в 20:42:52
Обсуждение: http://adn-cis.org/forum/index.php?topic=
Опубликовано 30.01.2018Отредактировано 30.01.2018 в 20:42:52