Html скрипт обратного звонка: Cкрипт обратного звонка — кнопка «заказать звонок» для сайта

SmartLid — бесплатный скрипт обратного звонка

Всем привет. Давно уже не писал в блог. Совсем не было времени. Работа, переезд, снова работа. В общем совсем «зашивался» и к вечеру уже не оставалось никаких сил. Когда появлялась минутка, тратил ее на обучение, разбор почты, ответы на сообщения в ВК и т.д., а также на обучение js.

Чтобы процесс шел быстрее и интереснее, решил заниматься реальным проектом и сделать скрипт обратного звонка. Потом, появилось желание расширить и придумать более сложный инструмент. Чтобы не просто обратный звонок, а набор инструментов для сайта:

  • Обратный звонок
  • Контактная форма

И другие элементы, которые могут использоваться на landing page и влиять на конверсию. Вот не полный список возможностей для контактных форм, которых планирую реализовать:

  • Подключение до 3 кнопок.
  • Выбор, между использованием иконического шрифта FontAwesome или svg, png, jpg иконками.
  • Редактирование placeholder у полей.
  • Редактирование заголовков форм.
  • Редактирование иконок форм и кнопок, вызывающих форму.
  • 3 положения основной кнопки.
  • Настройка внешнего вида (несколько тем оформления).
  • Возможность сделать поля обязательными для заполнения.
  • Возможность подключения reCaptcha.
  • Передача utm меток.
  • Передача в сообщении города пользователя.
  • Возможность вызова формы своей кнопкой расположенной в любом месте на сайте.
  • Настройка цели для Метрики.
  • Передача файла.
  • Отправка письма на несколько адресов.
  • Автоматическая отправка письма пользователю.
  • Автоматическое всплывание формы, через время.
  • Возможность подключения своих форм.
  • Связь с CRM Битрикс 24.

Буду рад услышать ваши пожелания, замечания и критику. Я в курсе, что скрипт не идеален с точки зрения кода.

Начал я с того, что все делал на чистом js, так как хотел обойтись без фреймворков. Потом, часть переделал с использованием jQuery. Все будет дорабатываться и улучшаться по мере изучения, но буду рад услышать ваши советы о том, как уменьшить потребления памяти и улучшить стиль кода.

Мне показалось, что подобные скрипты довольно популярны, так как нашел несколько готовых и успешно используемых инструментов. Например, callme.js. Кроме того, недавно писал статью о корзине для Landing page, которую сделал один парень и выложил в сеть. Так вот, оказалось, что файлы отвечающие за отправку письма лежат у него на сервере. И сам был свидетелем того, что сайт у него упал больше чем на сутки, и все пользователи не могли принять заказы. Для кого-то эта ситуация могла стоить неплохих денег. Я, в сою очередь, планирую сделать скрипт, в который будет полностью находится на вашем сервере и подобных ситуаций возникать не будет.

К версии 1.0 надеюсь сделать полноценный инструмент для повышения конверсии на landing page, поэтому и назвал скрипт — SmartLid.

Всегда актуальная версия скрипта будет находится по адресу:

  • https://smartlanding.biz/smartlid/

Кроме того, там расположена инструкция по подключению и демонстрация работы. Если возникнут вопросы, критика и пожелания, смело пишите в комментариях или в форме обратной связи на странице скрипта.

Надеюсь, скоро все устаканится и получится чаще писать в блог. Чтобы ускорить написание какой-то из статей, вы по-прежнему можете предложить тему на этой странице.

Скрипт обратного звонка Callme 2.0 — Tokar.ua

Callme

С ноутбуком в белградском хостеле я смотрю на Дунай и заканчиваю новый релиз Callme. Он не зря носит имя 2.0, в нем новое почти все. И это реально круто — сейчас вы в этом убедитесь.

Первый релиз Callme, версия 0.2, вышла в свет ровно три года назад и постоянно менялась. C тех пор я получал множество вопросов от вас: о кодировке, конфликтах со старыми версиями jQuery. Не оставлял без внимания пожелания в блоге и на форуме. В результате и получилась вторая версия скрипта.

Пока заканчивалась работа над другим продуктом, я решил, что мне срочно нужно переделать Callme. Забросив все остальные дела, я так и сделал. Подробнее о своей работе я напишу в другом посте, а этот ожидаемо будет посвящен только релизу. Поехали!

Что такое Callme

Callme — это бесплатный скрипт обратного звонка.

Подробнее о скрипте читайте в описании Callme.

Скрипт бесплатный, вы можете пользоваться им на своих сайтах. Можно поддержать меня и купить лицензию, это стоит от 7$ на ваше усмотрение, а как это сделать, написано здесь.

Что нового в версии 2.0

