最适合做二开的S3D编译环境是哪个版本
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();
请教一下SP3D的二开有学习资料吗?麻烦推荐一下,谢谢。