MSCE C++ mdlElmdscr_fillet 的问题

老师好:

         我这里准备实现一个关于倒角的功能,看到论坛之前的帖子,说可以考虑 使用mdlElmdscr_fillet  在二维图中,

我的代码是 这样创建的 

CurveVectorPtr pCurveVec = CurveVector::Create(CurveVector::BOUNDARY_TYPE_Open );//BOUNDARY_TYPE_Outer BOUNDARY_TYPE_Open
pCurveVec->Add(ICurvePrimitive::CreateLineString (pts2,14) );

DraftingElementSchema::ToElement(eeh1, *pCurveVec, nullptr, ACTIVEMODEL->Is3d(), *ACTIVEMODEL);

eeh1.AddToModel();

问题如下:

1、他绘制出来是一个 带有扣槽的矩形可以理解为,我想对 扣槽中的两个临边 做圆倒角,是不是可以认为这是一个二维图,因此可以采用  mdlElmdscr_fillet    进行操作?

2、 如果可以用的话,他的第一个参数 可以理解为 输出用的,那么第二个的作用就不清楚了、

3、根据对第三个参数和第四个参数的理解,他们应该是临边元素的意思,不知道这么理解对不对,如果对的话,是不是说明我我线串创建的 这一个元素 ,需要使用多个元素创建区分  要倒角的这两个临边啊?

4、第六个参数Dpoint3d * ,是不是代表 圆心位置的数组?那么这个圆心位置  有没有通用的计算方法?

5、mdlElmdscr_fillet    原则上 根据 圆心、两个临边的交点  是可以 绘制出 一个 优弧 和  一个劣弧的,我们 要怎么区分 哪一个是我们想要的呢?或者说怎么筛选出来我们需要的弧呢?

辛苦老师 ,百忙之中 给予 支持 和帮助,如果能够给出一个示例  分析 ,就更完美了!!!

  • 第一个参数是返回的弧元素,第二个参数是用来设置一些符号化的属性,例如颜色、线宽等,3,、4是用来倒角的两条直线,5参数设置倒角的半径,如果两条直线相交的话,在交点处会有四种倒角情况,这两条直线把平面分成了四个区域,6参数的点在哪个区域倒角就在这个区域内。

  • mdlElmdscr_fillet是C时代的旧函数,C++时代推荐你直接用CurveCurve::CollectFilletArcs。它使用的是全新的PrimitiveCurve或CurveVector对象,而不再是老的MSElement或MSElementDescr了。

    MDL中存在着两个时代的API,很容易把新用户搞晕。



  • 老师好:

       您对第六个参数的描述 是: 该参数点 在哪个区域,倒角 就在哪个区域。是该区域内的任意一点吗?不是特指的 圆心点吗?

    Bentley 二次开发小白一枚

  • 半径都已经有了,这个圆心都是定的了。另外还是推荐用符老师说的接口,能用c++ class的就用,没有再考虑这些老的c style的函数。

  • 符老师好:

         帮我看一下我的测试代码,一个是用的老版本的 一个是 新的 ,都存在问题,辛苦您了!您看我在使用过程中 哪里存在问题 。辛苦了!!!

    void testDaoJiao(DPoint3dR basePt)
    {
    	DPoint3d         pts2[2];
    	pts2[0]=basePt;pts2[1]=basePt;
    	pts2[1].x=basePt.x+100000;
    	EditElementHandle  eeh1,eeh2,eeh3,eeh4;
    	CurveVectorPtr pCurveVec = CurveVector::Create(CurveVector::BOUNDARY_TYPE_Open );//BOUNDARY_TYPE_Outer BOUNDARY_TYPE_Open
    	pCurveVec->Add(ICurvePrimitive::CreateLineString (pts2,2) );
    	DraftingElementSchema::ToElement(eeh1, *pCurveVec, nullptr, ACTIVEMODEL->Is3d(), *ACTIVEMODEL);
    	
    	
    	pts2[0]=basePt;pts2[1]=basePt;
    	pts2[0].y=basePt.y-10000;
    	pts2[1].x=basePt.x+100000;
    	pts2[1].y=basePt.y+15000;
    	CurveVectorPtr pCurveVec1 = CurveVector::Create(CurveVector::BOUNDARY_TYPE_Open );//BOUNDARY_TYPE_Outer BOUNDARY_TYPE_Open
    	pCurveVec1->Add(ICurvePrimitive::CreateLineString (pts2,2) );
    	DraftingElementSchema::ToElement(eeh2, *pCurveVec1, nullptr, ACTIVEMODEL->Is3d(), *ACTIVEMODEL);
    	
    	
    	Dpoint3d pp;
    	pp.x=basePt.x+100;
    	pp.y=basePt.y+100;
    	pp.z=basePt.z;
    	//准备倒角  。
    	bvector<CurveCurve::FilletDetail>			arcs;
    	CurveCurve::CollectFilletArcs(*pCurveVec , *pCurveVec1 , 1000 , true , arcs );//使用这个方法后,没有看到倒角后的效果。
    	if(arcs.size()==0)
    		return ;
    	eeh1.AddToModel();
    	eeh2.AddToModel();
    	
    	/*  //使用mdlElmdscr_fillet 方法  使用该方法 存在 崩溃的现象,老师可以帮忙看一下!
    	ElementPropertiesSetterPtr setter = ElementPropertiesSetter::Create();
    	setter->SetLinestyle(3, NULL);//设置线性 虚线
    	setter->SetWeight(10);//设置线宽度
    	setter->SetColor(2);//设置线性颜色
    	setter->Apply(eeh4);//线形应用
    	if(SUCCESS==mdlElmdscr_fillet(eeh3.GetElementP() , eeh4.GetElementP() , eeh1.GetElementDescrP() , eeh2.GetElementDescrP() , 1000, &pp , NULL) )
    	{
    		if(eeh3.IsValid() )
    		{
    			eeh1.AddToModel();
    			eeh2.AddToModel();
    			eeh3.AddToModel();
    		}
    	}
    	*/
    	return ;
    	
    }

    Bentley 二次开发小白一枚