Новое почти все и вы заметите улучшения с первого взгляда. Расскажу по пунктам:

  1. работа с любыми версиями jQuery, начиная от 1.4
    ; В прошлых версиях для jq от 1.4 до 1.7 требовалось вносить изменения в код, теперь этого делать не нужно. Если ваш сайт работает со старыми версиями, я не буду больше сетовать на это, а скрипт не будет и подавно;
  2. Callme теперь работает одинаково в кодировке utf-8 и win-1251; нет, правда, если ваш сайт работает в win-1251, это больше не проблема;
  3. скрипт можно подключать из любой папки, вообще из любой… Наконец-то, скажете вы, я не смогу говорить, что скрипт загружен не туда. И окажетесь правы.
  4. можно указывать, какие поля должны быть обязательными к заполнению. Если этого не сделать, обязательными будут все текстовые поля формы;
  5. можно добавлять placeholder для текстовых полей, подробно об этом написано в инструкции;
  6. быстрая загрузка формы; теперь все, кроме отправки, происходит прямо в браузере, форма грузится за долю секунды;
  7. множество других мелких доработок.

Как выглядит

Скрипт содержит 6 шаблонов оформления:

  • apple — в стиле Apple;
  • default — по умолчанию, самый крутой;
  • blackred — чёрно-красный;
  • vk — в стиле ВКонтакте;
  • fb — Facebook;
  • pink — Розовый.

Чтобы поменять шаблон, достаточно обновить его название в настройках скрипта.

Установка

Процесс установки и настройки не изменился, скрипт по-прежнему подключается в одну строку. Пожалуйста, добавляйте вызов скрипта в самый конец вашего html-кода. Вот инструкции:

  • Установка и настройка Callme  
  • Настройка SMS-уведомлений

Посмотреть и скачать

Посмотреть скрипт в работе:

Сценарий обратного вызова

Сценарий обратного вызова используется для классификации попытки вызова для запроса обратного вызова. Всегда используйте сценарий обратного вызова в очереди обратного вызова, либо сценарий по умолчанию, либо создайте его самостоятельно, используя тип сценария обратного вызова. Если вы создаете собственный сценарий, сценарий должен содержать классификационную функцию Call Attempt Result и ее варианты ответа, поскольку возможный повтор планируется в соответствии с результатом вызова. Дополнительные сведения см. в таблице

Сценарий обратного вызова по умолчанию .

В таблице ниже описаны используемые поля сценария обратного вызова по умолчанию.

Таблица 1. Сценарий обратного вызова по умолчанию

Функция обратного вызова

Техническое наименование

Описание

Никто

{CBR_NONE}

Описывает сценарий и его назначение.

Агенты не могут редактировать эту информацию.

Номер клиента

{CBR_ORIGCALLERNBR}

Используется для отображения номера вызывающего абонента, на который будет сделан вызов с запросом обратного вызова.

Агенты могут редактировать эту информацию. Это полезно в тех случаях, когда клиент отвечает и просит агента перезвонить позже на другой номер.

Имя клиента

{CBR_EXTRADATA_CUSTOMERNAME}

Используется для отображения имени вызывающего абонента, если он распознан.

Агенты могут редактировать эту информацию.

Запрос обратного вызова создан

{CBR_CREATIONTIME}

Используется для отображения времени создания запроса обратного вызова.

Агенты не могут редактировать эту информацию.

Попытки вызова

{CBR_CALLPROGRESS}

Используется для отображения количества попыток вызова. Первое число показывает текущую попытку звонка, а второе общее количество попыток звонка, например 1/3. Агенты не могут редактировать эту информацию.

Определите количество попыток вызова в системных службах > Настройки обратного вызова очереди > Максимальное количество вызовов.

Последняя попытка вызова и ее результат

{CBR_LASTCALLTIME}

Используйте это поле для отображения времени выполнения предыдущего обратного вызова и его результата.

Агенты не могут редактировать эту информацию.

Результат попытки вызова

{CBR_LASTRESULT}

Используется агентами для классификации обратного вызова.

Это поле является обязательным, поскольку оно классифицирует обратный вызов, и в зависимости от результата запрос удаляется из системы или перепланируется.

Варианты ответов следующие:

  • 01 — Успешный

  • 02 — Занят

  • 03 — Нет ответа

  • 04 – Голосовая почта

  • 99 — Другая причина

Дополнительные комментарии

{CBR_NOTES}

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

В следующей таблице показаны другие функции, доступные для сценария обратного вызова. Агенты могут редактировать всю информацию о клиенте.

Таблица 2. Другие функции сценария обратного вызова

Функция обратного вызова

Техническое наименование

Описание

Название компании клиента

{CBR_EXTRADATA_CUSTOMERCOMPANY}

Используется для отображения названия компании звонящего, если оно доступно.

Должность клиента

{CBR_EXTRADATA_CUSTOMERTITLE}

