(изменено: Vitaly, 25 февраля 2009г. 16:07:08)

Re: ADT, MEP Общая Длина элементов по стилям

Yuriy,
Юра, похоже пока не смогу ничем помочь!
Вроде бы всё правильно, но формула не работает.
Может на форуме Autodesk поискать что-то подобное?
Мне, честно говоря, остальные формулы тоже не очень нравятся,
т.к. не работают с xref. А переделывать времени нет!

PS
...вот эти выражения в кавычках надо писать >>>

n= "[Aec-Polygon:Style]"
h= "[Aec-Polygon:Handle]"

Re: ADT, MEP Общая Длина элементов по стилям

Юра, похоже пока не смогу ничем помочь!

Все равно спасибо за попытку.

Уверен в дальнейшем решение таки найдется.

В basic потихоньку стал влезать.

Re: ADT, MEP Общая Длина элементов по стилям

Подниму-ка старую, но от этого не менее важную тему :)
Пытаюсь сделать суммирование пользовательских PropertySet'ов, но получаться отказывается (честно скачал все файлы, которые выкладывал Vitaly, за что ему огромное спасибо).
Пытаюсь вбивать формульную колонку напрямую в ScheduleTable со следующим кодом:

On Error Resume Next

CurSpaceObjID = [kpblc_SpaceObject:ObjectID]
CurSpaceArea = CDbl(Replace(CStr([kpblc_SpaceObject:SchedFloorArea]), ".", ","))
CurSpaceLevel = "[kpblc_SpaceObject:Этаж]"
CurSpaceSection =  "[kpblc_SpaceObject:Секция]"
CurSpaceStyle = "[kpblc_SpaceObject:Style]"
CurSpacePropertySetName = "kpblc_SpaceObject"
CurSpacePropertySetFld = "SchedFloorArea"
CurSpaceObjectName = "AecDbSpace"

Set oAcad = GetObject(, "AutoCAD.Application")

totArea = 0

For Each objEnt In oAcad.ActiveDocument.ModelSpace
  toggle = 0
  objArea = 0
  Select Case True
    Case objEnt.ObjectID <> CurSpaceObjID And objEnt.ObjectName = CurSpaceObjectName
      Set Dict = objEnt.GetExtensionDictionary.Item("AEC_PROPERTY_SETS")
      For Each ObjPropertySet In Dict
        If ObjPropertySet.Name = CurSpacePropertySetName Then
          For Each PropertySetFld In ObjPropertySet.Properties
            If PropertySetFld.Name = CurSpacePropertySetFld Then
              objArea = CDbl(Replace(CStr(PropertySetFld.Value), ".", ","))
            End If
            If (LCase(PropertySetFld.Name) = "style" And PropertySetFld.Value = CurSpaceStyle) Or (LCase(PropertySetFld.Name) = "этаж" And (PropertySetFld.Value = CurSpaceLevel Or InStr(PropertySetFld.Value, CurSpaceLevel) <> 0)) Or (LCase(PropertySetFld.Name) = "секция" And (PropertySetFld.Value = CurSpaceSection Or InStr(PropertySetFld.Value, CurSpaceSection) <> 0)) Then
              toggle = toggle + 1
            End If
          Next 'PropertySetFld
          If toggle = 3 Then
            totArea = totArea + objArea
            toggle = 0
            objArea = 0
            Exit For
          End If
        End If
      Next 'ObjPropertySet
  End Select
Next 'objEnt

RESULT = totArea + CurSpaceArea

Проблема в том, что в какой-то момент "набивания" кода AA просто зависает вмертвую (при этом я еще не попытался входить внутрь блоков и внешних ссылок!). При этом если подставить вместо вычисляемых параметров их значения и код прогнать в VBA, то все вычисляется просто на ура.
Собственно вопросов несколько:
1. Можно ли заставить в таблицу собираться данные с объектных PropertySet'ов с фильтрацией по 2 (3, 4, 5 ...) параметрам, которые тоже являются данными из PropertySet'а?
2. В чем конкретно моя ошибка?
3. Возможно ли заставить VBS, работающий в коде таблиц АА (или полей PropertySet) использовать функции, написанные на VBA или VLISP? Если да, то как? Функции будут гарантированно подгружены.
4. Возможно ли в VBS получить интерфейс для IAecScheduleApplication для упрощения получения полей объектного PropertySet'a? Если да, то как? Очень не хочется по любому поводу лезть и реестр и там вычислять ссылку на CLSID (вдобавок я не уверен в успешности этого хода).
Файл с образцами данных и таблицей лежит по адресу http://depositfiles.com/files/bpeg899sr (210 кб)
P.S. На autodesk.com и на augi.com, скажу честно, особо тщательно не искал.

