Desarrollo secundario de Python SolidWorks: el método CreatePoint del objeto IMathUtility en SolidWorks está marcado

Desarrollo secundario de Python SolidWorks: el método CreatePoint del objeto IMathUtility en SolidWorks está bloqueado



Prefacio

Anteayer, un internauta dijo que también usó Python para el desarrollo secundario de SolidWorks, pero se encontró con un problema que lo ha estado molestando durante mucho tiempo, durante este período buscó diversa información nacional y extranjera pero no pudo resolverlo. Como resultado, ahora se encuentra con el problema de usar este método. Todos caminaron y me preguntaron si lo había encontrado antes y si tenía una solución. Después de leerlo, lo probé brevemente y descubrí que efectivamente había un problema. Hoy me tomé el tiempo para estudiar el problema que encontró y ahora está perfectamente resuelto. Aquí está la respuesta: Registre la solución para que todos los que encuentren problemas similares puedan consultarla.


1. Descripción del problema

El problema del internauta es que necesita crear un punto en SolidWorks y usa el método CreatePoint bajo el objeto IMathUtility, pero siempre se informa un error que no se puede resolver.

1. Definición del método CreatePoint en VBA

CreatePoint se define de la siguiente manera en VBA:

Function CreatePoint( _
   ByVal ArrayDataIn As System.Object _
) As System.Object

ArrayDataIn: es una matriz de coordenadas de doble precisión

2. La definición de CreatePoint en el método generado con makepy.py

CreatePoint se define de la siguiente manera en el archivo generado por makepy.py

	def CreatePoint(self, ArrayDataIn=defaultNamedNotOptArg):
		'Creates a new math point object'
		ret = self._oleobj_.InvokeTypes(5, LCID, 1, (9, 0), ((12, 1),),ArrayDataIn
			)
		if ret is not None:
			ret = Dispatch(ret, 'CreatePoint', None)
		return ret

Puedes ver que las definiciones en VBA y Python son las mismas, parece que no debería haber problemas y es fácil de solucionar, en realidad no es así.

2. Surgen problemas

1. Código de prueba de Python

El método en sí no es difícil de usar, así que simplemente escribí el siguiente código de prueba en Python:

import win32com.client
import pythoncom

def main():
    sldver=2018
    swApp=win32com.client.Dispatch(f'SldWorks.Application.{
      
      sldver-1992}')
    swApp.CommandInProgress =True
    swApp.Visible =True
    errors=win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1)
    warnings=win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1)
    swModel = swApp.ActiveDoc
    # 创建IMathUtility对象
    swMathUtil = swApp.GetMathUtility
    # 创建点
    Pt1=swMathUtil.CreatePoint((0.05,0.06,0.07))
    # 输出结果
    print(Pt1.ArrayData)
    
if __name__ == '__main__':
    main()

2. Surgen problemas

Después de ejecutar, aparece el siguiente error:

pywintypes.com_error: (-2147352573, 'Miembro no encontrado', Ninguno, Ninguno)

La afirmación problemática es:

# 创建点
Pt1=swMathUtil.CreatePoint((0.05,0.06,0.07))

El mensaje de error es que hay un problema con la asignación de CreatePoint, pero según el prototipo de la función no debería haber problema con la asignación, incluso si hubiera un problema no debería ser este error. el prototipo de función, intente la tarea nuevamente.Modifique el código anterior de la siguiente manera:

# 创建点
   Pt1=swMathUtil.CreatePoint(win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (0.05,0.06,0.07)))

El resultado es que aún se reporta un error, por lo que podemos estar seguros de que no tiene nada que ver con el formulario de asignación.

3. Soluciones

Como hay problemas con las asignaciones anteriores, decidí no asignar valores primero y ver cuál es el valor inicial, así que modifiqué el código anterior de la siguiente manera:

# 创建点
Pt1=swMathUtil.CreatePoint
# 输出结果
print(Pt1.ArrayData)

Los resultados de entrada son los siguientes. Según los resultados de salida, el valor inicial es el centro del eje de coordenadas. Como hay un valor, se puede modificar. Intente modificarlo:

(0,0, 0,0, 0,0)

El código modificado es el siguiente:

# 创建点
Pt1=swMathUtil.CreatePoint
# 点赋值
Pt1.ArrayData=(0.05,0.06,0.07)
# 输出结果
print(Pt1.ArrayData)

Los resultados de salida reales son los siguientes:

(9.60958240462e-312, 0,05, 0,0)

El resultado de entrada correcto debe ser

(0,05,0,06,0,07)

Parece que la asignación es incorrecta. Modifique el código nuevamente de la siguiente manera:

# 创建点
Pt1=swMathUtil.CreatePoint
# 点赋值
Pt1.ArrayData=win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (0.05,0.06,0.07))
# 输出结果
print(Pt1.ArrayData)

El resultado es el siguiente:

(0,05,0,06,0,07)

Puede ver que el resultado de salida en este momento es correcto, lo que indica que el problema ha sido encontrado y resuelto.

4. El código completo una vez resuelto el problema.

El código completo es el siguiente:

import win32com.client
import pythoncom


def main():
    sldver=2018
    swApp=win32com.client.Dispatch(f'SldWorks.Application.{
      
      sldver-1992}')
    swApp.CommandInProgress =True
    swApp.Visible =True
    errors=win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1)
    warnings=win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1)
    swModel = swApp.ActiveDoc
    # 创建IMathUtility对象
    swMathUtil = swApp.GetMathUtility
    # 创建点
    Pt1=swMathUtil.CreatePoint
    # 点赋值
    Pt1.ArrayData=win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (0.05,0.06,0.07))
    # 输出结果
    print(Pt1.ArrayData) 
    
if __name__ == '__main__':
    main()

3. Resumen del problema

Cuando surge este problema, la solución convencional es buscar la definición del método original y asignar el valor de acuerdo con la definición. El resultado es que el problema no se puede resolver si el valor se asigna en la forma del método original. Esta vez, es necesario encontrar otra forma de solucionar el problema que ocurre. El resultado se modifica directamente para que el problema se resuelva fácilmente. La aparición de este problema recuerda que en llamadas posteriores a la interfaz COM, no se puede manejar. completamente de acuerdo con la definición original y, a veces, es necesario solucionarlo.

Supongo que te gusta

Origin blog.csdn.net/Bluma/article/details/129182498
Recomendado
Clasificación