如下图,对白色CurveVector执行mdlElmdscr_copyParallel,结果为红色线图
已经把工具面板的模式改为斜接了,结果还是一样的,还需要哪里设置吗?
请上传一下您这个模型文件。
见附件7128.test.dgn
用mdlSolid_offsetWire这个函数,另外如果是这种首尾相连的线串的话,顶点顺序从顶视图看去需要是逆时针的顺序才可以。
尝试失败,最后这个TAG_ENTITY_LIST应该如何转换?
//CurveVectorP curve为需要offset的线圈 EditElementHandle eeh; DraftingElementSchema::ToElement(eeh, *curve, nullptr, ACTIVEMODEL->Is3d(), *ACTIVEMODEL); BODY_TAG body; Transform trans; StatusInt status = mdlSolid_elementToBody(&body, &trans, eeh.ExtractElementDescr(), MASTERFILE, 1); EDGE_TAG edge; mdlSolid_bodyAskFirstEdge(&edge, body); TAG_ENTITY_LIST list; int n = mdlSolid_offsetWire(&list, body, edge, &nativeNormal, offset, 0, 2, false);//n=0 MSElementDescrP elP; n = mdlSolid_createChainFromEdgeList(&elP, &list, NULL, ACTIVEMODEL); //n=32768,这个TAG_ENTITY_LIST应该怎么转回Element
void TestOffsetEdge() { ElementAgenda selectset; SelectionSetManager::GetManager().BuildAgenda(selectset); if (!selectset.GetCount()) { return; } EditElementHandle& eeh = selectset[0]; mdlSolid_beginCurrTrans(ACTIVEMODEL); BODY_TAG body; Transform curTransform; int result = mdlSolid_elementToBody(&body, &curTransform, eeh.GetElementDescrP(), ACTIVEMODEL); if (mdlSolid_isSheetBody(body)) { int numFaces = 0; TAG_ENTITY_LIST* pFaceList = NULL; mdlSolid_listCreate(&pFaceList); mdlSolid_getFaceList(pFaceList, body); mdlSolid_listCount(&numFaces, pFaceList); for (int i = 0; i < numFaces; i++) { FACE_TAG pFace = NULL; mdlSolid_listNthEl(&pFace, pFaceList, i); mdlSolid_uncoverFace(pFace); } mdlSolid_listDelete(&pFaceList); } TAG_ENTITY_LIST* pOffsetList; mdlSolid_listCreate(&pOffsetList); EDGE_TAG pEdge; result = mdlSolid_bodyAskFirstEdge(&pEdge, body); DPoint3d normal = DPoint3d::From(0, 0, 1); double dis = 40; result = mdlSolid_offsetWire(pOffsetList, body, pEdge, &normal, dis, 0, 1, false); for (TAG_ENTITY_LIST::iterator iter = pOffsetList->begin(); iter != pOffsetList->end(); ++iter) { if (mdlSolid_isWireBody((*iter))) { MSElementDescrP elmdscr = NULL; mdlSolid_bodyToElement(&elmdscr, (*iter), true, 0, 0, 0, NULL, ACTIVEMODEL); mdlElmdscr_transform(&elmdscr, &curTransform); EditElementHandle curEeh(elmdscr, true, false); curEeh.AddToModel(); } } mdlSolid_listDelete(&pOffsetList); mdlSolid_freeBody(body); mdlSolid_endCurrTrans(); result = 0; }
Answer Verified By: Chao Cheng
测试结果,这个偏移距离好像有点问题
用的是上面代码里的dis=40
距离问题已解决
double dis = 40; double valueInKernelUnits; mdlCurrTrans_invScaleDoubleArray(&valueInKernelUnits, &dis, 1);
需要再转换一次
然后,测试结果,对线圈方向无要求,顺时针也可以生成,偏移方向:当线圈按右手定则生成的法向量与指定法向量同向时,扩大。不能生成应该是以上的单位问题。
另外请问下,是否有现在的方法可以根据法向量判断平面线圈是否为逆时针?比如bool IsCCW(CurveVectgor cur,DVector vec)
没有现成的函数判断,需要自行构造算法去判断。
不知道 小郭老师发现没 这个挺不好用的 而且在2DModel 使用会有问题