среда, 19 декабря 2012 г.

Функция установки документа.

Продолжаю...
__________________
Функция установки документа:

  1. Даём имя объекту, которое будет видно в Менеджере - para->SetName(cObjName).
  2. Все шаги отмены должны быть собраны в одном месте, иначе, как пишут разработчики "смешные вещи будут происходить" -      vDoc->StartUndo();      vDoc->AddUndo(UNDO_OBJECT_NEW,para);      vDoc->EndUndo();.
  3. Создаём конструкторы переменных и тагов:
     vVarChanged = new(VariableChanged); 
    vBackupTags = new(BackupTags);

    Создаём переменную и массив для точек объекта:

         SP=Nu*Nv;      
          vPointAry = new(array, SP);
          para->SetPoints(vPointAry);
    Создаём переменную и массив для полигонов объекта:

         SQ=Nu*Nv+1;
         vPolyAry = new(array, SQ*4);
          para->SetPolygons(vPolyAry);
    Сохраняем и обнуляем переменные и таги объекта:

    vBackupTags->Init(para);
          vVarChanged->Init(0, SP);

    vBackupTags->Init(para);//Init-Бэкапит таги para(предохранитель нехватки памяти)
          vVarChanged->Init(0, SQ);//Init-Бэкапит все точки SQ(предохранитель нехватки памяти).
    vBackupTags->Restore();
    Вставляем Объект в ОбъектИерархию, как родителя:
    vDoc->InsertObject(para,NULL,NULL);
    Зафиксировать изменения в документе:
    GeEventAdd(DOCUMENT_CHANGED);





//**************************

 UstDoc(vDoc)//Функция установки документа
{
     DelOldObj(vDoc);
     var vVarChanged,vBackupTags;
      para=new(PolygonObject);
      if (!para) return NULL;
      para->SetName(cObjName);
      vDoc->StartUndo();
      vDoc->AddUndo(UNDO_OBJECT_NEW,para);
      vDoc->EndUndo();
 vVarChanged = new(VariableChanged);
      vBackupTags = new(BackupTags);
      Nv=Nv05*2;
      SP=Nu*Nv;
      SQ=Nu*Nv+1;
      vPointAry = new(array, SP);
      para->SetPoints(vPointAry);
      vBackupTags->Init(para);
      vVarChanged->Init(0, SP);
      if (!para->Message(MSG_POINTS_CHANGED, vVarChanged))
   {
 vBackupTags->Restore();
      return NULL;
      }
      vPolyAry = new(array, SQ*4);
      para->SetPolygons(vPolyAry);
      vBackupTags->Init(para);//Init-Бэкапит таги para(предохранитель нехватки памяти)
      vVarChanged->Init(0, SQ);//Init-Бэкапит все точки SQ(предохранитель нехватки памяти)
      if (!para->Message(MSG_POLYGONS_CHANGED, vVarChanged))//Если нет изменений в para-возврат
      {
      vBackupTags->Restore();
      return NULL;//(это нуль, но в адресном пространстве)
      }
   // Вставить Объект в ОбъектИерархию
      vDoc->InsertObject(para,NULL,NULL);
       GeEventAdd(DOCUMENT_CHANGED);
     
}//конец функции установки документа
//****************************************

пятница, 14 декабря 2012 г.

Работа с командной функцией.

Работа с командной функцией Command(vID,vMSG).
Здесь мы строим выбранный в диалоге объект.

  1. Приостановливаем все процессы перед исполнением StopAllThreads().
  2. Начинаем опрашивать ячейки диалога case 1, у нас одна ячейки и она срабатывает от нажатия кнопки ОК.
  3. Получить значение из переменной комбобокса, сравнить с 1, так, как он первый (вообще будет до ста объектов).
  4. Войдём в активный документ GetActiveDocument().
  5. Вызовем функцию установки документа UstDoc(vDoc), позже будет о ней речь.
  6. Вызовем функцию формулы первого объекта Form1(vDoc).
  7. Вызовем функцию главного рисователя полигонов по x,y,z координатам RisPol(vDoc).
  8. Вызовем функцию дополнительного рисователя полигонов по x,y,z (кое-где он не нужен) RisPolDop(vDoc).
  9. Вызовем функцию начала рисования fPara(vDoc).
  10. Вызовем функцию изменения позиции объекта (позиция по Y,Z, и поворот на 90 градусов по Z) PosObj(vDoc).


