Определение ряда функций в сценариях DigitalMicrograph

У меня есть набор функций внутри класса, который мне нужно определить. Каждый передает другое значение в другую функцию:

void function00(object self, taggroup tg) self.otherfunction(tg,0,0)
void function01(object self, taggroup tg) self.otherfunction(tg,0,1)
void function02(object self, taggroup tg) self.otherfunction(tg,0,2)
void function03(object self, taggroup tg) self.otherfunction(tg,0,3)
void function04(object self, taggroup tg) self.otherfunction(tg,0,4)

У меня есть 100 таких функций, и я бы предпочел не определять каждую отдельно. Учитывая приведенный выше пример, я хотел бы сделать что-то вроде:

for(number i=0; i<5; i++){
    void function0+i(object self, taggroup tg) self.otherfunction(tg,0,i)
}

который не работает сам по себе. Какие-либо предложения?

Для большего контекста я создаю серию флажков внутри 2 циклов for со следующим:

BOXinsides.DLGAddElement(DLGCreateCheckBox(label,0,"function"+i+j).DLGIdentifier("#function"+i+j))

и мне нужно определить все функции каким-то разумным образом.


person Ed White    schedule 22.08.2014    source источник


Ответы (1)


Скрипты DigitalMicrograph не позволяют использовать этот тип шаблонного кода. Однако вы можете решить свою проблему, связав все элементы флажка с одним и тем же методом действия. Сигнатура метода действия, переданная в TagGroup, которая является самим флажком. Вы можете использовать это для получения информации из него, например, просмотрев свойство флажка, такое как его заголовок:

class myUI : UIframe
{
  void generalFunction( object self , tagGroup checkTg )
  {
    // checkTg is the taggroup of the checkbox which fired the method.
    // Use its Title to get back the running value!

    string label = checkTg.DLGGetTitle()                
    Result( "\n label of checkbox:" + label )
    number i = val( right( label, len( label ) - 1 ) )   
    Result( "\n running index:" + i )
  }

  TagGroup CreateCheckboxes( object self )
  {
    TagGroup checkboxGroup = DLGCreateGroup()
    for ( number i = 0 ; I < 5 ; i++ )
    {
     checkboxGroup.DLGAddElement( DLGCreateCheckBox( "C" + I , 0 , "generalFunction" ) )
    }
    return checkboxGroup 
  }

  TagGroup CreateDLGTags( object self )
  {
    TagGroup dlg, dlgitems
    dlg = DLGCreateDialog( "Test" , dlgitems )
    dlgitems.DLGAddElement( self.CreateCheckboxes() )
    return dlg
  }

  object Init( object self )
  {
    return self.super.init( self.CreateDLGTags() )
  }
 }

// MAIN SCRIPT calling the dialog
{
  Object dlg = Alloc(myUI).Init()
  dlg.pose()
}

Вы также можете «прикрепить» информацию непосредственно к флажку. Флажки — как и все элементы диалога — на самом деле просто определенные объекты TagGroup, к которым вы можете добавить все, что захотите. В приведенном ниже примере я добавляю дополнительный тег со случайным числом:

class myUI : UIframe
{
  void generalFunction( object self , tagGroup checkTg )
  {
    // checkTg is the taggroup of the checkbox which fired the method.
    // Use its Title to get back the running value!

    string label = checkTg.DLGGetTitle()                
    Result( "\n label of checkbox:" + label )
    number rnd
    if ( checkTG.TagGroupGetTagAsNumber( "Random NR", rnd ) )
    {
      Result( "\n Random number:" + rnd )
    }
  }

  TagGroup CreateCheckboxes( object self )
  {
    TagGroup checkboxGroup = DLGCreateGroup()
    for ( number i = 0; I < 5 ; i++ )
    {
     TagGroup checkbox = DLGCreateCheckBox( "C" + I , 0 , "generalFunction" )
     checkbox.TagGroupSetTagAsNumber( "Random NR", Random() )
     checkboxGroup.DLGAddElement( checkbox )
    }
    return checkboxGroup 
  }

  TagGroup CreateDLGTags( object self )
  {
    TagGroup dlg, dlgitems
    dlg = DLGCreateDialog( "Test" , dlgitems )
    dlgitems.DLGAddElement( self.CreateCheckboxes() )
    return dlg
  }

  object Init( object self )
  {
    return self.super.init( self.CreateDLGTags() )
  }
 }

// MAIN SCRIPT calling the dialog
{
  Object dlg=Alloc(myUI).Init()
  dlg.pose()
}

введите здесь описание изображения

person BmyGuest    schedule 22.08.2014