Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ UO Pilot _ Рисуем с помощью пилота

Автор: FREEON 26.6.2019, 14:34

Можно ли с помощью пилота создать bmp картинку и на ней же к примеру расчертить сетку с определенным шагом по оси X и шагом по оси Y. Задав нужный цвет. Видел что что-то подобное реализовано в закрашивании фона... Если к примеру нельзя создать картинку, то хотя можно ли выполнить поставленную задачу(расчертить сетку) на готовой пустой картинке?

Автор: cirus 26.6.2019, 14:49

Сделать можно, но будет долго рисовать.
Для этого есть фотошоп. Создаётся узор и накладывается на картинку.
На крайний случай открыть картинку в paint'е и скриптом нарисовать сетку.

Автор: Fors1k 26.6.2019, 15:39

Цитата(FREEON @ 26.6.2019, 14:34) *

Можно ли с помощью пилота расчертить сетку


Если сетка в paint'е устроит
код

Код
set workwindow 10489422
set linedelay 1
//
set #sx 1780        // размер листа Х
set #sy 760         // размер листа У
set #xh 24          // Шаг по Х
set #yh 10          // Шаг по У
init_arr %a (1) 5 5 // координаты первого пикселя
//
  set #x %a [1 1]
  set #y %a [1 1]
repeat (#sx / #xh)
    set #x (#x + #xh)
    kleft_down #x %a[1 1]
    wait 10
    move #x #sy
    wait 10
    kleft_up #x #sy
end_repeat
repeat (#sy / #yh)
    set #y (#y + #yh)
    kleft_down %a[1 1] #y
    wait 10
    move #sx #y
    wait 10
    kleft_up #sx #y
end_repeat
end_script


Автор: Cockney 26.6.2019, 23:45

Цитата(cirus @ 26.6.2019, 14:49) *

Сделать можно, но будет долго рисовать.




Но это же на пилотовском языке ? А луа ? Думаю не хуже будет, там же поиск работает быстрее чем встроенная функция.

Автор: cirus 27.6.2019, 3:00

Цитата
можно ли выполнить поставленную задачу(расчертить сетку) на готовой пустой картинке?

Код
--lua
local ffi=require "ffi"
local cc=ffi.cast

local path_in=[[C:\1.bmp]]  -- путь к картинке
local path_out=[[C:\2.bmp]] -- путь куда сохранить картинку с сеткой
local setkaX, setkaY = 5, 5  -- размеры сетки
local setkaR, setkaG, setkaB = 255, 0, 255  -- цвет сетки в ргб

local address, width, height, length = loadimage(path_in)   -- загрузить картинку
if address > 0 then  -- если загружена
    for y=0, height-1  do
        for x=0, length-3, 3 do
            if  x % setkaX == 0 or y % setkaY == 0 then
                cc("unsigned char*", address + x + y * length)[0]=setkaB
                cc("unsigned char*", address + x + y * length+1)[0]=setkaG
                cc("unsigned char*", address + x + y * length+2)[0]=setkaR
            end
        end
    end
saveimage(address, path_out)    -- сохранить картинку
else log("Картинка не найдена")
end

Автор: FREEON 27.6.2019, 19:04

Цитата(cirus @ 27.6.2019, 3:00) *

Код
--lua
local ffi=require "ffi"
local cc=ffi.cast

local path_in=[[C:\1.bmp]]  -- путь к картинке
local path_out=[[C:\2.bmp]] -- путь куда сохранить картинку с сеткой
local setkaX, setkaY = 5, 5  -- размеры сетки
local setkaR, setkaG, setkaB = 255, 0, 255  -- цвет сетки в ргб

local address, width, height, length = loadimage(path_in)   -- загрузить картинку
if address > 0 then  -- если загружена
    for y=0, height-1  do
        for x=0, length-3, 3 do
            if  x % setkaX == 0 or y % setkaY == 0 then
                cc("unsigned char*", address + x + y * length)[0]=setkaB
                cc("unsigned char*", address + x + y * length+1)[0]=setkaG
                cc("unsigned char*", address + x + y * length+2)[0]=setkaR
            end
        end
    end
saveimage(address, path_out)    -- сохранить картинку
else log("Картинка не найдена")
end


Да благодарю отфотошопил. Похоже для луа нужен какой-то плагин(файл)?
Цитата

module 'ffi' not found:
no field package.preload['ffi']
no file '.\ffi.lua'
no file 'D:\UOPilot\lua\ffi.lua'
no file 'D:\UOPilot\lua\ffi\init.lua'
no file 'D:\UOPilot\ffi.lua'
no file 'D:\UOPilot\ff


Автор: cirus 27.6.2019, 21:52

Цитата
Похоже для луа нужен какой-то плагин(файл)?

Пилот нужен 2.41.

Автор: FREEON 27.6.2019, 22:59

Цитата(cirus @ 27.6.2019, 21:52) *

Пилот нужен 2.41.

Да как бы: UoPilot Version 2.41 (31.12.2018) и lua5.1.dll имеется

Автор: FREEON 28.6.2019, 12:57

Версии 2.41 оказалось мало. Немного покопавшись выяснилось что дело было в lua.dll а именно ffi которой просто нет, зато она есть в luajit.
Заменил стандартную пилотовскую библиотеку на версию из https://forum.uokit.com/index.php?s=&showtopic=19856&view=findpost&p=431534 и все заработало (разница в 300KB).

Автор: cirus 28.6.2019, 13:10

Цитата
Версии 2.41 оказалось мало.

Стандартной длл хватает. Она распаковывается при первом запуска пилота. Если конечно не было другой длл.

Автор: FREEON 28.6.2019, 13:16

Цитата(cirus @ 28.6.2019, 13:10) *

Стандартной длл хватает. Она распаковывается при первом запуска пилота. Если конечно не было другой длл.

Возможно библиотеки не заменились или я сам когда копировал в старую папку новую версию пилота не заменил.
Все ровно чертить пилотом в разы быстрее чем фотошопить(пока загрузишь ph пока создашь узор, области выделишь и заполнишь) а пилотом бжык и все готово.
Сразу возникает вопрос как еще задать толщину линий сетки. Если 0, 0 это начало отсчета, то для сетки толщиной в 2px нужно 2 центра 0,1 и 1,0. Пытался ещё for приделать для прорисовки 2го слоя линий и прям картины рисуются но не сетка с нужной толщиной. Если одну из осей ещё получается подогнать вплотную к первой то со второй абы шо выходит
Прикрепленное изображение

Автор: cirus 28.6.2019, 14:55

Цитата
как еще задать толщину линий сетки

код
Код
--lua
local ffi=require "ffi"
local cc=ffi.cast

local path_in=[[C:\1.bmp]]  -- путь к картинке
local path_out=[[C:\2.bmp]] -- путь куда сохранить картинку с сеткой
local setkaX, setkaY = 10, 10  -- размеры сетки
local setkaR, setkaG, setkaB = 255, 0, 255  -- цвет сетки в ргб

local setka_width_X, setka_width_Y = 3, 3   -- толщина линий сетки


local address, width, height, length = loadimage(path_in)   -- загрузить картинку
if address > 0 then  -- если загружена
    for y=0, height-1  do
        for x=0, length-3, 3 do
            if  x % setkaX == 0 then
                for i=0, setka_width_X-1 do
                    cc("unsigned char*", address + x + y * length + i * 3)[0]=setkaB
                    cc("unsigned char*", address + x + y * length + i * 3 + 1)[0]=setkaG
                    cc("unsigned char*", address + x + y * length + i * 3 + 2)[0]=setkaR
                end
            end

            if  y % setkaY == 0 then
                for i=0, setka_width_Y-1 do
                    cc("unsigned char*", address + x + (y + i) * length)[0]=setkaB
                    cc("unsigned char*", address + x + (y + i) * length+1)[0]=setkaG
                    cc("unsigned char*", address + x + (y + i)  * length+2)[0]=setkaR
                end
            end
        end
    end
saveimage(address, path_out)    -- сохранить картинку
else log("Картинка не найдена")
end

Автор: minfin 8.9.2019, 18:05

можно рассмотреть формат .SVG (векторная графика)

// пишу сложный парсер для сложной инфографики
и в моём случае очень разгрузило и по скриптам, и по нагрузке, и вообще по функционалу


есть редакторы, и даже есть браузерный редактор. бесплатный.

картинки рисуются кодом.
особенно легко обновлять\редактировать\переносить текст в конкретные координаты.

работает в разы легче чем PSD, \\ где придется писать ручную правку слоёв через тонны Move\kleft
при этом так же имеет функции Слоёв (Layers)
которые можно править по переменной, не запуская сам редактор. (через write пилота)

\\ через костыли:
координатам\слоям\объектам\тексту можно задавать переменные, объединять в группы,
а через булиан в пилоте можно задать условия if на Цвет например... или
если есть окружности\маркеры\линии, то можно менять их размерность\толщину\длину. в зависимости от if

так,
если какая-то $переменная, например, в критической отметке,
то можно изменить цвет на красный, увеличить размер шрифта, сделать жирным ...
и уже от соотношения, можно влиять на политику расположения координат индекса (родительского слоя)
проще говоря:
одной правкой в фоновом режиме,
можно переместить огромный графический массив, в соответствии с логикой высчитанной в UO
что идеально.
и моментально.



формат SVG в браузере отображает как картинку, но текст выделяется\ищется\редактируется, а ссылки кликабельны.
чего нет в Пейнте и сложно реализуемо в фотошопе.

ну и соответственно,
если в пейнте начать рисовать, то изменить уже невозможно.
в SVG же достаточно одной правкой, в определённой строке, определённого параметра,
отвечающего за координат Х\Y\угол\радиус\синус\косинус\экспоненту
обновлять хоть в режиме реального времени.


SVG внутри похож на HTML\XML\CSS. так что лично я (нуб) разобрался дня за 3.
теперь вспоминаю язык Пилота =) годов из 2005


____________
не знаю для чего автору рисовать сетку в пейнте................
в SVG она делается буквально тремя строками кода, прямо из Пилота.

Автор: minfin 8.9.2019, 19:10

Код

<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
    <style type="text/css">
        line { stroke: #ccc; }
    </style>
<defs>
<pattern id="diagonalHatch" width="10" height="10" patternTransform="rotate(45)" patternUnits="userSpaceOnUse">
  <line x1="0" y1="0" x2="0" y2="10" />
</pattern>
</defs>
    <rect width="100%" height="100%" fill="url(#diagonalHatch)" />
<g class="layer">
  <title>TEST</title>
  <text fill="#000000" font-family="serif" font-size="24" id="svg_1" stroke="#000000" stroke-width="0" text-anchor="middle" x="265.5" xml:space="preserve" y="77.40625">TEST[</text>
</g>

</svg>


вот вроде...
проверить времени нет. Мультизагружен =)
но так чтоб понимать примерно по коду.

id="svg_1" - и есть переменная текстового слоя TEST.
костыль именно к ней. из этой строки (через https://uopilot.uokit.com/wiki/index.php?title=RegExp) уже редактируется весь слой. как хочешь.
тот же метод к Линиям\окружностям\и тп.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)