73 行
2.5 KiB
Python
73 行
2.5 KiB
Python
# -*- coding: utf-8 -*-
|
||
u"""按**读回的相机视线方向**挑视图再截图(视图 id 与方向的对应在本机会变,NOTES §35 那张表这次就不成立)。"""
|
||
import io
|
||
import os
|
||
import sys
|
||
|
||
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', write_through=True)
|
||
import win32com.client as wc
|
||
|
||
OUT = r'C:\Users\35138\.claude\jobs\11836093\tmp'
|
||
|
||
|
||
def prop(o, n):
|
||
v = getattr(o, n)
|
||
return v() if type(v).__name__ in ('method', 'function', 'builtin_function_or_method') else v
|
||
|
||
|
||
def D(x):
|
||
return x if hasattr(x, '_oleobj_') else wc.Dispatch(x)
|
||
|
||
|
||
app = wc.GetActiveObject('SldWorks.Application')
|
||
doc = [d for d in app.GetDocuments if 'PhoneRail_5blades' in (prop(d, 'GetTitle') or '')][0]
|
||
e0 = wc.VARIANT(16387, 0)
|
||
app.ActivateDoc3(prop(doc, 'GetTitle'), False, 0, e0)
|
||
doc = app.ActiveDoc
|
||
|
||
views = {}
|
||
for vid in range(0, 9):
|
||
try:
|
||
doc.ShowNamedView2('', vid)
|
||
arr = list(prop(D(prop(doc, 'ActiveView')), 'Transform').ArrayData)
|
||
dirv = tuple(round(v, 3) for v in (arr[2], arr[5], arr[8]))
|
||
views[vid] = dirv
|
||
print(u' vid %d 视线 %s' % (vid, dirv))
|
||
except Exception as ex:
|
||
print(u' vid %d 失败 %s' % (vid, str(ex)[:40]))
|
||
|
||
|
||
def find(want):
|
||
for vid, d in views.items():
|
||
if all(abs(d[i] - want[i]) < 0.01 for i in range(3)):
|
||
return vid
|
||
return None
|
||
|
||
|
||
# 想要的「相机视线指向」:看西端墙 = 从 −x 往 +x 看 ⇒ 视线 (+1,0,0);以此类推
|
||
wanted = [(u'v7_west', (1.0, 0.0, 0.0)), (u'v7_south', (0.0, 1.0, 0.0)),
|
||
(u'v7_bottom', (0.0, 0.0, 1.0)), (u'v7_top', (0.0, 0.0, -1.0))]
|
||
for name, want in wanted:
|
||
vid = find(want)
|
||
if vid is None:
|
||
# 视线可能以相反号记录:再试反向(相机在另一侧)
|
||
vid2 = find(tuple(-v for v in want))
|
||
print(u' %s:没有视线 %s 的视图%s' % (name, want, u'(反向 vid %s)' % vid2 if vid2 is not None else u''))
|
||
continue
|
||
doc.ShowNamedView2('', vid)
|
||
doc.ViewZoomtofit2
|
||
doc.SaveBMP(os.path.join(OUT, name + '.bmp'), 1600, 1100)
|
||
print(u' %s ← vid %d' % (name, vid))
|
||
|
||
doc.ShowNamedView2('', 7)
|
||
doc.ViewZoomtofit2
|
||
doc.SaveBMP(os.path.join(OUT, 'v7_iso.bmp'), 1600, 1100)
|
||
|
||
vid = find((0.0, 1.0, 0.0))
|
||
if vid is not None:
|
||
doc.ShowNamedView2('', vid)
|
||
# 拉近到南墙 Type-C 与标识那一段(装配坐标,米)
|
||
doc.ViewZoomTo2(0.000, -0.005, -0.012, 0.100, -0.005, 0.008)
|
||
doc.SaveBMP(os.path.join(OUT, 'v7_south_zoom.bmp'), 1600, 1100)
|
||
print(u' v7_south_zoom ← vid %d + ViewZoomTo2' % vid)
|