Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Андрей Бушман от 13-03-2014, 12:21:01

Название: Использование Field в DIESEL
Отправлено: Андрей Бушман от 13-03-2014, 12:21:01
Нужно, чтобы на основании значения параметра видимости одного вхождения блока, формировалось отображаемое значение атрибута в другом вхождении блока. Т.е. необходимо реализовать логику if/else. Для этого использую DIESEL (см. 0.png). Однако есть проблема... Значение вычисляется (см. 1.png), однако это происходит разово: если снова входим в редактор DIESEL, то видим что формула изменена: вместо кода поля стоит его непосредственное значение (см. 2.png).

Т.о. если в последствии менять значение параметра видимости, то это уже никак не повлияет на отображаемое в поле значение ( всегда будет показывать "2"). Есть идеи о том, как решить проблему?

UPD
Пробовал использовать eval:
$(if, $(eq, $(eval, "%<\AcObjProp Object(%<\_ObjId 8796087916608>%).Parameter(9).VisibilityState>%"), "Абсолютные отметки"), 1, 2)но результат аналогичен - формула подменяется значением.
Название: Re: Использование Field в DIESEL
Отправлено: Александр Ривилис от 13-03-2014, 12:35:38
У меня никаких идей. Причин две:
1. Нет нормальной документации по возможностям полей и является ли это багом или запланированным поведением - не ясно.
2. К программированию это не имеет отношения
Название: Re: Использование Field в DIESEL
Отправлено: Андрей Бушман от 13-03-2014, 12:37:27
2. К программированию это не имеет отношения
Выражение формируется программно, так что опосредованно вопрос имеет отношение и к программированию...

