МиС Select GetObject Attribute, не могу получить значение атрибута

Автор l2qwe, 07.07.15, 11:50:41

« предыдущая - следующая »

0 Пользователей и 1 гость просматривают эту тему.

l2qwe

Доброе время суток

Столкнулся с проблемой получения значения атрибута объекта МиС



     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 представлении объекта всё в порядке.




l2qwe

В общем сделал через разбор 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
Писать макросы и программы на Python для Компас может каждый. Могу научить за вознаграждение. Обращаться в ЛС.