Используется для отображения имени вызывающего абонента, если оно доступно.

Электронная почта клиента

{CBR_EXTRADATA_CUSTOMEREMAIL}

Используется для отображения электронной почты вызывающего абонента, если она доступна.

Мобильный телефон клиента

{CBR_EXTRADATA_CUSTOMERMOBILE}

Используется для отображения мобильного телефона звонящего, если он доступен.

Номер телефона клиента

{CBR_EXTRADATA_CUSTOMERNUMBER}

Используется для отображения номера телефона вызывающего абонента, если он доступен.

Количество попыток

{CBR_MAXCALLS}

Используется агентами для изменения количества повторных попыток обратного вызова. Варианты ответов должны быть переключателями от 0 до 3.

Обратные вызовы

— Руководство разработчика NUKE Python v10.5v1, документация в НУКЕ.

Вы можете использовать все функции nuke.add…() в файлах init.py или menu.py . Таким образом, код считается частью вашей среды NUKE и не меняется от сценария к сценарию.

Все функции nuke.add…() принимают одни и те же аргументы, например: :

  • callable — это callable Python, например, имя определенной функции.

  • args — список аргументов. Они должны быть в скобках. Например:

     nuke.addOnCreate(nuke.tprint, («что печатать»)). 
  • kwargs — это список аргументов, представленных в виде пар ключевое слово+значение. Например:

     nuke.addOnCreate(nuke.tprint, ('a', 'b'), {'sep': ','}) 
  • nodeClass код вызывается, только если nuke.thisNode().nodeClass() соответствует этой строке. Например:

     nuke.addOnCreate(nuke.tprint, ('Создание записи'), nodeClass='Запись') 

Значение по умолчанию «*» означает, что это вызывается для всех узлов.

Во время обратного вызова есть узел контекста (затронутый узел), который проверяется с помощью nuke.thisNode() . Для KnobChanged также есть регулятор контекста, который вы можете получить с помощью nuke.thisKnob() .

Для многих функций nuke. add…() , таких как onCreate, также есть регуляторы с теми же именами. Эти ручки делятся на две категории:

  • Видимые ручки — это ручки, которые художники должны редактировать. Их можно увидеть на вкладке Python некоторых панелей свойств. К видимым ручкам относятся onScriptLoad, onScriptSave, onScriptClose, beforeRender, beforeFrameRender, afterRender и afterFrameRender.
  • Скрытые регуляторы — они не видны ни на одной панели свойств, но их можно настроить с помощью Python. Они предназначены для того, чтобы вы могли определить поведение штуковин. Художникам не следует настраивать эти регуляторы, так как пользовательские настройки переопределяют любые сохраненные настройки гизмо. Скрытые ручки включают в себя onCreate, onDestroy, KnobChanged, updateUI и autolabel.

Если зарегистрировано много обратных вызовов, код, прикрепленный к ручкам, всегда вызывается первым перед функциями nuke. add…() . (Например, код, помещенный в ручку onCreate, вызывается перед функцией nuke.addOnCreate() .) В большинстве случаев за ним следуют все функции nuke.add…() с соответствующим nodeClass в том порядке, в котором они были добавлены, и, наконец, ‘*’, также в том порядке, в котором они были добавлены. Обратите внимание, что 9Однако функции 0305 addAutolabel() и addFilenameFilter() являются исключениями из этого правила, поскольку они вызываются в обратном порядке.

Все вызовы обратного вызова добавления имеют соответствующий вызов обратного вызова удаления.

OnUserCreate

 nuke.addOnUserCreate(функция)
nuke.removeOnUserCreate(function) 

Это выполняется всякий раз, когда пользователь создает узел с помощью графического пользовательского интерфейса (GUI) NUKE. Он также вызывается при запуске на узлах Root и Viewer. Он не вызывается при загрузке существующих скриптов, вставке узлов или отмене удаления.

Этот код можно использовать для изменения значений регуляторов по умолчанию, добавления пользовательских регуляторов и выполнения других действий с предустановленными узлами так, как их видят пользователи.

nuke.addOnUserCreate запускается сразу после того, как для ручек установлены значения по умолчанию (включая значения для ручки по умолчанию). Он запускается до onCreate . Если nuke.addOnUserCreate() не используется, для обратной совместимости вызывается nuke.tcl(«OnCreate») .

onCreate

 node.knob('onCreate')
nuke.addOnCreate(функция)
nuke.removeOnCreate(функция) 

Выполняется при создании любого узла, например, при загрузке скрипта, вставке узла, выборе пункта меню или отмене удаления. Обратите внимание, что если функция onCreate определена до загрузки скрипта, она запускается для каждого узла. Это связано с тем, что узлы создаются во время загрузки скрипта. Когда создается группа (включая корень) с несколькими внутренними узлами, onCreate вызывается сначала на внутренних узлах, а затем на самой группе. Для root это запускается при загрузке любого скрипта (см. onScriptLoad ниже) или когда выбрано Файл > Новый . Для настроек и панелей ручек Python это запускается при их создании.