1. Нет нормальной документации по возможностям полей и является ли это багом или запланированным поведением - не ясно.
Ну так на это и существует ADN - чтобы давать ответы в т.ч. и на вопросы, не освещённые в документации.
Название: Re: Использование Field в DIESEL
Отправлено: Александр Ривилис от 13-03-2014, 12:39:36
Поле формируется программно, так что опосредованно вопрос имеет отношение к программированию...
Я так понимаю если все тоже самое делаешь вручную, то результат тот же. Так что нужно разбираться с самим AutoCAD, а не с программированием...
Если же вручную все нормально, то тогда ошибка у тебя в программе...
Название: Re: Использование Field в DIESEL
Отправлено: Андрей Бушман от 13-03-2014, 12:40:22
выше я дал комментарий и по "п.1"...
Название: Re: Использование Field в DIESEL
Отправлено: Александр Ривилис от 13-03-2014, 12:42:14
Ну так на это и существует ADN - чтобы давать ответы в т.ч. и на вопросы, не освещённые в документации.
Я не против передать запрос в ADN DevHelp. Но как обычно два условия:
1) Подготовленный код и пример чертежа для тестирования.
2) Повторяемость поведения в последней версии AutoCAD.
Название: Re: Использование Field в DIESEL
Отправлено: Андрей Бушман от 13-03-2014, 12:45:49
А что непонятного в проблеме, обозначенной в #1? Я могу скинуть DWG файл с блоками, а так же строку выражения, показанного в 0.png (дабы не набирать вручную). Версия AutoCAD и мой программный код здесь не имеют значения. Выкладывать DWG и текст выражения?
Название: Re: Использование Field в DIESEL
Отправлено: Александр Ривилис от 13-03-2014, 12:47:47
Версия AutoCAD и мой программный код здесь не имеют значения
Выкладывай. По поводу кода я уже понял. Ты проверил в AutoCAD 2014?
Название: Re: Использование Field в DIESEL
Отправлено: Андрей Бушман от 13-03-2014, 12:57:46
Цитировать
Ты проверил в AutoCAD 2014?
Проверял.
Варианты формул (идентификаторы объектов [вхождения блока anchor], разумеется, будут иными):
%<\AcDiesel $(if, $(eq, $(eval, "%<\AcObjProp Object(%<\_ObjId 8796087900992>%).Parameter(9).VisibilityState>%"), "Абсолютные отметки"), 1, 2)>%и
%<\AcDiesel $(if, $(eq, "%<\AcObjProp Object(%<\_ObjId 8796087900992>%).Parameter(9).VisibilityState>%", "Абсолютные отметки"), 1, 2)>%Спасибо.
Название: Re: Использование Field в DIESEL
Отправлено: Дима_ от 13-03-2014, 13:32:23
Обсуждали здесь http://forum.dwg.ru/showthread.php?t=42268&highlight=%EF%EE%EB%E5 (http://forum.dwg.ru/showthread.php?t=42268&highlight=%EF%EE%EB%E5)
Название: Re: Использование Field в DIESEL
Отправлено: Андрей Бушман от 13-03-2014, 13:46:33
Цитата: Дима_
if x=>1 (y) else (z)
При условии что x,y,z - числа, для полей решается так:
В моём случае x - строка (текстовое значение параметра видимости).
Название: Re: Использование Field в DIESEL
Отправлено: Александр Ривилис от 13-03-2014, 13:50:27
Я думаю, что Дима имел не это, а то что действительно пропадает, а точнее подставляется вычисленное значение  %<\AcObjProp Object(%<\_ObjId xxx>%).Parameter(y).VisibilityState>%
Думаю, что это непобедимо. Как AutoCAD будет знать когда нужно вычислять выражение, а когда нет?
Название: Re: Использование Field в DIESEL
Отправлено: Андрей Бушман от 13-03-2014, 13:55:11
Как AutoCAD будет знать когда нужно вычислять выражение, а когда нет?
Странный вопрос. Выражение нужно вычислять всегда. Если же нужно добавить возможность не вычисления, а только отображения формулы, то для этого уже много лет в языках программирования и операционных системах (да и не только в них) успешно используется экранирование.
Название: Re: Использование Field в DIESEL
Отправлено: Александр Ривилис от 13-03-2014, 13:56:56
Выражение нужно вычислять всегда
Вот оно его и вычислило и сразу подставило в "выше лежащее выражение", т.е. %<\AcObjProp Object(%<\_ObjId xxx>%).Parameter(y).VisibilityState>% сразу подставилась как строка.
Название: Re: Использование Field в DIESEL
Отправлено: Андрей Бушман от 13-03-2014, 14:06:05
Вот оно его и вычислило и сразу подставило
Александр Наумович, вы притворяетесь? "Вычислять выражение" и "подменять выражение его значением, вычисленным разово" - это разные вещи. Странно, что подобное нужно пояснять. Поля ведь AutoCAD не подменяет их фиксированными значениями, вычисленными разово, но каждый раз вычисляет их по указанной формуле.
Название: Re: Использование Field в DIESEL
Отправлено: Александр Ривилис от 13-03-2014, 14:15:59
"Вычислять выражение" и "подменять выражение его значением, вычисленным разово" - это разные вещи.
Согласен. Можно считать это багом. Возможно это связано с тем, что сам DIESEL не умеет работать с полями. Точнее он не может сам вычислить значение поля. Не для того он создавался и про то, что в AutoCAD'е появятся поля никто тогда не догадывался. А теперь возникает вопрос в какой момент это выражение должно вычисляться. Я не оправдываю, я пытаюсь понять.
Название: Re: Использование Field в DIESEL
Отправлено: Андрей Бушман от 13-03-2014, 14:30:21
Я понимаю так, что парсер должен разбирать указанное выражение и вычислять его, не изменяя текстового представления самой формулы. А пользователю отображать результат вычисления (по аналогии с тем, как работает поле). Во всяком случае это было бы логично.
Название: Re: Использование Field в DIESEL
Отправлено: Андрей Бушман от 13-03-2014, 14:34:49
Блин, тут ещё один геморрой вылез.... А в формате поля-то ведь нет возможности включить опцию "показывать знак "+" для положительных значений"... Да что ж такое-то... Не одно, так другое... Только префиксы\суффиксы, да подавление нулей...
Название: Re: Использование Field в DIESEL
Отправлено: Александр Ривилис от 13-03-2014, 14:37:37
Тут работает не один парсер, а точнее FieldEvaluator, а множество. И каждый из них отвечает за свой %<XXX ...>%
Название: Re: Использование Field в DIESEL
Отправлено: Андрей Бушман от 13-03-2014, 14:39:03
Т.е. правильно ли я понял: "родными" средствами AutoCAD обе обозначенные проблемы не решаются?
Название: Re: Использование Field в DIESEL
Отправлено: Александр Ривилис от 13-03-2014, 14:40:01
Т.е. правильно ли я понял: "родными" средствами AutoCAD обе обозначенные проблемы не решаются?
Угу.
Название: Re: Использование Field в DIESEL
Отправлено: Андрей Бушман от 13-03-2014, 14:45:09
Жаль, мне нормоконтроль уже весь мозг выел на эту тему... :(
Название: Re: Использование Field в DIESEL
Отправлено: Владимир Шу от 15-08-2016, 09:04:40
Цитата: Андрей Бушман от 13-03-2014, 14:06:05

    "Вычислять выражение" и "подменять выражение его значением, вычисленным разово" - это разные вещи.

Согласен. Можно считать это багом. Возможно это связано с тем, что сам DIESEL не умеет работать с полями.
Вот еще в копилку, такое же поведение, но в таблице: