Прошу разъяснить (подсказать) новичку несколько моментов общения с Knowledge Pattern.
Вопрос первый. Можно ли средствами встроенного языка создавать ассоциативные списки (они же массивы)? Другими словами, если в некотором прогоне создаются различные наборы примитивов, как обеспечить связь между конкретными экземплярами, если требуется в дальнейшем использовать ее в каких-то дополнительных построениях? Параметр - объект присоединить к примитиву не удается.
Единственный вариант, который для себя нашел, использование параметра - целого. Использую его как индекс в списке, где хранятся связанные объекты. То есть, при некотором прогоне создаются внутренние списки данного конкретного Pattern-а. А каждый связанный объект получает индексы элементов, к которым в дальнейшем должно идти обращение. Несколько раз я так уже делал. Минусы подхода в не-гарантированности целостности внутренних списков Pattern-а при необходимости перерасчетов какого-то неудачного построения. О чем вопрос ниже.
Был ли у кого-нибудь опыт подключения к файлу детали некоторого сателлитного COM (automation) объекта, написанного на нормальном С++, к примеру, где эти ассоциативные связи непосредственно между объектами могли бы храниться, перезаписываться при отработке одного Pattern-a, выдаваться в теле другого?
Вопрос второй. Обнаружил для себя следующий неприятный момент. Имеется некий Pattern с простым кодом вставки (развертывания) неких UDF. Чуть подробней про одну из UDF. Основные построения выполняет некоторое правило. На входе важный параметр - точка с пришитыми к ней характеристиками (целые и действительные числа). Далее все вспомогательные построения идут внутри тела правила, на выходе образуется две поверхности. Собственно, сам UDF одну из них использует для заливки, другую для сечения. Все работает, пока в некоторой из таких базовых точек я не меняю один параметр и ..... ничего не происходит. Pattern считает, что данное построение он уже выполнил, перерасчитывать обновленный UDF он не намерен. При удалении (вручную) некоторого инсталлированного UDF его повторная инсталляция проходит правильно (в соответствии с ...), но возникают различные глюки с другими построениями. Либо одна из точек недополучает своего построения, либо даже Pattern портит те построения, которые выполнялись до его работы. В поисках источников данного трабла обнаружил неприятное. Внутренний список UDF, созданных на некотором прогоне Pattern-а не реагирует на физическое удаление конкретной инсталляции. К примеру, их было 20, 13-ю я удалил (с целью перестроить). Физически их стало 19, но в списке Pattern-а их осталось 20. К этому списку доступа с редактированием нет, им управляет непосредственно сам Pattern. Одно из решений, "кривое" я нашел в том, чтобы полностью в теле Pattern-а уничтожить данный список, затем создать его заново, прописать его в нужном месте кода. При полном уничтожении всех произведенных инсталляций и перестроениях заново (с нуля) все перестраивается корректно.
Видимо, не нужно объяснять, насколько такой подход не практичен.
Вопрос третий. Как "путешествовать" по дереву иерархии? Как получать родительские или дочерние объекты? Например, есть некоторая точка на кривой. Стоит задача для такой точки извлекать саму кривую. Небольшой код:
- Код: Выделить всё
Let P (Point)
let x(List)
let s=""
P = gs\Corns_point\Point.107
x = P->ListAttributeNames("",false )
for s inside x
Trace(1,s)
Trace(1,"Has Attribute Support = " ,P->HasAttribute("Support"))
Выдает следующую отладочную информацию:
- Код: Выделить всё
Rule.2: Length
Rule.2: Activity2
Rule.2: Activity
Rule.2: Error
Rule.2: IsRoot
Rule.2: IsLeaf
Rule.2: IsDatum
Rule.2: Show
Rule.2: Color
Rule.2: Layer
Rule.2: Pick
Rule.2: Name
Rule.2: Owner
Rule.2: UserInfoComment
Rule.2: NamedURLs
Rule.2: Children
Rule.2: PointType
Rule.2: Support
Rule.2: RefPoint
Rule.2: Values
Rule.2: Direction
Rule.2: Type
Rule.2: Has Attribute Support = false
Некоторые атрибуты, например P->GetAttributeInteger("PointType") извлекаются. В данном случае =2 (точка на кривой). Support (то есть, сама кривая) засвечивается в списке атрибутов, но при попытках извлечения (посредством P->GetAttributeObject("Support"), к примеру) ругается и выдает ошибки. Также странно, что метод HasAttribute выдает ошибку.
Всем заранее спасибо за любую помощь!