Например, следующий код заставляет при создании каждого узла печатать OnCreate, вызываемый для [имя узла] в терминале:

 nuke.addOnCreate(lambda: nuke.tprint("OnCreate вызвал "+nuke.thisNode(). имя()))
onScriptLoad
root.knob('onScriptLoad'), nuke.addOnScriptLoad(функция), nuke.removeOnScriptLoad(функция) 

onScriptLoad

 root.knob('onScriptLoad')
nuke.addOnScriptLoad(функция)
nuke.removeOnScriptLoad(функция) 

Выполняется при загрузке любого скрипта сразу после onCreate для корня. Обратите внимание, что он НЕ запускается для новых скриптов.

Ручка onScriptLoad видна на вкладке Project Settings > Python .

onScriptSave

 root.knob('onScriptSave')
nuke.addOnScriptSave(функция)
nuke.removeOnScriptSave(функция) 

Запускаются, когда пользователь пытается сохранить скрипт. Если это изменит имя сценария, это будет имя, под которым сценарий будет сохранен. Ручка onScriptSave видна на вкладке Project Settings > Python .

onScriptClose

 root.knob('onScriptClose')
nuke.addOnScriptClose(функция)
nuke.removeOnScriptClose(function) 

Они запускаются, когда пользователь выходит из NUKE или закрывает скрипт, а также с помощью функции scriptClear() . Они запускаются непосредственно перед onDestroy для рута.

Ручка onScriptClose видна на вкладке Project Settings > Python .

onDestroy

 node.knob('onDestroy')
nuke.addOnDestroy(функция)
nuke.removeOnDestroy(function) 

Они выполняются при удалении любого узла, в том числе при отмене создания узла. Они вызываются в корне, когда скрипт закрывается или когда пользователь выходит из NUKE. Они НЕ запускаются для Preferences или панели ручки Python, или в случае сбоя NUKE.

Для групп и корня выполняется перед всеми потомками.

KnobChanged

 node.knob('knobChanged')
nuke.addKnobChanged(функция)
nuke.removeKnobChanged(function) 

Они выполняются, когда пользователь изменяет значение любой ручки, когда панель управления открыта. Они не вызываются рекурсивно. Вы можете найти ручку, которая была изменена, используя nuke.thisKnob() .

ручка изменена позволяет вам создавать штуковины с ручками, которые имеют такие эффекты, как включение, отключение или предустановка других ручек. Чтобы получить доступ к ручке, которая была изменена, используйте nuke.thisKnob() .

Примечание

Назначение KnockChanged — обновить внешний вид панели управления. Вы не можете использовать его для «отслеживания» ручек (например, для поддержания базы данных в актуальном состоянии со значениями всех ручек), так как она не вызывается, когда панель Properties закрыта. Чтобы отслеживать ручки, используйте updateUI , как описано ниже.

Когда пользователь открывает или закрывает панель свойств или когда он меняет входные соединения, когда панель открыта, вы можете вызвать KnobChanged с фиктивными ручками с именами showPanel и inputChange . Если вы отключаете или иным образом изменяете значения ручек при изменениях, вам, вероятно, потребуется ответить на showPanel , чтобы привести панель в правильное состояние для текущих настроек при ее открытии. Например, вы можете сделать:

 # если ползунок равен нулю, снимите галочку:
n = nuke.thisNode()
k = nuke.thisKnob()
если k.name()=="slider" или k.name()=="showPanel":
  n['checkmark'].setEnable(n['slider'].getValue()!=0) 

Вы можете использовать nuke.addKnobChanged для группировки ползунков усиления и гаммы выбранного узла ColorCorrect, чтобы, если пользователь настраивает один ползунок, другой автоматически устанавливается на то же значение. Чтобы сгруппировать ползунки, используйте следующий код:

 def gangGammaGainSliders():
 n = nuke.thisNode()
 k = nuke.thisKnob()
 если k.name() == "gamma":
   n['выигрыш'].setValue(k.value())
 Элиф k.name() == "усиление":
   n['gamma'].setValue(k.value())
nuke.addKnobChanged(gangGammaGainSliders, nodeClass="ColorCorrect") 

updateUI

 node.knob('updateUI')
nuke.addUpdateUI(функция)
nuke.removeUpdateUI(function) 

Они запускаются на каждом узле после любых изменений в скрипте. Это делается как низкоприоритетный процесс во время простоя, и поэтому NUKE, возможно, уже начал вычисление изображения для средства просмотра до вызова updateUI . Поэтому updateUI не должен вносить в скрипт такие изменения, которые меняют изображение (иначе Вьювер пришлось бы перезапускать).

