Тема: Как добраться до Property Set в формуле для Schedule Table

Есть пример формулы для Schedule Table, в которой организуется проход по объектам (в данном случае по space'ам) в Model Space и подсчет суммы:

Set acadApp = GetObject (,"AutoCAD.Application")
Set AecBaseApplication = acadApp.GetInterfaceObject("AecX.AecArchBaseApplication.5.5")
Set ActiveDoc =AecBaseApplication.ActiveDocument
Set ObjectCollection = ActiveDoc.ModelSpace
TotalArea = 0
For Each Object In ObjectCollection
Set SpaceObject = Object
If SpaceObject.ObjectName = "AecDbSpace" Then
TotalArea = TotalArea + SpaceObject.Area
End If
Next
RESULT = TotalArea 

Так вот, понадобилось мне, считать сумму не всех спейсов в модели, а только спейсов с конкретным property set.
Попробовал вставить код, который отлично работает в VBA:

Set Dict = SpaceObject.GetExtensionDictionary
If Dict.Count > 0 Then
Set subdict = Dict.Item("AEC_PROPERTY_SETS")
For Each sch_propset In subdict
If sch_propset.Name = "имя_PROPERTY_SET" Then
For Each sch_prop In sch_propset.Properties
If sch_prop.Name = "имя_свойства" Then ....

однако даже добавление одной строки  в формулу

Set Dict = SpaceObject.GetExtensionDictionary

приводит к тому, что вся формула перестает работать.
Буду благодарен за помощь.

Re: Как добраться до Property Set в формуле для Schedule Table

> Anatoly
Сначала я попробовал бы отфильтровать нужные помещения на входе с помощью самой таблицы. Для этого нужно ввести для помещений такое понятие как "классификация" свойство classification. Тогда не понадобится этот перебор

Set acadApp = GetObject (,"AutoCAD.Application")
Set AecBaseApplication = acadApp.GetInterfaceObject("AecX.AecArchBaseApplication.5.5")
Set ActiveDoc =AecBaseApplication.ActiveDocument
Set ObjectCollection = ActiveDoc.ModelSpace

Потому как таблица сама это делает и достаточно будет такое выражение
RESULT = BaseArea
А в таблице поставить галку подводить Итог

Re: Как добраться до Property Set в формуле для Schedule Table

PS Если посмотреть как работает таблица, то мы увидим, что строки это объекты, а столбцы это действия, которые мы выполняем над ними. Таблица перебирает все объекты в текущ. файле(лах), или ссылках, соответствующие кретериями выбора и выполняет над ними то, что мы просим в столбцах.

Re: Как добраться до Property Set в формуле для Schedule Table

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

Re: Как добраться до Property Set в формуле для Schedule Table

В общем задача была получить таблицу (для спейсов, или стен, или других объектов, неважно) типа
строка1: общая площадь объектов с Property "Х" = "А" из propertySet "Y" объекта
строка2: общая площадь объектов с Property "Х" = "В" из propertySet "Y" объекта
и т.д.
Если бы удалось заставить таблицу перебирать объекты и находить, что нужно, то это давало бы широкие возможности.

Re: Как добраться до Property Set в формуле для Schedule Table

Anatoly пишет:

Если бы удалось заставить таблицу перебирать объекты и находить, что нужно, то это давало бы широкие возможности.

Какие, например?

Re: Как добраться до Property Set в формуле для Schedule Table

И нельзя ли вместо  с Property "Х" = "А" из propertySet "Y" объекта
написать нормальным языком что нужно!!!???

Re: Как добраться до Property Set в формуле для Schedule Table

Такое впечатление, что народ стесняется своих мыслей, идей, вместо нормального вопроса начинают туман напускать, тут например в соседней ветке https://www.caduser.ru/forum/topic43986.html
товарищ со вчерашнего вечера воду мутил, мутил, сегодня к обеду выяснилось, что ему нужно в Autocad 2009 сделать динамический блок. На выяснение этого ушло вчерашний вечер, до 2ч. ночи и сегодня с утра, где-то до обеда выясняли что ему надо!

Re: Как добраться до Property Set в формуле для Schedule Table

Насчет возможностей - например, у вас была тема про ведомость отделки, может быть там, что-то удалось бы сделать.
Насчет нормального языка - просто написал в общем виде, потому-что писать названия конкретных PropertySet, которые у нас на фирме существуют -думаю никому не интересно.
Конкретный пример:
у спейсов есть PropertySet "АР-Помещение",
в нем есть среди прочих свойства "Квартира" (т.е. № помещения, тип custom) и "Площадь" (тип auto).
Есть стиль для ScheduleTable, в котором есть колонка для свойства "Квартира", и есть Quantity Column.
Т.о. получаем таблицу, сгруппированную по номерам помещений:
№ Кол
1  3
2  5
и т.д.
Если в стиль добавить Formula Column, в которую удалось бы записать подсчет площадей с условием о котором писал выше, то получили бы
№ Кол Площ
1  3   100
2  5   250
Нужно для спейсов и для стен.

Re: Как добраться до Property Set в формуле для Schedule Table

у вас была тема про ведомость отделки... Нужно для спейсов и для стен.

нет, средствами Schedule Table эту задачу не приподнять, уже говорено, переговорено...

Re: Как добраться до Property Set в формуле для Schedule Table

> Anatoly
Мы у себя в подобной ситуации поступили следующим образом, только не со спейсами а с проводами и устройствами. Т.е. задача похожая, достать свойства недоступные в Shedule Table. Написали коротенькую программку на С#, к-рая ищет в файле объекты, берёт у них данные и сохраняет их в заранее созданных custom свойствах объектов. Программа получилась небольшая всего одна страница текста, остальное в формулах Shedule Table. Примеры для написания нашли на диске с инсталлятором, плюс на сайте Autodesk несколько примеров. Всё с нуля, не имея ни какого представления о C# за неделю!!!

Re: Как добраться до Property Set в формуле для Schedule Table

Ну я програмку тоже написал, не на С# правда, я на VBA пишу.
Создает текстовые объекты, в PropertySet которых записывает суммы групп.
А Shedule Table строится на основании этих текстовых объектов.
И получаем таблицу, сгруппированную по номерам помещений.
Только было интересно получить такую таблицу штатными средствами.
Но то-ли VbScript, который используется в формулах таблицы, не может получить доступ к словарям объекта, где храняться PropertySet'ы (в отличие от VBA, который это делает легко), то-ли я не знаю правильный синтаксис, а в итоге фокус не удался.

Re: Как добраться до Property Set в формуле для Schedule Table

Что-то имя с е-mail местами поменялись

Re: Как добраться до Property Set в формуле для Schedule Table

an_nkh@mail.ru пишет:

Но то-ли VbScript, ... то-ли я не знаю правильный синтаксис, а в итоге фокус не удался.

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

Re: Как добраться до Property Set в формуле для Schedule Table

> Я
на их форуме много надёргал подобных примеров, могу поделиться
Если не трудно, вышли пожалуйста
an_nkh@mail.ru

Re: Как добраться до Property Set в формуле для Schedule Table

> Anatoly
Проверь почту!

Re: Как добраться до Property Set в формуле для Schedule Table

> Anatoly
Все равно не понятно. Вам нужно посчитать колисество квартир? Или количество комнат в квартирах? Или еще чего... Не понятно... но кажеться что задача элементарная.

Re: Как добраться до Property Set в формуле для Schedule Table

> Vitaly
Получил, спасибо.
>Gan
Не количество, а общую площадь, помещений (spaces) или стен, объединеных по к-либо принципу, например, по номеру квартиры, который забит в PropertySet/

Re: Как добраться до Property Set в формуле для Schedule Table

Gan пишет:

> Anatoly (2008-09-08 12:21:48)...Не количество, а общую площадь, помещений (spaces) или стен, объединеных по к-либо принципу, например, по номеру квартиры, который забит в PropertySet/

... а для этого необходимо устроить перебор всех помещений внутри одной ячейки! стандартными средствами енто не решить, придумали обход... но >Anatoly дальше хочет пойти дальше и посчитать площади за вычетом проёмов не только пола, но и стен, т.е. составить ведомость отделки помещений.

Re: Как добраться до Property Set в формуле для Schedule Table

> Anatoly
К сожалению, я не нашёл времени чтобы отфильтровать mht файлики, но могу заверить, что туда я заносил только самое интересное, не только по обходу ограничений стандартной Schedule table, но и другие оригинальные примеры скриптов!

Re: Как добраться до Property Set в формуле для Schedule Table

Да, их много, долго придется разбираться.

Re: Как добраться до Property Set в формуле для Schedule Table

> Anatoly
На сайте их ещё больше...
Самые интересные именовал с префиксом "__"
Поверь, игра стоит свеч!

Re: Как добраться до Property Set в формуле для Schedule Table

> Anatoly
Вот, например >> файл в папке ATP\Test
Autodesk - Discussion Groups - Parent object's Z coordinate.mht
Подсчёт общего кол-ва помещений с использованием ячеек память Autocad для временного хранения значений. Т.е. ещё одна из проблем Schedule Table хранение временных результатов, т.к. при переходе от одной строки таблицы к другой они не сохраняются!
Set acadApp = GetObject (,"AutoCAD.Application")
Set AecBaseApplication = acadApp.GetInterfaceObject("AecX.AecArchBaseApplication.5.5")
Set ActiveDoc = AecBaseApplication.ActiveDocument
ActiveDoc.SetVariable "USERI1", [NumberofSpaces]
RESULT = [NumberofSpaces]
and the Space Object uses this syntax to read from a temp location
Set acadApp = GetObject (,"AutoCAD.Application")
Set AecBaseApplication = acadApp.GetInterfaceObject("AecX.AecArchBaseApplication.5.5")
Set ActiveDoc = AecBaseApplication.ActiveDocument
RESULT = ActiveDoc.GetVariable ("USERI1")

Re: Как добраться до Property Set в формуле для Schedule Table

> Anatoly
Вот ещё интересный пример, поиск свойств прианкоренных объектов, подойдёт для нескольких версий DWG
Set acadApp = GetObject(,"AutoCAD.Application")
'ACADVER values:
'ADT2004 = "16.0"
'ADT2005 = "16.1s (LMS Tech)"
'ADT2006 = "16.2s (LMS Tech)"
'ADT2007 = "17.0s (LMS Tech)"
acadVerString = acadApp.ActiveDocument.GetVariable( "ACADVER" )
'Set ADT Schedule application string, based on version running:
Select Case acadVerString
Case "16.0"
aecSchedVer = "AecX.AecScheduleApplication.4"
Case "16.1s (LMS Tech)"
aecSchedVer = "AecX.AecScheduleApplication.4.5"
Case "16.2s (LMS Tech)"
aecSchedVer = "AecX.AecScheduleApplication.4.7"
Case "17.0s (LMS Tech)"
aecSchedVer = "AecX.AecScheduleApplication.5.0"
Case Else
aecSchedVer = "Unknown"
End Select
If aecSchedVer = "Unknown" Then
RESULT = "Unknown Version"
Else
On Error Resume Next
RESULT = "--"
findProp = "FireRating"
Set sched = acadApp.GetInterfaceObject(aecSchedVer)
Set door = acadApp.ActiveDocument.ObjectIDToObject( [ObjectID] )
Set anchor = door.GetAnchor
Set wall = anchor.Reference
Set style = wall.Style
Set propSets = sched.PropertySets(style)
For Each propSet In propSets
For Each prop In propSet.Properties
If prop.Name = findProp Then
RESULT = prop.Value
End if
Next
Next
End if

Re: Как добраться до Property Set в формуле для Schedule Table

Добраться до PropertySet получилось, правда что-то случилось с группировкой, появились лишние строчки, надо разбираться.

Set acadApp = GetObject(, "AutoCAD.Application")
On Error Resume Next
totarea = 0
For Each object In acadApp.activedocument.modelspace
If object.ObjectName = "AecDbSpace" Then
set dict=object.getextensiondictionary
If Dict.Count > 0 Then
Set subdict = Dict.Item("AEC_PROPERTY_SETS")
For Each sch_propset In subdict
If sch_propset.Name = "АР-Помещение" Then
For Each sch_prop In sch_propset.Properties
If sch_prop.Name = "Квартира" Then
if sch_prop.value= "[АР-Помещение:Квартира]" then
totarea = totarea + object.Area
end if
end if
next
end if
next
end if
End If
Next
RESULT = totarea