Re: ADT, MEP Общая Длина элементов по стилям

Кулик Алексей aka kpblc, формула с сортировкой по нескольким параметрам
на остальные вопросы чуть позже отвечу. С фильтрами что-то, имхо

RESULT = "--"
On Error Resume Next
Set acadApp = GetObject(,"AutoCAD.Application.17.2")
LengthRo = 0
LengthRe = 0
LengthOv = 0
s="[DuctObjLength:Style]"
f="[DuctObjLength:Shape]"
h="[DuctObjLength:Handle]"
L= [DuctObjLength:Length]

For Each object In acadApp.ActiveDocument.ModelSpace
    If object.ObjectName = "AecbDbDuct" Then
        If object.Handle <> h Then
            If f="Round" Then        
                set dict=object.GetExtensionDictionary
                Set subdict = Dict.Item("AEC_PROPERTY_SETS")
                For Each sch_propset In subdict
                    If sch_propset.Name = "DuctObjLength" Then
                        For Each sch_prop In sch_propset.Properties
                            If sch_prop.Name = "Style" Then 
                                If sch_prop.Value= s Then
                                    LengthRo = LengthRo + object.Length
                                End If
                            End If
                        Next
                    End If
                Next
            End If
            If f="Rectangular" Then
                set dict=object.GetExtensionDictionary
                Set subdict = Dict.Item("AEC_PROPERTY_SETS")
                For Each sch_propset In subdict
                    If sch_propset.Name = "DuctObjLength" Then
                        For Each sch_prop In sch_propset.Properties
                            If sch_prop.Name = "Style" Then 
                                If sch_prop.Value= s Then
                                    LengthRe = LengthRe + object.Length
                                End If
                            End If
                        Next
                    End If
                Next
            End If
            If f="Oval" Then
                set dict=object.GetExtensionDictionary
                Set subdict = Dict.Item("AEC_PROPERTY_SETS")
                For Each sch_propset In subdict
                    If sch_propset.Name = "DuctObjLength" Then
                        For Each sch_prop In sch_propset.Properties
                            If sch_prop.Name = "Style" Then 
                                If sch_prop.Value= s Then
                                    LengthOv = LengthOv + object.Length
                                End If
                            End If
                        Next
                    End If
                Next
            End If
        End If
    End If
Next
If f = "Round" Then RESULT = Round(LengthRo + L, 2)/1000 End If
If f = "Rectangular" Then RESULT = Round(LengthRe + L, 2)/1000 End If
If f = "Oval" Then RESULT = Round(LengthOv + L, 2)/1000 End If

(изменено: Кулик Алексей aka kpblc, 1 апреля 2009г. 20:15:22)

Re: ADT, MEP Общая Длина элементов по стилям

Vitaly, на самом деле проблема в строках вида

LengthOv = LengthOv + object.Length 

У тебя идет сложение вычисленного значения с обычным свойством объекта, что никаких проблем и нареканий не вызывает. Мне же требуется добавлять значение <...> из того же PropertySet'a, на чем ADT и "вешается", т.е. вместо object.Length должно быть значение другого поля того же PropertySet'a.
---
Исправил некоторые ошибки в тексте.

(изменено: Vitaly, 2 апреля 2009г. 14:37:16)

Re: ADT, MEP Общая Длина элементов по стилям

Кулик Алексей aka kpblc,

3. Возможно ли заставить VBS, работающий в коде таблиц АА (или полей PropertySet) использовать функции, написанные на VBA или VLISP? Если да, то как? Функции будут гарантированно подгружены.

Нет, и даже больше того, те формулы, что выше, официально никак не поддерживаются, это лазейка, к-рую откопали программисты. Таблица просто не расчитана на работу в цикле внутри ячейки. Её штатный режим -
это небольшие вспомогательные вычисления с текущим объектом, который она выбрала по заданным пользователем параметрам. Она даже не может передать данные из одной ячейки в другую, т.е. негде хранить промежуточные результаты.

4. Возможно ли в VBS получить интерфейс для IAecScheduleApplication для упрощения получения полей объектного PropertySet'a? Если да, то как?

То же самое, нет, невозможно!