updateUI запускается непосредственно перед autolabel и после handleChanged . Чтобы избежать запуска этого на каждом узле, NUKE проверяет, на что смотрит updateUI (например, номер кадра или представления), чтобы решить, запускать его или нет. Если функция не относится к номеру кадра или представления, NUKE вызывает ее только при изменении значений ручки на узле, а не при изменении кадра или представления.

автометка

 node.knob('автометка')
nuke.addAutolabel(функция)
nuke.removeAutolabel(функция) 

Они запускаются сразу после updateUI и возвращают строку для рисования узла в графе узлов. Если ручка автометки не пуста и возвращает что-либо, кроме None, возвращаемое значение отображается на узле. В противном случае функции nuke.addAutolabel() вызываются в обратном порядке, и используется первая функция, возвращающая что-либо, кроме None. Если все они возвращают None, то используется nuke.thisNode().name() .

Для обратной совместимости NUKE делает addAutolabel(__main__.autolabel) при запуске.

до рендеринга

 write.knob('beforeRender')
nuke.addBeforeRender(функция)
nuke.removeBeforeRender(function) 

Они запускаются до начала рендеринга в execute() . Если они выдают исключение, рендеринг прерывается. Их можно использовать, например, для создания целевого каталога или связи с вашей фермой рендеринга. Ручка beforeRender (до рендеринга в графическом интерфейсе) видна на 9-м узле записи.0305 Визуализация вкладка.

Совет

По умолчанию NUKE не создает каталоги при рендеринге файлов. Если у вас есть узел записи, чей элемент управления файлом указывает на несуществующий каталог, рендеринг завершится ошибкой. Однако вы можете изменить это поведение, используя функцию nuke.addBeforeRender() для регистрации функции, которая создает необходимый каталог перед рендерингом первого кадра. Вот пример того, как это сделать:

  1. Создайте файл с именем init.py в каталоге вашего плагина (если он еще не существует).

  2. Откройте файл init.py в текстовом редакторе и добавьте запись в следующем формате:

     по определению createWriteDir():
      импортировать ядерное оружие, ОС, errno
      файл = nuke. имя_файла(nuke.thisNode())
      dir = os.path.dirname( файл )
      osdir = nuke.callbacks.filenameFilter( dir )
      # справиться с уже существующим каталогом, игнорируя это исключение
      пытаться:
        os.makedirs( osdir )
      кроме OSError, e:
        если e.errno != errno.EEXIST:
          поднимать
    nuke.addBeforeRender(createWriteDir) 

доFrameRender

 write.knob('beforeFrameRender')
nuke.addBeforeFrameRender(функция)
nuke.removeBeforeFrameRender(function) 

Они запускаются до начала рендеринга каждого отдельного кадра. Если они выдают исключение, рендеринг прерывается. Их можно использовать, например, для создания целевого каталога или связи с вашей фермой рендеринга. Ручка beforeFrameRender (перед каждым кадром в графическом интерфейсе) видна на 9-м узле записи.0305 Визуализация вкладка.

afterFrameRender

 write.knob('afterFrameRender')
nuke.addAfterFrameRender(функция)
nuke.removeAfterFrameRender(function) 

Они запускаются после завершения рендеринга каждого кадра. Они не вызываются, если рендеринг прерывается. Если они выдают исключение, рендеринг прерывается. Их можно использовать, например, для копирования каждого кадра на цифровой видеомагнитофон (DVR). Ручка afterFrameRender (после каждого кадра в графическом интерфейсе) видна на 9-м узле записи.0305 Визуализация вкладка.

afterRender

 write.knob('afterRender')
nuke.addAfterRender(функция)
nuke.removeAfterRender(function) 

Они запускаются после завершения рендеринга всех кадров. Если они выдают ошибку, рендеринг прерывается. Они полезны, например, для доведения копии до цифрового видеомагнитофона (DVR) или для связи с рендер-фермой. Ручка afterRender (после рендеринга в графическом интерфейсе) отображается на вкладке Render узла записи.

afterBackgroundRender

 nuke.addAfterBackgroundRender(функция)
nuke.removeAfterBackgroundRender(function) 

Добавить код для выполнения после любого фонового рендеринга. Вызов должен иметь вид:

 def foo(context):
  pass 
Объект контекста, который передается, представляет собой словарь, содержащий следующие элементы:
  • id — Идентификатор завершенной задачи.

Имейте в виду, что текущий контекст NUKE не имеет смысла в обратном вызове, например nuke.thisNode возвращает случайный узел.

afterBackgroundFrameRender

 nuke.addBackgroundFrameRender(функция)
nuke.removeAfterBackgroundFrameRender(function) 

Добавьте код для выполнения после каждого кадра фонового рендеринга. Вызов должен иметь вид:

 def foo(context):
  pass 
