【OBD C#】参考轴网读取

ITFApplication appInst = new TFApplicationList();
ITFLoadableProject proj;
ITFLoadableProjectList projList;
//dgnModelRef 为参考的轴网文件对应模型
//appInst.ModelReferenceLoadProject(dgnModelRef, 0, out projList)返回0
//但projList为null
//直接通过appInst.GetProject(0, out projList)读取的project返回的轴网数据不对
if (appInst.ModelReferenceLoadProject(dgnModelRef, 0, out projList) == 0 && projList != null)
{
    proj = projList.AsTFLoadableProject;
}

代码如上,请问该怎么在当前文件中读取参考轴网文件内的轴网数据

Parents
  • 轴网信息是保存在项目的dgnlib文件中,是不能直接读取的。可以使用对应的API来读取。

    你在某个文件的model中看到的轴网,不是真正的轴网,是将轴网信息转化为几何元素的结果。这些几何元素是项目的轴网信息的具体化,只能通过轴网对话框进行更新。读取这些元素是没有意义的。因为这些元素可能和项目的轴网信息不同步了。

    CE版本之后,可以设置在项目的dgn文件中显示轴网,这些显示的轴网,是临时对象(这个和上面说的,某个model中的几何元素不同)。可以看作是轴网信息的具体化形式,但是他们不是任何model中的元素。拾取可以参考例子:

    examples\pickgridline

    这个例子在SDK的目录中(update 6 SDK)

  • 感谢解答。尝试了下,还是不行。 

    pickgridline需要拾取轴网,和需求不符。

    我现在用的代码是参考OBDSDK\examples\Gridline里的,看了下,与pickgridline用的API基本是一样的。

    目前遇到的问题,和您说的一样,读取到的轴网信息不同步,返回的信息是最后一次使用轴网工具更新的数据。

    pickgridline中

    TFGridSystemList* pThis = mdlTFGridSystemList_getFromElement(currDescr, const_cast<TFGridSystemList*>(pSystems));

    这一行无法实现,我的轴网dng里只有grid,没有其它东西,而且是参考进来的,无法创建currDescr。

    所以我想按照Gridline里的方式,通过ITFLoadableProject获取ITFDrawingGrid。

    通过ITFApplication.ModelReferenceLoadProject()获取参考文件中的ITFLoadableProject失败。

    所以,是否可以不通过交互拾取的方式,读取到参考文件中的轴网?

  • mdlTFGridSystemList_getFromElement 这个函数能成功,是因为临时对象这种轴网具体化的形式,附加了轴网的链接信息。在dgn文件的某个model中的轴网具体化形式,是没有这个链接的。所以,交互拾取的方式,是取不到参考文件中的轴网的。拾取到的是一个普通的元素,是轴网的具体化。但是没有轴网API所能提供的信息。

  • 经过测试,pickgridline代码返回的数据也不同步啊,只有mdlTFGridCurve_getLabel这个返回的结果是正确的,其它的均为上次使用轴网工具的数据。

    如上图,拾取01轴,TFGridCurve* pCurve = mdlTFGridCurve_getFromElement (currDescr, pCurveList); 

    pCurve返回null,因为轴网工具里没有这个轴。

    拾取4轴,模型中,4轴的Distance为15000,但是通过mdlTFGridCurve_getValue(pCurve ); 返回的数值为18000,还是轴网工具中的数据。

  • 不知道您是怎么测试的。我的测试过程是:

    1 新建dgn文件,删除项目中的轴网,新建轴网。

    2 使用pickgridline命令拾取轴网,得到对应的值。

    3 再轴网编辑器中增加,或者删除轴网。dgn文件中的轴网自动更新。注意,这是我没有点击更新轴网到model,只是点击了确定按钮结束轴网编辑对话框。

    4 再次使用Pickgridline命令,获取新的轴网的信息。

    这个命令拾取的是在dgn文件中显示的轴网,是临时对象,不在dgn文件中保存的。

