Mở đầu

Hôm nay mình sẽ bàn luận và phân tích về một lỗi bên trong Dynamo Developer, chính là The '+' character, hexadecimal value 0x2B, cannot be included in a name..Vấn đề này xảy ra khi mình tạo ra một Dropdown DuctTypes sổ xuống để mọi người dễ lựa chọn loại trong Dynamo, nhưng vì một lí do khó hiểu gì đó mà nó sinh ra lỗi này.Đầu tiên mình nghĩ là sự chuyển đổi giữa hai lớp kế thừa từ phiên bản cũ lên phiên bản mới giữa lớp DSDropDownBaseRevitDropDownBase .

Lục lại vấn đề của vài năm trước đây, tác giả @KonradKSobon cũng đã từng bị như mình ở đây và rồi cũng may mắn thay mà nó được giải quyết với một cách tạo enum mà tác giả không mô tả chi tiết cách làm.Mình đã thử gắn thẻ hỏi tác giả nhưng cũng trong vô vọng.

Sau khi trao đổi với tác giả @stillgotme trên diễn đàn thì có gọi luôn lớp cuối là AllElementOfTypeDropDown rồi kế thừa lại lớp RevitDropDownBase nhưng vẫn lại quay về vô vọng.Kết quả vẫn là ném ra lỗi đó.

Vậy thì vấn đề ở đây là gì?Dữ liệu đã được truyền vào, chỉ có UI là lỗi, tất nhiên là có gì đó bên trong rồi phải không các bác.

Đến thời điểm hiện tại mình vẫn đang tìm ra nguyên nhân cho lỗi không mong muốn này, có thể nó đến từ Core bên trong Dynamo, mình sẽ tiếp tục làm sáng tỏ vấn đề này.

Mô tả lỗi

Hình ảnh chi tiết

Hình ảnh ghi lại sau khi đưa được toàn bộ dữ liệu vào Dropdown thì bình thường nhưng khi nhấn vào khung lỗi lại ném ra lỗi như tiêu đề. Toàn bộ mã text lỗi sau khi crashed để các bác phân tích Tại Đây

Ductypeshex

Mã lỗi

Dưới đây là mã mà mình bị lỗi, hi vọng có bác nào đó lướt qua đây và cùng nghiên cứu với mình tìm cho ra nguyên nhân này.Bài viết thảo luận của mình được đặt ở đây

[NodeName("DuctTypes")]
[NodeCategory("MEP.Ducts")]
[NodeDescription("Get All Duct Type From Model Dropdown")]
[IsDesignScriptCompatible]
public class DuctTypeUi : DSDropDownBase
{
const string NoDuctTypes = "No types were found.";
/// <summary>
/// </summary>
public DuctTypeUi() : base("DuctType")
{
}
/// <summary>
/// </summary>
/// <param name="currentSelection"></param>
/// <returns></returns>
protected override SelectionState PopulateItemsCore(string currentSelection)
{
Items.Clear();
Document doc = DocumentManager.Instance.CurrentDBDocument;
List<Element> vtList = new FilteredElementCollector(doc).OfClass(typeof(DuctType)).ToList();
if (vtList.Count == 0)
{
Items.Add(new DynamoDropDownItem(NoDuctTypes, null));
SelectedIndex = 0;
return SelectionState.Done;
}
foreach (DuctType v in vtList) Items.Add(new DynamoDropDownItem(v.Name, v));
Items = Items.OrderBy(x => x.Name).ToObservableCollection();
return SelectionState.Restore;
}
/// <summary>
/// </summary>
/// <param name="inputAstNodes"></param>
/// <returns></returns>
public override IEnumerable<AssociativeNode> BuildOutputAst(List<AssociativeNode> inputAstNodes)
{
AssociativeNode node;
if (SelectedIndex == -1)
{
node = AstFactory.BuildNullNode();
}
else
{
DuctType ductType = Items[SelectedIndex].Item as DuctType;
StringNode idNode = AstFactory.BuildStringNode(ductType.UniqueId);
BooleanNode falseNode = AstFactory.BuildBooleanNode(true);
node = AstFactory.BuildFunctionCall(
new Func<string, bool, object>(ElementSelector.ByUniqueId),
new List<AssociativeNode> {idNode, falseNode});
}
return new[] {AstFactory.BuildAssignment(GetAstIdentifierForOutputIndex(0), node)};
}
}
}
view raw DuctTypes.cs hosted with ❤ by GitHub

Tham khảo :

Dynamo Forum