Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Архитектура, описанная в этом разделе, обеспечивает поддержку пользовательских трехмерных принтеров USB-интерфейса в экосистемах печати версии 3 и версии 4. Стандартный монитор портов, 3dmon.dll, пересылает 3D-команды задания печати в службу Windows 3DPrintService, запущенный с учетными данными локальной службы. Служба загружает и взаимодействует с DLL партнеров для выполнения пользовательских команд, необходимых для задания трехмерной печати. Библиотека DLL партнёра, а также распространяемые компоненты 3dmon.dll и 3dprintservice.exe устанавливаются пакетом USB-драйвера устройства. Библиотека DLL партнера должна реализовать и экспортировать набор функций для взаимодействия с 3DPrintService. Остальная часть необходимой функциональности для взаимодействия со службой диспетчера печати реализована в 3dmon.dll.
Примечание.
Для этой архитектуры требуется, чтобы DLL партнера поддерживала многократное создание экземпляров и была потокобезопасной.
Решения по архитектуре
Служба windows 3DPrintService используется для загрузки и вызова определенных API в библиотеках DLL, предоставляемых партнером, во время рабочего процесса печати. Эти API позволяют осуществлять обмен данными с принтером.
Пакеты драйверов USB-фильтра KMDF публикуются в Обновлениях Windows для установки с помощью Plug and Play (PnP) для поддерживаемого 3D-принтера. Драйвер KMDF устанавливает партнерское программное обеспечение и создает 3D-узел устройства принтера. Узел устройства 3D-принтера устанавливается при помощи опубликованного партнером драйвера печати версии v4 из Центра обновления Windows.
Решения по упаковке
Двоичные файлы и двоичные зависимости
В архитектуре используется драйвер, опубликованный производителем оборудования в Центре обновления Windows. Этот драйвер включает в себя следующие распространяемые двоичные файлы, предоставляемые Корпорацией Майкрософт, и их зависимости:
3dmon.dll
3dprintservice.exe
ms3dprintusb.sys
Драйвер USB-фильтра в режиме ядра
Драйвер KMDF публикуется партнером и состоит из компонентов, показанных на схеме ниже. Это связывает устройство с аппаратным идентификатором (как правило, VID и PID). Драйвер при установке создает узел устройства 3D-принтера, который активирует установку очереди печати и драйверов программного обеспечения для нарезки. Партнер предоставляет драйверы принтера версии 4 для созданного узла устройства 3D-принтера.
MS3DPrintUSB.sys
Драйвер устройства в режиме ядра, создающий узел разработки 3D-принтера в разделе Enum\3DPrint. Он вызывается подсистемой PnP посредством прямого сопоставления VID и PID на основе узла устройства, созданного Winusb.sys. Inf-файл драйвера настраивает пользовательскую библиотеку DLL, используемую для установки 3DPrintService (если она еще не установлена в системе).
3dmon.dll
3DMon.dll — это библиотека мониторинга порта, опубликованная корпорацией Майкрософт, которая вызывается спулером, чтобы взаимодействовать с трёхмерным принтером.
3dprintservice.exe
3DPrintService.exe — это опубликованный корпорацией Майкрософт двоичный файл в качестве службы Windows во время установки драйвера. 3DMon взаимодействует с этой службой для выполнения таких операций, как печать, биди и т. д. с трехмерными принтерами.
Partnerimpl.dll
Partnerimp.dll — это реализация интерфейса Microsoft, выполненная партнёром. Библиотека DLL взаимодействует с устройством партнера, используя их собственные протоколы. 3DPrintService.exe загружает эту библиотеку DLL во время выполнения, чтобы управлять операциями устройства 3D-принтера.
Последовательность использования принтера
Spooler взаимодействует с 3dmon.dll, который отправляет команды в службу Windows 3DPrintService.
3DPrintService.exe выполняется с учетными данными учетной записи NetworkService.
Spooler через 3dmon.dll отправляет команды в 3DPrintService в любое время, когда используется трехмерный принтер.
3DPrintService обрабатывает команды и вызывает API во время выполнения в библиотеках DLL реализации, предоставляемых партнером.
3DPrintService передает ответы от предоставленных партнером БИБЛИОТЕК DLL обратно в spooler
Интерфейсы и взаимодействия
DLL библиотеки партнера должна экспортировать API функции в следующем порядке:
HRESULT Install([in] LPCWSTR args)
Этот API является необязательным и может использоваться производителем для установки пользовательского программного обеспечения или регистрации для своего устройства. Например, установка моделирования, включенная в пакет драйвера для устройства. Этот API вызывается с учетными данными SYSTEM, чтобы включить установку.
DWORD PrintApiSupported()
Этот API используется сторонними производителями, чтобы указать версию поддерживаемого API 3D-службы печати. Приведенные ниже API совместимы с версией 1 3DPrintService.
HRESULT InitializePrint(LPCWSTR pPrinterName, LPCWSTR pPortName, DWORD dwJobId, LPVOID* ppPartnerData)
Этот API вызывается перед началом события печати, чтобы инициализировать принтер. Принтер может сохранить определенное состояние задания в параметре ppPartnerData. Этот вызов аналогиен вызову StartDocPort.
jobId — идентификатор задания, используемый для отслеживания задания
portName — имя порта для трехмерного принтера
printerName — имя принтера, в который отправляется задание печати.
ppPartnerData — указатель на указатель, который можно использовать для хранения данных конкретного задания.
HRESULT PrintFile([in] DWORD jobId, [in] LPWSTR portName, [in] LPWSTR printerName, [in] LPWSTR pathToRenderedFile,[in]LPVOID* ppPartnerData)
Этот API используется сторонними производителями для печати документа на принтере.
jobId — идентификатор задания, используемый для отслеживания задания
portName — имя порта для трехмерного принтера
printerName — имя принтера, в который отправляется задание печати.
pathToRenderedFile — UNC-путь к расположению spooled-файла после отрисовки. Сторонний производитель обрабатывает файл из этого расположения и печатает документ на своем устройстве.
ppPartnerData — указатель на указатель, выданный для хранения конкретной настройки данных партнера во время вызова API InitializePrint.
Имя принтера можно получить из реестра с помощью имени порта. Сторонние производители могут не использовать имя порта для связи с устройством. Имя принтера уникально на компьютере с Windows, и его программное обеспечение сможет определить, на каком принтере напечатать задание. Все принтеры, активные на компьютере, можно найти в следующем разделе реестра:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers
HRESULT Query(_In_ LPCWSTR command, _In_ LPCWSTR commandData, _Out_ LPWSTR resultBuffer, _Out_ resultBufferSize, _In_ LPVOID* ppPartnerData)
команда — строка, отправленная в виде запроса
commandData — аргументы команд (необязательно)
resultBuffer — результат вызова аргументов запроса>
resultBufferSize — размер строки буфера результата
ppPartnerData — указатель на указатель на текущий экземпляр DLL партнера
Служба 3Dprint вызывает библиотеку DLL партнера, чтобы получить размер буфера для выделения под команду.
После выделения памяти для хранения строки ответа библиотека DLL будет вызвана снова, чтобы получить фактический результат.
Библиотека DLL может использовать данные экземпляра из предыдущего вызова InitializePrint() для взаимодействия с устройством без открытия нового канала связи при каждом вызове функции Query().
Этот API используется для обмена данными с принтером для получения сведений о конфигурации устройства, ходе печати или уведомления партнерской DLL о событиях отключения устройства.
Приведенные ниже команды должны поддерживаться производителем:
Команда | CommandData | Выходные данные | Комментарии |
---|---|---|---|
\\Printer.3DPrint:JobStatus | Задание началось = {"Status": "ok"}, состояние, которое будет использоваться при завершении {"Состояние": "Завершено"} | Спулер отобразит любое возвращаемое значение в пользовательском интерфейсе очереди печати. Это позволяет устройству отображать соответствующие сведения во время печати в пользовательском интерфейсе очереди печати. Устройство может вернуть произвольную строку здесь (например, "Занят" или "33% завершено"), и это будет отображаться в состоянии задания очереди печати. | |
\\Printer.3DPrint:JobCancel | {"Status": "Completed"} | Средство spooler вызовет эту команду, когда пользователь отменяет печать. Библиотека DLL партнера возвращает это значение, когда отмена была успешной, а дескрипторы и потоки были закрыты. | |
\\Printer.Capabilities:Data | XML-строка, соответствующая схеме PrintDeviceCapabilites (PDC). | Запрос PDC вызывается приложениями, которые хотят получить дополнительные сведения о принтере. Данные используются для описания возможностей устройства и могут включать параметры среза, если драйвер использует срез Майкрософт. См. ниже образец PDC (Программа подготовки специалистов). | |
\\Printer.3DPrint:Отключить | {"Status": "OK"} | Этот запрос активируется всякий раз при отключении PnP устройства принтера. Партнеры могут выполнять любые необходимые действия, например закрыть любые открытые дескрипторы, чтобы обеспечить правильное повторное подключение. | |
\\Printer.3DPrint:Connect | {"Status":"OK"} | Этот запрос активируется всякий раз, когда происходит PnP-подключение устройства принтера. Партнеры могут выполнять любые необходимые действия. |
XML-код возможностей устройства печати
В качестве примера можно использовать следующий XML-файл с описанием возможностей устройства печати.
<?xml version="1.0"?>
<PrintDeviceCapabilities
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="https://www.w3.org/2001/XMLSchema"
xmlns:xml="https://www.w3.org/XML/1998/namespace"
xmlns:psk="https://schemas.microsoft.com/windows/2003/08/printing/printschemakeywords"
xmlns:psk3d="https://schemas.microsoft.com/3dmanufacturing/2013/01/pskeywords3d"
xmlns:psk3dx="https://schemas.microsoft.com/3dmanufacturing/2014/11/pskeywords3dextended"
xmlns:pskv="https://schemas.microsoft.com/3dmanufacturing/2014/11/pskeywordsvendor"
xmlns:psf="https://schemas.microsoft.com/windows/2003/08/printing/printschemaframework"
xmlns:psf2="https://schemas.microsoft.com/windows/2013/12/printing/printschemaframework2"
xmlns="https://schemas.microsoft.com/windows/2013/12/printing/printschemaframework2"
version="2">
<CapabilitiesChangeID xsi:type="xsd:string">{9F58AF07-DCB6-4865-8CA3-A52EA5DCB05F}</CapabilitiesChangeID>
<psk3d:Job3DOutputArea psf2:psftype="Property">
<psk3d:Job3DOutputAreaWidth>150001</psk3d:Job3DOutputAreaWidth>
<psk3d:Job3DOutputAreaDepth>150001</psk3d:Job3DOutputAreaDepth>
<psk3d:Job3DOutputAreaHeight>150001</psk3d:Job3DOutputAreaHeight>
</psk3d:Job3DOutputArea>
<psk3d:Job3DMaterials psf2:psftype="Property">
<psk3dx:MaterialPLA>
<psk:DisplayName>PLA</psk:DisplayName>
<psk3d:Job3DMaterialType>psk3d:PLA</psk3d:Job3DMaterialType>
<psk3d:MaterialColor>#FFFFFFFF</psk3d:MaterialColor>
<psk3dx:platformtemperature>0</psk3dx:platformtemperature>
<psk3dx:filamentdiameter>1750</psk3dx:filamentdiameter>
<psk3dx:filamentcalibrationoverride>1.0</psk3dx:filamentcalibrationoverride>
<psk3dx:extrudertemperature>207</psk3dx:extrudertemperature>
<psk3dx:SpeedFactor>1.0</psk3dx:SpeedFactor>
<psk3dx:SetupCommands>
<!-- Executed during pre-commands: nozzle pre-heating, priming, etc -->
<psk3dx:command>M104 S207 T1</psk3dx:command>
<psk3dx:command>M140 S50</psk3dx:command>
</psk3dx:SetupCommands>
<psk3dx:SelectCommands>
<!-- Executed during printing: T0/T1 selection, nozzle wiping sequence,turn fan on/off/gradual, retract the material, temperature, etc-->
<psk3dx:command>; PLA on</psk3dx:command>
<psk3dx:command>M108 T1</psk3dx:command>
</psk3dx:SelectCommands>
<psk3dx:DeselectCommands>
<!-- Executed during printing: retract the material, park the nozzle, reduce temperature, etc -->
<psk3dx:command>; PLA off</psk3dx:command>
</psk3dx:DeselectCommands>
</psk3dx:MaterialPLA>
</psk3d:Job3DMaterials>
<psk3dx:customStatus>Slicing</psk3dx:customStatus>
<psk3dx:userprompt>Confirm the 3D printer is calibrated and ready for the next print</psk3dx:userprompt>
<!— Additional Slicer settings follow (optional) -->
</PrintDeviceCapabilities>
Для трехмерных принтеров, которые не имеют встроенного дисплея и кнопок, чтобы разрешить пользователю взаимодействовать с устройством в начале печати, мы выступаем за возвращение xml PDC с подходящим набором сообщений запроса пользователя, как показано выше в psdk3dx:userPrompt. Это позволяет предотвратить запуск новой печати поверх существующей. Сообщение настраиваемого статуса <psk3dx:customStatus> используется для отображения любого сообщения во время нарезки.
HRESULT Cleanup(LPCWSTR pPrinterName, LPCWSTR pPortName, DWORD dwJobId, LPVOID* ppPartnerData)
dwJobId — идентификатор задания, используемый для отслеживания задания в spooler
pPortName — имя порта для трехмерного принтера
pPrinterName — имя принтера, в который отправляется задание печати.
ppPartnerData — указатель на указатель, содержащий настройку конкретных данных задания во время вызова API InitializePrint
Очистка вызывается при успешном завершении задания печати или при завершении запроса на отмену задания печати. Она предоставляет возможность для партнерской библиотеки DLL очистить ресурсы, которые были инициализированы для этой печати.
HRESULT UnInstall([in]LPCWSTR args)
Этот API вызывается при удалении устройства 3D-принтера и предоставляет механизм удаления программного обеспечения изготовителя, который, возможно, был установлен.