На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Функции создания зарамочного оформления

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Функции создания зарамочного оформления, функции из frmapi.dll
 
Здравствуйте, не могли бы Вы подсказать как сформировать зарамочное оформление? В sdk в preprint видел создание ситов с зарамочным оформлением по шаблонам, интересуют функции из frmapi.dll, как их реализовать самому и что для этого нужно:
Код
frmCreateBorder(HMAP Hmap,int sheet,HSITE rotsit, 
                           HSITE frmsit,char *FrameTemp,double Angle, 
                           char *logfile,int mestarget); 
frmErrorMessage(const char * message, int target, const char * filename, int mode) 
frmCreateLegend(HMAP Hmap,int sheet,HSITE rotsit, 
                           HSITE legsit,char *lblname,double Angle, 
                           char *logfile,int mestarget); 
frmGetRotateAngle(HMAP hmap,int listnumber,double *alfa) 
frmTurnSheet(TASKPARM *parm,HMAP hmap,int listnumber,double alfa, 
                                              HSITE rotSit)
 
Приведу текст рабочей программы "Формирование зарамочного оформления по шаблону", которая вызывается в диалоге создания зарамочного оформления (панель "Подготовка к изданию"):
Код
//---------------------------------------------------------------------------
// Кнопка "Выполнить"
//---------------------------------------------------------------------------
void __fastcall TFormFrameBuild::OkClick(TObject *Sender)
{
 if (IsActive == 1)  return;

 int isalias = 0;

 if ((mapIsSiteFromServer(Hmap,Hmap) != 0) || (mapIsNormalPathUn(SourceMap) == 0))  // 15/12/17 KVN
  {
     // Определить путь к папке пользовательской карты
     mapGetSitePathUn(Hmap, Hmap, SourceMap, sizeof(SourceMap));
     isalias = 1;
  }

 IsActive  = 1;
 IsQuit    = 0;

 WCHAR drive_s[MAX_PATH_LONG],dir_s[MAX_PATH_LONG],file_s[MAX_PATH_LONG];
 WCHAR newdrive[MAX_PATH_LONG];

 ::SplitThePath(SourceMap,drive_s,dir_s,file_s,NULL);

 WcsCat(dir_s,L"FRAME\\",sizeof(dir_s));
 ::MakeThePath(newdrive,drive_s,dir_s,NULL,NULL);
 CreateTheDirectory(newdrive);

 WcsCopy(LogFile,newdrive,sizeof(LogFile));
 WcsCat(LogFile,L"Frame.log",sizeof(LogFile));

 if(RewriteCheck->Checked == true)
   frmErrorMessageUn(L"****************************************",0,LogFile,0);
 else
   frmErrorMessageUn(L"****************************************",0,LogFile,1);

 WCHAR message[MAX_PATH_LONG] = {0};

 TDateTime datetime;
 TDateTime currenttime = datetime.CurrentDateTime();
 String time = currenttime.DateTimeString();
 frmErrorMessageUn(L" ",0,LogFile,0);
 message[0]=0;
 WcsCat(message,time.c_str(),sizeof(message));
 frmErrorMessageUn(message,0,LogFile,0);

 WCHAR filename[MAX_PATH_LONG];

 if (isalias == 0)
   mapGetSiteFileNameUn(Hmap, Hmap, filename, sizeof(filename));
 else 
   mapGetSitePathUn(Hmap, Hmap, filename, sizeof(filename));  // 15/12/17 KVN

 message[0]=0;

 WcsCat(message,_prptxt(78),sizeof(message));  // "ОФОРМЛЕНИЕ КАРТЫ: "

 WcsCat(message,filename,sizeof(message));
 frmErrorMessageUn(message,0,LogFile,0);
 message[0]=0;

 WcsCat(message,_prptxt(79),sizeof(message));  // "ПО ШАБЛОНУ      : "

 WcsCat(message,FrameTemp,sizeof(message));
 frmErrorMessageUn(message,0,LogFile,0);

 int mestarget = 0;
 if(MessageCheck->Checked == true)mestarget = 2;
 else                             mestarget = 0;

 int  flagSit = 0;
 int  condSit = 0;
 int  flagFrame = 0;
 int  condFrame = 0;
 int  flagLegend = 0;

 WCHAR commondir[MAX_PATH_LONG] = {0};
 WcsCopy(commondir,dir_s,sizeof(commondir));

 int begN,endN;
 if(AllCheckBox->Checked == false)
 {
  int number = SheetList->ItemIndex;
  begN = (int)(SheetList->Items->Objects[number]);
  endN = begN;
 }
 else
 {
  begN = 1;
  endN = mapGetListCount(Hmap);
 }
 int count = endN-begN+1;
 ProgressBar1->Max = count;
 ProgressBar1->Position = 0;

 Cancel->Caption = _prptxt(10);  // "Прервать"

 // Для последующего закрытия созданных карт
 HSITE legsit[MAX_PATH];  // 15/12/17

 // ПРОЦЕСС ОФОРМЛЕНИЯ
 for(int i = begN; i <= endN; i++)
 {
  double angle = 0.0;  // 15/12/17

  RetrieveMsg();

  if (IsQuit == 1)
   break;

  // Вычислить угол поворота листа
  if (AngleCheck->Checked && frmGetRotateAngle(Hmap, i, &angle) == 0) continue;  // 15/12/17

  ProgressBar1->Position ++;

  WCHAR sheetname[256];
  mapGetListNameUn(Hmap,i,sheetname,sizeof(sheetname));
  frmErrorMessageUn(L"=============================",0,LogFile,0);
  message[0]=0;
  WcsCat(message,_prptxt(80),sizeof(message));  // "ЛИСТ           : "
  WcsCat(message,sheetname,sizeof(message));
  frmErrorMessageUn(message,0,LogFile,0);

  WcsCopy(dir_s,commondir,sizeof(dir_s));

  // Создать директорию для оформления текущего листа
  char nomenclature[32];

  // Удобнее создавать каталоги по номенклатуре на латинице с арабскими цифрами
  mapGetSiteNomenclature(Hmap,Hmap,i,nomenclature,sizeof(nomenclature));  // 10/12/17
  StringToUnicode(nomenclature,sheetname,sizeof(sheetname));

  WcsCat(dir_s,sheetname,sizeof(dir_s));

  WcsCat(dir_s,L"\\",sizeof(dir_s));
  ::MakeThePath(newdrive,drive_s,dir_s,NULL,NULL);

  CreateTheDirectory(newdrive);

  ::MakeThePath(RotateSit,drive_s,dir_s,L"Sheet",L"sit");
  ::MakeThePath(FrameSit,drive_s,dir_s,L"Frame",L"sit");


  // Если требуется проверка наличия повернутого листа на диске
  if (RscChangeCheck->Checked)  // 15/12/17
  {
    if (ExistTheFile(RotateSit))
    {
      if (flagSit == 0)
      {
        flagSit = 1;
        WcsCopy(message,RotateSit,sizeof(message));
        WcsCat(message,_prptxt(39),sizeof(message));  // "Файл уже существует. Заменить файл ?"
        if (MessageBox(0,message,_prptxt(61),MB_YESNO | MB_ICONQUESTION | MB_TASKMODAL) == ID_NO)
        {
          condSit = 1;
        }
      }

      if (condSit == 1) continue;
    }

    if (ExistTheFile(FrameSit))
    {
      if (flagFrame == 0)
      {
        flagFrame = 1;
        WcsCopy(message,FrameSit,sizeof(message));
        WcsCat(message,_prptxt(39),sizeof(message));  // "Файл уже существует. Заменить файл ?"
        if (::MessageBoxW(0,message,_prptxt(61),MB_YESNO | MB_ICONQUESTION | MB_TASKMODAL) == ID_NO)
        {
          condFrame = 1;
        }
     }

     if (condFrame == 1) continue;
    }
  }

  HSITE rsit   = 0;
  HSITE frmsit = 0;

  int sitecount = mapGetSiteCount(Hmap);

  // Поиск карт оформления в открытом документе
  for (int k = 0; k <= sitecount; k++)  // 15/12/17
  {
   HSITE cursite = mapGetSiteIdent(Hmap,k);
   WCHAR name[MAX_PATH_LONG];
   name[0] = 0;

   if (isalias == 0)
     mapGetSiteFileNameUn(Hmap, cursite, name, sizeof(name));
   else
     mapGetSitePathUn(Hmap, cursite, name, sizeof(name));  // 15/12/17 KVN

   if (wcsncmp(name,RotateSit,wcslen(name)) == 0)
   {
    rsit = mapGetSiteIdent(Hmap,k);
    mapLogAccess(Hmap,rsit,0);
    mapClearSite(Hmap,rsit);  // 15/12/17
   }

   if (wcsncmp(name,FrameSit,wcslen(name)) == 0)
   {
    frmsit = mapGetSiteIdent(Hmap,k);
    mapLogAccess(Hmap,frmsit,0);
    mapClearSite(Hmap,frmsit);  // 15/12/17
   }
  }

  CREATESITEUN  createsite;
  memset(&createsite,0,sizeof(CREATESITEUN));
  createsite.Length = sizeof(CREATESITEUN);        // Длина записи структуры CREATESITEUN

  // Имя района
  WcsCopy(createsite.MapName,_prptxt(81),sizeof(createsite.MapName));  // "ПОВЕРНУТЫЙ ЛИСТ"

  createsite.MapType = -1;                  // Обобщенный тип карты
  createsite.MaterialProjection = -1;       // Проекция исх. материала
  createsite.Scale = mapGetMapScale(Hmap);  // Знаменатель масштаба карты

  WCHAR testfile[MAX_PATH_LONG];
  WCHAR testname[MAX_PATH_LONG];
  WCHAR rscfilename[MAX_PATH_LONG];

  if (rsit == 0) // Не нашли среди открытых
  {
   SplitThePath(SourceRsc,NULL,NULL,testfile,NULL);
   MakeThePath(testname,drive_s,dir_s,testfile,L"rsc");
   if(ExistTheFile(testname))
     WcsCopy(rscfilename,testname,sizeof(rscfilename));
   else
     WcsCopy(rscfilename,SourceRsc,sizeof(rscfilename));

   // Создать повёрнутый лист
   rsit = mapCreateAndAppendSiteUn(Hmap, RotateSit, rscfilename, &createsite);
  }

  if (rsit == 0) continue;


  mapLogAccess(Hmap,rsit,0);

  _prptxt(81, message, sizeof(message));  // "ПОВЕРНУТЫЙ ЛИСТ"
  WcsCat(message,L": ",sizeof(message));
  WcsCat(message,RotateSit,sizeof(message));
  frmErrorMessageUn(message,0,LogFile,0);

  // Оформление
  if (frmsit == 0) // Не нашли среди открытых
  {
   // Имя района
   _prptxt(82, createsite.MapName, sizeof(createsite.MapName));  // "ОФОРМЛЕНИЕ"

   if (FrameRsc[0] == 0)
    {
       MessageBox(0, _prptxt(83),  // "Не задано имя файла классификатора для оформления"
                     _prptxt(61),  // "Формирование зарамочного оформления"
                     MB_OK | MB_ICONINFORMATION | MB_TASKMODAL);
      IsActive = 0;

      mapCloseSiteForMap(Hmap, rsit);  // 15/12/17
      return;
    }

   SplitThePath(FrameRsc,NULL,NULL,testfile,NULL);
   MakeThePath(testname,drive_s,dir_s,testfile,L"rsc");
   if(ExistTheFile(testname))
    WcsCopy(rscfilename,testname,sizeof(rscfilename));
   else
    WcsCopy(rscfilename,FrameRsc,sizeof(rscfilename));

   // Карта зарамочного оформления
   frmsit = mapCreateAndAppendSiteUn(Hmap,FrameSit,rscfilename,&createsite);

   _prptxt(82, message, sizeof(message));  // "ОФОРМЛЕНИЕ"
   WcsCat(message,L"     : ",sizeof(message));
   WcsCat(message,FrameSit,sizeof(message));
   frmErrorMessageUn(message,0,LogFile,0);
  }

  if (frmsit == 0)
  {
   mapCloseSiteForMap(Hmap, rsit);  // 15/12/17
   continue;
  }

  mapLogAccess(Hmap,frmsit,0);

  // СОЗДАТЬ ПОВЕРНУТЫЙ ЛИСТ

  if (frmTurnSheet(TaskParm, Hmap, i, angle, rsit) == 0)
  {
    mapCloseSiteForMap(Hmap, rsit);  // 15/12/17
    mapCloseSiteForMap(Hmap, frmsit);
    break;
  }

  // НАНЕСТИ ЗАРАМОЧНОЕ ОФОРМЛЕНИЕ
  if (CreateBorder(Hmap, i, rsit, frmsit, angle) == 0)
  {
    mapCloseSiteForMap(Hmap, rsit);  // 15/12/17
    mapCloseSiteForMap(Hmap, frmsit);
    break;
  }

  mapCloseSiteForMap(Hmap, rsit);  // 15/12/17
  mapCloseSiteForMap(Hmap, frmsit);

  // НАНЕСТИ ЛЕГЕНДЫ
  memset(legsit,0,sizeof(legsit));

  for (int j = 0; j < LegendCount; j++)
  {
   String region = _prptxt(84) + String(j);  // "ЛЕГЕНДА "

#ifdef UNICODE11
   WcsCopy(createsite.MapName,region.c_str(),sizeof(createsite.MapName));
#else
   region.WideChar(createsite.MapName, sizeof(createsite.MapName));
#endif
   WCHAR file[256];
   WCHAR legfilename[256];

   if (Legends[j].SiteName[0] == 0)
   {
    ::MessageBoxW(0, _prptxt(85),  // "Отсутствует имя файла легенды"
                     _prptxt(61),  // "Формирование зарамочного оформления"
                     MB_OK | MB_ICONINFORMATION | MB_TASKMODAL);
    continue;
   }

   ::SplitThePath(Legends[j].SiteName,NULL,NULL,file,NULL);
   ::MakeThePath(legfilename,drive_s,dir_s,file,L"sit");

   // Для последующего открытия легенд
   WcsCopy(Legends[j].SiteName, legfilename, sizeof(Legends[j].SiteName));

   SplitThePath(Legends[j].RscName,NULL,NULL,testfile,NULL);
   MakeThePath(testname,drive_s,dir_s,testfile,L"rsc");

   if (ExistTheFile(testname))
     WcsCopy(rscfilename,testname,sizeof(rscfilename));
   else
   {
    if(Legends[j].RscName[0] == 0)
     {
       if (flagLegend == 0)
        {
          MessageBox(0,_prptxt(86),  // "В шаблоне легенды отсутствует имя файла RSC"
                       _prptxt(61),  // "Формирование зарамочного оформления"
                       MB_OK | MB_ICONINFORMATION | MB_TASKMODAL);
          flagLegend = 1;
        }
       continue;
     }

    WcsCopy(rscfilename, Legends[j].RscName, sizeof(rscfilename));
   }

   // Создать пользовательскую карту по открытой карте
   legsit[j] = mapCreateAndAppendSiteUn(Hmap, legfilename, rscfilename, &createsite);

   if (legsit[j] == 0) continue;

   mapLogAccess(Hmap,legsit[j],0);

   frmErrorMessageUn(L"--------------",0,LogFile,0);

   _prptxt(84, message, sizeof(message));  // "ЛЕГЕНДА "
   WcsCat(message,L"     : ",sizeof(message));
   WcsCat(message,legfilename,sizeof(message));
   frmErrorMessageUn(message,0,LogFile,0);

   _prptxt(87, message, sizeof(message));  // "КЛАССИФИКАТОР"
   WcsCat(message,L": ",sizeof(message));
   WcsCat(message,Legends[j].RscName,sizeof(message));
   frmErrorMessageUn(message,0,LogFile,0);

   _prptxt(88, message, sizeof(message));  // "ШАБЛОН"
   WcsCat(message,L"       : ",sizeof(message));
   WcsCat(message,Legends[j].FileName,sizeof(message));
   frmErrorMessageUn(message,0,LogFile,0);

   // Нанесение легенды зарамочного оформления
   frmCreateLegendPro(Hmap, i, rsit, legsit[j], Legends[j].FileName, angle, LogFile, mestarget);

   mapCloseSiteForMap(Hmap, legsit[j]);  // 15/12/17
  }  // НАНЕСЕНИЕ ЛЕГЕНД - КОНЕЦ
 }  // ПРОЦЕСС ОФОРМЛЕНИЯ - конец

 if (ViewLogCheck->Checked == true)
 {
  TFormFrameLog *logview = 0;
  try
  {
   logview = new TFormFrameLog(Application,LogFile);

   if (logview)
   {
    logview->ShowModal();
   }
  }
  catch (...)
  {
  }

  if (logview) delete logview;
 }

 // Сохранить в INI имена "по умолчанию"
 try
 {
  TIniFile *ini = new TIniFile(TaskParm->IniName);
  if(!ini) return;
  AnsiString scale = AnsiString(mapGetMapScale(Hmap)) + "_FRM_RSC";
  ini->WriteString("FRAME",scale,FrameRsc);
  scale = AnsiString(mapGetMapScale(Hmap)) + "_FRM_FRM";
  ini->WriteString("FRAME",scale,FrameTemp);
  delete ini;
 }
 catch(...)
 {
  ;
 }

 IsActive = 0;
 Cancel->Caption = _prptxt(19);  // "Выход"
 Close();

 //            Открываем созданные карты в новом документе
 //-----------------------------------------------------------------------------
 // Откроем главную - карту повёрнутого листа RotateSit
 HMAP hFrame;
 hFrame = mapOpenMapUn(RotateSit);
 if (hFrame == 0) return;

 // Добавим карту зарамочного оформления
 mapOpenSiteForMapUn(hFrame, FrameSit, 0);

 // Добавим карты легенд
 for (int j = 0; j < LegendCount; j++)
 {
   mapOpenSiteForMapUn(hFrame, Legends[j].SiteName, 0);
 }

 // Сохранить текущие параметры окна карты в INI-файл карты
 mapSaveMapState(hFrame, 0);

 // Закрыть документ
 mapCloseData(hFrame);

 // Открыть документ
 ::SendMessage(TaskParm->Handle, AW_OPENDOCUN, (WPARAM)RotateSit, 0);
 //-----------------------------------------------------------------------------
}

