2

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

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

ModelBody.ApplyTransform(rotationMatrix) 'rotates the body

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

因此,我想通过向 Body2 接口添加一个名为“CombinedTransformMatrix”的新属性来扩展它,这样每次调用时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。我想将该位存储在对象本身内。至于派生类,Visual Studio 甚至不允许我继承Body2- 说“当它的程序集配置为嵌入互操作类型时,'Body2Class' 是不允许的。”。而且我必须嵌入这些 .dll 文件,否则我将不得不将它们与我的应用程序的 .exe 一起发送,这是 SOLIDWORKS 法律禁止的。

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

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

4

1 回答 1

1

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

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

于 2021-12-15T01:16:25.567 回答