Как внутри сборки перебрать все входящие сбоки....детали?

Автор bvr, 18.12.10, 19:19:10

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

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

bvr

Добрый день

Как внутри сборки перебрать все входящие сбоки....детали?

Спасибо.

Sabahs

Интерфейс динамического массива компонентов сборки.
ksPartCollection,
IPartCollection

bvr

IPartCollectionPtr iPC = pDocument3d->PartCollection(TRUE);
IPartPtr IPrt = iPC->First();
while(IPrt)
{
    if(!IPrt->IsDetail())
    {
Не пойму, как тут получить состав сборки?
    }
    CString str;
    str = IPrt->GetFileName(); <-Тут данные получаю
.....
    str = IPrt->GetMarking(); <-Тут данные НЕ ПОЛУЧАЮ, почему? В подсборке, когда она открыта в отдельном окне есть и обозначение и наименование, не понятно.
....
    str = IPrt->GetName(); <-Тут данные получаю
.....

Спасибо

ainis

Чтобы получить обозначение компонента сборки, нужно открыть файл с этим компонентом.
Public Function Mark(ByVal iPart As Kompas6API5.ksPart) As String
    'получить обозначение компонента (iPart) сб. единицы
    Mark = ""
    Try
      Dim iKompas As Kompas6API5.KompasObject = Marshal.GetActiveObject("KOMPAS.Application.5")
      Dim iKompas7 As KompasAPI7.IApplication = Marshal.GetActiveObject("KOMPAS.Application.7")
      Dim iDocuments As KompasAPI7.IDocuments = iKompas7.Documents 'коллекция открытых документов
      Dim iDoc3D As Kompas6API5.ksDocument3D = iKompas.Document3D
      iDoc3D.Open(iPart.fileName, False)
      Dim iiPart As Kompas6API5.ksPart = iDoc3D.GetPart(Kompas6Constants3D.Part_Type.pTop_Part)
      If iiPart IsNot Nothing Then
        Mark = iiPart.marking
        iDoc3D.close()
      Else 'документ уже открыт
        Dim iDoc As KompasAPI7.IKompasDocument = iDocuments.Item(iPart.fileName)
        If iDoc.DocumentType = DocumentTypeEnum.ksDocumentPart Or iDoc.DocumentType = DocumentTypeEnum.ksDocumentAssembly Then
          'деталь или сборка
          Dim iDoc3D7 As KompasAPI7.KompasDocument3D = iDoc
          Dim iPart7 As KompasAPI7.Part7 = iDoc3D7.TopPart
          Mark = iPart7.Marking
        End If
      End If
    Catch ex As Exception
      Mark = ""
    End Try
  End Function

Slaviation

Еще нужно не забыть, что использование интерфейсов ksPartCollection и IPartCollection не сработает, если некоторые компоненты сборки спрятаны внутрь макрообъекта. Эти компоненты в коллекции ksPartCollection и IPartCollection не попадут. В общем случае вернее брать коллекцию фич (элементов дерева построения) от корневой фичи:
iTopPart := ksPart(iDoc.GetPart(pTop_Part)); // корневой компонент
iTopFeature := ksFeature(iTopPart->GetFeature); // корневая фича
iFeatureCollection := ksFeatureCollection(iTopFeature->SubFeatureCollection(True, True); // коллекция фич
Далее проверять каждый элемент этой коллекции на то, что его объект является компонентом (деталью или сборкой):
if iFeatureItem.type = o3d_part then
begin
...
end;
Если это сборка, то повторять описанный алгоритм (организовать рекурсию).
Реализацию можно посмотреть в http://forum.ascon.ru/index.php/topic,17423.msg100320.html#msg100320

bvr

Спасибо
На мой взгляд, несколько странно, что нельзя получить доступ к обозначению (к наименованию можно), приходится заморачиваться с открытием/закрытием файлов, что расурсоемкая задача.
Питон - что за язык. только в связи с компасом узнал. Как запускать/отлаживать файлы?

bvr

Добрый вечер
этот код
        elif iFeature.type == 105: # o3d_entity
            iEntity = iFeature.GetObject()
Вот на какой интерфейс возвращает iFeature.GetObject()?, Если IPart? Не могу разобраться!!!!
            if iEntity == None:
                continue

            if iEntity.type == 63: # o3d_MacroObject
                ProcessFeature(iKompasObject, iFeature, func, strStatus)

Slaviation

ЦитироватьВот на какой интерфейс возвращает iFeature.GetObject()?

На интерфейс ksEntity. Если это макрообъект, то разбирается и его состав.

SerGoVec

Вечер добрый.

А можно ли получить путь к файлу объекта?
С помощью IFeatureCollection нашел список (дерева) объектов. Могу узнать имя объекта, в дереве. Но как получить имя файла этого объекта или обозначение?

Akew

ЦитироватьА можно ли получить путь к файлу объекта?

ksPart::fileName
и/или
IPart7::FileName.
ksPart и/или IPart7 - можно получить из ksFeature, если он соответствующего типа.

matb

А может кто подсказать как "заставить" переписать файл Компасом 16.2 (64 версия)
txt файл - Информация о документе... - Внешние ссылки - Записать в файл (Полный путь)
без ошибок ( а то формирует  всегда с ошибочными ссылками, а при загрузке СБ требует неиспользуемые в СБ сборки)

http://forum.ascon.ru/index.php/topic,30885.new.html#new
В  txt файле файле - Информация о документе... - Внешние ссылки - Записать в файл (Полный путь)
лишние ссылки на файлы (в СБ этих деталей и сб нет).

ТП - не дали ответа, а срочно надо.