【MSCE C++】扫描成体

老师好,我想问下,为什么圆截面沿着线段进行扫描,生成实体却是空心的而不是实心的?难道不应该使用扫描吗?

Parents
  • 是否你创建的圆是用的弧构成的?必须用封闭的圆来构造这个两端的profile。



  • 符工好,我创建的圆是用弧构成的,必须要用封闭的圆构造截面的话,需要用到相关的什么函数可以构造封闭的圆呢?谢谢指教

  • 已经在另外一个帖子回复了怎么创建封闭的圆的方法了。

  • 你生成的圆和路径在端点是否是垂直的?必须垂直才能保证不倾斜。



  •  符工,这是测试生成的实体,代码如下所示:

    void SolidElement(ElementId id)
    {
        //获取当前模型中的目标元素
    	EditElementHandle eeh(id,ACTIVEMODEL);
    	//在该目标元素上获取端点,并且获取端点的切向量
    	CurveVectorPtr curVecPath = ICurvePathQuery::ElementToCurveVector(eeh);
    	DPoint3d  pointA, pointB;
    	//DVec3d unitTangentA, unitTangentB;
    	(*curVecPath).GetStartEnd(pointA,pointB);
    	//已知圆心、半径,求截面圆
    	MSElement out;
    	mdlArc_create(&out,NULL,&pointA,100,100,NULL,0,fc_pi* 2);
    	mdlElement_add(&out);
    	//构造旋转矩阵,对圆旋转
    	ElementId outID = mdlElement_getID(&out);
    	EditElementHandle circleh(outID, ACTIVEMODEL);
    	CurveVectorPtr curVecPtrCircle = ICurvePathQuery::ElementToCurveVector(circleh);
    	RotMatrix matrix;
    	DPoint3d center;
    	double r0,r1,theta0,sweep;
    	(*curVecPtrCircle)[0]->GetArcCP()->GetScaledRotMatrix(center,matrix,r0,r1,theta0,sweep);
    	Transform transform;
    	center.Negate();
    	transform.InitFrom(center);                                           
    	Transform transform2;
    	matrix.Invert();
    	transform2.InitFrom(matrix);
    	mdlTMatrix_multiply(&transform,&transform2,&transform);
    
     	//对弧线进行操作
    	DPoint3d startEnd[2];
    	mdlArc_extract(startEnd,NULL, NULL, NULL, NULL, &matrix, NULL, eeh.GetElementCP());
    	DPoint3d vecY;
    	mdlRMatrix_getColumnVector(&vecY,&matrix,1);
    	DPoint3d vecZ = vecY;
    	vecZ.x += 10000;
    	vecZ.y += 10000;
    	DPoint3d vec;
    	mdlVec_crossProduct(&vec,&vecY,&vecZ);
    	mdlVec_crossProduct(&vecZ,&vecY,&vec);
    	mdlVec_normalize(&vec);
    	mdlVec_normalize(&vecY);
    	mdlVec_normalize(&vecZ);
    	mdlRMatrix_fromColumnVectors(&matrix, &vec, &vecZ, &vecY);
    	transform2.InitIdentity();
    	transform2.InitFrom(matrix,*startEnd);
    	mdlTMatrix_multiply(&transform,&transform2,&transform);
    
    	MSElementDescrP elmDscrP = circleh.GetElementDescrP();
    	mdlElmdscr_transform(&elmDscrP,&transform);
    	circleh.ReplaceInModel(circleh.GetElementRef());
    	//拉伸
    	ISolidKernelEntityPtr solid;
    	EditElementHandle loftSolid;
    	SolidUtil::Create::BodyFromSweep(solid,*curVecPtrCircle,*curVecPath,*ACTIVEMODEL,true,false,true,NULL, NULL, NULL,NULL);
    	DraftingElementSchema::ToElement(loftSolid,*solid,nullptr,*ACTIVEMODEL);
    	loftSolid.AddToModel(); 
    }
    不知道哪里出现了问题?

  • 我看到的是,你的代码中仍然在用mdlArc_create创建弧而不是用EllipseHandler::CreateEllipseElement。我为你写了如下代码,修改和简化了许多地方。

    void BodyFromSweepTest()
    {
    	ElementId id = 809;
    	MSElementDescrP edP = NULL;
    	mdlAssoc_getElementDescr(&edP, NULL, id, ACTIVEMODEL, FALSE);
    
    	DPoint3d  startPnt;  //起点
    	DVec3d startTangent; //起点切向量
    	mdlElmdscr_extractEndPoints(&startPnt, &startTangent, NULL, NULL, edP, ACTIVEMODEL);
    
    	RotMatrix rMatrix;
    	mdlRMatrix_fromNormalVector(&rMatrix, &startTangent);
    	rMatrix.Invert();
    
    	EditElementHandle myCircle;
    	EllipseHandler::CreateEllipseElement(myCircle, nullptr, startPnt, 100, 100, rMatrix, true, *ACTIVEMODEL);
    
    	CurveVectorPtr profile = ICurvePathQuery::ElementToCurveVector(myCircle);
    
    	ElementHandle eeh(edP, true, false);  //直接从元素描述符构造元素句柄,第二个参数true表示不用再手工释放edP了
    	CurveVectorPtr path = ICurvePathQuery::ElementToCurveVector(eeh);
    
    	ISolidKernelEntityPtr solid;
    	EditElementHandle     sweepSolid;
    	SolidUtil::Create::BodyFromSweep(solid, *profile, *path, *ACTIVEMODEL, false, true, false);
    	DraftingElementSchema::ToElement(sweepSolid, *solid, nullptr, *ACTIVEMODEL);
    	sweepSolid.AddToModel();
    }

    我在创建该profile前就先计算了起点的切向量,然后调用mdlRMatrix_fromNormalVector直接以该切向量为Z轴构造了一个旋转矩阵(X和Y是任意的,因为对圆来说无关紧要,这将大大简化复杂的矩阵计算)。

    您的BodyFromSweep中对三个布尔变量的理解全都是错误的,我将它们都反过来了。代码执行结果如下图:



    Answer Verified By: Duo Duo 

