我在尝试用一根直线切割实体,很奇怪的是代码创建的CurveVector curVec 剪切不成功,但是把curVec 转换为 LineElement (LineElement eleTemp11 = DraftingElementSchema.ToElement(Session.Instance.GetActiveDgnModel(), curVec, null) as LineElement;)后然后提取其CurveVector (eleTemp11.GetCurveVector();)然后剪切则能成功。
SolidKernelEntity solidKernelEntity; Create.BodyFromSolidPrimitive(out solidKernelEntity, sfd, Session.Instance.GetActiveDgnModelRef()); CurveVector curVec = CurveVector.Create(CurveVector.BoundaryType.Inner); DSegment3d line1 = new DSegment3d(new DPoint3d(0, 0, 0), new DPoint3d(-10000 * UorPerMas, 0, 0)); curVec.Add(CurvePrimitive.CreateLine(line1)); BentleyStatus sdfs= Modify.BooleanCut(ref solidKernelEntity, curVec, Modify.CutDirectionMode.Both, Modify.CutDepthMode.All, 0, false, DVector3d.FromXYZ(10, 0, 0), 0);
下面的代码侧能成功,区别仅仅是增加了
LineElement eleTemp11 = DraftingElementSchema.ToElement(Session.Instance.GetActiveDgnModel(), curVec, null) as LineElement; curVec = eleTemp11.GetCurveVector();
SolidKernelEntity solidKernelEntity; Create.BodyFromSolidPrimitive(out solidKernelEntity, sfd, Session.Instance.GetActiveDgnModelRef()); CurveVector curVec = CurveVector.Create(CurveVector.BoundaryType.Inner); DSegment3d line1 = new DSegment3d(new DPoint3d(0, 0, 0), new DPoint3d(-10000 * UorPerMas, 0, 0)); curVec.Add(CurvePrimitive.CreateLine(line1)); LineElement eleTemp11 = DraftingElementSchema.ToElement(Session.Instance.GetActiveDgnModel(), curVec, null) as LineElement; curVec = eleTemp11.GetCurveVector(); BentleyStatus sdfs= Modify.BooleanCut(ref solidKernelEntity, curVec, Modify.CutDirectionMode.Both, Modify.CutDepthMode.All, 0, false, DVector3d.FromXYZ(10, 0, 0), 0);
如果CurveVector不是封闭的,可以用CurveVector.BoundaryType.Open试试。一般的闭合shape用Outer,“环”的内部的shape用Inner
Answer Verified By: Yongan.Fu
这个我也尝试过,BoundaryTypede 所有类型我都试过。都不行
抱歉符老师,确实各种类型我都有试过,而且是试过我才尝试eleTemp11.GetCurveVector();这个方法的。可能试的过程我不够仔细,给大家带来麻烦了。
请看c/c++的文档:
另外想请问符老师,还是这个函数,依然想用直线切割,但是想控制剪切方向。我尝试用ValueType defaultNormalIn这个参数,一直没效果。控制剪切方向应该怎么处理?
切割方向确实是倒数第二个参数控制的,不过c#看样子封装的有问题,用c/c++测试是可以的。
如果不想切换到C++又不会自己用C++/CLI封装该函数的话,可以考虑创建一个斜面元素来切,这样就不需要用到这个倒二参数了。
我们内部也会向开发组提交一个Defect来修正这个.NET封装错误。
付老师,我用CLR重新封装C++的BooleanCut方法,代码如下,但是编译错误,您能不能帮我看下是什么原因。
#include "StdAfx.h" #include "BDSNativeSolid.h" namespace BCC = Bentley::CIMNET::CIMCore; #include <Geom/GeomApi.h> #include <DgnPlatform/SolidKernel.h> #include <Mstn\MdlApi\MdlApi.h> #include <DgnPlatform\DgnPlatformApi.h> #include <DgnPlatform\SolidKernel.h> #include <PSolid\PSolidCoreAPI.h> USING_NAMESPACE_BENTLEY_DGNPLATFORM #define CUT_DEPTH_MODE SolidUtil::Modify::CutDepthMode Bentley::DgnPlatformNET::SolidKernelEntity^ BDSNativeSolid::SolidTool::CutByCurve(Bentley::DgnPlatformNET::SolidKernelEntity^ solidKernelEntity, Bentley::GeometryNET::CurveVector^ curve) { ISolidKernelEntityPtr pSolid = BCC::CimConvert::ToUnmanaged(solidKernelEntity); CurveVectorP pCurve= BCC::CimConvert::ToUnmanaged(curve); SolidUtil::Modify::BooleanCut(pSolid, *pCurve, SolidUtil::Modify::CutDirectionMode::Backward, CUT_DEPTH_MODE::All, 0, false, 0, 0); Bentley::DgnPlatformNET::SolidKernelEntity^ solid= BCC::CimConvert::ToManaged(pSolid); return solid; }
出错提示是什么?
最新版的Mstn,Modify.BooleanCut有两个重载,应该是已经解决掉这个bug了,不需要自行封装了,您可以测试一下看看。
Bentley::DgnPlatform::SolidUtil::Modify::BooleanCut(Bentley::DgnPlatform::ISolidKernelEntityPtr &,Bentley::CurveVectorCR,Bentley::DgnPlatform::SolidUtil::Modify::CutDirectionMode,Bentley::DgnPlatform::SolidUtil::Modify::CutDepthMode,double,bool,Bentley::DVec3dCP,UInt32)”: 无法将参数 1 从“Bentley::DgnPlatform::ISolidKernelEntity”转换为“Bentley::DgnPlatform::ISolidKernelEntityPtr &”
郭老师,说是需要一个智能指针的引用参数,但是我传参的时候是个引用。
能否远程让我看一下,可将远程软件名字,及ID,密码发送至我的邮箱:hongqiang.guo@bentley.com