Имхо проще написать на С# (или др. яз.) некую прогу, к-рая бы доставала те или иные данные по проекту и помещала бы их в заранее отведённые текстовые свойства объектов или стилей. А дальше уже пускать в ход обычную Schedule Table.
Собственно мы так и сделали, есть кабельный журнал и в работе ещё одна прога, к-рая будет собирать кол-ва и длины, площади и помещать их в свойства стилей. Дело в том, что многие данные хранятся в готовом виде, осталось только взять их в одном месте и положить в другое!!!

Re: ADT, MEP Общая Длина элементов по стилям

PS ...или убедить Autodesk в необходимости вытащить на палитру нужные нам свойства, или спец утилиту от них самих. Но для этого нужно чтобы  здешние представители от Autodesk не спали, а представляли бы интересы пользователей!!!

Re: ADT, MEP Общая Длина элементов по стилям

Спасибо.
Нда, получается, что не зря я "пошел своим путем" и начал формировать собственный механизм сбора данных и вывода в таблицу :)

(изменено: Vitaly, 2 апреля 2009г. 16:04:17)

Re: ADT, MEP Общая Длина элементов по стилям

Кулик Алексей aka kpblc, ... конечно не зря! Кстати, что за механизм? )))

Re: ADT, MEP Общая Длина элементов по стилям

