8 февраля 2011 г.

Пример использования коллекций. Обработка модели

Задача: были созданы несколько трубопроводов (PIPE), однако не задавался атрибут Bore (диаметр). В именовании трубопроводов присутствует обозначение диаметра, в качестве первого блока (до знака минус), например /100-B-1 (здесь 100 - основной диаметр линии). Необходимо найти диаметр по части имени и присвоить это значение атрибуту Bore элемента Pipe. Вторая часть задачи: добавить найденные элементы на экран и задать временный цвет согласно схеме
Диаметр-цвет: 40-BLUE,80-RED,100-GREEN,150-YELLOW,200-GREY,250-DARKBROWN

Решение: делаем запросы к базе на предмет нахождения элементов типа PIPE, далее запускаем
цикл, в цикле обрабатываем каждый элемент на предмет нахождения диаметр (функция .Before(), .After()), присвоения атрибута Bore в найденное значение, учитывая что это должно быть число, вывод на экран и раскраской согласно указанной фильтрации


VAR !pipes COLLECT ALL PIPE FOR CE
do !x from 1 to !pipes.Size()   
--находим диаметр из имени, сначал преварительно превратив элемент массива в объект
   --и обработав его атрибут Name
 

  !boreS = !pipes[!x].Dbref().Name.Before('-').After('/') 
  --превращаем найденное значение в объект типа BORE
  --пропуская элемент, если конвертация невозможна
 

 !boreB = OBJECT BORE(!boreS)
   HANDLE ANY
     SKIP
   ENDHANDLE
 

 --задаем атрибут через обращение к объекту массива 
!pipes[!x].Dbref().Bore = !boreB
 
  --вычисляем нужный цвет 

 if (!boreS EQ '40') then
    !colour = 'BLUE'
   elseif (!boreS EQ '80') then
    !colour = 'RED'
   elseif (!boreS EQ '100') then
    !colour = 'GREEN'
   elseif (!boreS EQ '150') then
    !colour = 'YELLOW'
   elseif (!boreS EQ '200') then
    !colour = 'GREY'
   elseif (!boreS EQ '250') then
    !colour = 'DARKBROWN'
   else
    !colour = 'WHITE'
  endif

  --добавляем элемент 
 ADD $!pipes[$!x] 
--раскрашиваем 
ENHANCE $!pipes[$!x] COLOUR $!colour
   
enddo

--далее следует набор команд для выполнения операции
--Walk to drawlist (центрирование всех объектов экрана)

var !collection COLLECT ALL FROM DRAWLIST
  !block    = OBJECT BLOCK('!collection[!evalindex].dbref()')
  !list     = !collection.evaluate(!block)
  !volume   = object volume(!list)
 
 !lim = OBJECT GPHVIEWS() 
 !lim.limits(!!gph3ddesign1.view, !volume)


Работу примера можно проверить на проекте SAM 

0 коммент.:

Отправить комментарий