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

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

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

Страницы: Пред. 1 ... 4 5 6 7 8 9 10 11 12 13 14 ... 148 След.
Печать отчета в формате А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]
Печать отчета в формате А3, нет возможности выбора свойств принтера
 
Настройка свойств принтера через панель управления проблемой не является - это особенность. Кроме принтера, может понадобиться настроить еще и дополнительные программы обработки, например Adobe Acrobat Distiller.

По поводу переключения с формата на формат A4 -> A3 и обратно: проще всего выполнить специальную настройку принтера на двух компьютерах: на одном - A4, на втором - A3.


Думаю, что Вы написали хорошую инструкцию. Приведу краткую выдержку из нашей методики проверки формирования векторного изображения карты в форматах PostScript CMYK и PDF CMYK:

Условия выполнения:

1. Для получения файла в формате PostScript на компьютере должен быть установлен и настроен драйвер принтера, поддерживающего печать в PostScript (PDF Creator или Adobe PDF):

-      открыть окно с принтерами: Пуск - Устройства и принтеры ([B]выполняется 1 раз, чтобы не настраивать каждый раз в ГИС "Панорама"[/B]);

-      открыть контекстное меню (правой кнопкой мыши) выбранного принтера (например "Adobe PDF") - Настройка печати:

[CENTER]- в закладке "Adobe PDF Setting" отключить опцию "Rely on system fonts only; do not use fonts";[/CENTER]

-      в закладке "Макет" нажать кнопку "Дополнительно";

-      качество печати:  1200 dpi (точек на дюйм);

-      параметры вывода PostScript:  Инкапсулированный PostScript;

-      загрузка шрифтов TrueType:  Как векторные;

-      нажать кнопку "Особый размер страницы PostScript";

-      установить размеры страницы в миллиметрах: Ширина = 630, Высота = 770 ([B]установите нужные Вам [/B][B]параметры[/B]).

2. Для получения файла в формате PDF на компьютере должна быть установлена программа Adobe Acrobat Pro и выполнена настройка Acrobat Distiller  ([B]установите нужные Вам параметры[/B]):

-      Press Quality - General - File Options - Resolution = 2400 dots per inch;

-      Press Quality - General - Default Page Size - Width = 630 mm;

-      Press Quality - General - Default Page Size - Height = 770 mm.

Порядок проверки:

-      запустить ГИС "Панорама";

-      открыть карту;

-      открыть диалог печати карты: в главной панели ГИС "Панорама" нажать кнопку "Печать";

-      выбрать устройство печати, поддерживающее PostScript: нажать кнопку "Свойства принтера". После выбора принтера и его настройки нажать кнопку Ok;

-      выбрать тип вывода: Output type = PostScript CMYK (1 file);

-      выполнить печать в файл: "Печать в файл".

Проверка считается выполненной при получении PS-файла с изображением карты. Файл может быть открыт с помощью программы Adobe Acrobat после конвертирования файла PS в PDF модулем Distiller, входящим в состав Adobe Acrobat Pro.

Проблема с отрисовкой векторного объекта на HDC
 
Я немного ошибся. Структура IMGPOLYDESC имеет переменную длину.
[CODE]typedef struct IMGPOLYDESC // Для (149) описание цепочки
{                                //      (size = 12 + 8*Count + Length)
 unsigned char  Type    ;       // Тип цепочки (VT_SQUARE, ...)
                                // для выделения блока VT_OBJECT,
                                // VT_SUBJECT, VT_END)
 unsigned char  Image   ;       // Тип параметров
                                // (IMG_SQUARE, IMG_LINE, IMG_DOT,
                                // IMG_VECTORTEXT)              
 unsigned short Length  ;       // Длина параметров (>= 4)
 unsigned int   Parm    ;       // Параметры цепочки по ее типу
 unsigned int   Count   ;       // Число точек в цепочке
 IMGVECTPOINT   Point[1];       // Координаты до 512 точек
}
 IMGPOLYDESC;
[/CODE]В описании структуры поле "Parm" правильнее было бы написать: Parm[1], чтобы программист видел, что это поле переменной длины. Именно поэтому я ошибся в прежнем описании. Ниже я привожу пример с учетом настоящего поля переменной длины "unsigned int Parm".
[CODE]desc = &(vectorex->desc);// получили указатель на первый примитив

