Получить размер окна документа 3Д

Автор /|exa_in_da_house, 06.07.23, 13:49:56

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

/|exa_in_da_house

Здравствуйте! Пытаюсь сохранить активную сборку в растровый формат, на выходе нужно разрешение 300х300, но напрямую задать разрешение изображения задать нельзя: доступны только масштаб и количество точек на дюйм. Это значит что в зависимости от размеров модели будет меняться результат.
Но при ручном сохранении в растр в окне подготовки есть данные о размере документа и будущем разрешении картинки, как программно достать хотя бы размер окна?
Использую следующий код:
iDocument3D = kompas_object.ActiveDocument3D()
    rasterParam = iDocument3D.RasterFormatParam() # интерфейс параметров растрового экспорта
    rasterParam.Init()
    rasterParam.colorBPP = 8 # цветность - 256 цветов
    rasterParam.colorType = 3 # цвет вывода объектов - 3 - цвет для объекта
    rasterParam.extResolution = 0 # количество точек на дюйм (0 - экранное разрешение)
    rasterParam.extScale = 1 # масштаб изображения
    rasterParam.format = 0
    rasterParam.greyScale = False # чёрно-белый
    iDocument3D.SaveAsToRasterFormat('test.jpeg', rasterParam)

Снимок.JPG
Снимок2.JPG

P.S. Думал определить габариты модели и отталкиваться от них, но на размер конечного изображения влияет ориентация модели на момент её последнего сохранения, то есть не совсем то, что нужно.

Doom

На фото что подчеркнули - это габаритные размеры модели относительно плоскости просмотра, эта тема уже поднималась.
+ Благодарностей: 1

/|exa_in_da_house

Цитата: Doom от 06.07.23, 14:09:39На фото что подчеркнули - это габаритные размеры модели относительно плоскости просмотра, эта тема уже поднималась.

Спасибо, буду внимательнее изучать форум

/|exa_in_da_house

Прошу прощения за навязчивость, но не могу отыскать правильное направление, намекните, пожалуйста, на название интерфейса  :)  Пробовал IPrintJob, видимо работает только с 2Д документами, хотя должен и с трёхмерными, IDocumentFrame - даёт размер рабочей области.  :?:

Doom

Допустим, получили размеры картинки при масштабе 1 и 96 точек на дюйм при размере документа 800 на 800 получили 3000 на 3000 картинку - и каким образом изменить свести к разрешению 300 на 300 ? масштаб уменьшить только ? или как то вместе с плотностью точек на дюйм ?

Doom

Цитата: /|exa_in_da_house от 07.07.23, 07:52:21Пробовал IPrintJob, видимо работает только с 2Д документами

Это треш какой то :)
Он работает со всеми документами НО при одном условии - документ не должен быть сохранен те новый создали построили и все..

Дальше еще интересней :)

Нужно передать в параметры имя документа - а как он же безименный (но каким то образом работает iDocument_7.Name)?


from win32com.client import Dispatch, gencache

const_2d_ = gencache.EnsureModule('{75C9F5D0-B5B8-4526-8681-9903C567D2ED}', 0, 1, 0).constants
const_3d_ = gencache.EnsureModule('{2CAF168C-7961-4B90-9DA2-701419BEEFE3}', 0, 1, 0).constants

module5_ = gencache.EnsureModule('{0422828C-F174-495E-AC5D-D31014DBBE87}', 0, 1, 0)
api5_ = Dispatch('Kompas.Application.5', None, module5_.KompasObject.CLSID)

module7_ = gencache.EnsureModule('{69AC2981-37C0-4379-84FD-5DD2F3C0A520}', 0, 1, 0)
api7_ = Dispatch('Kompas.Application.7')



iDocument_7 = api7_.ActiveDocument
iDocument3D_7 = module7_.IKompasDocument3D(iDocument_7)

print_7 = api7_.PrintJob

if print_7.AddSheets(iDocument_7.Name, None, 0):
    print(iDocument_7.Name)
    sheet = print_7.Sheet(0)
   
    if sheet.GetGabarites():
        print('Width:',sheet.GetGabarites()[1])
        print('Height',sheet.GetGabarites()[2])
       
        # что то эти значения отличаются от того что показывает Компас (+-2)
       
        # указываем габариты на печать
        # sheet.SetClipFrameGabarites(300.0, 300.0)
        # а вот как далее указать устройство для вывода печати в jpg и указать путь сохранения файла?

+ Благодарностей: 1

Vellar

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

Доброго всем времени.
Всегда был уверен, что это синонимы, или уже что-то изменилось?
Укажите в окне вместо 96 ->300

Doom

У меня тоже вопрос - каким образом данная функция уменьшает размер картинки.

+ Благодарностей: 1

