C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

画面を原寸大にする4

こちらの続きです。
画面を原寸大にする3 - C#ATIA

先日のスクリプトを実行すると、新たなドキュメントを作成し
スケッチを作成し50mmX50mmの四角形を描いて終わります。

この時、スクリプトが終了した時に表示されている四角形の
一辺の長さが原寸大になっている! ・・・はずです。

が、会社のPCのモニター(1920x1080)では良いのですが
自宅のPCの場合はちょっと小さい感じ(48mmぐらい)になりました。

原因はモニターの解像度っぽいです。

そこでこんな感じに修正してみました。

# Fusion360API Python script

import traceback
import adsk.fusion
import adsk.core
from tkinter import *

def run(context):
    ui = adsk.core.UserInterface.cast(None)
    try:
        app: adsk.core.Application = adsk.core.Application.get()
        ui = app.userInterface
        app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
        des: adsk.fusion.Design = app.activeProduct
        root: adsk.fusion.Component = des.rootComponent

        skt: adsk.fusion.Sketch = root.sketches.add(
            root.xYConstructionPlane
        )
        skt.sketchCurves.sketchLines.addTwoPointRectangle(
            adsk.core.Point3D.create(0,0,0),
            adsk.core.Point3D.create(5,5,0),
        )

        sels: adsk.core.Selections = ui.activeSelections
        sels.clear()
        sels.add(skt)
        app.executeTextCommand(u'Commands.Start SketchActivate') 

        vp: adsk.core.Viewport = app.activeViewport
        vp.fit()
        execFullSize()

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))


def execFullSize():
    app: adsk.core.Application = adsk.core.Application.get()
    ui: adsk.core.UserInterface = app.userInterface

    def get_dpi():
        screen = Tk()
        current_dpi = screen.winfo_fpixels('1i')
        return current_dpi

    def getViewLength(length = 100):
        app: adsk.core.Application = adsk.core.Application.get()
        vp: adsk.core.Viewport = app.activeViewport

        p0 = adsk.core.Point3D.create(0,0,0)
        p1 = adsk.core.Point3D.create(length*0.1,0,0)
        m0 = vp.modelToViewSpace(p0)
        m1= vp.modelToViewSpace(p1)
        return m0.distanceTo(m1)

    def dumpmsg(s):
        adsk.core.Application.get().log(s)
        print(s)

    try:
        vp: adsk.core.Viewport = app.activeViewport
        pixel2millimeter = 25.4 / get_dpi()

        dist = getViewLength()
        dumpmsg(f'ViewSpace Dist {dist}-{dist * pixel2millimeter}')

        viewLength = dist * pixel2millimeter
        ratio = (viewLength / 100) ** 2

        cam: adsk.core.Camera = vp.camera 
        cam.viewExtents = cam.viewExtents * ratio
        vp.camera = cam
        vp.refresh()

        dist = getViewLength()
        dumpmsg(f'ViewSpace Dist {dist}-{dist * pixel2millimeter}')
        dumpmsg('**')

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

結果は自宅に帰ってからになりますが・・・。