【MSCE C++/CLI】mdlElmdscr_copyParallel模式问题

如下图,对白色CurveVector执行mdlElmdscr_copyParallel,结果为红色线图

已经把工具面板的模式改为斜接了,结果还是一样的,还需要哪里设置吗?

Parents Reply
  • 尝试失败,最后这个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

Children
  • 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 使用会有问题