//---------------------------------------------------------------------------
// Нанести зарамочное оформление
//---------------------------------------------------------------------------

int TFormFrameBuild::CreateBorder(HMAP hmap, int sheet, HSITE rotsit, HSITE frmsit, double angle)  // 15/12/17
{
 if (MessageCheck->Checked == true)
   return frmCreateBorderPro(Hmap,sheet,rotsit,frmsit,FrameTemp,angle,LogFile,2);
 return frmCreateBorderPro(Hmap,sheet,rotsit,frmsit,FrameTemp,angle,LogFile,0);
}
 
Цитата
Александр Кружков написал:
Приведу текст рабочей программы "Формирование зарамочного оформления по шаблону"
Спасибо, я это видел в sdk, не до конца понял что происходит в frmCreateBorder,  frmGetRotateAngle,  frmTurnSheet,frmCreateLegendPro: создаются ли там какие-то объекты или выбирается рамка листа, какие mapapi функции используются?
 
Я привел текст программы, которая реализована в ГИС Панорама. Прошу проанализировать текст самостоятельно. В этом тексте используются функции, которые Вас интересуют.
 
Цитата
Максим Казаровец написал:
Спасибо, я это видел в sdk, не до конца понял что происходит в frmCreateBorder,  frmGetRotateAngle,  frmTurnSheet,frmCreateLegendPro: создаются ли там какие-то объекты или выбирается рамка листа, какие mapapi функции используются?
Исходные тексты функций есть в sdk12.zip\ready\frmapi -
http://gisinfo.ru/download?id=229
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности