При размещении таблиц и спецификаций на чертеже в модуле DRAFT зачастую требуется выразить длину текста не в количестве символов, а в миллиметрах. Это может оказаться полезным, например, чтобы узнать поместится или нет заданный текст в колонку определенной ширины.
У всех текстовых примитивов на чертеже (TEXP) есть псевдо-атрибут extent btext, в котором содержится массив координат x,y габаритного прямоугольника, в котором размещается текст. Нумерация точек начинается с верхней левой и далее по часовой стрелке. Характерная особенность: запросить extent btext можно только на PML1.

Ниже пример макроса для вычисления длины текста в мм:
!string = ‘Отвод-2″, 1.5ND, LR90, приварной, WPHY42, 2.0MПa’
NEW TEXP
BTEX ‘$!string’
– Вычисляем пары x,y четырех точек габаритного бокса
var !texcoord extent btext
– В массиве !texcoord содержатся данные вида:
– X 791 Y 514 X 866 Y 514 X 866 Y 510 X 791 Y 510
!texsplit = !texcoord.Split()
– Вычисляем длину текста по оси Х
!texlen = !texsplit[6].Real() – !texsplit[2].Real()
!texlen = !texlen.String(‘D0′).Real()
$P Длина текста в мм: $!texlen
Далее можно продолжить и написать функцию для переноса части текста в случае, если он не помещается в колонку.
…это иногда может привести к фатальным ошибкам в модуле Design. Поэтому чтобы этого не произошло, предлагаем вашему вниманию пример макроса для поиска тех компонентов спецификации, у которых длина детального текста больше 120 символов.
–Собираем в коллекцию все SPCO
var !AllSpco coll all SPCO for ce
do !x Index !AllSpco
–Проверяем наличие ссылки на детальный текст
!SpcoText[!x] = !AllSpco[!x].Dbref().Dtxr
HANDLE (2,220)(2,232)
$P У компонента $!AllSpco[$!x] отсутствует ссылка на детальный текст
skip
ENDHANDLE
–Если длина превышена, выводим информацию в командную строку
!SpcoTextLength[!x] = !SpcoText[!x].Length()
if (!SpcoTextLength[!x] GE 120) then
$P У компонента $!AllSpco[$!x] длина текста $!SpcoTextLength[$!x] символов
endif
enddo
Запускать макрос можно стоя в иерархии на спецификации или можно собрать компоненты спецификации по всей MDB – для этого достаточно удалить фразу for ce в первой строчке кода.
Стандартные правила автораскаски элементов (Autocolor Rules) не позволяют раскрашивать отдельные компоненты бранчей в модуле Design, однако можно воспользоваться приведенным ниже кодом для подсветки, к примеру, шаровых кранов красным цветом:
–Собираем все шаровые краны – элементы VALV с STYP=BALL
var !BranchMem coll all valv with styp eq ‘BALL’ for ce
–В цикле красим каждый найденный элемент с помощью команды ENHANCE
do !x values !BranchMem
enhance $!x colour red
enddo
То же самое в более компактной форме:
enhance all VALV with stype eq ‘BALL’ colour red for ce
Вместо названия цвета можно использовать его код. Ниже приведены коды основных цветов:
Grey 1
Red 2
Orange 3
Yellow 4
Green 5
Cyan 6
Blue 7
Violet 8
Brown 9
White 10
Pink 11
Mauve 12
Turquoise 13
Indigo 14
Black 15
Magenta 16
Часто возникает задача массового удаления элементов модели, которые в данный момент выделены в графическом окне. Ниже предлается один из вариантов решения:
–Вызываем конструктор объекта selection
!CurSel = object selection()
–Получаем текущее на экране выделение
!CurSel.GetCurrent()
–Число элементов в выделении
!CurSelEl = !CurSel.GetSelection()
if ( !CurSelEl.Size() EQ 0 ) then
!!Alert.Message(‘Выделите элементы’)
return
endif
–Удаляем в цикле все найденное
do !Entity values !CurSelEl
!ElName = !Entity.Name
!ElType = !Entity.Type
delete $!ElType
$P Удалено $!ElName
enddo
Как обычно, код можно навесить на кнопку или пункт меню.
Задача: в Paragon у всех найденных категорий изменить название третьего параметра на «Тип присоединения»
и всем компонентам в качестве значения третьего параметра установить BWD.
Решение:
Читать дальше…
Задача: в зависимости от координаты опоры, указать ей текстовое описание с уровнем, если координата лежит в обзначенных диапазонах.
Решение:
Читать дальше…
Задача: указав элемент на экране, проверить его на коллизии..
!!Alert.Message(‘Укажите элемент для проверки на столкновения (HH)…’)
ID @
DESCLASH
OVERRIDE ON
REM OBST ALL
OBST ALL
Читать дальше…
Очень простая функция для выполнения масштабирования и центрирования содержимого экрана.
Бывает очень полезна при обработке графики. Аналог функции Walk to Drawlist
define function !!arwalktodrawlist()
–запоминаем содержимое экрана
VAR !chek DRAWLIST
–если пусто – выходим
HANDLE ANY
RETURN
ENDHANDLE
Читать дальше…
Задача: разбить трубопровод с помощью сборки фланцев под покрасочную ванну. Длина ванны задается.
Решение:
–проверяем текущий тип – нужен бранч
if (!!CE.Type NEQ ‘BRAN’) then
!!Alert.Message(‘Нужно выделить бранч…’)
RETURN
endif
–просим ввести длину ванны и переводим ее в тип Real
!lengthOfBasinS = !!Alert.Input(‘Введите длину ванны’,’4000′)
!lengthOfBasin = !lengthOfBasinS.Real()
Читать дальше…
Задача: подсчитать количество сварных швов внутри текущего элемента и вывести в файл. Необходимо отдельно считать сварные компоненты и сварные швы на трубе и вывести результат в файл.
Решение:
–запоминаем текущий элемент
!backCE = !!CE.Name
–запрос имени файла для вывода
!fileName = !!Alert.Input(‘Введите имя файла для вывод информации’,'d:\welds.txt’)
!outputA = OBJECT ARRAY()
!finalOutput = OBJECT ARRAY()
!finalOutput[1] = ‘Подсчет сварных элементов для ‘ + !!CE.Type + ‘ ‘ + !!CE.Name
Читать дальше…