как поменять Instance Name in Part ?

Программирование для CATIA.

как поменять Instance Name in Part ?

Сообщение RIMs » 17 сен 2010 17:40

Есть Продакт с входящими в него парт, каждый парт имеет свой Инстанс, я хочу его перенумеровать. Затык в том что считать я его могу а перезаписать почему то нет? ето нить сталкивался с такой проблемой?

Set Prods1 = product1.Products
iProds1 = Prods1.Count
For i = 1 To iProds1 перебор партов входящих в product1
Set Prod1 = Prods1.Item(i)
strInstance = Trim(Prod1.PartNumber) + "." + Trim(Str(i)) задаю имя Инстанс которое мне надо
strRef = Prod1.Name могу считать Инстанс
Prod1.Name = strInstance затык, менять его не хочет
Prod1.Update
Next i
RIMs
Новичок
Новичок
 
Сообщения: 43
Зарегистрирован: 20 мар 2009 22:27

Re: как поменять Instance Name in Part ?

Сообщение RIMs » 20 сен 2010 20:01

Спасиб всем, нашел в чем затык. Если в дереве только один продукт, то прога отрабатывает, если больше (продукт -> продукт -> партС) - не хочет
буду ковырять
RIMs
Новичок
Новичок
 
Сообщения: 43
Зарегистрирован: 20 мар 2009 22:27

Re: как поменять Instance Name in Part ?

Сообщение AnTe » 24 сен 2010 04:50

Вот, пробую (копирую сразу с Delphi)

Создал сборку, в ней подсборку, в ней подсборку, в ней подсборку :) сохранил.
Проверяю, для первого уровня входимости:

Код: Выделить всё
procedure TfmTest.Button1Click(Sender: TObject);
var ctCatia, ctProduct: Variant;
begin
  try
    ctCatia := GetActiveOleObject('Catia.Application');
    ctProduct := ctCatia.ActiveDocument.Product.Products.Item(1);

    ctProduct.Name := 'New_Product_Name';
    showmessage(ctProduct.Name)

  except
    showmessage('Ошибка')
  end;
end;
Всё работает

Перезагружаю сборку. Проверяю для второго уровня входимости, т.е. в коде заменяю
ctProduct := ctCatia.ActiveDocument.Product.Products.Item(1);
на
ctProduct := ctCatia.ActiveDocument.Product.Products.Item(1).Products.Item(1);

после этого строка
ctProduct.Name := 'New_Product_Name';
заменять Name перестаёт. Причём отрабатывает, не генерируя исключение. Типа всё ОК, переименовал.

Код: Выделить всё
procedure TfmTest.Button1Click(Sender: TObject);
var ctCatia, ctProduct: Variant;
begin
  try
    ctCatia := GetActiveOleObject('Catia.Application');
//    ctProduct := ctCatia.ActiveDocument.Product.Products.Item(1);  // если раскомментировать - дальнейшее присвоение РАБОТАЕТ
//    ctProduct := ctCatia.ActiveDocument.Product.Products.Item(1).Products.Item(1); // если раскомментировать - дальнейшее присвоение НЕ работает
//    ctProduct := ctCatia.ActiveDocument.Product.Products.Item(1).Products.Item(1).Products.Item(1); // если раскомментировать - дальнейшее присвоение НЕ работает

    ctProduct.Name := 'New_Product_Name';
    showmessage(ctProduct.Name)
  except
    showmessage('Ошибка')
  end;
end;

Примечательно, что, несмотря на тот факт, что ctProduct.Name переименован не был - сборка в Catia помечена, как "изменённая", т.е. при попытке открыть сборку заново, или закрыть сеанс - спрашивает, сохранять ли изменения.

Следует заметить, что если заместо Name проводить операции с PartNumber или Definition - всё превосходно работает! Проблема только с Instance Name

где могут быть грабли? Всё перерыл! Работа встала! :dash2: :dash1: :HELP: :HELP: :HELP:
AnTe
Новичок
Новичок
 
Сообщения: 17
Зарегистрирован: 22 ноя 2007 08:00

Re: как поменять Instance Name in Part ?

Сообщение AnTe » 24 сен 2010 08:27

мда. Отвечу сам себе. Извратился чуток.

Проблема частично решается, если открывать родителя каждой сборки, например, если у меня в Produkt1 входит Product2, в Product2 входит Product3, и т.д., и мне нужно переименовать Product5, я делаю так:

ctProduct := ctCatia.Documents.Item('Produkt4.CATProduct').Product.Products.Item(1)
ctProduct.Name := '________New_Product_Name_________';


Осталось точно так же извратиться, для наборов (т.е. сборки без файла)
AnTe
Новичок
Новичок
 
Сообщения: 17
Зарегистрирован: 22 ноя 2007 08:00

Re: как поменять Instance Name in Part ?

Сообщение deNSe » 26 сен 2010 12:24

для VB имеет смысл применить конструкцию: For Each ProductChildren In ..., при этом следует учесть, что Part.Products -> Error!!!
know how vs how know
Аватара пользователя
deNSe
Участник
Участник
 
Сообщения: 115
Зарегистрирован: 24 сен 2010 19:00

Re: как поменять Instance Name in Part ?

Сообщение AnTe » 27 сен 2010 06:40

deNSe писал(а):для VB имеет смысл применить конструкцию: For Each ProductChildren In ..., при этом следует учесть, что Part.Products -> Error!!!
в VB я не силён, но, если правильно понимаю - это ничего принципиально не изменит? Ведь нет разницы, как коллекцию перебирать - через For i = .. или For Each ?
AnTe
Новичок
Новичок
 
Сообщения: 17
Зарегистрирован: 22 ноя 2007 08:00

Re: как поменять Instance Name in Part ?

Сообщение deNSe » 27 сен 2010 10:10

я думаю с использованием For Each... удобнее записать процедуру, которая просканирует все дерево продукта, т.е. все имеющиеся коллекции Products

Код: Выделить всё
Sub FindProducts(CurProduct,..)

Dim ProductChildren

For Each ProductChildren In CurProduct.Products

-------

If (ProductChildren.Products.Count <> 0) Then

Dim ReferenceProduct

Set ReferenceProduct = ProductChildren.ReferenceProduct

FindProducts ReferenceProduct,..

End if

Next

Set ProductChildren = Nothing

End Sub
know how vs how know
Аватара пользователя
deNSe
Участник
Участник
 
Сообщения: 115
Зарегистрирован: 24 сен 2010 19:00


Вернуться в CAA-RADE

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3