//***************************

MyDialog::Command(vID,vMSG)
{
      var vDoc;//Переменная vDoc
      StopAllThreads();//Приостановить все процессы перед исполнением
      switch (vID)//Опрос ячеек диалога,
{
       case 1 : // нажатие кнопки OK!
{
       var x0 = GetItem(2001);//Получить значение подобъекта из id=2001 (комбобокс) - 1 в нашем случае, вообще будет до 100
       if (x0==1)//Сравнить это значение с 1 (подобъекта №1)
{
                         vDoc = GetActiveDocument();
                         if (!vDoc) return FALSE;
                         UstDoc(vDoc); //Вызов функции установки документа
                         Form1(vDoc);//Вызов функции формулы
                         RisPol(vDoc); //Вызов функции главного рисователя полигонов по x,y,z, координатам.
                         RisPolDop(vDoc); //Вызов функции дополнительного рисователя полигонов по x,y,z (кое-где он не нужен)
                         fPara(vDoc);//Функция начала рисования
                         paraRX=2;
                         PosObj(vDoc);//Функция изменения позиции объекта (позиция по Y,Z, и поворот на 90 градусов по Z)
                         return TRUE;
         break;    //Прервать
}

}
           return TRUE;
}

//****************************

Функция определения структуры диалога.

Функция определения структуры диалога.

  1. Установливаем имя диалога плагина.
  2. Инициируем первую вертикальную группу, ставим разделитель.
  3. Добавляем комбобокс с переменной (2001), параметрами и координатами
  4. Вставляем в бокс имя нашего первого объекта ("1. Endless") и делаем его первым показываемым в диалоге SetItem(2001,  1).
  5. Ставим разделитель и конец первой вертикальной группы.
  6. Инициируем вторую вертикальную группу.
  7. Добавляем в диалог кнопку ОК - AddDlgGroup(DR_DLGGROUP_OK)
  8. Ставим конец второй вертикальной группы.


//***************************

MyDialog::CreateLayout()
{    
     SetTitle(cPlugName);    //  Установить имя диалога плагина
AddGroupBeginV(1001, BFH_SCALEFIT,1,"group",0);//Начало группы V-вертикальная
AddSeparatorH(0);//Разделитель
AddComboBox(2001,  BFH_SCALEFIT|BFV_CENTER, 250, 0);//КомбоБокс
AddItem(2001, 1, "1. Endless");          //ParaObject №1

SetItem(2001,  1);//Установить в комбобоксе по умолчанию Подобъект №1
AddSeparatorH(0);//Разделитель
AddGroupEnd();//Конец группы
AddGroupBeginV(1004, BFH_SCALEFIT,1,"group",0);//Начало группы V-вертикальная
AddSeparatorH(0);//Разделитель
AddDlgGroup(DR_DLGGROUP_OK);
AddGroupEnd();//Конец группы
     return TRUE;//Возвращает значение=1
}
//******************************

Вызов функции диалога.

Вызов функции диалога.
GeModalDialog - означает, что диалог вызывается и постоянно находится на экране, пока мы вводим данные. СИНЕМА находится в ожидании, пока мы не нажмём кнопку OK или CANCEL.

//*****************************

class MyDialog :GeModalDialog
{
   public:
   CreateLayout();//Вызвать функцию определения структуры диалога.
   Command(vID,vMSG);//Всякий раз, когда пользователь изменяет данные внутри диалога, вызывается эта функция, чтобы зафиксировать изменения.
}
//*************************

Главная функция, с которой начинается работа программы

Если мы хотим проследить работу всей программы, мы должны найти первым делом функцию main(doc,op). В данном случае мы видим, что первой запускается функция (подпрограмма) диалога (MyDialog), которая отрисовывается в позиции мыши Open(-1,-1). По умолчанию это правый нижний угол экрана в двенадцатой СИНЕМе, В тринадцатой это, почему-то левый верхний угол.
//******************************

 main(doc,op)//Это главная функция, с которой начинается работа программы
{
           var d = new(MyDialog);//Вызвать меню диалога
           d->Open(-1,-1);//Запустить меню в позиции мыши
}
//*******************************

воскресенье, 9 декабря 2012 г.

Это будет первый объект, который появится на сцене:

Дальше будет интереснее. Собственно само создание объекта и создание диалога для выбора различных объектов.