Имеется база на FoxPro с описанием элементов электрической схемы. В базе есть MEMO поля с описанием графики этих элементов. Но проблема в том что все это в hex. Например обычный предохранитель описан так: 00 3A 00 00 00 00 00 00 00 01 0F 00 FA FF 2B 00 FA FF 2B 00 06 00 0F 00 06 00 00 00 00 00 00 00 00 00 00 00 3A 00 00 00 3A 00 00 00 Графически элемент представлен линией и прямоугольником (точно прямоугольник, а не 4 линии) Пробовал менять некоторые значения и смотрел результат. Например менял ...01 0F 00 FA FF 2B 00 FA FF... на FB или на E9 в итоге середина левой грани прямоугольника поворачивалась на небольшой угол FB вниз E9 вверх. Меняя некоторые другие значения либо ничего не менялось либо элемент искажался до неузнаваемости. Вся графика в пикселах 255х255. Линия 57 пикселей. Прямоугольник 28х12. Это все что удалось пока раскопать. Вопрос: может кто подскажет как "копать" и как опознать как описана эта графика в базе? Цель немного видоизменять графику в базе для более корректного отображения на чертежах.
Shoorup Начни с линии: линия должна описываться координатой начала и конца, типом линии (сплошная, прерывистая, точка тире и т.д.), толщина, цвет линии... Тоже для прямоугольника, только у него две координаты, плюс цвет заполнения. Посмотри на WinAPI Ellipse, Rectangle
Походу разработчик немного изменил алгоритм... это не просто апишные фунции... Потому как толщина, тип линии походу описывается где-то в другом месте. Поковыряюсь отпишусь когда упрусь в стену... А вообще где бы поискать как будет выглядеть в HEX описание прямоугольника
Shoorup Я и не говорил, что это один в один Ellipse или Rectangle, но количество переданных аргументов и свойства за которые они отвечают должны быть похожими, самый первый аргумент, по-идее, должен быть тип элемента: проводник, резистор, конденсатор и т.п., среди аргументов должен быть номинал элемента 100 Ом, 200 пФ и т.д.
да как угодно. Только сперва уточни: эти хексы относятся к описанию объекта "предохранитель", или к описанию экземпляра объекта на схеме? Поясню: логичнее всего было бы сделать некую таблицу с описанием объектов. В которой хранить ID объекта (например, 3A = предохранитель), ссылки на другие элементарные объекты, из которых он состоит (например, 0F - , линия, 2B - прямоугольник), характеристики этих объектов и их взаимное расположение. А потом в другой таблице, описывающей схему в целом, ссылаться на конкретный объект "Предохранитель" (по ID=3A), указывать скажем угол верхний левый в относительных координатах, и размеры по Х-У (например, 2B-06, 0F-06). Вот в зависимости от того, к какой из таблиц относится этот код, и надо его расшифровывать. К эталону, или к экземпляру на схеме?
Shoorup Для начала создай схему из 4 проводников образующих прямоугольник и посмотри какие записи появятся в базе
Ну близкое к 57 - это 3A. Это 58 если перевести в десятичное. Если последние 16 байт рассматривать как dword-ы, то получаем (0,0)-(58,58) Но это диагональ и длина 59 пикселей. Прямоугольник никак не получается в пропорциях 28х12 0x2BFFFA/0x0f0100 = 2.9 1) У прямоугольника нет граней(точнее она одна) , а только стороны и вершины. 2) Середина это точка. При повороте вверх(поворот бывает по часовой или против) она не меняется ????????????????? ++++++++++++++++++= А еще лучше действительно создать простые схемы и попытатся расшифровать.
Так и не получилось расшифровать. Врядли в этих хексах хранится описание что это предохранитель а это резистор, потому как это описание есть в обыкновенных полях базы. Помоимо просто графического представления самого предохранителя в этих хексах еще может быть описание точек подключения и координаты данных (номинал, выводы, и пр.) Насчет таблицы не уверен что получится... Другие элементы описаны разным количеством байт и имеют разное количество выводов (подключений)... Вот например Резистор 00 00 00 00 0F 00 00 00 00 1E 00 FA FF 1E 00 EB FF 00 1E 00 F0 FF 28 00 F0 FF 00 00 00 00 00 00 00 00 00 00 3A 00 00 00 3A 00 00 00 00 28 00 F0 FF 28 00 F0 FF А разница по сути только в том что нет линии пересекающей прямоугольник. Возможно (а скорее всего так и есть) в предохранителе линия одна а в резисторе описание двух линий. Вот сам файлец с описание элементов. В файле описано 4 MEMO поля. Первое описание элемента (Full_name) - как в первом посте это было "Предохранитель плавкий" и для резистора "Резистор постоянный". Затем идет некое поле header для чего используется не знаю. Затем идет graf_ch - это и есть описание самих элементов - я их привел. И последнее поле Juncs - тоже не знаю зачем... Вообще на сколько мне известно программа пишется со времен DOS. Возможно описание графики там идет DOSявое... но я даже не могу вообразить как описывается графика в DOS
Shoorup 1) Представь, что разработчик это ты, как бы ты проектировал эту базу? 2) Повторюсь, создай несколько простых схем и попытайся их расшифровать
1. Я бы ее проектировал точно не так! Программа супер корявая и супер гэ. По долгу службы приходится ее ковырять... В нормальных программах описание графических элементов хранится не в базах а в файле-чертеже где описан сам блок. И при открытии схемы не идет сопоставление того что в базе и того что в файле... а в файле храниться уже вставленное ранее описание этого блока в специально отведенном для этого месте а отображаются только блоки которые ссылаются на это описание. Т.е. в нормальном чертеже вот эта база по сути храниться в самом чертеже причем только те описание элементов которые необходимы для вывода графики. 2. Создать какие схемы? Реальный файл чертежа в этой программе хранит только имя и координату вставленного блока, но не его графическое описание. Если в базе что-то исправить, то открывая любой чертеж можно увидеть как это изменилось. Повторюсь в нормальных программах я могу открыть конечный чертеж и в этом чертеже исправить описание графики любого блока и изменения будут касаться естественно только этого чертежа. Например в AutoCAD именно так все сделано. Возможно с DOSявых времен все это было не рационально... и разработчики решили не менять сложившиеся порядки при переходе из DOS в Windows...
то есть это описание объекта вообще, эталона. Это уже лучше. Идет с доса - значит элементы структуры скорее всего WORD, а не DWORD (если там есть структура). Предохранитель описывается 44 байтами, а резистор 53... Первый 0 в 3-й строчке не лишний? точно есть? 52 байта мне почему-то больше нравятся. И не забудьте рассмотреть возможность, что это растр, а не вектор Вот например "резистор" в растре 16х9 (ч/б): 00 00 00 00 1F F8 10 08 F0 0F 10 08 1F F8 00 00 00 00 чего-то похожее, не? повторяющиеся хексы, нули, прямые участки (1E, 1F, F8, F0, FF). Растр может быть 4-цветным, растр может быть сжатым. Прямоугольник говорите, 28 * 12? это 42 байта двухцветного растра... Наш размерчик Хотя проще 32*12 или 28*16, чтоб кратно 8 хотя бы 1 из размеров был - но кто их знает, первых авторов? сжать хотели, какой-то свой алгоритм сделали, чтобы лишних 4-8 байт на элемент не занимало. Это так, предположение.
FatMoon, в очередной раз спасибо! Почему-то мне тоже показалось что если это DOS то какой нафик вектор... скорее всего все пикселями представлено. Файлик прилагаю с описалищем.
Насчет размеров... Элементы бывают и очень большие и очень маленькие... Мне кажется размер указывается гдето в начале описания В самой программе можно задать цвета для всех элементов. Но не думаю что это както связано с описанием... скорее всего рисунок монохромный. Все элементы из этой базы всегда одного цвета.
Хотя наверно это не просто пиксели... потому как когда я менял некоторые байты то элемент растягивался в пределах 255х255
Это для предохранителя. Действительно WORD! держите ваш прямоугольник : (15,-6)-(43,-6)-(43,6)-(15,6) Как раз 43-15=28 и 6-(-6)=12 Растр никак не может быть - он для данных целей неэкономен. Junc - это junction, сочленения/соединения Удачи!
Вот заголовок для пердохранителя: 1A 00 04 C0 00 14 28 04 05 05 02 1D 00 F3 7F 1C 00 13 00 1D 00 E8 7F 1D 00 F3 7F 00 00 00 00 Еще если смотреть хекс впереди дописано 00 01 00 00 00 1F но это к заголовку не относится. Скорее информация из БД. Вообще все заголовки 31 байт