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

Вернуться   Форум DWG.RU > Поиск литературы, чертежей, моделей и прочих материалов > Есть ли программа для суммирования заданного атрибута выделенных блоков?

Есть ли программа для суммирования заданного атрибута выделенных блоков?

Ответ
Поиск в этой теме
Непрочитано 07.08.2023, 19:33 #1
Есть ли программа для суммирования заданного атрибута выделенных блоков?
Shadow_elf1979
 
Регистрация: 25.11.2019
Сообщений: 15

Существует ли какой-нибудь скрипт, аналогичный Geomprops, но выводящий в свойствах выделенных блоков сумму их атрибутов по имени?
Например, есть группа светильников, каждый из которых представлен блоком с атрибутом "P" (мощность). Возможно ли сделать так, чтобы выводилась "в реальном времени", т.е. по отношению к выделенным объектам их суммарная "мощность"?
Просмотров: 728
 
Непрочитано 07.08.2023, 20:14
#2
Сергей812


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


наверняка существует. Не обязательно же в свойства выводить, можно в ту же комстроку акада - т.е. даже на лиспе написать
Сергей812 вне форума  
 
Автор темы   Непрочитано 07.08.2023, 20:32
#3
Shadow_elf1979


 
Регистрация: 25.11.2019
Сообщений: 15


Не уверен, что это подходит - ключевое здесь - "в реальном времени". Т.е. выделено блоков 8 - одно число, добавили в выделение еще один - другое.
Ну и если такая есть, то хотелось бы конкретики где именно она есть и как ей разжиться )))
Shadow_elf1979 вне форума  
 
Непрочитано 08.08.2023, 09:28
#4
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,182


Цитата:
Сообщение от Shadow_elf1979 Посмотреть сообщение
Не уверен, что это подходит - ключевое здесь - "в реальном времени"
"Влезть" в панель свойств просто так не получится, лисп для этого не годится, нужна "тяжелая артиллерия" ARX. Именно на нем написан Geomprops. Но т.к. соотношение задачи и средств ее решения на уровне "из крупнокалиберной пушки по воробьям", то с большой вероятностью, именно такой проги, как вам надо, нет. Совсем нет. Потому что никто не написал и вряд ли напишет.
kp+ вне форума  
 
Непрочитано 08.08.2023, 10:12
#5
CTPAHHNK

чертила
 
Регистрация: 30.11.2009
Вятка
Сообщений: 851


Команда ДАННЫЕИЗВЛ (DATAEXTRACTION)
__________________
Основа вятской философии: "Так-то да, а так-то и нет." :secret:
CTPAHHNK вне форума  
 
Непрочитано 08.08.2023, 10:27
#6
Сергей812


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


и зачем влезать в панель свойств, когда можно вывести информацию прямо под нос пользователю?) На том же Net это делается элементарно

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

// AutoCAD
using aps = Autodesk.AutoCAD.ApplicationServices;
using dbs = Autodesk.AutoCAD.DatabaseServices;
using edi = Autodesk.AutoCAD.EditorInput;
using rtm = Autodesk.AutoCAD.Runtime;


namespace OutCountSelectObjects
{

    public class Commands : rtm.IExtensionApplication
    {
        private const string cNamePowerAttr = "P";

        private void DM_DocumentActivated(object sender, aps.DocumentCollectionEventArgs e)
        {
            if (e.Document != null) e.Document.Editor.PointMonitor += DocEd_PointMonitor;
        }


        private void DM_DocumentToBeDeactivated(object sender, aps.DocumentCollectionEventArgs e)
        {
            if (e.Document != null) e.Document.Editor.PointMonitor -= DocEd_PointMonitor;
        }


        private void DM_DocumentToBeDestroyed(object sender, aps.DocumentCollectionEventArgs e)
        {
            if (e.Document != null) e.Document.Editor.PointMonitor -= DocEd_PointMonitor;
        }


        private void DocEd_PointMonitor(object sender, edi.PointMonitorEventArgs e)
        {
            if (!(sender is edi.Editor lEd)) return;
            edi.PromptSelectionResult lSelRes = lEd.SelectImplied();
            if (lSelRes.Status == edi.PromptStatus.OK)
            {
                if (lSelRes.Value.Count > 0)
                {
                    int lCounter = 0;
                    double lPowerSum = 0;
                    using (dbs.Transaction lTr = lEd.Document.Database.TransactionManager.StartTransaction())
                    {
                        foreach (dbs.ObjectId lId in lSelRes.Value.GetObjectIds())
                        {
                            dbs.BlockReference lBR = lId.GetObject(dbs.OpenMode.ForRead) as dbs.BlockReference;
                            if ((lBR != null) && (lBR.AttributeCollection.Count > 0))
                            {
                                foreach (dbs.ObjectId lARId in lBR.AttributeCollection)
                                {
                                    using (dbs.AttributeReference lAR = 
                                        lARId.Open(dbs.OpenMode.ForRead, false, true) as dbs.AttributeReference)
                                    {
                                        if (lAR != null)
                                        {
                                            if ((lAR.Tag.Equals(cNamePowerAttr)) && (lAR.TextString.Length > 0) && 
                                                (double.TryParse(lAR.TextString.Replace(',', '.'), 
                                                    NumberStyles.Any, CultureInfo.InvariantCulture, out double lPower)))
                                            {
                                                lCounter++;
                                                lPowerSum += lPower;
                                                break;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        lTr.Commit();
                    }
                    if (lCounter > 0) e.AppendToolTipText($"Выделено светильников: {lCounter}; P = {lPowerSum} Вт");
                }
            }
        }
        

        public void Initialize()
        {
            aps.Application.DocumentManager.DocumentActivated += DM_DocumentActivated;
            aps.Application.DocumentManager.DocumentToBeDeactivated += DM_DocumentToBeDeactivated;
            aps.Application.DocumentManager.DocumentToBeDestroyed += DM_DocumentToBeDestroyed;
            aps.Document lDoc = aps.Application.DocumentManager.MdiActiveDocument;
            if(lDoc != null) lDoc.Editor.PointMonitor += DocEd_PointMonitor;
            if (Convert.ToInt32(aps.Application.GetSystemVariable("TOOLTIPS")) == 0)
            {
                aps.Application.SetSystemVariable("TOOLTIPS", 1);
            }
        }


        public void Terminate()
        {
        }

    }

}

и тогда в всплывающей подсказке (если есть блоки с атрибутом P, заполненным числом) выдаст мощность помимо информации от самого акада. Тип разделителя целой и дробной части в строке атрибута и крайние пробелы не влияют на распознавание числа.

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от CTPAHHNK Посмотреть сообщение
Команда ДАННЫЕИЗВЛ (DATAEXTRACTION)
извлечение не совсем в "в реальном времени")

Последний раз редактировалось Сергей812, 13.03.2025 в 14:33.
Сергей812 вне форума  
 
Непрочитано 08.08.2023, 12:03
#7
mainevent100

конструктор
 
Регистрация: 15.05.2009
Сообщений: 6,500


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
можно вывести информацию прямо под нос пользователю?) На том же Net это делается элементарно
и тогда в всплывающей подсказке

и без БИМа жить можно ))
mainevent100 вне форума  
 
Непрочитано 08.08.2023, 13:02
#8
Сергей812


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


Offtop:
Цитата:
Сообщение от mainevent100 Посмотреть сообщение
и без БИМа жить можно ))
ну не совсем. БИМ - готовая автоматизация (со своими косяками и ограничениями) из коробки, а своих программистов CAD в большинстве фирм никогда не было и не будет из-за клинической жадности руководства)
Сергей812 вне форума  
 
Непрочитано 08.08.2023, 14:56
#9
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,705


Если набор светильников представлены как графический объект (блок), то задача имела бы решение. Простое сохранение выбранных объектов приведет к невозможности контроля того, какие объекты просуммированы - тогда проще суммировать каждый раз "ручками" при изменении данных.
nickname2019 вне форума  
 
Непрочитано 08.08.2023, 15:49
#10
Сергей812


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


Цитата:
Сообщение от nickname2019 Посмотреть сообщение
Если набор светильников представлены как графический объект (блок), то задача имела бы решение. Простое сохранение выбранных объектов приведет к невозможности контроля того, какие объекты просуммированы - тогда проще суммировать каждый раз "ручками" при изменении данных.
так это и есть оценочное решение
Цитата:
Сообщение от Shadow_elf1979 Посмотреть сообщение
Например, есть группа светильников, каждый из которых представлен блоком с атрибутом "P" (мощность). Возможно ли сделать так, чтобы выводилась "в реальном времени", т.е. по отношению к выделенным объектам их суммарная "мощность"?
которое нигде не сохраняется дальше - чисто для удобства оператора проектирования.
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Поиск литературы, чертежей, моделей и прочих материалов > Есть ли программа для суммирования заданного атрибута выделенных блоков?

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление одинакового атрибута сразу в несколько блоков. ArtyLight AutoCAD 11 23.07.2013 21:56
Господа, так есть ли программа для поиска текста??? karatete Поиск литературы, чертежей, моделей и прочих материалов 2 23.10.2007 10:16
Есть файл с блоками, ссылки этих блоков накиданы в панель ин Pave1 AutoCAD 15 12.12.2006 11:57
Есть много блоков с аттрибутами. Надо добавить во все блоки Pave1 Программирование 10 14.06.2006 21:57