Объект контекста, который передается, представляет собой словарь, содержащий следующие элементы:
  • id — идентификатор задачи, которая выполняется.
  • кадр — номер текущего рендеримого кадра.
  • numFrames — Общее количество кадров для рендеринга
  • frameProgress — количество отрендеренных кадров.

Имейте в виду, что текущий контекст NUKE не имеет смысла в обратном вызове, например, nuke.thisNode возвращает случайный узел.

filenameFilter

 nuke.addFilenameFilter(функция)
nuke.removeFilenameFilter(функция) 

Это добавляет функцию фильтра, которая обрабатывает любые имена файлов, которые находятся в сценарии NUKE, перед передачей сценария в систему. Эти фильтры можно использовать для устранения различий между операционными системами или для вставки необходимых частей имен путей. Этот обратный вызов должен быть единственным строковым аргументом и может либо возвращать новую строку, либо None (что эквивалентно возврату строки без изменений). Для имен файлов, которые не относятся к определенному узлу, например, имена подключаемых модулей, эта функция вызывается с кодом 9.0305 nuke.thisNode() установлен на корневой узел. Все функции, переданные в nuke.addFilenameFilter , вызываются в обратном порядке (первым вызывается та, которая добавлена ​​последней).

Для обратной совместимости, если никакие функции не были добавлены, NUKE запускает main.filenameFix(s) . Версия этой функции по умолчанию, в свою очередь, вызывает nuke.tcl(‘filename_fix’,s) .

В приведенном ниже примере фильтр имени файла используется для сопоставления путей Windows и путей Linux в общей смешанной среде Windows и Linux. Например, рабочие станции работают под управлением Windows и имеют доступ к общему диску, смонтированному как «y:». В Linux это соответствует точке монтирования ‘/mnt/y/’:

 импорт ядерной бомбы
def myFilenameFilter (имя файла):
    если nuke.env['LINUX']:
        имя_файла = имя_файла.replace('y:', '/mnt/y')
        имя_файла = имя_файла.replace('x:', '/mnt/x')
    еще:
        имя_файла = имя_файла.replace('/mnt/y', 'y:')
        имя_файла = имя_файла.replace('/mnt/x', 'x:')
    вернуть имя файла
nuke.addFilenameFilter(myFilenameFilter) 

validateFilename

 nuke.addValidateFilename(функция)
nuke. removeValidateFilename(function) 

Добавьте функцию для проверки имени файла в узлах записи. Первый аргумент — это имя файла, и он должен возвращать логическое значение относительно того, является ли имя файла допустимым или нет. Если предоставляется обратный вызов, он контролирует, будет ли Кнопка Render узлов Write и кнопка Execute узлов WriteGeo, включена или нет.

autoSaveFilter

 nuke.addAutoSaveFilter(функция)
nuke.removeAutoSaveFilter(function) 

Добавьте функцию для изменения имени файла автосохранения перед тем, как NUKE сохранит текущий скрипт по тайм-ауту автосохранения.

Функция фильтра должна иметь вид:

 def myAutoSaveFilter(имя файла):
  return filename 

Первым аргументом фильтра является текущее имя файла автосохранения. Фильтр возвращает имя файла для сохранения автосохранения или Нет , если автосохранение не требуется.

См. Использование обратных вызовов автосохранения для реализации последовательного автосохранения в качестве примера использования фильтров автосохранения.

autoSaveRestoreFilter

 nuke.addAutoSaveRestoreFilter(функция)
nuke.removeAutoSaveRestoreFilter(function) 

Добавьте функцию для изменения имени файла автосохранения до того, как NUKE попытается восстановить файл автосохранения.

Функция фильтра должна иметь вид:

 def myAutoSaveRestoreFilter(имя файла):
  вернуть имя файла 

Первым аргументом фильтра является имя текущего файла автосохранения. Эта функция возвращает имя файла для загрузки автосохранения или None , если файл автосохранения не требуется. Если фильтр восстановления автосохранения возвращает None , это также подавляет диалоговое окно NUKE, которое спрашивает пользователя, хотят ли они восстановить найденное автосохранение.

См. Использование обратных вызовов автосохранения для реализации последовательного автосохранения в качестве примера использования фильтров автосохранения.

autoSaveDeleteFilter

Добавьте функцию для изменения имени файла автосохранения до того, как NUKE попытается удалить файл автосохранения.

Функция фильтра должна иметь вид:

 def myAutoSaveDeleteFilter(имя файла):
  return filename 

Первым аргументом фильтра является текущее имя файла автосохранения. Эта функция возвращает имя файла для удаления или возвращает None, если ни один файл не требует удаления.

См. Использование обратных вызовов автосохранения для реализации последовательного автосохранения в качестве примера использования фильтров автосохранения.

