Доброе время суток
Столкнулся с проблемой получения значения атрибута объекта МиС
BOMat := CreateComObject(Class_BOSimpleProvider) as IBOSimpleProvider;
BOMat.Select(True, Location, Application.Handle);
if(Location <> '') then begin
BOMat.GetObjectInfo(Location, ClassID, ObjectID);
ObjMat := BOMat.GetObject(ClassID, ObjectID,OptGetProperties);
if(ClassID <> 'SortamentEx') then begin
// Вытащим атрибут
for i:=0 to ObjMat.Attributes.Count-1 do begin
if(ObjMat.Attributes.Item[i].Name = 'InheritedName') then begin
l_str := ObjMat.Attributes.Item[i].AsString;
Break;
end;
end;
end;
end;
Вот что вижу в отладчике(скрин во вложении).
Видно что данные как то обрезаются. Хотя в XML представлении объекта всё в порядке.
В общем сделал через разбор XML, тогда и выяснил что то свойство которое мне нужно в атрибутах не самого объекта а немого по глубже. Но всё равно ObjMat.Attribute['Properties'].Attribute['PropCode'].Attribute['InheritedName'].Value не дал результат.
В моём случаи можно и без рекурсии обойтись.
....
var
l_xmlNode : IXMLNode;
l_xmlNodeList : IXMLNodeList
xmldoc_M : TXMLDocument;
...
...
ObjMat := BOMat.GetObject(ClassID, ObjectID,OptGetProperties);
if(ClassID <> 'SortamentEx') then begin
xmldoc_M.LoadFromXML(ObjMat.XML);
l_xmlNodeList := xmldoc_M.DocumentElement.ChildNodes.FindNode('attributecollection').ChildNodes;
if(l_xmlNodeList <> nil) then begin
l_xmlNode := l_xmlNodeList.First;
try
repeat
if(l_xmlNode.ChildNodes.FindNode('name').Text = 'Properties') then
l_xmlNode := l_xmlNode.ChildNodes.FindNode('attributecollection').ChildNodes.First;
if(l_xmlNode.ChildNodes.FindNode('name').Text = 'PropCode') then
l_xmlNode := l_xmlNode.ChildNodes.FindNode('attributecollection').ChildNodes.First;
if(l_xmlNode.ChildNodes.FindNode('name').Text = 'InheritedName') then begin
l_str := l_xmlNode.ChildNodes.FindNode('value').Text;
break;
end;
l_xmlNode := l_xmlNode.NextSibling;
until l_xmlNode = nil;
except
end;
end;
Цитата: l2qwe от 08.07.15, 15:22:16
Но всё равно ObjMat.Attribute['Properties'].Attribute['PropCode'].Attribute['InheritedName'].Value не дал результат.
Потому что у Properties много PropCode. Надо среди них найти нужный, а потом получать его значение.
Вот получение наименования, плотности и стиля штриховки материала:
if ClassID in ['Material', 'SortamentEx']:
iBOObject = iBOSimpleProvider.GetObject(ClassID, ObjectID, 1)
iBOAttributeCollection = iBOObject.Attributes
if ClassID == 'Material':
material = iBOObject.DisplayName
else:
material = iBOAttributeCollection.Item(6).Value
density, hatchstyle = 0, None
iProperties = iBOAttributeCollection.Item(2).Attributes
pc = iProperties.Count
for i in range(pc):
iProperty = iProperties.Item(i)
if u"Плотность" in iProperty.Value:
density = iProperty.Attributes.Item(8).Value
break
for i in range(pc):
iProperty = iProperties.Item(i)
if u"Стиль штриховки" in iProperty.Value:
hatchstyle = iProperty.Attributes.Item(8).Value
break