目录
第四章 Application Integration(应用程序集成)
本章介绍SpaceClaim二次开发文档的第四章,(由于使用的翻译,一些专业名词可能翻译不准确,如有错误,相互交流学习)
第四章 Application Integration(应用程序集成)
4.1 永久标识符
文档对象具有持久标识符,称为名称,可以记录并稍后解析以再次返回文档对象。Moniker属性返回doc对象的名字对象,Resolve方法再次返回doc对象。
在内部,主文档对象具有全局唯一的标识符。事件由作为主对象的实例以及本身可能是事件的原始对象标识。名字对象是一个对象,它封装了主体身份中涉及的一个或多个主对象的标识符。
要记录名字对象,可以使用ToString记录其字符串表示形式。此字符串的长度取决于所涉及的主对象的数量。此字符串的格式没有记录,因此您不应该尝试构造或修改此类字符串。
要将字符串表示形式转换回名字对象,可以使用FromString。
public static void Example(IDesignFace desFace) {
Document doc = desFace.Document;
// all doc objects provide a moniker 所有文档对象都提供一个名字对象
Moniker<IDesignFace> desFaceMonikerA = desFace.Moniker;
// resolve the moniker in the document to obtain the original object
// 解析文档中的名字对象以获取原始对象
Debug.Assert(desFaceMonikerA.Resolve(doc) == desFace);
// the string representation can be recorded 可以记录字符串表示
string monikerText = desFaceMonikerA.ToString();
// the moniker can be reconstructed from the string 名字可以从字符串中重建
Moniker<IDesignFace> desFaceMonikerB = Moniker<IDesignFace>.FromString(monikerText);
Debug.Assert(desFaceMonikerB.Resolve(doc) == desFace);
}
要解析名字对象,必须提供文档作为上下文。SpaceClaim允许同时加载同一scdoc文件的多个版本,因此同一名字对象可能会在多个文档中解析。
由于涉及的内部标识符是全局唯一的,因此在无关的文档中解析名字对象没有危险。如果您尝试这样做,将返回null以表示找不到对象。
4.2 替代
如果文档对象已被删除,Resolve将返回null,表示找不到该对象。有时,在命令执行过程中,文档对象可能会被替换。例如,如果在建模操作期间分割了一个设计面,它将被两个新的设计面替换。或者其中一个新的设计面的会分裂自己或其中一个被删除。
在幕后,会记录替换,当调用Resolve时,如果对象已被替换,则名字对象会自动返回其中一个被记录的对象,如果没有对象,则返回null。
如果知道对象是否是幸存者而不是原始对象很重要,则可以使用==运算符将其名字与已有的名字进行比较。如果对象是幸存者,它将有一个不同的名字。
如果获取所有幸存者很重要,可以使用ResolveSurvivors。请注意,此方法只返回幸存的替换,因此如果对象根本没有被替换,则不会返回幸存的对象。
4.3 更新状态
文档对象master有一个更新状态,它告诉对象是否已更改。每次更改文档对象master时,其更新状态都会发生变化。相反,如果更新状态没有改变,则对象没有改变。当对象因撤消(或重做)操作而更改时,其更新状态也会被撤消(或重试)。更新状态是持久的,因此您可以存储其字符串表示形式,并在另一个SpaceClaim会话中使用它。
public static void Example(DesignFace desFace) {
// doc object masters provide an update state 文档对象master提供更新状态
UpdateState beforeStateA = desFace.UpdateState;
// the string representation can be recorded 可以记录字符串表示
string stateText = beforeStateA.ToString();
ModifyDesignBody();
// test whether the design face was changed 测试设计面是否更改
if (desFace.UpdateState != beforeStateA)
Debug.WriteLine("Design face was changed.");
// the update state can be reconstructed from the string 更新状态可以从字符串中重建
UpdateState beforeStateB = UpdateState.FromString(stateText);
Debug.Assert(beforeStateA == beforeStateB);
}
事件不提供更新状态,但您可以存储事件链中涉及的实例的更新状态以及主节点的更新状态。PathToMaster返回这些实例。
更新状态仅表示对象本身的状态,而不表示它包含或引用的其他对象的状态。例如,如果修改了子设计体,则零件的更新状态不会改变。同样,虽然如果修改了组件的位置,组件的更新状态会发生变化(因为这是组件本身的属性),但如果修改了其模板部分,更新状态不会发生变化。