// Число точек
unsigned int * pointCount = (unsigned int*)((char*)&(desc->Parm) + desc->Length; // Пропустить параметры
count = *pointCount;

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

[/CODE]desc->Length зависит от длины параметров:

Если desc->Image = IMG_SQUARE, то desc->Length = 4 = sizeof(IMGSQUARE)
Если desc->Image = IMG_LINE, то desc->Length = 8 = sizeof(IMGLINE)
Изменено: Александр Кружков - 20.12.2017 12:13:12 (Уточнено)
Проблема с отрисовкой векторного объекта на HDC
 
Тогда возращаемся к началу: координаты x и y являются относительными.

Конечные координаты примитивов векторного знака вычисляются примерно так:
...
x = MKM2PIX(_point[i].Hor);
y = MKM2PIX(_point[i].Ver);

pixelX = centerX + _vectorex->PosH + x;
pixelY = centerY + _vectorex->PosV + y;

где
centerX, centerY - координаты центра окна.
pixelX, pixelY - координаты точек для polyline.
Проблема с отрисовкой векторного объекта на HDC
 
Координаты x и y являются относительными.

Если  необходимо отображать карту, то

1. У векторного объекта есть собственные координаты:

DOUBLEPOINT point;
mapGetMapPlanePoint(info, &point, 1, 0);

2. Координаты преобразовать к экранным пискелям

mapPlaneToPicture(map, &point.X, &point.Y);

3. Конечные координаты примитивов векторного знака вычисляются примерно так:

point.X + PosH + x;
point.Y + PosV + y;
Проблема с отрисовкой векторного объекта на HDC
 
Добрый день!
Я не вижу текста выше. Векторный знак не всегда имеет параметры типа IMGVECTOREX. Часто параметры лежат в структуре IMGDRAW.

IMGVECTOREX * vectorex;
IMGPOLYDESC *  desc;
IMGVECTPOINT * point;

// if(IMG_VECTOREX)  // Это условие всегда выполнится как "true" (условие ошибочно)
if (function == IMG_VECTOREX)
{
//     _imgvectpoint = *(IMGVECTOREX*)res;  // По отношению к параметрам  IMGVECTOREX, IMGDRAW так делать не рекомендуется - параметры имеют переменную длину
  vectorex = (IMGVECTOREX *)res;
  desc = &(vectorex->Desc);
  point = &(desc->Point);

  // Следующая запись IMGPOLYDESC находится так
  desc = (IMGPOLYDESC *)(point + desc->Count);
  point = &(desc->Point);
}
Использование ActiveObject, SelectObject, прикладная задача для ГИС Панорама12
 
// Отобразить произвольный объект в пределах фрагмента
// в условных знаках пользователя
// image - описание вида объекта (см. MAPGDI.H),
// Координаты объекта заданы в дискретах в листе
// При ошибке в параметрах возвращает ноль
// alpha - флаг использования альфа канала 0 - не использовать 1 - использовать
// filename  - полное имя создаваемого файла формата png


_MAPIMP long int _MAPAPI mapPaintMapObject95(HMAP hMap, HDC hdc,
                                     RECT * rect,
                                     PAINTPARM * image,
                                     HOBJ object);
Пример:

После обновления карты нарисовать требуемые объекты (например сплошной линией указанным цветом  color)
[CODE] PAINTPARM image;
     IMGLINE   line;
     image.Image = IMG_LINE;
     image.Parm  = (char*)&line;
     image.Mode  = R2_COPYPEN;

     line.Color  = color;
     line.Thick  = PIX2MKM(1);                     // 19/04/10

     mapPaintMapObject95(hmap, hdc, rect, &image, info);[/CODE]
Использование ActiveObject, SelectObject, прикладная задача для ГИС Панорама12
 
Для перехода к следующему\предыдущему объекту необходимо отправить сообщение окну карты:
DocHandle - идентификатор окна карты
MS_NEXTOBJECT - команда перехода между объектами
Параметр WPARAM:
0 - переход к следующему объекту;
1 - переход к предыдущему объекту.

Параметр LPARAM:
Info - идентификатор объекта карты, в который записывается результат.[CODE]if (::SendMessage(DocHandle, MS_NEXTOBJECT, 0, Info) != 0)
{
   // Обработка возвращаемого объекта, если нужно
 ...
}[/CODE]
Конвертер SXF ->SHP
 
см. vectrapi.h, функции библиотек gisuvectr.dll (x32 версия 12), gisu64vectr.dll (x64 версия 12):

 // Импорт данных Shape (исходные данные выбираются из диалогового окна открытия файла)
 // hmap       - идентификатор открытых данных
 // parm       - параметры задачи, описание структуры TASKPARM в maptype.h.
 // При ошибке возвращает ноль

_MAPIMP long int WINAPI CallImportShp(HMAP hmap, TASKPARMEX * parm);

 // Импорт набора данных Shape (исходные данные выбираются из диалогового окна выбора директории)
 // hmap       - идентификатор открытых данных
 // parm       - параметры задачи, описание структуры TASKPARM в maptype.h.
 // При ошибке возвращает ноль

_MAPIMP long int WINAPI ImportShpSet(HMAP hmap, TASKPARMEX * parm);
Страницы: Пред. 1 ... 4 5 6 7 8 9 10 11 12 13 14 ... 148 След.



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

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