老师好,我想问下,为什么圆截面沿着线段进行扫描,生成实体却是空心的而不是实心的?难道不应该使用扫描吗?
是否你创建的圆是用的弧构成的?必须用封闭的圆来构造这个两端的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(); }
好的