老师,您好,请问怎么将新绘制的钢筋加入已存在的钢筋组中,好让他们可以一起选中?
需求描述:在一组点筋中,因为业务需求需要移动其中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; }
以上代码为什么不是将新的钢筋加入钢筋组而是替换掉钢筋组中的钢筋
HI,焯辉,这个需求是要给原有的钢筋组添加钢筋还是修改某根钢筋?
噢噢 原有需求是移动钢筋的位置,思路方法是重新绘制了一根钢筋
如果是修改钢筋,可以尝试如下代码
ElementHandle eh(hitPath->GetHeadElem(), hitPath->GetRoot()); RebarElementP rep = RebarElement::Fetch(eh); //new rebar location... rep->Update(curve, diameter, endTypes, shape, rep->GetModelRef(), false); RebarModel *rmv = RMV; if (rmv != nullptr) { rmv->SaveRebar(*rep, rep->GetModelRef(), true); }
Answer Verified By: 焯辉 洪
谢谢老师,可以了
我通过论坛给您发了私信,请在回复私信中告知我们您的单位名称。谢谢了!