2013-10-18 2 views
2

저는 솔리드 웍스를 파이썬으로 제어하기 위해 VBA에서 작성한 코드를 포팅하려고합니다. 특히 스케치 편집을 자동화합니다. Python에서 Solidworks SelectById2를 사용하는 데 문제가 있습니다. VBA에서 다음 코드는 정상적으로 작동합니다.SelectById2에 대한 포인터 설명자

문제는 VBA의 "Nothing"값을 일부 Python으로 대체 한 것입니다. 솔리드 웍스 API 문서 도구에서

, 무엇을 SelectByID2가 찾고있는 것은 : 콜 아웃은 관련된 콜 아웃에 대한 포인터입니다

SelectByID2(Name, Type, X, Y, Z, Append, Mark, Callout, SelectOption) 

. 나는 그것이 나와 관련이 없기 때문에 포인터를 생성하지 않는 것을 선호 할 것이고 나는 VBA에서 그것이 필요하지 않다는 것을 보았다.

파이썬의 없음, pythoncom.Missing, pythoncom.Empty, "", "", 0 ... 모두 사용하지 않으려 고 노력했습니다. 이 모든 것들이 TypeError를 제공합니다. 이 문제를 알아내는에 대해 어떻게 이동하는 방법에 대한

import win32com.client 
import pythoncom 

pythoncom.CoInitializeEx(pythoncom.COINIT_APARTMENTTHREADED) 

sldworks = win32com.client.gencache.EnsureModule('{83A33D31-27C5-11CE-BFD4-00400513BB57}', 0x0, 20, 0) # Solidworks OLE Automation 1.0 Type Library 
swconst = win32com.client.gencache.EnsureModule('{4687F359-55D0-4CD3-B6CF-2EB42C11F989}', 0x0, 20, 0) # Solidworks 2012 Constant Type Library 

sw = sldworks.SldWorks() 
sw.Visible = 1 
model_path = "Y:\\Templates\\Solidworks\\test.SLDPRT" 
doc, errors, warnings = sw.OpenDoc6(model_path, swconst.constants.swDocPART, swconst.constants.swOpenDocOptions_Silent, "", pythoncom.Missing, pythoncom.Missing) 
sw.ActivateDoc2(model_path, False,pythoncom.Missing) 
Part = sw.ActiveDoc 

try: 
    Part.Extension.SelectByID2("Sketch1", "SKETCH", 0, 0, 0, False, 0, ffff, 0) 
except Exception, value:   
    print "Exception occured, value = ", value 

어떤 제안 :

여기 내 관련 파이썬 코드는?

+0

Part.Extension.SelectByID2() 라인에서만 오류가 발생하는 것을 올바르게 이해하고 있습니까? pythoncom.Missing은 sw.OpenDoc6()에서 잘 작동합니까? –

+0

예, 괜찮습니다. pythoncom.Missing 함께 sw.OpenDoc6() 작동합니다. SelectByID2()에서 pythoncom.Missing을 사용하려고 할 때 "Type 객체가 'PyOleMissing'을 COM VARIANT로 변환 할 수 없습니다."라는 메시지와 함께 TypeError가 나타납니다. – c1one

+0

표 12-2 [여기]에 COM 변형 목록이 있습니다. (http://oreilly.com/catalog/pythonwin32/chapter/ch12.html). 그래서 pythoncom.Missing이 작동하지 않는 이유입니다. 이제는 해당 테이블에 나열된 모든 변형을 사용하려고했지만 모두에 대해 TypeError를 얻었습니다. – c1one

답변

0

나는 그것의 당신의 문제를 해결하지,하지만 어쩌면 당신이 해결 방법을 사용할 수 있습니다 알고

다음 이름을 물어
swModel.FirstFeature 

:

swFeat.Name = "Sketch1" 

이 아니 스케치 당신이 찾고있는 경우 for, 다음 머리 :

swFeat = swFeat.GetNextFeature 
+0

흥미로운 제안. 이 같은 것이 효과가있을 수 있습니다. 불행히도 Solidworks에서 더 이상 사용하지 않아도됩니다. – c1one

관련 문제