Пожалуйста, не блокируйте рекламу!

0 Пользователей и 1 Гость просматривают эту тему.

*

Оффлайн BeArt

  • *****
  • 1016
  • Репутация: +94/-3
  • Пол: Мужской

Test

STW (string_expression) НЕ возвращает ширину (действительное число) строки (в метрах) с учетом текущего стиля при перемещении.
!Master Script
n = REQUEST ("Elevation_dimension", "",ed)
ePOSy=STR (ed,SYMB_POS_Y)
unID=0
HOTSPOT2 0, 0, unID, tx, 129 : unID=unID+1
HOTSPOT2 tx, 0, unID, tx, 2 : unID=unID+1
HOTSPOT2 -1, 0, unID, tx, 3 : unID=unID+1
line2 0,-1,0,1
line2 0,0, tx,0
text2 tx-STW(ePOSy)/1000 * GLOB_SCALE,0, ePOSy

!Parameter Script
VALUES "tx" RANGE (STW(ePOSy)/1000 * GLOB_SCALE,]

!Parameters
tx - Length

Как исправить? Спасибо.

*

Оффлайн Valery W

  • *****
  • 5987
  • Репутация: +634/-14
  • Пол: Мужской
!Master Script
IF tx < STW(ePOSy)/1000 * GLOB_SCALE THEN tx = STW(ePOSy)/1000 * GLOB_SCALE

!Parameter Script
VALUES "tx" RANGE [STW(ePOSy)/1000 * GLOB_SCALE,]

Или

!Master Script
IF tx < STW(ePOSy)/1000 * GLOB_SCALE THEN tx = STW(ePOSy)/1000 * GLOB_SCALE
VALUES "tx" RANGE [STW(ePOSy)/1000 * GLOB_SCALE,]

В каждом случае будет разное поведение после перемещения, но текст не будет вылазить за вертикальную линию. Выбирай нужное.

*

Оффлайн BeArt

  • *****
  • 1016
  • Репутация: +94/-3
  • Пол: Мужской
И этот код и другой, например:
IF tx - STW(ePOSy)/1000 * GLOB_SCALE <= 0 THEN tx = STW(ePOSy)/1000 * GLOB_SCALE

Или
IF tx /(STW(ePOSy)/1000 * GLOB_SCALE) <= 1 THEN tx = STW(ePOSy)/1000 * GLOB_SCALE

Подтверждают правильность названия темы.
Из справочного руководства GDL
Цитировать
STW
STW (string_expression)
Возвращает ширину (действительное число) строки (в метрах) с учетом текущего стиля. Ширина в метрах, при текущем масштабе равна STW (string_expression) / 1000 * A_.
Это очевидное условие приходится исправлять вводом дополнительных проверок - если не возвращает ширину - тогда... Причём, если закрыть в комментарий активную узловую точку или после перемещения два раза кликнуть по узловой точке в режиме растяжения (изменение размеров) - ширина возвращается.
Примерчик, конечно простой, поясняющий суть. В нем всего лишь одна проверка. В более сложном объекте необходимо проделывать десятки таких проверок, что сильно раздувает  код и раздражает.
В девятом Архикаде эта тормознутость касается практически всех значений переопределённых в параметрах. С десятого ArchiCAD часть значений в параметрах  стали определятся автоматически, как видим не все.

*

Оффлайн ALAKK

  • *****
  • 625
  • Репутация: +55/-7
  • Пол: Мужской
  • Он спорил с модером...
Ув. Господа.
С наступающим Праздником и позвольте «… пару слов без протокола».
BeArt задал очень существенный вопрос и важный, а ValeryW ответил на него, но не пояснил почему именно так, а не иначе, что и вызвало ответный пост ув. BeArt.

По моему мнению надо понимать как именно работает интерпретатор бэйсик-подобных языков, а именно ГДЛ в данном случае, в среде ООП. Надо понять состав и значения переменных на момент исполнения действия пользователя.
Когда система находится в ожидании действий пользователя, весь набор правильно описанных переменных имеет какие-то значения, которые попадают в ООФ.
Если ничего не происходит с этим объектом, то он так и живет в проекте до форматирования винта. Но как только пользователь начинает таскать его за волосы и прочие хотспоты по всей Руси Великой, тут начинаются чудеса. Программа объекта начинает исполняться  с той самой строки, где описывается данный хотспот (элемент геометрического редактирования) и переходит сразу на исполнение мастер скрипт. О чем это нам говорит? О том, что  на момент начала исполнения действия у программы есть ПРЕДЫДУЩИЙ набор значений переменных, а после исполнения ВСЕГО скрипта она получает совсем другой набор и его отображает на мониторе. Именно в этом причина того, что уважаемому BeArt кажется, что неверно возвращается значение функции. Оно возвращается правильно, только не туда, куда Вы хотели бы. Просто надо учесть тот факт, что язык написан именно так и никак иначе. Чтож… таковы реалии.

И еще раз всех с Пасхой. Христос воскрес!

*

Оффлайн Valery W

  • *****
  • 5987
  • Репутация: +634/-14
  • Пол: Мужской
BeArt, я не опровергал название темы. Я ответил на вопрос "Как исправить?".

Я даже не пытался объяснить почему так происходит. Не обладаю знаниями и терминологией программирования, чтобы грамотно объяснить, как это сделал ALAKK. За что ему спасибо. Хотя "механизмы" эти я примерно понимаю. Давно уже с ними столкнулся, принял как данное и научился обходить.

*

Оффлайн BeArt

  • *****
  • 1016
  • Репутация: +94/-3
  • Пол: Мужской
Valery W
Да, конечно, вопросом «Как исправить?», несколько расширен вариант ответов.
Сорри. Но, я имел ввиду непосредственно  оператор – STW. Обходные  решения мне известны и реализованы (например, ”отметка от Be Art”).

Что касается интерпретатора:
ALAKK
Цитировать
Когда система находится в ожидании действий пользователя, весь набор правильно описанных переменных имеет какие-то значения, которые попадают в ООФ. 
Так вот, система не находится в ожидании действий пользователя. Объект перемещается – все  значения пересчитываются. Пересчитываться должны и параметры, это определено в программе, получена и отработана команда  - VALUES "tx" RANGE (STW(ePOSy)/1000 * GLOB_SCALE,]
ALAKK
Цитировать
Оно возвращается правильно, только не туда, куда Вы хотели бы. Просто надо учесть тот факт, что язык написан именно так и никак иначе. Чтож… таковы реалии.
Если возвращается правильно, ТО КУДА? В этом то и вопрос.
Если интерпретатор языка так устроен, то его надо исправлять.
P.S. Надеюсь на это!

С праздником Светлого Христова Воскресения!

*

SergeyAB

"Так вот, система не находится в ожидании действий пользователя. Объект перемещается – все  значения пересчитываются. Пересчитываться должны и параметры, это определено в программе, получена и отработана команда  - VALUES "tx" RANGE (STW(ePOSy)/1000 * GLOB_SCALE,]"

- находится. постоянно.с момента нажатия на кнопку Power(не, ну может быть пара секунд проходит в "свободном полете", до приглашения зайти в биос). В любом уважающем себя пакете есь функция OnIdle() - т.е "на простой" - базы данных в это время проверяют структуру, оптимизируют данные и протча, арч делает примерно тоже, А ИНАЧЕ ГРЕЕТСЯ ПРОЦ на холостых оборотах, но как только поступает сообщение OnMouseMove() вся закулисная работа уходит на задний план. Таким образом система всегда ждет нашего участия. Alakk говорил об этом.

Скрипт GDL "работает" - а точнее - компилируется - только "один раз" - в момент загрузки объекта в библиотеку, при создании проекта, или добавлении объекта к загруженным библиотекам, после этого вся "получаемая от объекта" информация минуя GDL-скрипт как таковой, обрабатывается функциями *.dll-s размещенными по дороге
C:\Program Files\Graphisoft\ArchiCAD 12, с учетом изменения Environment Variables связанных с работой объекта, с Run Time Type Information, если ближе к теме.

Терь, что касается темы:

Глючит в данном случае не интерпретатор GDL. Такова его работа, таковы его задачи. Это не ООП!

Дело в том что на момент первой компиляции GDL объекта(загрузка объекта в пространство имен текущего проекта) - компиляция происходит с дефолотовыми значениями,
если возникают неувязки выдается ошибка и объект не подгружается и выглядит черной точкой.
Но когда происходит интерактивное редактирование, то компилятор(скажем так, хотя на самом деле это уже работа одной из функций одной из длл арчикада) не может предполагать какой шрифт(или стиль текста - Define Style) окажется "выбранным" в объекте, точнее его это не интересует ибо шрифты везде разные, а еще точнее у него и нет задачи вернуть значение "вовремя" (вот в этом и парадокс! GDL<>ООП!), эта функция всего лишь запишет возвращаемое любой функцией типа RunTime(в данном случае речь о STW()) в массив RTTI (Run Time Type Info) , сделав соответсвующий запрос к Винде, что для "статичных" объектов вполне сносно работает(!) - напишите изменение стиля через параметр ГДЛ объекта - проблемы с STW в скрипте не будет!
Но другое дело когда одна функция типа RunTime зависит от другой функции типа Runtime, в данном случае HotSpot2 и STW. Надо понимать, что при перемещении Hotspot2 работает не ГДЛ скрипт, а его давно скомпилированный код, а написать взаимоувязанную работу двух Runtime функций, это вам не хухры! Со всеми исключениями времени исполнения! Это отдельный глубокий предмет! Называется SEH - Structured Exception Handling, да и не стояло такой задачи!
Проще сказать разработчики подумали примерно так - проблема будет решена на стороне клиента(или не будет возникать совсем - для статичных объектов) - например как показал Valery W, или как решили ее Вы в вашем объекте отметка - суть одна - чтобы ширина строки была возвращена корректно нужно "запрашивать" свежую RTTI, что и происходит по строчке:
unit2=tx-stw(fixVal_Y)/ 1000 * GLOB_SCALE
if unit2>0 then unit2=0,
проходит еще один вызов stw(), и теперь для данной части скрипта "дефолтовым" значением становится измененное значение возвращенное STW().

Вот такой вот DDE-механизм(Do Data Exchanging) путем GDL-трюков...
Не самый надо сказать педальный конь из педальных коней.

*

Оффлайн BeArt

  • *****
  • 1016
  • Репутация: +94/-3
  • Пол: Мужской
SergeyAB
Цитировать
- находится. постоянно.с момента нажатия на кнопку Power(не, ну может быть пара секунд проходит в "свободном полете", до приглашения зайти в биос). В любом уважающем себя пакете есь функция OnIdle() - т.е "на простой" - базы данных в это время проверяют структуру, оптимизируют данные и протча, арч делает примерно тоже, А ИНАЧЕ ГРЕЕТСЯ ПРОЦ на холостых оборотах, но как только поступает сообщение OnMouseMove() вся закулисная работа уходит на задний план. Таким образом система всегда ждет нашего участия. Alakk говорил об этом.

Понял так, как было написано...
BeArt
"Так вот, система не находится в ожидании действий пользователя. Объект перемещается – все  значения пересчитываются. Пересчитываться должны и параметры, это определено в программе, получена и отработана команда  - VALUES "tx" RANGE (STW(ePOSy)/1000 * GLOB_SCALE,]"

Подождём. :wink:

 

Похожие темы

  Тема / Автор