Вычисляем реальную длину текста на чертеже

Рубрика: Работа с объектами — Kasatik 20.03.2012 в 13:29

При размещении таблиц и спецификаций на чертеже в модуле 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

Далее можно продолжить и написать функцию для переноса части текста в случае, если он не помещается в колонку.

Когда длина детального текста превышает 120 символов…

…это иногда может привести к фатальным ошибкам в модуле 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 в первой строчке кода.

Раскрашивание элементов бранча в 3D-модели

Рубрика: Обработка модели,Работа с графикой — Kasatik 21.01.2012 в 21:11

Стандартные правила автораскаски элементов (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

Удаление элементов с помощью графического выделения

Рубрика: Работа с графикой,Работа с объектами — Kasatik 06.01.2012 в 22:08

Часто возникает задача массового удаления элементов модели, которые в данный момент выделены в графическом окне. Ниже предлается один из вариантов решения:

–Вызываем конструктор объекта 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.

Решение:

Читать дальше…

Описание опор в зависимости от координаты

Рубрика: Задачи по проекту,Обработка модели — LSA 31.10.2011 в 10:14

Задача: в зависимости от координаты опоры, указать ей текстовое описание с уровнем, если координата лежит в обзначенных диапазонах.

Решение:

Читать дальше…

Нахождение коллизий указанного элемента

Задача: указав элемент на экране, проверить его на коллизии..

!!Alert.Message(‘Укажите элемент для проверки на столкновения (HH)…’)
ID @

DESCLASH
  OVERRIDE ON

  REM OBST ALL
  OBST ALL

Читать дальше…

Центрирование экрана

Рубрика: Обработка модели,Работа с графикой — LSA 15.08.2011 в 16:57

Очень простая функция для выполнения масштабирования и центрирования содержимого экрана.

Бывает очень полезна при обработке графики. Аналог функции Walk to Drawlist

define function !!arwalktodrawlist()

–запоминаем содержимое экрана
 VAR !chek DRAWLIST
   –если пусто – выходим
      HANDLE ANY
        RETURN
      ENDHANDLE 

Читать дальше…

Разбивка трубопровода фланцами

Рубрика: Задачи по проекту,Обработка модели — LSA 08.08.2011 в 18:11

Задача: разбить трубопровод с помощью сборки фланцев под покрасочную ванну. Длина ванны задается.

Решение:

–проверяем текущий тип – нужен бранч
if (!!CE.Type NEQ ‘BRAN’) then
  !!Alert.Message(‘Нужно выделить бранч…’)
  RETURN
endif

–просим ввести длину ванны и переводим ее в тип Real
 !lengthOfBasinS = !!Alert.Input(‘Введите длину ванны’,’4000′)
 !lengthOfBasin = !lengthOfBasinS.Real()

  Читать дальше…

Подсчет количества сварных швов

Рубрика: Задачи по проекту,Обработка модели — LSA 20.06.2011 в 14:29

Задача: подсчитать количество сварных швов внутри текущего элемента и вывести в файл. Необходимо отдельно считать сварные компоненты и сварные швы на трубе и вывести результат в файл.

Решение:
  –запоминаем текущий элемент
  !backCE = !!CE.Name

  –запрос имени файла для вывода
  !fileName = !!Alert.Input(‘Введите имя файла для вывод информации’,'d:\welds.txt’)
  
  !outputA = OBJECT ARRAY()
  !finalOutput = OBJECT ARRAY()
  !finalOutput[1] = ‘Подсчет сварных элементов для ‘ + !!CE.Type + ‘ ‘ + !!CE.Name

Читать дальше…