2022/08/07

最适合做二开的S3D编译环境是哪个版本

作者 Leon

Smart3D这些年一直在更新迭代,每个版本更新都会或多或少伴随着一些API方面的变化,但是基本上遵循一个大原则,那就是做加法,即老的接口一般不会发生变化,只会多出一些新的东西。这里我举几个例子。

比如在2016版中,螺栓垫片找长短描述的方法是先从Part找到ImpliedItem,再从ImpliedItem上分别找到接口IJGasket和IJBolt的ShortMaterialDescription和LongMaterialDescription。而仪表特殊件找长短描述的方法则和普通管件一样,从Part找到MaterialControlData,再从MaterialControlData上找到接口IJGenericMaterialControlData的LongMaterialDescription和ShortMaterialDescription。

RelationCollection rImpliedItemToPart = bo.GetRelationship("ImpliedMatingParts", "UsedImpliedPart");
BusinessObject oImpliedPart = rImpliedItemToPart.TargetObjects[0];
if (bo.ClassInfo.DisplayName == "Pipe Gasket")
{
    sShortDesc = oImpliedPart.GetPropertyValue("IJGasket", "ShortMaterialDescription").ToString();
    sLongDesc = oImpliedPart.GetPropertyValue("IJGasket", "LongMaterialDescription").ToString();
}
else if (bo.ClassInfo.DisplayName == "Pipe Bolt Set")
{
    ShortDesc = oImpliedPart.GetPropertyValue("IJBolt", "ShortMaterialDescription").ToString();
    sLongDesc = oImpliedPart.GetPropertyValue("IJBolt", "LongMaterialDescription").ToString();
    PropertyValueDouble pBoltLen = (PropertyValueDouble)bo.GetPropertyValue("IJRteBolt", "RoundedLength");
    sBoltLen = Convert.ToString(pBoltLen.PropValue * 1000);
    PropertyValueDouble pBoltDiam = (PropertyValueDouble)bo.GetPropertyValue("IJRteBolt", "Diameter");
    sBoltDiam = "M" + Convert.ToString(pBoltDiam.PropValue * 1000);
}

而在最新版里螺栓垫片和仪表特殊件的Part上直接多了一个接口叫IJResolvedMaterialDescription,从这个接口就可以直接获取到描述。

sShortDesc = bo.GetPropertyValue("IJResolvedMaterialDescription", "ShortMaterialDescription").ToString();
sLongDesc = bo.GetPropertyValue("IJResolvedMaterialDescription", "LongMaterialDescription").ToString();

再比如2016版本里获取SharedContent路径的方法。在2016版里是下面的写法:

private static string symbolsharepath = MiddleServiceProvider.SiteMgr.ActiveSite.ActivePlant.PlantCatalog.SymbolShare;

在最新版里,多了个更加简单的新写法:

private static string symbolsharepath = MiddleServiceProvider.SiteMgr.ActiveSite.ActiveCatalog.SymbolShare;

但也有例外情况,不是做的增量,而是做的变更。一个我遇到过的典型例子,OracleDBConnection这个类,在之前的版本,都是在CommonMiddle这个dll里,但是从2018HF44和2019HF24之后开始,它被移动到了SP3DCoreDotNetUtilities.dll中。所以如果你在老版本里用到了这个类,编译的dll一旦到了更新的版本就不能用了。反之亦然。

所以不管在新版本里还是旧版本编译的dll,如果更换环境,都有可能会出问题,问题倒不是出在.NET Framework上,而是S3D本身的接口异同。我测试过在老版本环境编译的dll拿到新版本中去使用,也测试过在新版本环境里编译的dll拿到老版本中去使用,如果所使用的接口和方法都是公用的,那就都不会出问题。所以这个结论就是无所谓在什么版本环境做开发,只要你找到各个版本之间共同的接口和方法来使用就都没问题。如果实在是某些版本所独有的内容,那可能就需要你在代码里根据S3D的版本信息来进行一些分支处理。

S3D的版本信息在如下的注册表位置:HKEY_LOCAL_MACHINE\SOFTWARE\Intergraph\SP3D\AppInfo

具体的S3D的版本号可以到这个网站上查看:Hexagon PPM Compatibility Matrix

代码中获取这个版本信息的C#写法如下:

using Microsoft.Win32;

RegistryKey regkey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Intergraph\SP3D\AppInfo");
string s3DVer = regkey.GetValue("").ToString();
0 0 投票数
文章评分