Несколько вопросов по Pattern-у.

Средства работы с базами знаний.

Несколько вопросов по Pattern-у.

Сообщение SeSl » 04 окт 2013 10:40

Уважаемые гуру!
Прошу разъяснить (подсказать) новичку несколько моментов общения с 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 выдает ошибку.

Всем заранее спасибо за любую помощь!
SeSl
Новичок
Новичок
 
Сообщения: 14
Зарегистрирован: 10 авг 2013 22:24

Re: Несколько вопросов по Pattern-у.

Сообщение Artem » 09 окт 2013 17:15

3) `Geometrical Set.1\Plane.1` =`Geometrical Set.1\Point.1` ->Support
так вроде работает
по остальному - 16я...нет там кп ((...может и посмотрел бы в познавательном порядке - но вопросы мягко выражаясь не примитивные - ты/вы б тест кейсы простенькие выложил/и
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: Несколько вопросов по Pattern-у.

Сообщение [PTM] » 10 окт 2013 07:29

1. можно создавать точки, линии, плоскости и может еще какие-нибудь примитивы. Правила построения определяются в самом массиве и изменения отслеживаются автоматом( например point on curve), не смотря на то что все это будет datum.
2. Несколько моих чисто академических построений паттерна такой закономерности не выявляли. обычно все отрабатывалось норм( имеется ввиду только удаление инстансов), про ручное изменение udf-не пробовал.
Изображение
Аватара пользователя
[PTM]
Moderator
 
Сообщения: 2139
Images: 40
Зарегистрирован: 13 сен 2007 13:03
Откуда: Rzn
Blog: View Blog (15)

Re: Несколько вопросов по Pattern-у.

Сообщение SeSl » 10 окт 2013 13:56

Artem писал(а):3) `Geometrical Set.1\Plane.1` =`Geometrical Set.1\Point.1` ->Support
так вроде работает

У меня не получилось:
Код: Выделить всё
Let P (Point)
Let crv (Curve)

crv = gs\Corns_point\Point.107   ->Support
Message("#",crv .Support.Name   )
   

Не получилось и в варианте ->Support, и .Support . Пробовал разные точки. Возможно, есть какие-то настройки, которые за этот момент отвечают. Собственно, не суть, так как вариант меня все-равно бы не устроил. Мне нужен доступ к этому Support со стороны переменной:
Код: Выделить всё
Let P (Point)
Let crv (Curve)

P = gs\Corns_point\Point.110
crv = P.Support

А при таких конструкциях паттерн уже ругается по синтаксису. Там точек много, они объединены в некий список, операции происходят с каждым элементом путем перебора элементов списка. Так что там может быть путь только через GetAttributeObject("Support") , как мне кажется. Возможно, опять же, какие-то настройки мешают это сделать.

Зы: конечно, можно на "ты"

[PTM] писал(а):1. можно создавать точки, линии, плоскости и может еще какие-нибудь примитивы. Правила построения определяются в самом массиве и изменения отслеживаются автоматом( например point on curve), не смотря на то что все это будет datum.


Попробую конкретизировать вопрос. Вот фрагмент кода, где в параметры точки прописывается ее некоторая характеристика:
Код: Выделить всё
...........................
Points_Sizes =List(2 mm , 1.7 mm,  1.5 mm,  1.2 mm)

for Cur_size inside Points_Sizes
{   
   set Cur_point = CreateOrModifyDatum("Point",  nests\Points ,`Relations\Points & cener lines\Points`     ,j)
   Cur_point = pointoncurve (Cur_Spline , Prev_point ,(Cur_size + Last_size)/2 + Delta  , false)
   Cur_point. Name = "nest." + ToString(j) 
   Cur_point-> SetAttributeReal("D",Cur_size )
   Last_size = Cur_size
   Prev_point = Cur_point
   
   ..............................
   j = j + 1
}


На выходе получается набор datum точек, содержащих каждая свой параметр:


Суть в том, что некоторым точкам должны соответствовать некоторые объекты (к примеру линии). Соответствие не однозначное. Нескольким точкам может соответствовать одна и та же линия, некоторые могут иметь в своем подмножестве по нескольку линий. Из вариантов, которые я придумал, объединять эти (вспомогательные) объекты в списки, а внутри создаваемых datum точек прописывать их индексы. Что не есть гуд.

По второму вопросу постараюсь смакетировать ситуацию на чем-то простом. Как сделаю, так выложу.
Спасибо!
SeSl
Новичок
Новичок
 
Сообщения: 14
Зарегистрирован: 10 авг 2013 22:24

Re: Несколько вопросов по Pattern-у.

Сообщение Artem » 10 окт 2013 17:06

Код: Выделить всё
Let GSMPointOnCurve1 (GSMPointOnCurve)
Let Curve (GSMCurve)
set GSMPointOnCurve1=`Geometrical Set.1\Point.1`
set Curve=GSMPointOnCurve1->Support
set Curve=GSMPointOnCurve1->GetAttributeObject("Support")
`Geometrical Set.1\Curve.1` =Curve

вот так вроде сработало...
или так:
Код: Выделить всё
Let GSMPointOnCurve1 (Point)
Let Curve (Curve)
GSMPointOnCurve1=`Geometrical Set.1\Point.1`
set Curve=GSMPointOnCurve1->GetAttributeObject("Support")
`Geometrical Set.1\Curve.1` =Curve
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: Несколько вопросов по Pattern-у.

Сообщение SeSl » 11 окт 2013 12:03

Уважаемый Artem!
Спасибо, что откликнулись. И да, Ваш вариант работает (!!!) Но, к сожалению, не в моем случае. Видимо, умом эту Катю не понять (с).

На всякий случай выкладываю файл, где создан макет моей ситуации (упростил как мог).
Первый набор (Geometrical Set.1) содержит некую произвольную кривую, ее замыкание и пару точек, лежащих, соотв. на первом и втором вариантах. В обоих случаях исходная кривая извлекается через параметр support , что не может не радовать.

В рамках второго геом. набора (GS2) я воспроизвел часть тех построений, которые мне непосредственно нужны. Есть некоторая поверхность (сейчас не суть - какая) - в контексте примера Target_surf, есть несколько расставленных в разброс точек, объединенных списком (List.1). Далее, на основе этих данных Knowledge Pattern.1 строит несколько datum кривых на целевой поверхности (ортогональные проекции окружностей для простоты).
Следующим шагом разбрасываю вручную несколько точек (On Curve) на полученных кривых, и .... не работает(!!!) Не работает извлечение (support ) - Rule.2. Что здесь может быть не так - вопрос сложный. Если есть идеи, куда копать, плиз поделитесь.

Файл примера прикрепляю. Еще раз спасибо за внимание к моей проблеме!
Part1.zip
(142.04 КБ) Скачиваний: 619
SeSl
Новичок
Новичок
 
Сообщения: 14
Зарегистрирован: 10 авг 2013 22:24

Re: Несколько вопросов по Pattern-у.

Сообщение SeSl » 19 окт 2013 10:50

Отвечу на последний вопрос сам.
Несколько разных ситуаций, где было необходимо извлекать некоторые опорные элементы убедили меня в следующей особенности (я бы назвал это багом).
Катя по-разному воспринимает datum объекты и построенные в рукопашку. Соответственно, "рукотворные" точки, поверхности, кривые дальше видятся и извлекаются соотв. функциями, в то время как их datum аналоги проявляют стойкий иммунитет к таким попыткам.

Что есть грустно, и, возможно, когда-нибудь будет исправлено разработчиками. На сегодняшний день я нашел не совсем гибкую, но рабочую схему решения проблемы: На первом этапе нужное мне количество точек создается неким Pattern - ом посредством CreateOrModifyDatum. Далее несколько ключевых точек, от которых требуется вести дальнейшее построение я просто копирую извлечением. Тут не совсем удобно, ибо в моем случает приходится также каждому такому Extract - у переписать некоторое количество пользовательских атрибутов исходной точки. А дальше этот Extract замечательно извлекается через чтение Attribute("RefPoint"), что позволяет его полноценно включить в автоматизацию дальнейших построений.
SeSl
Новичок
Новичок
 
Сообщения: 14
Зарегистрирован: 10 авг 2013 22:24

Re: Несколько вопросов по Pattern-у.

Сообщение SeSl » 23 ноя 2013 17:32

Прошу прощения за нубовский вопрос. Собственно, не получается из паттерна работать с каталогом. Здесь сказано относительно аргумента TemplateId метода CreateOrModifyTemplate следующее:
If the templates are stored in catalogs, the first part of the argument is the ARM path or the catalog name. The second part is the name of the User Feature.

Приведен пример:
Код: Выделить всё
udf = CreateOrModifyTemplate("PktARMcatalog2|BoxUDF", PartBody, Boxes, i)


Собственно, пробую - не работает! В закладке infr-catalog editor файл каталога в список включил, галку performance поставил. При попытке воткнуть собственный кусок такого кода идут ошибки:
Catalog MyCat not found: no resource will be retrieved

No resource with logical name nest_create has been found in the catalog MyCat (extended search not activated)


Возможно, я не правильно понимаю смысл "ARM path or the catalog name". Если что, врукопашку из этого каталога все вставляется.

Спасибо заранее!
SeSl
Новичок
Новичок
 
Сообщения: 14
Зарегистрирован: 10 авг 2013 22:24


Вернуться в Knowledge

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

cron