Использование обратных вызовов автосохранения для реализации непрерывного автосохранения

В приведенном ниже примере используются три обратных вызова автосохранения для реализации непрерывного автосохранения. Каждый раз, когда вызывается автосохранение, создается новое автосохранение, пронумерованное от 1 до 9 (с переходом на 0). Например: автосохранение, автосохранение1, автосохранение2… автосохранение9.

 импортное ядерное оружие
импортировать глобус
время импорта
импорт ОС
### Пример реализации последовательного автосохранения с использованием обратных вызовов autoSaveFilter
###
## автосохранения прокручиваются от 0 до 9например, мой файл. автосохранение, мой файл.автосохранение1, мойфайл.автосохранение2...
#
## Чтобы использовать, просто добавьте 'import nukescripts.autosave' в ваш init.py
def onAutoSave (имя файла):
  ## игнорировать незавершенное автосохранение
  если nuke.root().name() == 'Корень':
    вернуть имя файла
  файл№ = 0
  файлы = getAutoSaveFiles (имя файла)
  если len(файлы) > 0 :
    последнийФайл = файлы[-1]
    # получить номер последнего файла
    если len(lastFile) > 0:
      пытаться:
        номер_файла = int(последнийФайл[-1:])
      кроме:
        проходить
      № файла = № файла + 1
  если ( № файла > 9):
    файл№ = 0
  если (№ файла!= 0):
    имя файла = имя файла + строка (№ файла)
  вернуть имя файла
def onAutoSaveRestore (имя файла):
  файлы = getAutoSaveFiles (имя файла)
  если длина (файлы) > 0:
    имя файла = файлы[-1]
  вернуть имя файла
def onAutoSaveDelete(имя файла):
  ## удалять только автосохранение до тех пор
  если nuke.root().name() == 'Корень':
    вернуть имя файла
  # вернуть здесь None, чтобы не удалять файл автосохранения
  возврат Нет
  
def getAutoSaveFiles (имя файла):
  список_файлов_даты = []
  файлы = glob. glob (имя файла + '[1-9]')
  files.extend(glob.glob(имя файла))
  для файла в файлах:
      # извлекает статистику для текущего файла в виде кортежа
      # (режим, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)
      # элемент кортежа mtime с индексом 8 является датой последнего изменения
      статистика = os.stat(файл)
      # создать кортеж (год гггг, месяц (1-12), день (1-31), час (0-23), минута (0-59), секунда (0-59),
      # день недели(0-6, 0 - понедельник), день по юлианскому календарю(1-366), флаг дневного света(-1,0 или 1)) из секунд с начала эпохи
      # примечание: этот кортеж можно правильно отсортировать по дате и времени
      lastmod_date = время.местное время (статистика [8])
      #print image_file, lastmod_date # тест
      # создать список кортежей, готовых к сортировке по дате
      date_file_tuple = lastmod_date, файл
      date_file_list.append (date_file_tuple)
   
  date_file_list.sort()
  return [имя файла для _, имя файла в date_file_list]
nuke.addAutoSaveFilter(при автосохранении)
nuke. addAutoSaveRestoreFilter( onAutoSaveRestore )
nuke.addAutoSaveDeleteFilter( onAutoSaveDelete )
### В качестве примера для удаления обратных вызовов используйте этот код
#nuke.removeAutoSaveFilter( при автосохранении )
#nuke.removeAutoSaveRestoreFilter( onAutoSaveRestore )
#nuke.removeAutoSaveDeleteFilter( onAutoSaveDelete )
 

Использование обратных вызовов в корневом каталоге для добавления стереоустановки

Чтобы добавить сценарий, устанавливающий новые проекты в качестве проекта стерео/мультипросмотра, вы можете сделать что-то вроде этого:

 # при необходимости импортируйте модуль, содержащий нужный сценарий. выполняться при запуске:
примеры импорта
# подготовка аргумента для этого конкретного скрипта
просмотры = [('L', (0,.5,0)), ('R', (.5,0,0)), ('M', (.5,.5,0))]
# добавляем скрипт в callback
nuke.addOnUserCreate(examples.setUpMultiView, views, nodeClass='Root') 

Для получения подробной информации о сценарии setupMultiView см. Настройка стерео

Обратный вызов onUserCreate запускается каждый раз, когда пользователь создает узел в первый раз (тогда как обратный вызов onCreate создается каждый раз, когда узел создается создается, даже если он скопирован или загружен с диска). Поскольку корень является узлом, мы можем использовать фильтр nodeClass , чтобы убедиться, что этот скрипт запускается только при создании корневого узла.

С вышеуказанной записью в вашем menu.py или init.py , новые сценарии nuke теперь имеют три вида: L (зеленый), R (красный) и M (желтый):

Цветовые пространства по умолчанию