Reply
  • 不知道您是怎么测试的。我的测试过程是:

    1 新建dgn文件,删除项目中的轴网,新建轴网。

    2 使用pickgridline命令拾取轴网,得到对应的值。

    3 再轴网编辑器中增加,或者删除轴网。dgn文件中的轴网自动更新。注意,这是我没有点击更新轴网到model,只是点击了确定按钮结束轴网编辑对话框。

    4 再次使用Pickgridline命令,获取新的轴网的信息。

    这个命令拾取的是在dgn文件中显示的轴网,是临时对象,不在dgn文件中保存的。

Children
  • 和您操作方法不一样,点击的是 Create/Update Grid Mod按钮,只点OK的话,貌似只能在Floor下可见。且,没法通过被参考在其它dgn中可见。

    1。新建dgn文件1,使用轴网工具新建轴网1。更新到model

    2。新建dgn文件2,使用轴网工具新建轴网2。更新到model

    3。关闭dgn文件2,在dgn文件1里使用pickgridline命令。

  • 我的那种使用方式,在model里是没有新生成元素的方法,主要是为了辅助建模。这时候看到的轴网,是临时对象。这个临时对象,和项目的轴网信息是实时同步的。所以在轴网对话框确认后,他会和轴网信息同步,生成新的轴网几何。所谓临时对象,就是不保存在dgn文件里的,只是为了显示而创建的。所以,其他文件参考之后,是看不到的。

    这种轴网,需要特殊设置才能选中。您可以看例子代码中的这句话:

     mdlModelRefList_add (tcb->searchModelList, TRANSIENT_MODELREF);

    在这个临时对象上,是有轴网的信息的链接的。所以我们可以得到轴网的信息。

    您的方法,“点击的是 Create/Update Grid Mod按钮”,是在model里生成实际的元素,这个元素不是临时对象,是保存在文件中的元素。如果修改了轴网信息,那就需要再次用那个按钮的功能来更新这些元素。因此,就会出现您的测试结果。这时候,如果您把这个带有轴网的dgn文件,在另外一个项目中使用,那么这个轴网元素所指向的信息,就是和这个新的项目不相匹配的。因为他指向的信息,是原有的项目的轴网的信息。

    把轴网保存在dgn文件中的,还有一个缺陷。如果您需要导出ifc,并且需要导出轴网到ifc,那么ifc中导出的是项目的轴网信息,而不是保存在dgn文件中的轴网。

    总结如下:

    1 轴网信息保存在项目文件,而不是dgn文件中。

    2 dgn文件中的轴网可以在轴网对话框中使用按钮来生成。但是这些轴网元素,只能通过轴网对话框来更新,要不然他们和项目的轴网信息是不匹配的。

    3 临时对象显示的轴网,需要使用pickgridline中的方法来拾取。他们是和项目的轴网信息实时同步的。并且可以导出到ifc文件中。

    4 导出ifc文件时,导出的是项目文件中的轴网信息,而不是保存在dgn文件中的轴网元素。

    Answer Verified By: Chao Cheng 

  • 经测试,pickgridline拾取通过OK按钮显示的临时轴网,结果正确。

    但是,不保存在dgn文件中,如何跨专业协同呢?我们需要这个轴网文件在OBD和OPM中同时使用,所以采用保存在dgn中的方式,这样将轴网参考进来才可见,也为了保证数据一致性。

    然后,我需要解析这个可见的轴网,提取轴符及坐标等信息,编写一些批量功能。

    按您的说法,貌似我们的这个需求无法实现?

  • 不懂OPM,可能需要OPM的专家来分析一下,怎么去实现。

  • 看了下,窗体上有个导出xml的功能,让发布轴网文件的人,设置完成数据再导出个xml一起发布吧。或者,再把这个xml通过EC写回到轴网文件里,应该可行。