Reply
  • 我看到的是,你的代码中仍然在用mdlArc_create创建弧而不是用EllipseHandler::CreateEllipseElement。我为你写了如下代码,修改和简化了许多地方。

    void BodyFromSweepTest()
    {
    	ElementId id = 809;
    	MSElementDescrP edP = NULL;
    	mdlAssoc_getElementDescr(&edP, NULL, id, ACTIVEMODEL, FALSE);
    
    	DPoint3d  startPnt;  //起点
    	DVec3d startTangent; //起点切向量
    	mdlElmdscr_extractEndPoints(&startPnt, &startTangent, NULL, NULL, edP, ACTIVEMODEL);
    
    	RotMatrix rMatrix;
    	mdlRMatrix_fromNormalVector(&rMatrix, &startTangent);
    	rMatrix.Invert();
    
    	EditElementHandle myCircle;
    	EllipseHandler::CreateEllipseElement(myCircle, nullptr, startPnt, 100, 100, rMatrix, true, *ACTIVEMODEL);
    
    	CurveVectorPtr profile = ICurvePathQuery::ElementToCurveVector(myCircle);
    
    	ElementHandle eeh(edP, true, false);  //直接从元素描述符构造元素句柄,第二个参数true表示不用再手工释放edP了
    	CurveVectorPtr path = ICurvePathQuery::ElementToCurveVector(eeh);
    
    	ISolidKernelEntityPtr solid;
    	EditElementHandle     sweepSolid;
    	SolidUtil::Create::BodyFromSweep(solid, *profile, *path, *ACTIVEMODEL, false, true, false);
    	DraftingElementSchema::ToElement(sweepSolid, *solid, nullptr, *ACTIVEMODEL);
    	sweepSolid.AddToModel();
    }

    我在创建该profile前就先计算了起点的切向量,然后调用mdlRMatrix_fromNormalVector直接以该切向量为Z轴构造了一个旋转矩阵(X和Y是任意的,因为对圆来说无关紧要,这将大大简化复杂的矩阵计算)。

    您的BodyFromSweep中对三个布尔变量的理解全都是错误的,我将它们都反过来了。代码执行结果如下图:



    Answer Verified By: Duo Duo 

Children