Начиная с NUKE 10, вы можете динамически заменять цветовые пространства по умолчанию, используемые на узлах чтения и записи в DAG.

Цветовое пространство по умолчанию — это то, которое объекты Reader и Writer для конкретного файла сообщают NUKE, что оно лучше всего подходит для файла, который читается или записывается, и его можно выбрать одним из нескольких способов:

  • файл может хранить цветовое пространство по имени в метаданных или заголовке файла, Reader может использовать это для установки цветового пространства по имени
  • файл может содержать данные определенного типа, 8-битные, 16-битные, данные с плавающей запятой или данные пространства журнала, и запросить NUKE использовать соответствующее цветовое пространство для этого типа из настроек проекта
  • Reader/Writer, обладающий глубоким знанием NUKE, может запросить встроенный тип LUT по идентификатору, например REDLog, AlexaLog, ProTune или Gamma2. 2 (полный список см. в перечислении DataType в DDImage/LUT.h)

Благодаря поддержке конфигураций OpenColorIO (OCIO) в NUKE теперь проще ввести цветовое пространство, с которым не могут сопоставляться поставляемые NUKE устройства чтения и записи, и, следовательно, легче получить NUKE в состоянии ошибки из-за несоответствия цветовых пространств, особенно с пользовательскими конфигурациями OCIO. Эти обратные вызовы помогут вам избежать такой ошибки с пользовательскими конфигурациями.

Так же, как и все остальные обратные вызовы, вы можете добавлять и удалять обратные вызовы с помощью следующего API:

 nuke.addDefaultColorspaceMapper(function)
nuke.removeDefaultColorspaceMapper(функция) 

Функция должна иметь вид:

 def myDefaultColorspaceMapper(colorspaceName, dataTypeHint) :
  # ... сопоставить имя цветового пространства с желаемым цветовым пространством ...
  return colorspaceName 
Объекты переданы:
  • имя — Текущее имя цветового пространства, запрошенное программой чтения/записи, которое может быть установлено на одно из значений по умолчанию NUKE или любое другое существующее или несуществующее цветовое пространство независимо от того, существует оно или нет.
  • dataTypeHint — Как указано выше, это будет значение, которое представляет один из 3 аспектов
    • nuke.INVALID — Цветовое пространство было установлено по имени и только по имени
    • значение, связанное с настройкой проекта, см. ниже. ColorspaceName будет первоначально установлено на соответствующее значение настройки проекта, обратите внимание, что, поскольку эти обратные вызовы объединены в цепочку, вы не можете полагаться на цветовое пространство, соответствующее цветовому пространству, заданному в проекте, поскольку ранее выполненные обратные вызовы могут поменяли
    • ID встроенной NUKE LUT, см. ниже — colorspaceName будет первым значением в списке цветовых пространств

Значения подсказки связанных типов данных проекта:

  • nuke.INT8 — имя цветового пространства будет установлено на имя цветового пространства в ручке «8-битные файлы» в настройках проекта
  • nuke. INT16 — имя цветового пространства будет установлено на имя цветового пространства в ручке «16-битные файлы» в настройках проекта
  • nuke.MONITOR — название цветового пространства будет установлено на имя цветового пространства в ручке «монитор» в настройках проекта. Используется для дисплеев, например, для просмотра и почтовых марок
  • nuke.FLOAT — имя цветового пространства будет установлено на имя цветового пространства в ручке «плавающие файлы» в настройках проекта
  • nuke.LOG — имя цветового пространства будет установлено на имя цветового пространства в ручке «файлы журнала» в настройках проекта
Другие значения типов данных, которые сопоставляются со встроенными LUT, находятся в DDImage/LUT.h, обратная совместимость с Reader и Writers:
  • nuke.VIEWER — не используется
  • 6 — эквивалентно DD::Image::LUT::GAMMA1_8
  • 7 — эквивалентно DD::Image::LUT::GAMMA2_2
  • 8 — эквивалентно DD::Image::LUT::GAMMA2_4
  • 9 — эквивалент DD::Image::LUT::PANALOG
  • 10 — эквивалентно DD::Image::LUT::REDLOG
  • 11 — эквивалент DD::Image::LUT::VIPERLOG
  • 12 — эквивалентно DD::Image::LUT::ALEXAV3LOGC
  • 13 — эквивалентно DD::Image::LUT::PLOGLIN
  • 14 — эквивалентно DD::Image::LUT::SLOG
  • 15 — эквивалентно DD::Image::LUT::SLOG1
  • 16 — эквивалентно DD::Image::LUT::SLOG2
  • 17 — эквивалентно DD::Image::LUT::SLOG3
  • 18 — эквивалентно DD::Image::LUT::CLOG
  • 19 — эквивалент DD::Image::LUT::PROTUNE

Например, если вы хотите поддерживать конфигурацию предварительного просмотра ACES 1.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *