Loading... <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px">Smart3D这些年一直在更新迭代,每个版本更新都会或多或少伴随着一些API方面的变化,但是基本上遵循一个大原则,那就是做加法,即老的接口一般不会发生变化,只会多出一些新的东西。这里我举几个例子。</p> <!-- /wp:paragraph --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px">比如在2016版中,螺栓垫片找长短描述的方法是先从Part找到ImpliedItem,再从ImpliedItem上分别找到接口IJGasket和IJBolt的ShortMaterialDescription和LongMaterialDescription。而仪表特殊件找长短描述的方法则和普通管件一样,从Part找到MaterialControlData,再从MaterialControlData上找到接口IJGenericMaterialControlData的LongMaterialDescription和ShortMaterialDescription。</p> <!-- /wp:paragraph --> <!-- wp:code {"style":{"typography":{"fontSize":"16px"}}} --> <pre class="wp-block-code" style="font-size:16px"><code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color"><em>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); }</em></mark></code></pre> <!-- /wp:code --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px">而在最新版里螺栓垫片和仪表特殊件的Part上直接多了一个接口叫IJResolvedMaterialDescription,从这个接口就可以直接获取到描述。</p> <!-- /wp:paragraph --> <!-- wp:code {"style":{"typography":{"fontSize":"16px"}}} --> <pre class="wp-block-code" style="font-size:16px"><code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color"><em>sShortDesc = bo.GetPropertyValue("IJResolvedMaterialDescription", "ShortMaterialDescription").ToString(); sLongDesc = bo.GetPropertyValue("IJResolvedMaterialDescription", "LongMaterialDescription").ToString();</em></mark></code></pre> <!-- /wp:code --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px">再比如2016版本里获取SharedContent路径的方法。在2016版里是下面的写法:</p> <!-- /wp:paragraph --> <!-- wp:code {"style":{"typography":{"fontSize":"16px"}}} --> <pre class="wp-block-code" style="font-size:16px"><code><em><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">private static string symbolsharepath = MiddleServiceProvider.SiteMgr.ActiveSite.ActivePlant.PlantCatalog.SymbolShare;</mark></em></code></pre> <!-- /wp:code --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px">在最新版里,多了个更加简单的新写法:</p> <!-- /wp:paragraph --> <!-- wp:code {"style":{"typography":{"fontSize":"16px"}}} --> <pre class="wp-block-code" style="font-size:16px"><code><em><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">private static string symbolsharepath = MiddleServiceProvider.SiteMgr.ActiveSite.ActiveCatalog.SymbolShare;</mark></em></code></pre> <!-- /wp:code --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px">但也有例外情况,不是做的增量,而是做的变更。一个我遇到过的典型例子,OracleDBConnection这个类,在之前的版本,都是在CommonMiddle这个dll里,但是从2018HF44和2019HF24之后开始,它被移动到了SP3DCoreDotNetUtilities.dll中。所以如果你在老版本里用到了这个类,编译的dll一旦到了更新的版本就不能用了。反之亦然。</p> <!-- /wp:paragraph --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px">所以不管在新版本里还是旧版本编译的dll,如果更换环境,都有可能会出问题,问题倒不是出在.NET Framework上,而是S3D本身的接口异同。我测试过在老版本环境编译的dll拿到新版本中去使用,也测试过在新版本环境里编译的dll拿到老版本中去使用,如果所使用的接口和方法都是公用的,那就都不会出问题。所以这个结论就是无所谓在什么版本环境做开发,只要你找到各个版本之间共同的接口和方法来使用就都没问题。如果实在是某些版本所独有的内容,那可能就需要你在代码里根据S3D的版本信息来进行一些分支处理。</p> <!-- /wp:paragraph --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px">S3D的版本信息在如下的注册表位置:HKEY_LOCAL_MACHINE\SOFTWARE\Intergraph\SP3D\AppInfo</p> <!-- /wp:paragraph --> <!-- wp:image {"id":2209,"sizeSlug":"full","linkDestination":"media"} --> <figure class="wp-block-image size-full"><a href="https://mrgeng.com/usr/uploads/2022/07/S3D-Version-Reg.jpg"><img src="https://mrgeng.com/usr/uploads/2022/07/S3D-Version-Reg.jpg" alt="" class="wp-image-2209" style=""></a></figure> <!-- /wp:image --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px">具体的S3D的版本号可以到这个网站上查看:<span class="external-link"><a class="no-external-link" href="https://compatibilitymatrix.hexagonppm.com/" target="_blank"><i data-feather="external-link"></i>Hexagon PPM Compatibility Matrix</a></span></p> <!-- /wp:paragraph --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px">代码中获取这个版本信息的C#写法如下:</p> <!-- /wp:paragraph --> <!-- wp:code {"style":{"typography":{"fontSize":"16px"}}} --> <pre class="wp-block-code" style="font-size:16px"><code><em><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-purple-color">using Microsoft.Win32;</mark> <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-purple-color"> RegistryKey regkey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Intergraph\SP3D\AppInfo"); string s3DVer = regkey.GetValue("").ToString();</mark></em></code></pre> <!-- /wp:code --> 最后修改:2025 年 03 月 13 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏
1 条评论
请教一下SP3D的二开有学习资料吗?麻烦推荐一下,谢谢。