老师好,我想问下,为什么圆截面沿着线段进行扫描,生成实体却是空心的而不是实心的?难道不应该使用扫描吗?
是否你创建的圆是用的弧构成的?必须用封闭的圆来构造这个两端的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
非常感谢符工
void BodyFromSweepTest() { ElementId id = 809; ElementHandle myArc(id, ACTIVEMODEL); CurveVectorPtr path = ICurvePathQuery::ElementToCurveVector(myArc); DPoint3d startPnt, endPnt; DVec3d startTangent, endTangent; path->at(0)->GetStartEnd(startPnt, endPnt, startTangent, endTangent); RotMatrix rMatrix = RotMatrix::From1Vector(startTangent, 2, true); EditElementHandle myCircle; EllipseHandler::CreateEllipseElement(myCircle, nullptr, startPnt, 100, 100, rMatrix, true, *ACTIVEMODEL); CurveVectorPtr profile = ICurvePathQuery::ElementToCurveVector(myCircle); ISolidKernelEntityPtr solid; EditElementHandle sweepSolid; SolidUtil::Create::BodyFromSweep(solid, *profile, *path, *ACTIVEMODEL, false, true, false); DraftingElementSchema::ToElement(sweepSolid, *solid, nullptr, *ACTIVEMODEL); sweepSolid.AddToModel(); }
我又重写了这个函数,完全用新的C++ Class取代了老的C函数,可以不用引入MSElementDescr这个老概念了。是不是看起来更完美了?
符工,您好,要怎样才能实现由一个圆截面拉伸为一个3维的封闭的圆柱体?
我们弧形的扫略面都能生成了,圆柱体不是比这个更简单吗?
再者,如果想生成一个圆柱体的话,直接用ConeHandler::CreateConeElement会更简单一些