Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Значение атрибута, задающее угол для параметра вращения в динамическом блоке

Значение атрибута, задающее угол для параметра вращения в динамическом блоке

Ответ
Поиск в этой теме
Непрочитано 02.05.2019, 16:59 #1
Значение атрибута, задающее угол для параметра вращения в динамическом блоке
АлексЮстасу
 
топограф, технолог
 
Москва
Регистрация: 24.05.2009
Сообщений: 3,031

Есть динамический блок, стрелка в котором имеет параметр вращения. И в блоке есть атрибут.
Как сделать, чтобы угол вращения элемента был равен значению атрибута?

Были не раз похожие темы - задавать длину чего-нибудь в динблоке по значению атрибута или т.п. Наверняка и с поворотом уже обсуждалось, но найти не получается.

Lisp, наверное, нужен?

Миниатюры
Нажмите на изображение для увеличения
Название: rotation_parameter_attribute.png
Просмотров: 91
Размер:	11.4 Кб
ID:	213784  

Вложения
Тип файла: dwg
DWG 2010
Rot_Attr.dwg (444.0 Кб, 18 просмотров)

__________________
количество моих сообщений не говорит о знании Автокада

Последний раз редактировалось АлексЮстасу, 02.05.2019 в 19:43.
Просмотров: 5863
 
Непрочитано 02.05.2019, 18:30
#2
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,039


Отлавливать событие изменения атрибута, и в idle устанавливать параметр вращения.
Сергей812 вне форума  
 
Автор темы   Непрочитано 02.05.2019, 18:41
#3
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Отлавливать события - это совсем круто. Я думал только о запуске процедуры - передать значение угла из атрибута в угол поворота.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 02.05.2019, 18:48
#4
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,039


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Я думал только о запуске процедуры - передать значение угла из атрибута в угол поворота.
инициация запуска чем будет производится?
Сергей812 вне форума  
 
Автор темы   Непрочитано 02.05.2019, 19:45
#5
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Если лисп, то вызовом лиспа. Без хитростев.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 02.05.2019, 19:53
#6
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,039


А что мешает тогда установить и значение вставки атрибута, и параметра динповорота? Логика работа вашего интерфейса - такая большая тайна?)
Сергей812 вне форума  
 
Автор темы   Непрочитано 02.05.2019, 20:19
#7
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
А что мешает тогда установить и значение вставки атрибута, и параметра динповорота? Логика работа вашего интерфейса - такая большая тайна?)
Я не понял Ваших вопросов.
Дано: куча динблоков с вращаемым элементом и с атрибутом.
Вопрос: как для всех таких блоков установить угол поворота элемента равным значению атрибута?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 02.05.2019, 20:31
#8
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,039


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Дано: куча динблоков с вращаемым элементом и с атрибутом.
значения атрибутов каким образом инициализируется? Сама задача элементарная - считать значение атрибута соответствующего блока, перевести в число и присвоить соответствующему динпараметру поворота этого же блока.
Сергей812 вне форума  
 
Автор темы   Непрочитано 02.05.2019, 20:37
#9
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
значения атрибутов каким образом инициализируется? Сама задача элементарная - считать значение атрибута соответствующего блока, перевести в число и присвоить соответствующему динпараметру поворота этого же блока.
Значения атрибутов - это "дано".
Ну, да: считать из атрибута, и присвоить повороту. Ничего хитрого.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 02.05.2019, 20:52
#10
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,039


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
считать из атрибута, и присвоить повороту. Ничего хитрого.
и что у вас тут вызвало затруднение?
Сергей812 вне форума  
 
Автор темы   Непрочитано 02.05.2019, 21:00
#11
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
и что у вас тут вызвало затруднение?
Отсутствие инструмента.

Нашел, наконец, тему с названием, полностью соответствующим моему вопросу: Как сделать так, чтобы параметр динамического блока принял значение аттрибута autocad
В той теме динпараметр управляет диаметром окружности, а не поворотом. Но суть вопроса такая же.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 02.05.2019, 21:08
#12
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


на лиспе решается на раз-два
koMon вне форума  
 
Автор темы   Непрочитано 02.05.2019, 21:22
#13
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Цитата:
Сообщение от koMon Посмотреть сообщение
на лиспе решается на раз-два
Для тех, кто владеет лиспом - наверное.

Если в общем виде, чтобы для любого случая, то могло быть так:
1. Запрашивается название динпараметра.
2. Запрашивается название атрибута.
3. Выбор объектов.
4. Присваивается значение динпараметру.
Или:
1. Выбрать объекты.
2. Выбрать из списка параметров динблоков нужный. (Ввести название нужного из выведенного списка).
3. Выбрать из списка атрибутов нужный. (Ввести название нужного из выведенного списка).
4. Присваивается значение динпараметру.
Тогда пригодилось бы и для других тем и вопросов.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 02.05.2019, 22:08
#14
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,039


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Отсутствие инструмента.
инструмент - прямые руки из нужного места называется) Набросал по быстрому код (чистый функционал без всяких проверок под ваш файл примера), разбирайтесь:

Код:
[Выделить все]
// Windows
using System;

// AutoCAD
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;


namespace Изменение_угла_поворота_по_атрибуту
{
    public class CommandsClass
    {
        /// <summary>
        /// Команда установки угла поворота по значению атрибута
        /// </summary>
        [CommandMethod("SetAngleFromAttr", CommandFlags.Modal)]
        public void SetAngleFromAttr()
        {
            // Получаем текущий документ, его БД и редактор
            Document lAcadDoc = Application.DocumentManager.MdiActiveDocument;
            Database lAcadDb = lAcadDoc.Database;
            Editor lAcadEd = lAcadDoc.Editor;
            // Получаем все вставки блоков с атрибутами
            TypedValue[] lFilterList = new TypedValue[2];
            lFilterList[0] = new TypedValue(0, "INSERT");
            lFilterList[1] = new TypedValue(66, 1);
            PromptSelectionResult lSelRes = lAcadEd.SelectAll(new SelectionFilter(lFilterList));
            // Если получение вставок с атрибутами успешно
            if (lSelRes.Status == PromptStatus.OK)
            {
                // Получаем идентификаторы вставок
                ObjectId[] lListInsertIds = lSelRes.Value.GetObjectIds();
                // Если массив не пустой
                if (lListInsertIds.Length > 0)
                {
                    // Открываем транзакцию
                    using (Transaction lAcadTrans = lAcadDoc.TransactionManager.StartTransaction())
                    {
                        // В цикле по идентификаторам вставок блоков
                        foreach (ObjectId lId in lListInsertIds)
                        {
                            // Получаем вставку блока
                            BlockReference lBlockReference =
                                (BlockReference)lAcadTrans.GetObject(lId, OpenMode.ForRead);
                            // Если блок является динамическим
                            if (lBlockReference.IsDynamicBlock)
                            { 
                                // Получаем коллекцию идентификаторов атрибутов блока
                                AttributeCollection lAttrCollection =
                                    lBlockReference.AttributeCollection;
                                // В цикле по коллекции Id атрибутов
                                foreach (ObjectId lAtId in lAttrCollection)
                                {
                                    // Получаем вставку атрибутов
                                    AttributeReference lAttrReference =
                                        (AttributeReference)lAcadTrans.GetObject(lAtId, OpenMode.ForRead);
                                    // Если нашли атрибут ROT
                                    if (lAttrReference.Tag.Equals("ROT"))
                                    {
                                        // Пытаемся получить его значение
                                        double lNewAngle;
                                        if (Double.TryParse(lAttrReference.TextString, out lNewAngle))
                                        {
                                            // Подготавливаем угол
                                            if (lNewAngle < 0) lNewAngle = 360 + lNewAngle;
                                            lNewAngle = lNewAngle * Math.PI / 180;
                                            // Получаем коллекцию дин. свойств блока
                                            DynamicBlockReferencePropertyCollection lDynValues = 
                                                lBlockReference.DynamicBlockReferencePropertyCollection;
                                            // В цикле по свойствам
                                            foreach (DynamicBlockReferenceProperty lDynProperty in lDynValues)
                                            {
                                                // Если нашли свойство ROT
                                                if (lDynProperty.PropertyName.Equals("ROT") 
                                                    && (!lDynProperty.ReadOnly))
                                                {
                                                    // Получаем текущее значение параметра
                                                    double lCurrAngle = (double)lDynProperty.Value;
                                                    // Если текущее значение параметра
                                                    // отличается от устанавливаемого
                                                    if(!lCurrAngle.Equals(lNewAngle))
                                                    {
                                                        // Устанавливаем новое значение
                                                        lBlockReference.UpgradeOpen();
                                                        lDynProperty.Value = lNewAngle;
                                                        lBlockReference.DowngradeOpen();
                                                    }
                                                    // Выходим из цикла по динсвойствам
                                                    break;
                                                }
                                            }
                                        }
                                        // Выходим  из цикла по атрибутам
                                        break;
                                    }
                                }
                            }
                        }
                        // Подтверждаем транзакцию
                        lAcadTrans.Commit();
                    }
                }
            }
        }

    }
}



Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Если в общем виде, чтобы для любого случая, то могло быть так:
1. Запрашивается название динпараметра.
2. Запрашивается название атрибута.
3. Выбор объектов.
4. Присваивается значение динпараметру.
Или:
1. Выбрать объекты.
2. Выбрать из списка параметров динблоков нужный. (Ввести название нужного из выведенного списка).
3. Выбрать из списка атрибутов нужный. (Ввести название нужного из выведенного списка).
4. Присваивается значение динпараметру.
Тогда пригодилось бы и для других тем и вопросов.
Это уже сами - ничего сложного там нет, информации в инете более чем достаточно.
Сергей812 вне форума  
 
Автор темы   Непрочитано 02.05.2019, 22:35
#15
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Набросал по быстрому код (чистый функционал без всяких проверок под ваш файл примера), разбирайтесь:
Спасибо!
Как это вызывать из Автокада?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 02.05.2019, 22:51
#16
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,039


А как обычно вызывают .Net код из акада? Скачать любую бесплатную студию по вкусу, подключить необходимые акадовские библиотеки в проект, вставить мой код и создать сборку. Потом загрузить через NetLoad. Все инструкции в инете есть - и на русском языке тоже)
Сергей812 вне форума  
 
Непрочитано 03.05.2019, 07:34
1 | #17
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


DynIN DynOUT, все уже написано... импортировать атрибуты и дин. свойства в ексель и там назначить дин свойству значение из атрибута (дин. свойства поворота, они в радианах). Экспортировать обратно. Собственно все.
Boxa вне форума  
 
Непрочитано 03.05.2019, 10:45
#18
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,039


Цитата:
Сообщение от Boxa Посмотреть сообщение
DynIN DynOUT, все уже написано... импортировать атрибуты и дин. свойства в ексель и там назначить дин свойству значение из атрибута (дин. свойства поворота, они в радианах). Экспортировать обратно. Собственно все.
Только зачем для операции, не требующей никаких вариантов преобразования/обработки данных, промежуточный костыль в виде экселя?
Сергей812 вне форума  
 
Непрочитано 03.05.2019, 11:33
#19
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Только зачем для операции, не требующей никаких вариантов преобразования/обработки данных, промежуточный костыль в виде экселя?
Для обеспечения универсальности, и не совсем ексель, csv файлы можно и в блокноте редактировать, но в табличном редакторе конечно удобнее.
Код, который Вы написали, годится только для блока имеющего атрибут с тегом "ROT" и дин. свойством "ROT", что прописано в коде и если в этом или другом блоке не будет этого тега атрибута или наименования дин. свойства, то Ваш код работать не будет, потребуется перекомпиляция под новые наименования, можно эти свойства вынести в отдельный файл настроек... но чем это будет по сути отличаться от dynIN_dynOUT ?

Ну и преобразования данных все таки есть, из градусов в радианы
lNewAngle = lNewAngle * Math.PI / 180; - это же Ваш код.

С другой стороны, все нет времени дописать этот проект, добавить туда реализацию лисп функций, работу с полями и прочие плюшки, но это уже другая тема.

Последний раз редактировалось Boxa, 03.05.2019 в 11:45.
Boxa вне форума  
 
Непрочитано 03.05.2019, 12:19
#20
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,039


Цитата:
Сообщение от Boxa Посмотреть сообщение
Код, который Вы написали, годится только для блока имеющего атрибут с тегом "ROT" и дин. свойством "ROT",
Читайте внимательно
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
чистый функционал без всяких проверок под ваш файл примера), разбирайтесь:
Это учебный пример, с подробными комментариями, длинными названиями переменных. Что там хотел ТС - с выбором атрибутов и т.п. - мечтать не вредно, пускай и свой труд тоже вложит, благо все это уже разобрано на примерах в инете...
Цитата:
Сообщение от Boxa Посмотреть сообщение
но чем это будет по сути отличаться от dynIN_dynOUT ?
хотя бы тем - что не надо будет указывать, куда сохранять файл, затем идти туда, править файл и обратно загружать. И файл извлечения потом же остается на диске? И если посмотрите на мой код - меняет поворот только тех блоков, которые имеют различные значения атрибута и динпараметра поворота - зачем лишний раз дергать на изменение БД чертежа...
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Значение атрибута, задающее угол для параметра вращения в динамическом блоке

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Diesel. Как передать значение атрибута? DANZZ Программирование 2 21.12.2023 14:23
Вставка значения атрибута блока в поле в блоке Prying AutoCAD 28 08.09.2020 17:51
Как присвоить тексту в блоке значение атрибута? Engineer_Sergii AutoCAD 1 14.04.2015 18:48
Проблема при использовании в динамическом блоке атрибута Даниил Динамические блоки 13 31.05.2013 09:16
Динамический блок и значение атрибута _Andre_ Динамические блоки 15 08.12.2006 23:55