Сообщество программистов Autodesk в СНГ
ADN Club => AutoCAD .NET API => Тема начата: Андрей Бушман от 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)
но результат аналогичен - формула подменяется значением.
-
У меня никаких идей. Причин две:
1. Нет нормальной документации по возможностям полей и является ли это багом или запланированным поведением - не ясно.
2. К программированию это не имеет отношения
-
2. К программированию это не имеет отношения
Выражение формируется программно, так что опосредованно вопрос имеет отношение и к программированию...
1. Нет нормальной документации по возможностям полей и является ли это багом или запланированным поведением - не ясно.
Ну так на это и существует ADN - чтобы давать ответы в т.ч. и на вопросы, не освещённые в документации.
-
Поле формируется программно, так что опосредованно вопрос имеет отношение к программированию...
Я так понимаю если все тоже самое делаешь вручную, то результат тот же. Так что нужно разбираться с самим AutoCAD, а не с программированием...
Если же вручную все нормально, то тогда ошибка у тебя в программе...
-
выше я дал комментарий и по "п.1"...
-
Ну так на это и существует ADN - чтобы давать ответы в т.ч. и на вопросы, не освещённые в документации.
Я не против передать запрос в ADN DevHelp. Но как обычно два условия:
1) Подготовленный код и пример чертежа для тестирования.
2) Повторяемость поведения в последней версии AutoCAD.
-
А что непонятного в проблеме, обозначенной в #1? Я могу скинуть DWG файл с блоками, а так же строку выражения, показанного в 0.png (дабы не набирать вручную). Версия AutoCAD и мой программный код здесь не имеют значения. Выкладывать DWG и текст выражения?
-
Версия AutoCAD и мой программный код здесь не имеют значения
Выкладывай. По поводу кода я уже понял. Ты проверил в AutoCAD 2014?
-
Ты проверил в 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)>%
Спасибо.
-
Обсуждали здесь 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)
-
if x=>1 (y) else (z)
При условии что x,y,z - числа, для полей решается так:
В моём случае x - строка (текстовое значение параметра видимости).
-
Я думаю, что Дима имел не это, а то что действительно пропадает, а точнее подставляется вычисленное значение %<\AcObjProp Object(%<\_ObjId xxx>%).Parameter(y).VisibilityState>%
Думаю, что это непобедимо. Как AutoCAD будет знать когда нужно вычислять выражение, а когда нет?
-
Как AutoCAD будет знать когда нужно вычислять выражение, а когда нет?
Странный вопрос. Выражение нужно вычислять всегда. Если же нужно добавить возможность не вычисления, а только отображения формулы, то для этого уже много лет в языках программирования и операционных системах (да и не только в них) успешно используется экранирование.
-
Выражение нужно вычислять всегда
Вот оно его и вычислило и сразу подставило в "выше лежащее выражение", т.е. %<\AcObjProp Object(%<\_ObjId xxx>%).Parameter(y).VisibilityState>% сразу подставилась как строка.
-
Вот оно его и вычислило и сразу подставило
Александр Наумович, вы притворяетесь? "Вычислять выражение" и "подменять выражение его значением, вычисленным разово" - это разные вещи. Странно, что подобное нужно пояснять. Поля ведь AutoCAD не подменяет их фиксированными значениями, вычисленными разово, но каждый раз вычисляет их по указанной формуле.
-
"Вычислять выражение" и "подменять выражение его значением, вычисленным разово" - это разные вещи.
Согласен. Можно считать это багом. Возможно это связано с тем, что сам DIESEL не умеет работать с полями. Точнее он не может сам вычислить значение поля. Не для того он создавался и про то, что в AutoCAD'е появятся поля никто тогда не догадывался. А теперь возникает вопрос в какой момент это выражение должно вычисляться. Я не оправдываю, я пытаюсь понять.
-
Я понимаю так, что парсер должен разбирать указанное выражение и вычислять его, не изменяя текстового представления самой формулы. А пользователю отображать результат вычисления (по аналогии с тем, как работает поле). Во всяком случае это было бы логично.
-
Блин, тут ещё один геморрой вылез.... А в формате поля-то ведь нет возможности включить опцию "показывать знак "+" для положительных значений"... Да что ж такое-то... Не одно, так другое... Только префиксы\суффиксы, да подавление нулей...
-
Тут работает не один парсер, а точнее FieldEvaluator, а множество. И каждый из них отвечает за свой %<XXX ...>%
-
Т.е. правильно ли я понял: "родными" средствами AutoCAD обе обозначенные проблемы не решаются?
-
Т.е. правильно ли я понял: "родными" средствами AutoCAD обе обозначенные проблемы не решаются?
Угу.
-
Жаль, мне нормоконтроль уже весь мозг выел на эту тему... :(
-
Цитата: Андрей Бушман от 13-03-2014, 14:06:05
"Вычислять выражение" и "подменять выражение его значением, вычисленным разово" - это разные вещи.
Согласен. Можно считать это багом. Возможно это связано с тем, что сам DIESEL не умеет работать с полями.
Вот еще в копилку, такое же поведение, но в таблице: