AutoCAD получает длину из BlockReference.

#c# #autocad #autocad-plugin

#c# #autocad #autocad-плагин

Вопрос:

Проблема

я изо всех сил пытаюсь получить длину из ссылки на блок в AutoCAD. Я как-то, будучи математическим новичком, получил ширину и высоту, но пока не могу получить длину BlockReference. Есть ли способ получить длину ссылки на блок. Я просмотрел API AutoCAD, но без успеха. Может быть, кто-нибудь может показать мне направление.

Что я сделал

    public static double GetBlockWidthAndHeight(BlockReference blockReference) {
            try {
                var db = HostApplicationServices.WorkingDatabase;
                var blockname = blockReference.Name;
                double width = 0;

                using (var tr = db.TransactionManager.StartTransaction()) {
                    var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                    if (!bt.Has(blockname)) {
                        return 0;
                    }

                    var btrec = (BlockTableRecord)tr.GetObject(bt[blockname], OpenMode.ForRead, false);
                    Extents3d? bounds;
                    bounds = btrec.Bounds;
                    if (bounds.HasValue) {
                        var ext = bounds.Value;
                        width = ext.MaxPoint.X - ext.MinPoint.X;
                        double height = ext.MaxPoint.Y - ext.MinPoint.Y;
                    }
                    else {
                        var bref = new BlockReference(Point3d.Origin, bt[blockname]);
                        bounds = bref.Bounds;
                        var ext = bounds.Value;
                        width = ext.MaxPoint.X - ext.MinPoint.X;
                        double height = ext.MaxPoint.Y - ext.MinPoint.Y;
                        bref.Dispose();
                    }
                    tr.Commit();
                }

                return width;
            }
            catch (Exception ex) {
                Debug.WriteLine(ex.Message);
            }
            return 0;
        }
  

Ответ №1:

Является ли ваша ссылка на блок 3D-объектом? Если да. Я заметил, что в настоящее время вы получаете границы объекта по оси X (ширина) и оси Y (высота), но вы не используете ось Z. Если ссылка на блок представляет собой 2D-объект, то использование описанного вами метода не будет работать, поскольку этой информации там просто нет.

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

Вот ссылка на блог Кина Уомсли, в котором приведены краткие примеры того, как использовать API для прямого доступа к информации о блоке — http://through-the-interface.typepad.com/through_the_interface/2009/03/accessing-the-properties-of-a-dynamic-autocad-block-using-net.html

Комментарии:

1. спасибо за ваше время. у меня есть 2d-чертеж. Спасибо за ссылку, есть ли способ получить длину тем же методом?-

2. Опять же, будучи 2D-объектом, вы не сможете использовать границы объекта для получения чего-либо за пределами границ осей X и Y, поскольку эта информация просто не существует. Лучшим вариантом будет, если в свойствах ссылки на блок задано какое-либо значение «Длина». Однако это полностью зависит; от того, как была сделана ссылка на блок и поместил ли создатель это значение.