# -*- 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'v9_west', (1.0, 0.0, 0.0)), (u'v9_south', (0.0, 1.0, 0.0)), (u'v9_bottom', (0.0, 0.0, 1.0)), (u'v9_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, 'v9_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, 'v9_south_zoom.bmp'), 1600, 1100) print(u' v9_south_zoom ← vid %d + ViewZoomTo2' % vid) vid = find((1.0, 0.0, 0.0)) if vid is not None: doc.ShowNamedView2('', vid) doc.ViewZoomTo2(-0.0184, 0.015, 0.002, -0.0184, 0.088, 0.074) # 拉近西端格栅 doc.SaveBMP(os.path.join(OUT, 'v9_west_zoom.bmp'), 1600, 1100) print(u' v9_west_zoom ← vid %d + ViewZoomTo2' % vid)