[PS ++] 怎么在已有的钢筋组中加入新的钢筋

老师,您好,请问怎么将新绘制的钢筋加入已存在的钢筋组中,好让他们可以一起选中?

需求描述:在一组点筋中,因为业务需求需要移动其中1根点筋,采用的方法是重新绘制了1根点筋,并将原来的删除。以上功能没有问题,但是新绘制的钢筋不在原来的钢筋组中,导致选择一组时,新绘制的钢筋选不中。

如果绘制新钢筋时,使用原来的rebarset,钢筋组中的钢筋就会被全部删除,再将新的钢筋加入其中,即钢筋组中只剩新绘制的钢筋。

RebarSetTag* SingleRebarAssembly::MakeRebars
(
ElementId&          rebarSetId,
double              spacing,
vector<RebarVertices>&   pts,
CVector3D const&    endNormal,
DgnModelRefP        modelRef
)
{
    bool const isStirrup = false;
	
	int tmpRebarSetId = rebarSetId;
    RebarSetP   rebarSet = RebarSet::Fetch (rebarSetId, modelRef);
    if (NULL == rebarSet)
        return NULL;
	int index = 0;
	if (tmpRebarSetId != 0)
	{
		index = rebarSet->GetSetData().GetNumber();
	}

    rebarSet->SetRebarDisplayMode (RebarDisplayMode::kRebarCylinderMode);
    rebarSet->SetCallerId (GetCallerId());
    rebarSet->StartUpdate (modelRef);

    RebarEndType endType;
    endType.SetType (RebarEndType::kNone);

    double uor_per_mm = modelRef->GetModelInfoCP ()->GetUorPerMeter () / 1000.0;
	WString    LevelName;

	if (mrebareeh.IsValid())
	{
		DgnFileP  pDgnFile = ISessionMgr::GetActiveDgnFile();
		ElementPropertiesGetterPtr propEleGet = ElementPropertiesGetter::Create(mrebareeh);
		std::vector<LevelId>vctlevelid;
		for (LevelHandle lh : pDgnFile->GetLevelCacheR())
		{
			LevelId   Levelid = lh.GetLevelId();
			LevelId   Level = propEleGet->GetLevel();
			if (Levelid == (propEleGet->GetLevel()))
			{
				lh.GetDisplayName(LevelName);
			}
		}
	}
	
	int numRebar = (int)pts.size() + index;
  
    for (int i = 0; i < pts.size(); i++)
    {
		BrString   sizeKey = m_vecDirSize.at(i);
		double diameter = RebarCode::GetBarDiameter(sizeKey, modelRef);
		double bendRadius = RebarCode::GetPinRadius(sizeKey, modelRef, isStirrup);
		double bendLen = RebarCode::GetBendLength(sizeKey, endType, modelRef);

        RebarCurve      rebarCurve;
        RebarEndTypes   endTypes = {endType, endType};
        makeRebarCurve (rebarCurve,pts.at(i) , bendRadius, bendLen, endTypes, endNormal);

        RebarSymbology symb;
		string str(sizeKey);
		char ccolar[20] = { 0 };
		strcpy(ccolar, str.c_str());
		SetRebarColorBySize(ccolar, symb);

		CString cstr(LevelName.c_str());
		if (mCAddVerticalRebarflg)
		{
			symb.SetRebarLevel(TEXT_MAIN_REBAR);//画的是点筋则设置为主筋图层
		}
		else
			symb.SetRebarLevel (cstr);//钢筋锚入或钢筋合并设置为所选钢筋的图层

        RebarElementP rebarElement = rebarSet->AssignRebarElement (i + index, numRebar, symb, modelRef);
			
        if (nullptr != rebarElement)
        {
            RebarShapeData shape;
            shape.SetSizeKey ((LPCTSTR)sizeKey);
            shape.SetIsStirrup (isStirrup);
            shape.SetLength (rebarCurve.GetLength () / uor_per_mm);
            rebarElement->Update (rebarCurve, diameter, endTypes, shape, modelRef, false);

			ElementId eleid = rebarElement->GetElementId();
			EditElementHandle tmprebar(eleid, ACTIVEMODEL);
 			string Stype = "SingleRebar";
			if (mSelectedRebarType != "")
				Stype = mSelectedRebarType;
// 			if (mCAddVerticalRebarflg)
// 				Stype = "PointRebar";
// 			else
// 				Stype = "AnchorinRebar";
			ElementRefP oldref = tmprebar.GetElementRef();
			SetRebarLevelItemTypeValue(tmprebar, Stype, ACTIVEMODEL);
			SetRebarHideData(tmprebar, spacing / uor_per_mm, ACTIVEMODEL);
			tmprebar.ReplaceInModel(oldref);
        }
    }

    RebarSetData setdata;
    setdata.SetNumber (numRebar);
    setdata.SetNominalSpacing (spacing / uor_per_mm);
    setdata.SetAverageSpacing(spacing / uor_per_mm);

    rebarSet->FinishUpdate (setdata, modelRef);

    RebarSetTag* tag = new RebarSetTag ();
    tag->SetRset (rebarSet);
    tag->SetIsStirrup (isStirrup);

    return tag;
}

以上代码为什么不是将新的钢筋加入钢筋组而是替换掉钢筋组中的钢筋

Parents Reply Children
No Data