|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
RGB_color в OLE_color как это сделать?
Программист широкого профиля.
Челябинск
Регистрация: 08.09.2005
Сообщений: 722
|
||
Просмотров: 11523
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,410
|
Посмотри на http://www.autocad.ru/cgi-bin/f1/board.cgi?t=29431LT - там А.Ривилис показал 2 функции преобразовний
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
Вобщем принцип такой
Имеем некоторые переменные R G B Делаем так (strcat B_hex G_hex R_hex); обратите внимание на перестановку чисел, почемуто их нужно переворачивать. Мы получили hex-строку-число цвета OLE_Color соответствующего цвету RGB. Вот и все. Дело за малым, осталось только сделать надежные функции перевода целых чисел HEX<->DEC. |
|||
![]() |
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
поробовал цвет курсора = цвету слоя,
Все работает за исключением некоторых косяков, связанных с HEX<->DEC. Обнаружил несколько ньюансов. глючит когда RGB=(0,неноль,любоечисло), тоесть когда начинается на ноль, здесь явно HEX<->DEC не хочет связываться с нолями. И когда HEX имеет буквы, то надо перед каждой вуквой поставить 0. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Converting Decimal to Hexadecimal and Hexadecimal to Decimal
Ф-ции перевода Hex<->Dec Код:
What is your color system? How are numeric color names better than word ones? |
|||
![]() |
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
Принцип преобразования такой, надеюсь он всем будет понятен.
Функция hex->dec может быть любой В функции dec->hex должно быть одно условие, описанное ниже HEX-числа должны быть стрингами Код:
Функция dec->hex должна быть сделана таким образом, чтобы в полученном hex-числе, если в нем есть буквы, то перед каждой буквой надо принудительно поставить 0. Например R=15 G=88 B=55 hex_BGR = 3758F – это обычное преобразование, но так как в нем есть буква то надо перед F поставить 0 -- 37580F. Другой пример AAA->A0A0A ноль в начале не нужен. Если R = 0, то цвет преобразуется неправильно, этот ньюанс я еще не проработал. Вот пример использования преобразования цвета(цвет курсора сделать равным цвету слоя): Код:
Rфотошоп = Bacad Gфотошоп = Gacad Bфотошоп = Racad Ньюансы на этом не закончились: Если vla-put-ModelCrosshairColor выдает ошибку, то тогда нужно в функции dec->hex убрать принудительную простановку нуля перед буквами. Это связано с тем, что OLE-число получается больше допустимого значения. Все это проверено и работает, осталось только доработать ошибку R=0, и поставить условия для функции dec->hex, а точнее доработать ее примерно таким образом Код:
Если ктото хочет понять принцип самостоятельно, то поэкспериментируйте в фотошоповской палитре c такими цветами 0 0 15, 0 15 0, 15 0 0 итп. И сразу станет все понятно. PS Я очень плохо разбираюсь в терминологии, и название темы скорее свего неправильное. Насколько я понимаю TRUE color не имеет отношения к ACI color. [ATTACH]1158249412.gif[/ATTACH] |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,410
|
У меня сказанное здесь : http://www.autocad.ru/cgi-bin/f1/board.cgi?t=5445Tm навевает определеннные сомнения с правильностью работы Photoshop'a... Такое на всех машинах? Или ты пробовал только на одной?
--- Исправление: Точнее, не с правильностью работы Photo, а (как бы это сказать) с правильностью логики преобразования цветов. Посмотри на лисп c:\program files\<AutoCAD>\Sample\Visual LISP\color-util.lsp, как посоветовал ShaggyDoc.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
В ф-ции DecToHex была ошибка в логике
Код:
Цитата:
Код:
Код:
|
|||
![]() |
|
||||
Я все никак не могу понять.
Вы пытаетесь написать это? (list (lsh (lsh OleCol 24) -24) (lsh (lsh OleCol 16) -24) (lsh OleCol -16)) Посмотрите http://www.autocad.ru/cgi-bin/f1/board.cgi?t=20854PJ Там еще в прошлом году я выкладывал применение этой конструкции для присвоения слою цвета фона автокада... |
||||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
Цитата:
Если надо получить число OLE, которое используется в vla-put-ModelCrosshairColor из RGB то зто просто: Код:
и соответственно OLE = 19513. |
|||
![]() |
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
>CB
Где же вы раньше были. Я тут голову ломал, а по вашему все так просто. Вринципе все эти три дня мной руководил простой интерес. И мой способ всетаки реализовался, надеюсь. Последнее что я выявил это: Если в hex-числе есть буква, то не всегда надо ставить ноль принудительно. например: число 61dec = 3Dhex зздесь ноль не нужен. число 15dec = Fhex здесь ноль нужен. Вобщем, как я понял, данный вопрос мало кому интересен. И на мой взгляд цвет курсора = цвету слоя это единственное применение данному преобразованию. Всем спасибо за предоставленную информацию. |
|||
![]() |
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
Вот , надеюсь, окончательный вариант реализации моих вычислений.
Функции DEC<->HEX могут быть любыми. Функция DEC->HEX должна возвращать строки в любом регистре. Функция HEX->DEC не должна вспотыкаться на регистре строковых символов. Данная функция сама поставит ноли там где это нужно. Также здесь же решена проблема R=0. Код:
|
|||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
>mmax
Посмотри внимательно на созданную тобой тему: ACI_color в OLE_color . ACI_color - это палитра, которую использует ACAD, и здесь всего 256 цветов. Цитата:
Код:
|
|||
![]() |
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
Цитата:
|
|||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
>mmax
Говоря о прямом вычислении ACI_color -> OLE_color, я имел в виду функцию, которая без промежуточного вычисления RGB сразу же бы давала OLE_color, т.е. например (Функция 5) = 16711680 (синий цвет), хотя я в этом и не уверен, т.к. не силен в объектной модели, а там много чего можно... А сейчас хочу предложить свой вариант функции перевода DEC->HEX: Код:
Код:
|
|||
![]() |
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
>CB
В моей последней функции rgb->ole уже не нужна принудительная проставка нолей, она сама проставит ноли где надо. Нужно чтобы Hex-числа были строками, тк rgb->ole обрабатывает только строки. Аргументы R G B - должны быть целыми числами. Вот мои варианты DEC<->HEX Код:
Код:
Также если уж взялся за это дело, то попытаюсь сделать еще несколько функций работы с цветом. Например: ACI->RGB OLE->RGB RGB->ACI Например ACI->RGB Рисуется точка на слое defpoints, модифицируется ее цвет по aci(vla-put-indexcolor или еще какойнибудь метод) потом (vla-get-truecolor) позволит вычислить цвет по RGB. Точка удаляется. Наверно на этой неделе чтонибудь придумаю. А еще вопрос к знающим людям (acad_colordlg)выдает скудный диалог цветов по ACI, а как вызвать диалог со всеми палитрами и альбомаим? У меня пока одна задумка (command "_.color" pause), а потом составить список своиств из (vla-get-truecolor) Код:
|
|||
![]() |
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
>Александр Ривилис, спасибо вам за предоставленную информацию.
В данном диалоге выбрал цвет по RGB=9 17 246 -- синий. Под кодом 420 возвращается цвет по OLE=594422, только в превернутом виде по RGB, тоесть (vla-put-ModelCrosshairColor(vla-get-Display(vla-get-Preferences (vlax-get-acad-object)))594422) изменяет цвет на красный, а RGB = уже 246 17 9 следовательно если я хочу в своей программе использовать цвета RGB, то придется использовать функцию ole->rgb, которая будет работать как rgb->ole(сообщение 16) только в обратном порядке. И вот вопрос: А почему AUTODESK держит в секрете сведения по преобразованию цветов? В справке по этой проблеме нет никаких сведений. Сделал поиск, на этом форуме по слову "цвет", то наткнулся только на вопросы без ответа. А идея преобразования появилась только тогда когда в палитре фотошопа случайно увидел, что RGB = 0 15 0 = 000F00. PS Если комуто это вопрос интересен, то верная информация начинается с сообщения №16, все мои предыдущие сообщения это домыслы и догадки. |
|||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
Здесь Александр Ривилис показал функции для RGB>>TrueColor<<RGB. Для OLE_color они будут выглядеть так:
Код:
А теперь вопрос - начиная с какой версии ACAD появилось свойство TrueColor (и соответственно группа (420 . ) в свойствах примитива)? В 2002м этого еще нет. :cry: |
|||
![]() |