/|exa_in_da_house

Цитата: Doom от 08.07.23, 21:30:09Допустим, получили размеры картинки при масштабе 1 и 96 точек на дюйм при размере документа 800 на 800 получили 3000 на 3000 картинку - и каким образом изменить свести к разрешению 300 на 300 ? масштаб уменьшить только ? или как то вместе с плотностью точек на дюйм ?
Да, планировал уменьшать масштаб (делаю что-то вроде браузера файлов, поэтому нужна миниатюра деталей, 300х300 это я конечно загнул, нужна мелкая иконка. Думал использовать миниатюру через shell, но это для меня вообще дремучий лес, поэтому решил остановиться, как мне казалось, на более простом варианте).
Спасибо за наводку!

pr0100

#9
Цитата: /|exa_in_da_house от 06.07.23, 13:49:56...на выходе нужно разрешение 300х300....

как-то так:


Цитировать#Сохранение в JPG
import pythoncom
from win32com.client import Dispatch, gencache
KAPI = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
iKompasObject = KAPI.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(KAPI.KompasObject.CLSID, pythoncom.IID_IDispatch))
rasterPar = iKompasObject.ActiveDocument3D().RasterFormatParam()
rasterPar.format=2 #0-BMP,2-JPG,3-PNG,4-TIFF,1-GIF(не работает)
rasterPar.colorType=3 #цвет 0-черный, 3-Установленный для объекта
rasterPar.multiPageOutput=1 #1 - сохранять листы в одном файле для для TIFF
rasterPar.onlyThinLine=1 #для обьектов, 1 тонкими
rasterPar.extResolution=300  #разрешение
iKompasObject.ActiveDocument3D().SaveAsToRasterFormat("test.jpg",rasterPar)

/|exa_in_da_house

Сделал таким образом, всё работает, только на выходе имею погрешность в 1-2 пикселя, для меня не проблема

iDocument_7 = app.ActiveDocument
iDocument3D_7 = module_7.IKompasDocument3D(iDocument_7)


print_7 = app.PrintJob
# print(print_7.AddSheets(iDocument_7.Name, None, 0))
# print(print_7.AddSheets(iDocument_7.PathName, None, 0))
if print_7.AddSheets(iDocument_7.PathName, None, 0):
    print(iDocument_7.PathName)
    sheet = print_7.Sheet(0)
    # sheet.ClipFlag = False
    if sheet.GetGabarites():
        width = math.ceil(sheet.GetGabarites()[1])
        height = math.ceil(sheet.GetGabarites()[2])
        print('Width:', width)
        print('Height',height)
        print_7.Clear() # очищаем предыдущее задание на печать

        iDocument3D = kompas_object.ActiveDocument3D()
        iDocument3D.hideAllPlaces = True # скрыть системы координат
        rasterParam = iDocument3D.RasterFormatParam() # интерфейс параметров растрового экспорта
        rasterParam.Init()
        rasterParam.colorBPP = 8 # цветность - 16 цветов
        rasterParam.colorType = 3 # цвет вывода объектов - 3 - цвет для объекта
        rasterParam.extResolution = 96 # количество точек на дюйм (0 - экранное разрешение)
        pic_width = 64 # желаемая ширина выходного изображения в пикселях
        rasterParam.extScale = 1 / (((width/25.4)*96)/pic_width) # масштаб изображения, что б достичь желаемого разрешения
        rasterParam.format = 0
        rasterParam.greyScale = False # чёрно-белый
        iDocument3D.SaveAsToRasterFormat(r'C:\test.jpeg', rasterParam)

Toptotal

Цитата: /|exa_in_da_house от 10.07.23, 05:44:53Да, планировал уменьшать масштаб (делаю что-то вроде браузера файлов, поэтому нужна миниатюра деталей, 300х300
все уже придуманно... открвывете ТС и настраиваете миниатюры хоть 100х100 хоть 1000х1000 зависит от разрешения экрана. с 10 вертии Тотала командера , при нажатии альт и скролинг мышки динамически изменяется масштаб. Да и формат файлов почти 1000 разных , одни плагин ulister.wlx 600+ самых популярных форматов показывает.
п.с. на фото Солид , и пдф, не важно тоже самое с компасом есть плагин WLX.

но и это не требуется любая прога что дает в проводнике эскиз можно использовать настроив в настройках ТС расширение.

Doom

Тут объекты хаотично лежат и не по всей области..

А по скрипту выше нужно бы добавить проверку sheet.GetGabarites()[...] и по большему значению менять масштаб..

if width >= height:
    rasterParam.extScale = 1 / (((width/25.4)....
if width <= height:
    rasterParam.extScale = 1 / (((height/25.4)....
+ Благодарностей: 1