在外部API接口中添加新成员和扩展方法



我正在使用SOLIDWORKS API在Visual Studio中构建VB.NET应用程序-我的应用程序通过COM连接到SOLIDWORKS应用程序,并使用各种API调用在其中执行一些操作。通过向SOLIDWORKS.dll文件添加项目引用来访问API。出于法律原因,这些文件必须嵌入到我的应用程序的可执行文件中。

这个问题并不是API特有的,但我会尝试解释我想做什么。有一个名为Body2的SOLIDWORKS API接口,它控制三维空间中模型对象(实体(的操作。例如,Body2接口提供了一种方法ApplyTransform,该方法允许通过对某个物体应用MathTransform(变换矩阵(来移动或旋转该物体:

ModelBody.ApplyTransform(rotationMatrix) 'rotates the body

现在,Body2对象不存储这些转换矩阵——它们被应用并遗忘了。然而,在我的应用程序中,我需要持久地存储这些信息,以便在某个时刻,我可以反转所有转换,并将主体返回到其原始位置。

因此,我想通过添加一个新的属性来扩展Body2接口,称为";组合变换矩阵";,以便每次调用ApplyTransform时,我也可以更新此属性的值,例如:

ModelBody.ApplyTransform(rotationMatrix)
ModelBody.CombinedTransformMatrix.Multiply(rotationMatrix)
ModelBody.ApplyTransform(translationMatrix)
ModelBody.CombinedTransformMatrix.Multiply(translationMatrix)

当我最终想把身体恢复到原来的位置时,我可以打电话给:

ModelBody.ApplyTransform(ModelBody.CombinedTransformMatrix.Inverse)
ModelBody.CombinedTransformMatrix = New MathTransform 'reset matrix

理想情况下,还扩展ApplyTransform方法会非常好,这样它就会自动更新CombinedTransformMatrix,例如:

Overrides Function ApplyTransform(Xform As MathTransform) As Boolean
'Do whatever SOLIDWORKS does in this function
'My additional code:
Me.CombinedTransformMatrix.Multiply(Xform)
End function

(我知道我应该做一个扩展而不是覆盖,但我不知道怎么做(

如果这是可能的,那么我可以简化身体转换的代码,因为CombinedTransformMatrix会自动更新:

'Rotate and move
ModelBody.ApplyTransform(rotationMatrix)
ModelBody.ApplyTransform(translationMatrix)
'Return to original position
ModelBody.ApplyTransform(ModelBody.CombinedTransformMatrix.Inverse)
ModelBody.CombinedTransformMatrix = New MathTransform 'reset matrix

我更喜欢这种解决方案,而不是从Body2创建一些派生类,或者制作某种将CombinedTransformMatrix存储在Body2对象之外的包装类。我想把这一点存储在对象本身内部。至于派生类,VisualStudio甚至不允许我继承Body2—says&quot当Body2Class的程序集配置为嵌入互操作类型时,不允许使用它&";。我必须嵌入这些.dll文件,否则我将不得不将它们与我的应用程序的.exe一起发送,这是SOLIDWORKS法律禁止的。

我想要的可能吗?我可以在不创建派生类的情况下将CombinedTransformMatrix添加到Body2接口吗?在不知道ApplyTransform方法是如何实现的情况下,是否可以用我的附加代码扩展该方法?

如果没有,实现我想要的目标的下一个最佳解决方案是什么?正如我所说,我非常希望避免Body2之外的包装器或其他变量,因为会有很多这样的Body2对象,它们将在应用程序的整个生命周期中持续存在,每个对象都有不同的转换,因此必须将它们的转换信息存储在自己之外会使我的代码严重复杂化。

没有通用的方法可以做到这一点。您可以维护单独的字典,其中COM对象(例如,本例中的IBody2(是键,其他参数(标记(是值。当指针被破坏时,您需要手动更新字典以删除数据。然而,有些特定的软件接口确实有一些关联自定义数据的方法(类似于标签(。例如,IBody2具有IBody2::AddPropertyExtension2,它允许将自定义数据与主体本身相关联,IEntity具有IEntity::CreateStringAttributeDefinition(注意,这不是有文档记录的方法(等。

但是,COM类不存在类似于Windows控件的通用System::Windows::Forms::Tag属性或DependencyObjects的依赖属性。

相关内容

  • 没有找到相关文章

最新更新