По поводу общего алгоритма - вопрос к модераторам ФОРУМА.
Цвета в данном класификаторе меняються не из-за семантики а из-за того что каждый объект был создан редактором объектов классификатора, и одним из элементов объекта - субобъект с конкретной раскраской. При смене палитры идет замена цветов не по коду классификатора (потому-что Вы писали что семантика "обязательная", не влияющая на вид), а коду цвета этого конкретного субобъекта. Кстати при смене палитры классификатора (даже при смене типа палитры 16 цветов-256, RGB - CMYK ) меняеется расцветка ВСЕХ без исключения объектов. Как см.1-е предложение ответа.
В добавок ! Все таки стало интересно и решила проверить господина Козлова. Как говороит один мой знакомый молотком можно не только забить гвоздь но и .... (не буду продолжать) ----------------------- "НЕРЕШАЕМАЯ ЗАДАЧА" - многопотоковый модуль работающий с библиотекой "mapacces.dll" (из состава ГИС Панорама) который должен отображать участок карты на разные КЕНВЕС-ы ---------------- РЕЗУЛЬТАТ НИЖЕ(код - правда на Паскале, Си недолюбливаю): если интересует рабочий модуль (скинь свои координаты мне на мыло uuof@mail.ru) перекину КОД и ЕХЕ PS: (программа запускается любое количество раз, в ней по 3-потока.ВРОДЕ ПРОБЛЕМ НЕТ, и exception-ов тоже) КОД:
_________________________________________________________________ unit Unit1;
// КЛАСС: стандартная форма TForm1 = class(TForm) Panel1: TPanel; Button1: TButton; // кнопка "Создать 3 потока" Button2: TButton; // кнопка "Активировать прорисовку в потоках" p1: TPanel; // будем использовать панель 1 как Кенвес для потока 1 p3: TPanel; // будем использовать панель 2 как Кенвес для потока 2 p2: TPanel; // будем использовать панель 3 как Кенвес для потока 3 procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button2Click(Sender: TObject); private Threads : array[0..2]of TMyThread; public FMap : integer; end;
var Form1: TForm1;
implementation
{$R *.dfm}
// ОПИСЫВАЕМ САМЫЕ НЕОБХОДИМЫЕ ФУНКЦИИ mapacces.dll ДЛЯ ПРИМЕРА
function mapOpenMap(Map: Pchar; mode: integer): integer; stdcall; external 'mapacces.dll' name 'mapOpenMap';
procedure mapCloseMap(Map: integer); stdcall; external 'mapacces.dll' name 'mapCloseMap';
// ... И ФУНКЦИЯ - "ПАРАЗИТ", КОТОРАЯ НЕ РИСУЕТ В НЕСКОЛЬКИХ ПОТОКАХ procedure mapPaint95(Map: integer; DC : HDC;Erase:integer;var R : TRect); stdcall; external 'mapacces.dll' name 'mapPaint95';
{ TMyThread } // Запуск потока procedure TMyThread.Execute; var R : TRect; begin inherited FreeOnTerminate := TRUE; FillChar(R,SizeOf(TRect),0); R.Top :=100; R.Left :=100; R.Right :=300; R.Bottom :=300; try
while (not Terminated) do try // если еще не нарисовано И активировано -"НАРИСОВАТЬ" то: if not IsDraw and ViewMap then begin // Рисуем по законам описанными в mapapi.h SetViewportOrgEx(FDC,0,0,nil); mapPaint95(FMap,FDC,1,R); // устанавливаем флажек НАРИСОВАНО IsDraw:=true; end;
except Terminate; end;
finally Terminate; end; end;
// КЛИК - зоздаються 3 потока procedure TForm1.Button1Click(Sender: TObject); var i : integer; begin
for i:=0 to 2 do begin Threads[i]:=TMyThread.Create(true); Threads[i].sName := 'THREAD:'+IntToStr(i+1); Threads[i].FMap := FMap; Threads[i].ViewMap := false; Threads[i].IsDraw := false; end;
// деактивация (разрушение) формы procedure TForm1.FormDestroy(Sender: TObject); var i : integer; begin for i:=0 to 2 do begin if Assigned(Threads[i]) then Threads[i].terminate;
end; ReleaseDC(P1.Handle,Threads[0].FDC); // каждому потоку вешается свой индивидуальный Кенвес ReleaseDC(P2.Handle,Threads[1].FDC); // каждому потоку вешается свой индивидуальный Кенвес ReleaseDC(P3.Handle,Threads[2].FDC); // каждому потоку вешается свой индивидуальный Кенвес mapCloseMap(FMap); end;
// клик другой кнопкой - выставляем флажки нарисавть карту на прикрепленный к потоку Кенвес // procedure TForm1.Button2Click(Sender: TObject); var i : integer; begin for i:=0 to 2 do begin Threads[i].ViewMap:=true; Sleep(1000); // обязательно должно успеть отработать ! end; end;
end. _______________________________
В директории с ЕХЕ-шником должны находиться: mapacces.dll и CW3230.DLL
ОТВЕТ АНДРЕЮ КОЗЛОВУ! НЕПРАВДА! Показываю НАГЛЯДНО работу библиотеки mapacces.dll в трех потоках (различных программах) одновременно 1. ГИС Панорама 2. Задача PanTask 3. Задача MapTask http://img229.imageshack.us/img229/1689/33438260zj2.th.jpg
Здравствуйте коллега! Ответы; Вопрос 1 (связь) - в данном классификаторе НИКАК Вопрос 2 (выбор цвета) - ВЫБИРАЕТСЯ ЦВЕТ С КОДОМ "0" если таков отсутсвует с наименьшим кодом Вопрос 3 НИЧЕГО (если этим цветам не соответсвует Цветной объект у которого семантика влияет на ВИД)
Доброго времени суток господин Bolotoff ! Судя по всему наши модераторы еще не прочитали Ваш вопрос, и я приняла инициативу на себя. Отсылаю Ван на ящик карту с Вашими параметрами и код (на Паскале) с функцией которая Вас беспокоит. Я не знаю что у Вас с библиотеками GisTool, но мой Вам совет - обновите. В центре карты с параметрами которые Вы указали выше для точки X=(4373129.8+3719858.8)/2 Y=0 получается B=50.094318, L=87.00000 см.код.
Но это единый тип карты который, по моему мнению, позволяет наносить объекты по всей территории мира одновременно. Цилиндрические проекции почему-то при копировании на них объектов с других карт (через буфер) или при присоединении пользовательской карты (с дальнейшей ее трансформацией) превращает объекты южнее экватора в месиво: Отсылаю на тот-же ящик пример месива (001.zip) + исходную карту (002.zip)+ сит который нужно на нее посадить(003.zip).
Космонавигационная карта (обзорная мировая) которая Вами создана этот сит в месиво не превращает
Доброго времени дня! Почему во всех версих ГИС Панорама от 7.0 до 10.2 отсутсвтует возможность создания Космонавигацинных карт. И каким образом их создавать ?