Да сам, на лиспе нарисовал. В xml-файле описания стилей таблиц и данных об объектах, с которых собирается информация. Лиспом формируется стиль таблицы и она заполняется. Кода много и работает не всегда быстро, да и заточено под наши условия, но зато "творю чего хочу" :)
Основные тормоза - сбор объектов, т.к. помимо собственно объектов иногда приходится забирать данные с xml-файлов сопровождения dwg-частей проекта. А это приличные временные затраты :(

Re: ADT, MEP Общая Длина элементов по стилям

Vitaly Добрый день. Стал разбираться с написанием кода для Schedule table.
Предложенный вами код не совсем понятен. Он неверно считает длину. По сути он выбирает все объекты AecbDbDuct
с PropertySet "DuctObjLength". Даже те, которые не добавлены к таблице, но имеют PropertySet "DuctObjLength"

Re: ADT, MEP Общая Длина элементов по стилям

Pavlukas,

Сравни вот с этим кодом >

Set acadApp = GetObject(, "AutoCAD.Application")
On Error Resume Next
totLength = 0
n="[MemObjLength:Style]"
h="[MemObjLength:Handle]"
s= [MemObjLength:Length]

For Each object In acadApp.ActiveDocument.ModelSpace
If object.ObjectName = "AecsDbMember" Then
If object.Handle <> h Then
set dict=object.GetExtensionDictionary

Set subdict = Dict.Item("AEC_PROPERTY_SETS")
For Each sch_propset In subdict
If sch_propset.Name = "MemObjLength" Then
For Each sch_prop In sch_propset.Properties
If sch_prop.Name = "Style" Then 
If sch_prop.Value= n then
totLength = totLength + object.Length
End If
End If
Next
End If
Next

End If
End If
Next

RESULT = Round(totLength + s, 2)/1000

Его работа показана на видео клипе
ADT, MEP Общая Длина элементов по стилям

Re: ADT, MEP Общая Длина элементов по стилям

Ещё раз поясню.
Допустим 3 разных типа объектов, как у вас на видео-примере.
Все объекты присоединены к таблице. По идее они и должны участвовать в расчёте.
Теперь скопируем любой из объектов.
Он не добавлен к таблице, но у него есть PropertySet "MemObjLength"
По логике он не должен участвовать в суммировании длин, но он участвует.

В предложенном коде нет проверки на пренадлежность входящего объекта к таблице.
Разве не так?

Re: ADT, MEP Общая Длина элементов по стилям

Pavlukas,

В предложенном коде нет проверки на пренадлежность входящего объекта к таблице.
Разве не так?

так, проверка в формуле не нужна, это делает таблица!

В клипе видно, что общая длина меняется в зависимости от
выбранных объектов, остальные никакого влияния не оказывают!

Re: ADT, MEP Общая Длина элементов по стилям

Всё верно, но вот этот код

For Each object In acadApp.ActiveDocument.ModelSpace 
If object.ObjectName = "AecsDbMember" Then 
If object.Handle <> h Then 
set dict=object.GetExtensionDictionary 

Set subdict = Dict.Item("AEC_PROPERTY_SETS") 
For Each sch_propset In subdict 
If sch_propset.Name = "MemObjLength" Then 
For Each sch_prop In sch_propset.Properties 
If sch_prop.Name = "Style" Then 
If sch_prop.Value= n then 
totLength = totLength + object.Length 
End If 
End If 
Next 
End If 
Next 

Просчитывает всю объектную модель в независимости от того - добавлены эти объекты в таблицу или нет.
Если "MemObjLength" есть и в объектах, которые присоединены к таблице и в тех, которые не присоединены - то суммируется длина и тех и других.
Или эта строка For Each object In acadApp.ActiveDocument.ModelSpace берёт не все Structural Member'ы?

(изменено: Vitaly, 10 декабря 2009г. 17:24:03)

Re: ADT, MEP Общая Длина элементов по стилям

так, проверка в формуле не нужна, это делает таблица!

таблица подсовывает формуле только то, что она выбрала!

Re: ADT, MEP Общая Длина элементов по стилям

Наверно я что-то не понимаю. Вы не могли бы сбросить файл, который был в ролике на мой е-майл
pahm@yandex.ru
У меня, как вы говорите не выходит

(изменено: Vitaly, 10 декабря 2009г. 18:03:32)

Re: ADT, MEP Общая Длина элементов по стилям

Pavlukas,

ок! проверяй

PS проверено на MEP2009-10 ENG версии!

Re: ADT, MEP Общая Длина элементов по стилям

У меня файл не открывается в AA2009 (En)

Re: ADT, MEP Общая Длина элементов по стилям

Pavlukas,
Проверь, послал файл, к-рый не открывал 10-кой

Re: ADT, MEP Общая Длина элементов по стилям

Открыл. Вот как я и говорил программный код сканирует все Structural Member'ы и те, которые присоединены к таблице и те, которые не присоединены, но у которых есть PropertySet "MemObjLength"

Я скопировал один из объектов и таблица пересчиталась, но этот объект мною не присоединялся к таблице.
Допустим, что присоединение происходит автоматически
Отсоединяю этот объект от таблицы - таблица пересчиталась. Ещё раз сделал Update
и длина отсоединённого объекта снова в таблице просуммировалась.
А всё оттого, что программа внутри таблицы не проверяет объекты по пренадлежности к таблице.

Re: ADT, MEP Общая Длина элементов по стилям

Pavlukas,
В свойствах таблицы отключи опцию Add new objects automatically!

Re: ADT, MEP Общая Длина элементов по стилям

Это проблему не решает.
Создал 2 таблицы и в каждую из них добавил по одному объекту разных типов.
В 1-ую таблицу (уголок 100х63 длиной 415, круг21 длиной 391, круг12 длиной 360)
Во 2-ую таблицу (уголок 100х63 длиной 332 , круг21 длиной 340, круг12 длиной 265)

Далее правой клавишей мыши выбираю Update для 2-ух таблиц
И получаем одинаковые данные в обеих таблицах,
0.75
0.63
0.73

хотя объекты разной длины.

Re: ADT, MEP Общая Длина элементов по стилям

Такого не должно быть, у меня пашет и раньше всё пахало!
Ищи где-то глюк в MEP-e!

Re: ADT, MEP Общая Длина элементов по стилям

Ну глюк в пррограммном коде. Неверная сортировка данных

Set acadApp = GetObject(, "AutoCAD.Application") 
On Error Resume Next 
totLength = 0 
n="[MemObjLength:Style]" 
h="[MemObjLength:Handle]" 
s= [MemObjLength:Length] 
[b]n,h,s - свойства текущего объекта[/b]

For Each object In acadApp.ActiveDocument.ModelSpace 
[b]Здесь сканируется все объекты модели[/b]
If object.ObjectName = "AecsDbMember" Then
[b]Здесь проверка на класс объекта[/b]
If object.Handle <> h Then 
[b]Здесь, что объект не совпадает с текущим[/b]
set dict=object.GetExtensionDictionary 

Set subdict = Dict.Item("AEC_PROPERTY_SETS") 
For Each sch_propset In subdict 
If sch_propset.Name = "MemObjLength" Then 
For Each sch_prop In sch_propset.Properties 
If sch_prop.Name = "Style" Then 
If sch_prop.Value= n then 
[b]А вот тут, если стиль совпадает и есть PropertySet "MemObjLength" то суммируем. И не важно - присоединён объект к таблице или нет.[/b]
totLength = totLength + object.Length 
End If 
End If 
Next 
End If 
Next 

End If 
End If 
Next 

RESULT = Round(totLength + s, 2)/1000