На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты
АРХИВ ФОРУМА...
здесь вы можете ознакомиться с материалами форума до 08.06.2008

Александр Кружков (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Александр Кружков
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 178 След.
Подготовка к Печати - Формирование зарамочного оформления, Предложения и вопросы
 
Спасибо за предложение! Постараемся сделать в ближайшее время. Текущие элементы RSCTEXT, RSCBOX и др. поправить нельзя (для обеспечения обратной совместимости со старыми файлами). Планируем добавить дополнительные примитивы: RSCTEXT2, RSCBOX2, ...
Подготовка к Печати - Формирование зарамочного оформления, Предложения и вопросы
 
[QUOTE]Алексей написал:
А можно ли реализовать также динамическую привязку элементов (при создание RSCLINE, RSCBOX, RSCBAR) например как это сделано для RSCTEXT (цифра в коде Point)?P. S. Могу более подробно разъяснить если захотите реализовать или хотя бы поставите Вам это станет интересно.[/QUOTE]
Интересно. Прошу написать подробнее.
LoadMapToBMP
 
// Запросить размеры общего изображения карты в пикселах
// для текущего масштаба
// hmap - идентификатор открытых данных
// В переменную width заносится ширина изображения (dx),
// в переменную height - высота (dy)

_MAPIMP void _MAPAPI mapGetPictureSize(HMAP hmap, long int *width,
                                      long int *height);
_MAPIMP void _MAPAPI mapGetPictureSizePro(HMAP hmap, double * width,
                                         double * height);
LoadMapToBMP
 
mapPaint95ToFile выполняет рисование с текущим разрешением (условной точностью экрана (точек/метр) = mapGetScreenPrecision()).
LoadMapToBMP выполняет рисование с указанным Вами разрешением (resolution). Более высокое разрешение увеличивает толщину линий и размер шрифта.
Создание фреймов, Управление фреймами при подготовке к печати
 
Правильное расположение точек рамки:
2           3


1(5)       4

Прошу проверить метрику объекта-рамки. Выбрать объект, в закладке "Метрика" проверить порядок точек на схеме (в правой части окна).
[IMG WIDTH=1042 HEIGHT=677]http://public.gisinfo.ru/Forum/object_frame.png[/IMG]
Проблема с отрисовкой векторного объекта на HDC
 
Приведу описание структуры:
[CODE]typedef struct IMGVECTPOINT // Для (149) описание точки объекта
{                                //      ( size = 8 )
 int Hor;                       // Координаты от точки привязки
 int Ver;                       // вправо и вниз в соответствии
                                // с типом цепочки:
                                //                Центр  Радиусы  Точки начала и окончания
                                // Circle, Round  (h,v)  (dh,dh)
                                // Ellipse, Oval  (h,v)  (dh,dv)
                                // Arc,      Pie  (h,v)  (dh,dv)        (h1,v1)  (h2,v2)
}
 IMGVECTPOINT;
[/CODE]Примерный текст для получения параметров окружности, эллипса, дуги (продолжение текста от 20.12.2017 11:51:32):
[CODE]...

// Пропустить поле desc->Count
point = (IMGVECTPOINT*)(pointCount+1);

// Центр окружности (эллипса, дуги)
centerX = point->Hor;
centerY = point->Ver;
point++;

// Радиусы окружности (эллипса, дуги)
radiusH = point->Hor;
radiusV = point->Ver;
point++;

// Точка начала дуги (сектора)
arcX1 = point->Hor;
arcY1 = point->Ver;
point++;

// Точка конца дуги (сектора)
arcX2 = point->Hor;
arcY2 = point->Ver;[/CODE]
Функции создания зарамочного оформления, функции из frmapi.dll
 
Я привел текст программы, которая реализована в ГИС Панорама. Прошу проанализировать текст самостоятельно. В этом тексте используются функции, которые Вас интересуют.
Печать отчета в формате А3, нет возможности выбора свойств принтера
 
Добавим.
Печать отчета в формате А3, нет возможности выбора свойств принтера
 
Рассмотрели возможность сохранения готового Отчета в графические форматы, PDF и GeoPDF.

Сделали следующие выводы:

1. Готовый отчет представляет собой документ в виде набора изображений в произвольных масштабах (выбранных пользователем) с произвольных фрагментов карт с различной привязкой к местности (выбранных пользователем), а также произвольных элементов оформления (линий, текстов, OLE-объектов), привязанных к оформляемой печатной странице (к бумаге, а не к местности). Поэтому формирование Отчета в формате геопривязанных данных (GeoPDF) не имеет смысла.

2. Формирование изображения Отчета в остальных форматах технически возможно, но нецелесообразно по следующей причине:

- для отображения всех элементов оформления Отчета непосредственно в графический файл необходимо реализовать дополнительные механизмы отображения - для реализации дополнительных функций необходимо выполнить серьезную доработку программы, требующую затрат времени и средств (в настоящее время данная доработка не планируется). Данные механизмы уже реализованы в виде виртуальных PDF-принтеров. Некоторые из них распространяются бесплатно, например PDFCreator.
Функции создания зарамочного оформления, функции из frmapi.dll
 
Приведу текст рабочей программы "Формирование зарамочного оформления по шаблону", которая вызывается в диалоге создания зарамочного оформления (панель "Подготовка к изданию"):
[CODE]//---------------------------------------------------------------------------
// Кнопка "Выполнить"
//---------------------------------------------------------------------------
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);
}[/CODE]
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 178 След.



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